@@ -38,7 +38,7 @@ namespace | |||
&& (int) h >= 0 && (int) h <= maxVal); | |||
#endif | |||
return Rectangle<Type> (x, y, w, h); | |||
return { x, y, w, h }; | |||
} | |||
} | |||
@@ -49,15 +49,13 @@ LowLevelGraphicsContext::~LowLevelGraphicsContext() {} | |||
//============================================================================== | |||
Graphics::Graphics (const Image& imageToDrawOnto) | |||
: context (*imageToDrawOnto.createLowLevelContext()), | |||
contextToDelete (&context), | |||
saveStatePending (false) | |||
contextToDelete (&context) | |||
{ | |||
jassert (imageToDrawOnto.isValid()); // Can't draw into a null image! | |||
} | |||
Graphics::Graphics (LowLevelGraphicsContext& internalContext) noexcept | |||
: context (internalContext), | |||
saveStatePending (false) | |||
: context (internalContext) | |||
{ | |||
} | |||
@@ -85,7 +83,7 @@ bool Graphics::reduceClipRegion (Rectangle<int> area) | |||
return context.clipToRectangle (area); | |||
} | |||
bool Graphics::reduceClipRegion (const int x, const int y, const int w, const int h) | |||
bool Graphics::reduceClipRegion (int x, int y, int w, int h) | |||
{ | |||
return reduceClipRegion (coordsToRectangle (x, y, w, h)); | |||
} | |||
@@ -157,7 +155,7 @@ void Graphics::setOrigin (Point<int> newOrigin) | |||
void Graphics::setOrigin (int x, int y) | |||
{ | |||
setOrigin (Point<int> (x, y)); | |||
setOrigin ({ x, y }); | |||
} | |||
void Graphics::addTransform (const AffineTransform& transform) | |||
@@ -239,23 +237,20 @@ void Graphics::drawSingleLineText (const String& text, const int startX, const i | |||
// Don't pass any vertical placement flags to this method - they'll be ignored. | |||
jassert (justification.getOnlyVerticalFlags() == 0); | |||
const int flags = justification.getOnlyHorizontalFlags(); | |||
auto flags = justification.getOnlyHorizontalFlags(); | |||
if (flags == Justification::right) | |||
{ | |||
if (startX < context.getClipBounds().getX()) | |||
return; | |||
} | |||
else if (flags == Justification::left) | |||
if (startX > context.getClipBounds().getRight()) | |||
return; | |||
if (flags == Justification::right && startX < context.getClipBounds().getX()) | |||
return; | |||
if (flags == Justification::left && startX > context.getClipBounds().getRight()) | |||
return; | |||
GlyphArrangement arr; | |||
arr.addLineOfText (context.getFont(), text, (float) startX, (float) baselineY); | |||
if (flags != Justification::left) | |||
{ | |||
float w = arr.getBoundingBox (0, -1, true).getWidth(); | |||
auto w = arr.getBoundingBox (0, -1, true).getWidth(); | |||
if ((flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) | |||
w /= 2.0f; | |||
@@ -371,11 +366,6 @@ void Graphics::fillRectList (const RectangleList<int>& rects) const | |||
context.fillRect (r, false); | |||
} | |||
void Graphics::setPixel (int x, int y) const | |||
{ | |||
context.fillRect (coordsToRectangle (x, y, 1, 1), false); | |||
} | |||
void Graphics::fillAll() const | |||
{ | |||
fillRect (context.getClipBounds()); | |||
@@ -385,7 +375,7 @@ void Graphics::fillAll (Colour colourToUse) const | |||
{ | |||
if (! colourToUse.isTransparent()) | |||
{ | |||
const Rectangle<int> clip (context.getClipBounds()); | |||
auto clip = context.getClipBounds(); | |||
context.saveState(); | |||
context.setFill (colourToUse); | |||
@@ -507,7 +497,7 @@ void Graphics::drawRoundedRectangle (Rectangle<float> r, float cornerSize, float | |||
strokePath (p, PathStrokeType (lineThickness)); | |||
} | |||
void Graphics::drawArrow (const Line<float>& line, float lineThickness, float arrowheadWidth, float arrowheadLength) const | |||
void Graphics::drawArrow (Line<float> line, float lineThickness, float arrowheadWidth, float arrowheadLength) const | |||
{ | |||
Path p; | |||
p.addArrow (line, lineThickness, arrowheadWidth, arrowheadLength); | |||
@@ -531,7 +521,7 @@ void Graphics::fillCheckerBoard (Rectangle<int> area, | |||
} | |||
else | |||
{ | |||
const Rectangle<int> clipped (context.getClipBounds().getIntersection (area)); | |||
auto clipped = context.getClipBounds().getIntersection (area); | |||
if (! clipped.isEmpty()) | |||
{ | |||
@@ -573,7 +563,7 @@ void Graphics::drawHorizontalLine (const int y, float left, float right) const | |||
context.fillRect (Rectangle<float> (left, (float) y, right - left, 1.0f)); | |||
} | |||
void Graphics::drawLine (const Line<float>& line) const | |||
void Graphics::drawLine (Line<float> line) const | |||
{ | |||
context.drawLine (line); | |||
} | |||
@@ -588,15 +578,15 @@ void Graphics::drawLine (float x1, float y1, float x2, float y2, float lineThick | |||
drawLine (Line<float> (x1, y1, x2, y2), lineThickness); | |||
} | |||
void Graphics::drawLine (const Line<float>& line, const float lineThickness) const | |||
void Graphics::drawLine (Line<float> line, const float lineThickness) const | |||
{ | |||
Path p; | |||
p.addLineSegment (line, lineThickness); | |||
fillPath (p); | |||
} | |||
void Graphics::drawDashedLine (const Line<float>& line, const float* const dashLengths, | |||
const int numDashLengths, const float lineThickness, int n) const | |||
void Graphics::drawDashedLine (Line<float> line, const float* dashLengths, | |||
int numDashLengths, float lineThickness, int n) const | |||
{ | |||
jassert (n >= 0 && n < numDashLengths); // your start index must be valid! | |||
@@ -338,12 +338,6 @@ public: | |||
void drawRoundedRectangle (Rectangle<float> rectangle, | |||
float cornerSize, float lineThickness) const; | |||
/** Fills a 1x1 pixel using the current colour or brush. | |||
Note that because the context may be transformed, this is effectively the same as | |||
calling fillRect (x, y, 1, 1), and the actual result may involve multiple pixels. | |||
*/ | |||
void setPixel (int x, int y) const; | |||
//============================================================================== | |||
/** Fills an ellipse with the current colour or brush. | |||
The ellipse is drawn to fit inside the given rectangle. | |||
@@ -388,14 +382,14 @@ public: | |||
TIP: If you're trying to draw horizontal or vertical lines, don't use this - | |||
it's better to use fillRect() instead unless you really need an angled line. | |||
*/ | |||
void drawLine (const Line<float>& line) const; | |||
void drawLine (Line<float> line) const; | |||
/** Draws a line between two points with a given thickness. | |||
@see Path::addLineSegment | |||
TIP: If you're trying to draw horizontal or vertical lines, don't use this - | |||
it's better to use fillRect() instead unless you really need an angled line. | |||
*/ | |||
void drawLine (const Line<float>& line, float lineThickness) const; | |||
void drawLine (Line<float> line, float lineThickness) const; | |||
/** Draws a dashed line using a custom set of dash-lengths. | |||
@@ -408,7 +402,7 @@ public: | |||
@param dashIndexToStartFrom the index in the dash-length array to use for the first segment | |||
@see PathStrokeType::createDashedStroke | |||
*/ | |||
void drawDashedLine (const Line<float>& line, | |||
void drawDashedLine (Line<float> line, | |||
const float* dashLengths, int numDashLengths, | |||
float lineThickness = 1.0f, | |||
int dashIndexToStartFrom = 0) const; | |||
@@ -441,7 +435,7 @@ public: | |||
/** Draws a path's outline using the currently selected colour or brush. */ | |||
void strokePath (const Path& path, | |||
const PathStrokeType& strokeType, | |||
const AffineTransform& transform = AffineTransform()) const; | |||
const AffineTransform& transform = {}) const; | |||
/** Draws a line with an arrowhead at its end. | |||
@@ -450,7 +444,7 @@ public: | |||
@param arrowheadWidth the width of the arrow head (perpendicular to the line) | |||
@param arrowheadLength the length of the arrow head (along the length of the line) | |||
*/ | |||
void drawArrow (const Line<float>& line, | |||
void drawArrow (Line<float> line, | |||
float lineThickness, | |||
float arrowheadWidth, | |||
float arrowheadLength) const; | |||
@@ -743,7 +737,7 @@ private: | |||
LowLevelGraphicsContext& context; | |||
ScopedPointer<LowLevelGraphicsContext> contextToDelete; | |||
bool saveStatePending; | |||
bool saveStatePending = false; | |||
void saveStateIfPending(); | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Graphics) | |||
@@ -280,7 +280,7 @@ void Path::startNewSubPath (const float x, const float y) | |||
data.elements[numElements++] = y; | |||
} | |||
void Path::startNewSubPath (const Point<float> start) | |||
void Path::startNewSubPath (Point<float> start) | |||
{ | |||
startNewSubPath (start.x, start.y); | |||
} | |||
@@ -301,7 +301,7 @@ void Path::lineTo (const float x, const float y) | |||
bounds.extend (x, y); | |||
} | |||
void Path::lineTo (const Point<float> end) | |||
void Path::lineTo (Point<float> end) | |||
{ | |||
lineTo (end.x, end.y); | |||
} | |||
@@ -326,8 +326,7 @@ void Path::quadraticTo (const float x1, const float y1, | |||
bounds.extend (x1, y1, x2, y2); | |||
} | |||
void Path::quadraticTo (const Point<float> controlPoint, | |||
const Point<float> endPoint) | |||
void Path::quadraticTo (Point<float> controlPoint, Point<float> endPoint) | |||
{ | |||
quadraticTo (controlPoint.x, controlPoint.y, | |||
endPoint.x, endPoint.y); | |||
@@ -358,9 +357,9 @@ void Path::cubicTo (const float x1, const float y1, | |||
bounds.extend (x3, y3); | |||
} | |||
void Path::cubicTo (const Point<float> controlPoint1, | |||
const Point<float> controlPoint2, | |||
const Point<float> endPoint) | |||
void Path::cubicTo (Point<float> controlPoint1, | |||
Point<float> controlPoint2, | |||
Point<float> endPoint) | |||
{ | |||
cubicTo (controlPoint1.x, controlPoint1.y, | |||
controlPoint2.x, controlPoint2.y, | |||
@@ -675,7 +674,7 @@ void Path::addPieSegment (Rectangle<float> segmentBounds, | |||
} | |||
//============================================================================== | |||
void Path::addLineSegment (const Line<float>& line, float lineThickness) | |||
void Path::addLineSegment (Line<float> line, float lineThickness) | |||
{ | |||
auto reversed = line.reversed(); | |||
lineThickness *= 0.5f; | |||
@@ -687,7 +686,7 @@ void Path::addLineSegment (const Line<float>& line, float lineThickness) | |||
closeSubPath(); | |||
} | |||
void Path::addArrow (const Line<float>& line, float lineThickness, | |||
void Path::addArrow (Line<float> line, float lineThickness, | |||
float arrowheadWidth, float arrowheadLength) | |||
{ | |||
auto reversed = line.reversed(); | |||
@@ -705,8 +704,8 @@ void Path::addArrow (const Line<float>& line, float lineThickness, | |||
closeSubPath(); | |||
} | |||
void Path::addPolygon (const Point<float> centre, const int numberOfSides, | |||
const float radius, const float startAngle) | |||
void Path::addPolygon (Point<float> centre, int numberOfSides, | |||
float radius, float startAngle) | |||
{ | |||
jassert (numberOfSides > 1); // this would be silly. | |||
@@ -729,8 +728,8 @@ void Path::addPolygon (const Point<float> centre, const int numberOfSides, | |||
} | |||
} | |||
void Path::addStar (const Point<float> centre, const int numberOfPoints, | |||
const float innerRadius, const float outerRadius, const float startAngle) | |||
void Path::addStar (Point<float> centre, int numberOfPoints, float innerRadius, | |||
float outerRadius, float startAngle) | |||
{ | |||
jassert (numberOfPoints > 1); // this would be silly. | |||
@@ -755,9 +754,9 @@ void Path::addStar (const Point<float> centre, const int numberOfPoints, | |||
} | |||
} | |||
void Path::addBubble (const Rectangle<float>& bodyArea, | |||
const Rectangle<float>& maximumArea, | |||
const Point<float> arrowTip, | |||
void Path::addBubble (Rectangle<float> bodyArea, | |||
Rectangle<float> maximumArea, | |||
Point<float> arrowTip, | |||
const float cornerSize, | |||
const float arrowBaseWidth) | |||
{ | |||
@@ -968,8 +967,8 @@ void Path::applyTransform (const AffineTransform& transform) noexcept | |||
//============================================================================== | |||
AffineTransform Path::getTransformToScaleToFit (const Rectangle<float>& area, | |||
bool preserveProportions, Justification justification) const | |||
AffineTransform Path::getTransformToScaleToFit (Rectangle<float> area, bool preserveProportions, | |||
Justification justification) const | |||
{ | |||
return getTransformToScaleToFit (area.getX(), area.getY(), area.getWidth(), area.getHeight(), | |||
preserveProportions, justification); | |||
@@ -1059,7 +1058,7 @@ bool Path::contains (const float x, const float y, const float tolerance) const | |||
: ((negativeCrossings + positiveCrossings) & 1) != 0; | |||
} | |||
bool Path::contains (const Point<float> point, const float tolerance) const | |||
bool Path::contains (Point<float> point, const float tolerance) const | |||
{ | |||
return contains (point.x, point.y, tolerance); | |||
} | |||
@@ -1138,7 +1137,7 @@ Point<float> Path::getPointAlongPath (float distanceFromStart, | |||
return { i.x2, i.y2 }; | |||
} | |||
float Path::getNearestPoint (const Point<float> targetPoint, Point<float>& pointOnPath, | |||
float Path::getNearestPoint (Point<float> targetPoint, Point<float>& pointOnPath, | |||
const AffineTransform& transform, | |||
float tolerance) const | |||
{ | |||
@@ -129,7 +129,7 @@ public: | |||
@see closeSubPath, setUsingNonZeroWinding | |||
*/ | |||
bool contains (const Point<float> point, | |||
bool contains (Point<float> point, | |||
float tolerance = defaultToleranceForTesting) const; | |||
/** Checks whether a line crosses the path. | |||
@@ -211,7 +211,7 @@ public: | |||
@see lineTo, quadraticTo, cubicTo, closeSubPath | |||
*/ | |||
void startNewSubPath (const Point<float> start); | |||
void startNewSubPath (Point<float> start); | |||
/** Closes a the current sub-path with a line back to its start-point. | |||
@@ -247,7 +247,7 @@ public: | |||
@see startNewSubPath, quadraticTo, cubicTo, closeSubPath | |||
*/ | |||
void lineTo (const Point<float> end); | |||
void lineTo (Point<float> end); | |||
/** Adds a quadratic bezier curve from the shape's last position to a new position. | |||
@@ -272,8 +272,8 @@ public: | |||
@see startNewSubPath, lineTo, cubicTo, closeSubPath | |||
*/ | |||
void quadraticTo (const Point<float> controlPoint, | |||
const Point<float> endPoint); | |||
void quadraticTo (Point<float> controlPoint, | |||
Point<float> endPoint); | |||
/** Adds a cubic bezier curve from the shape's last position to a new position. | |||
@@ -300,9 +300,9 @@ public: | |||
@see startNewSubPath, lineTo, quadraticTo, closeSubPath | |||
*/ | |||
void cubicTo (const Point<float> controlPoint1, | |||
const Point<float> controlPoint2, | |||
const Point<float> endPoint); | |||
void cubicTo (Point<float> controlPoint1, | |||
Point<float> controlPoint2, | |||
Point<float> endPoint); | |||
/** Returns the last point that was added to the path by one of the drawing methods. | |||
*/ | |||
@@ -320,7 +320,7 @@ public: | |||
@see addRoundedRectangle, addTriangle | |||
*/ | |||
template <typename ValueType> | |||
void addRectangle (const Rectangle<ValueType>& rectangle) | |||
void addRectangle (Rectangle<ValueType> rectangle) | |||
{ | |||
addRectangle (static_cast<float> (rectangle.getX()), static_cast<float> (rectangle.getY()), | |||
static_cast<float> (rectangle.getWidth()), static_cast<float> (rectangle.getHeight())); | |||
@@ -355,7 +355,7 @@ public: | |||
@see addRectangle, addTriangle | |||
*/ | |||
template <typename ValueType> | |||
void addRoundedRectangle (const Rectangle<ValueType>& rectangle, float cornerSizeX, float cornerSizeY) | |||
void addRoundedRectangle (Rectangle<ValueType> rectangle, float cornerSizeX, float cornerSizeY) | |||
{ | |||
addRoundedRectangle (static_cast<float> (rectangle.getX()), static_cast<float> (rectangle.getY()), | |||
static_cast<float> (rectangle.getWidth()), static_cast<float> (rectangle.getHeight()), | |||
@@ -367,7 +367,7 @@ public: | |||
@see addRectangle, addTriangle | |||
*/ | |||
template <typename ValueType> | |||
void addRoundedRectangle (const Rectangle<ValueType>& rectangle, float cornerSize) | |||
void addRoundedRectangle (Rectangle<ValueType> rectangle, float cornerSize) | |||
{ | |||
addRoundedRectangle (rectangle, cornerSize, cornerSize); | |||
} | |||
@@ -534,13 +534,13 @@ public: | |||
@see addArrow | |||
*/ | |||
void addLineSegment (const Line<float>& line, float lineThickness); | |||
void addLineSegment (Line<float> line, float lineThickness); | |||
/** Adds a line with an arrowhead on the end. | |||
The arrow is added as a new closed sub-path. (Any currently open paths will be left open). | |||
@see PathStrokeType::createStrokeWithArrowheads | |||
*/ | |||
void addArrow (const Line<float>& line, | |||
void addArrow (Line<float> line, | |||
float lineThickness, | |||
float arrowheadWidth, | |||
float arrowheadLength); | |||
@@ -548,7 +548,7 @@ public: | |||
/** Adds a polygon shape to the path. | |||
@see addStar | |||
*/ | |||
void addPolygon (const Point<float> centre, | |||
void addPolygon (Point<float> centre, | |||
int numberOfSides, | |||
float radius, | |||
float startAngle = 0.0f); | |||
@@ -556,7 +556,7 @@ public: | |||
/** Adds a star shape to the path. | |||
@see addPolygon | |||
*/ | |||
void addStar (const Point<float> centre, | |||
void addStar (Point<float> centre, | |||
int numberOfPoints, | |||
float innerRadius, | |||
float outerRadius, | |||
@@ -572,8 +572,8 @@ public: | |||
@param cornerSize the size of the rounded corners | |||
@param arrowBaseWidth the width of the base of the arrow where it joins the main rectangle | |||
*/ | |||
void addBubble (const Rectangle<float>& bodyArea, | |||
const Rectangle<float>& maximumArea, | |||
void addBubble (Rectangle<float> bodyArea, | |||
Rectangle<float> maximumArea, | |||
const Point<float> arrowTipPosition, | |||
const float cornerSize, | |||
const float arrowBaseWidth); | |||
@@ -677,7 +677,7 @@ public: | |||
@see applyTransform, scaleToFit | |||
*/ | |||
AffineTransform getTransformToScaleToFit (const Rectangle<float>& area, | |||
AffineTransform getTransformToScaleToFit (Rectangle<float> area, | |||
bool preserveProportions, | |||
Justification justificationType = Justification::centred) const; | |||
@@ -2295,11 +2295,11 @@ public: | |||
} | |||
} | |||
void drawLine (const Line<float>& line) | |||
void drawLine (Line<float> line) | |||
{ | |||
Path p; | |||
p.addLineSegment (line, 1.0f); | |||
fillPath (p, AffineTransform()); | |||
fillPath (p, {}); | |||
} | |||
void drawImage (const Image& sourceImage, const AffineTransform& trans) | |||
@@ -2319,7 +2319,7 @@ public: | |||
void renderImage (const Image& sourceImage, const AffineTransform& trans, | |||
const BaseRegionType* const tiledFillClipRegion) | |||
{ | |||
const AffineTransform t (transform.getTransformWith (trans)); | |||
auto t = transform.getTransformWith (trans); | |||
const int alpha = fillType.colour.getAlpha(); | |||
@@ -2356,18 +2356,17 @@ public: | |||
{ | |||
if (tiledFillClipRegion != nullptr) | |||
{ | |||
tiledFillClipRegion->renderImageTransformed (getThis(), sourceImage, alpha, t, interpolationQuality, true); | |||
tiledFillClipRegion->renderImageTransformed (getThis(), sourceImage, alpha, | |||
t, interpolationQuality, true); | |||
} | |||
else | |||
{ | |||
Path p; | |||
p.addRectangle (sourceImage.getBounds()); | |||
typename BaseRegionType::Ptr c (clip->clone()); | |||
c = c->clipToPath (p, t); | |||
if (c != nullptr) | |||
c->renderImageTransformed (getThis(), sourceImage, alpha, t, interpolationQuality, false); | |||
if (auto c = clip->clone()->clipToPath (p, t)) | |||
c->renderImageTransformed (getThis(), sourceImage, alpha, | |||
t, interpolationQuality, false); | |||
} | |||
} | |||
} | |||
@@ -2386,7 +2385,7 @@ public: | |||
ColourGradient g2 (*(fillType.gradient)); | |||
g2.multiplyOpacity (fillType.getOpacity()); | |||
AffineTransform t (transform.getTransformWith (fillType.transform).translated (-0.5f, -0.5f)); | |||
auto t = transform.getTransformWith (fillType.transform).translated (-0.5f, -0.5f); | |||
const bool isIdentity = t.isOnlyTranslation(); | |||