Browse Source

Did a bit of minor modernising in Graphics + Path

tags/2021-05-28
jules 7 years ago
parent
commit
3df7f8ff8b
5 changed files with 71 additions and 89 deletions
  1. +19
    -29
      modules/juce_graphics/contexts/juce_GraphicsContext.cpp
  2. +6
    -12
      modules/juce_graphics/contexts/juce_GraphicsContext.h
  3. +19
    -20
      modules/juce_graphics/geometry/juce_Path.cpp
  4. +18
    -18
      modules/juce_graphics/geometry/juce_Path.h
  5. +9
    -10
      modules/juce_graphics/native/juce_RenderingHelpers.h

+ 19
- 29
modules/juce_graphics/contexts/juce_GraphicsContext.cpp View File

@@ -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!


+ 6
- 12
modules/juce_graphics/contexts/juce_GraphicsContext.h View File

@@ -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)


+ 19
- 20
modules/juce_graphics/geometry/juce_Path.cpp View File

@@ -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
{


+ 18
- 18
modules/juce_graphics/geometry/juce_Path.h View File

@@ -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;


+ 9
- 10
modules/juce_graphics/native/juce_RenderingHelpers.h View File

@@ -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();


Loading…
Cancel
Save