diff --git a/src/juce_appframework/gui/components/controls/juce_ListBox.h b/src/juce_appframework/gui/components/controls/juce_ListBox.h index 2c42eb32c3..07f19b2c61 100644 --- a/src/juce_appframework/gui/components/controls/juce_ListBox.h +++ b/src/juce_appframework/gui/components/controls/juce_ListBox.h @@ -431,10 +431,11 @@ public: */ enum ColourIds { - backgroundColourId = 0x1002800, /**< The background colour to fill the list with. - Make this transparent if you don't want the background to be filled. */ - outlineColourId = 0x1002810 /**< An optional colour to use to draw a border around the list. - Make this transparent to not have an outline. */ + backgroundColourId = 0x1002800, /**< The background colour to fill the list with. + Make this transparent if you don't want the background to be filled. */ + outlineColourId = 0x1002810, /**< An optional colour to use to draw a border around the list. + Make this transparent to not have an outline. */ + textColourId = 0x1002820 /**< The preferred colour to use for drawing text in the listbox. */ }; /** Sets the thickness of a border that will be drawn around the box. diff --git a/src/juce_appframework/gui/components/controls/juce_Slider.cpp b/src/juce_appframework/gui/components/controls/juce_Slider.cpp index bb09619585..a1692f147d 100644 --- a/src/juce_appframework/gui/components/controls/juce_Slider.cpp +++ b/src/juce_appframework/gui/components/controls/juce_Slider.cpp @@ -1281,9 +1281,10 @@ void Slider::mouseWheelMove (const MouseEvent&, float wheelIncrementX, float whe const double currentPos = valueToProportionOfLength (currentValue); const double newValue = proportionOfLengthToValue (jlimit (0.0, 1.0, currentPos + proportionDelta)); - double delta = jmax (fabs (newValue - currentValue), interval); + double delta = (newValue != currentValue) + ? jmax (fabs (newValue - currentValue), interval) : 0; - if (proportionDelta < 0) + if (currentValue > newValue) delta = -delta; sendDragStart(); diff --git a/src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp b/src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp index 12551304a2..02d8817028 100644 --- a/src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp +++ b/src/juce_appframework/gui/components/lookandfeel/juce_LookAndFeel.cpp @@ -142,6 +142,7 @@ LookAndFeel::LookAndFeel() ListBox::backgroundColourId, 0xffffffff, ListBox::outlineColourId, standardOutlineColour, + ListBox::textColourId, 0xff000000, Slider::backgroundColourId, 0x00000000, Slider::thumbColourId, textButtonColour, diff --git a/src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp b/src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp index 7fb989a58f..83c2165353 100644 --- a/src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp +++ b/src/juce_appframework/gui/components/special/juce_AudioDeviceSelectorComponent.cpp @@ -132,7 +132,7 @@ public: enabled, true, true, false); g.setFont (height * 0.6f); - g.setColour (Colours::black.withAlpha (enabled ? 1.0f : 0.6f)); + g.setColour (findColour (ListBox::textColourId, true).withMultipliedAlpha (enabled ? 1.0f : 0.6f)); g.drawText (item, x, 0, width - x - 2, height, Justification::centredLeft, true); } } diff --git a/src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp b/src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp index b7c32959f4..75fcadbcfe 100644 --- a/src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp +++ b/src/juce_appframework/gui/graphics/contexts/juce_Graphics.cpp @@ -42,6 +42,20 @@ BEGIN_JUCE_NAMESPACE static const Graphics::ResamplingQuality defaultQuality = Graphics::mediumResamplingQuality; +//============================================================================== +#define MINIMUM_COORD -0x3fffffff +#define MAXIMUM_COORD 0x3fffffff + +#define ASSERT_COORDS_ARE_SENSIBLE_NUMBERS(x, y, w, h) \ + jassert ((int) x >= MINIMUM_COORD \ + && (int) x <= MAXIMUM_COORD \ + && (int) y >= MINIMUM_COORD \ + && (int) y <= MAXIMUM_COORD \ + && (int) w >= 0 \ + && (int) w < MAXIMUM_COORD \ + && (int) h >= 0 \ + && (int) h < MAXIMUM_COORD); + //============================================================================== LowLevelGraphicsContext::LowLevelGraphicsContext() @@ -345,6 +359,9 @@ void Graphics::fillRect (int x, int width, int height) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + SolidColourBrush colourBrush (state->colour); (state->brush != 0 ? *(state->brush) : (Brush&) colourBrush).paintRectangle (*context, x, y, width, height); } @@ -362,6 +379,9 @@ void Graphics::fillRect (const float x, const float width, const float height) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + Path p; p.addRectangle (x, y, width, height); fillPath (p); @@ -423,6 +443,9 @@ void Graphics::drawRect (const int x, const int height, const int lineThickness) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + SolidColourBrush colourBrush (state->colour); Brush& b = (state->brush != 0 ? *(state->brush) : (Brush&) colourBrush); @@ -441,6 +464,9 @@ void Graphics::drawBevel (const int x, const Colour& bottomRightColour, const bool useGradient) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + if (clipRegionIntersects (x, y, width, height)) { const float oldOpacity = state->colour.getFloatAlpha(); @@ -465,6 +491,9 @@ void Graphics::fillEllipse (const float x, const float width, const float height) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + Path p; p.addEllipse (x, y, width, height); fillPath (p); @@ -476,6 +505,9 @@ void Graphics::drawEllipse (const float x, const float height, const float lineThickness) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + Path p; p.addEllipse (x, y, width, height); strokePath (p, PathStrokeType (lineThickness)); @@ -487,6 +519,9 @@ void Graphics::fillRoundedRectangle (const float x, const float height, const float cornerSize) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + Path p; p.addRoundedRectangle (x, y, width, height, cornerSize); fillPath (p); @@ -499,6 +534,9 @@ void Graphics::drawRoundedRectangle (const float x, const float cornerSize, const float lineThickness) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); + Path p; p.addRoundedRectangle (x, y, width, height, cornerSize); strokePath (p, PathStrokeType (lineThickness)); @@ -680,6 +718,9 @@ void Graphics::drawImageWithin (const Image* const imageToDraw, const RectanglePlacement& placementWithinTarget, const bool fillAlphaChannelWithCurrentBrush) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (destX, destY, destW, destH); + if (imageToDraw != 0) { const int imageW = imageToDraw->getWidth(); @@ -711,6 +752,10 @@ void Graphics::drawImage (const Image* const imageToDraw, int sx, int sy, int sw, int sh, const bool fillAlphaChannelWithCurrentBrush) const throw() { + // passing in a silly number can cause maths problems in rendering! + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (dx, dy, dw, dh); + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (sx, sy, sw, sh); + if (imageToDraw == 0 || ! context->clipRegionIntersects (dx, dy, dw, dh)) return; diff --git a/src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp index d763081a50..dd179da8d7 100644 --- a/src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +++ b/src/juce_appframework/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp @@ -49,6 +49,19 @@ BEGIN_JUCE_NAMESPACE #pragma warning (disable: 4714) #endif +#define MINIMUM_COORD -0x3fffffff +#define MAXIMUM_COORD 0x3fffffff + +#define ASSERT_COORDS_ARE_SENSIBLE_NUMBERS(x, y, w, h) \ + jassert ((int) x >= MINIMUM_COORD \ + && (int) x <= MAXIMUM_COORD \ + && (int) y >= MINIMUM_COORD \ + && (int) y <= MAXIMUM_COORD \ + && (int) w >= 0 \ + && (int) w < MAXIMUM_COORD \ + && (int) h >= 0 \ + && (int) h < MAXIMUM_COORD); + //============================================================================== static void replaceRectRGB (uint8* pixels, const int w, int h, const int stride, const Colour& colour) throw() { @@ -1177,6 +1190,9 @@ bool LowLevelGraphicsSoftwareRenderer::getPathBounds (int clipX, int clipY, int w = roundDoubleToInt (tw) + 2; h = roundDoubleToInt (th) + 2; + // seems like this operation is using some crazy out-of-range numbers.. + ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, w, h); + return Rectangle::intersectRectangles (x, y, w, h, clipX, clipY, clipW, clipH); } diff --git a/src/juce_appframework/gui/graphics/geometry/juce_Path.cpp b/src/juce_appframework/gui/graphics/geometry/juce_Path.cpp index be7b0fbe13..2490af1785 100644 --- a/src/juce_appframework/gui/graphics/geometry/juce_Path.cpp +++ b/src/juce_appframework/gui/graphics/geometry/juce_Path.cpp @@ -38,6 +38,9 @@ BEGIN_JUCE_NAMESPACE #include "juce_Line.h" #include "../../../../juce_core/io/streams/juce_MemoryInputStream.h" +// tests that some co-ords aren't NaNs +#define CHECK_COORDS_ARE_VALID(x, y) \ + jassert (x == x && y == y); //============================================================================== static const float lineMarker = 100001.0f; @@ -197,6 +200,8 @@ void Path::getBoundsTransformed (const AffineTransform& transform, void Path::startNewSubPath (const float x, const float y) throw() { + CHECK_COORDS_ARE_VALID (x, y); + if (numElements == 0) { pathXMin = pathXMax = x; @@ -219,6 +224,8 @@ void Path::startNewSubPath (const float x, void Path::lineTo (const float x, const float y) throw() { + CHECK_COORDS_ARE_VALID (x, y); + if (numElements == 0) startNewSubPath (0, 0); @@ -237,6 +244,9 @@ void Path::lineTo (const float x, const float y) throw() void Path::quadraticTo (const float x1, const float y1, const float x2, const float y2) throw() { + CHECK_COORDS_ARE_VALID (x1, y1); + CHECK_COORDS_ARE_VALID (x2, y2); + if (numElements == 0) startNewSubPath (0, 0); @@ -258,6 +268,10 @@ void Path::cubicTo (const float x1, const float y1, const float x2, const float y2, const float x3, const float y3) throw() { + CHECK_COORDS_ARE_VALID (x1, y1); + CHECK_COORDS_ARE_VALID (x2, y2); + CHECK_COORDS_ARE_VALID (x3, y3); + if (numElements == 0) startNewSubPath (0, 0);