diff --git a/modules/juce_graphics/geometry/juce_EdgeTable.cpp b/modules/juce_graphics/geometry/juce_EdgeTable.cpp index 5caa8bf130..43caa9ece6 100644 --- a/modules/juce_graphics/geometry/juce_EdgeTable.cpp +++ b/modules/juce_graphics/geometry/juce_EdgeTable.cpp @@ -32,8 +32,12 @@ const int juce_edgeTableDefaultEdgesPerLine = 32; //============================================================================== EdgeTable::EdgeTable (Rectangle area, const Path& path, const AffineTransform& transform) : bounds (area), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements (juce_edgeTableDefaultEdgesPerLine * 2 + 1) + // this is a very vague heuristic to make a rough guess at a good table size + // for a given path, such that it's big enough to mostly avoid remapping, but also + // not so big that it's wasteful for simple paths. + maxEdgesPerLine (jmax (juce_edgeTableDefaultEdgesPerLine / 2, + 4 * (int) std::sqrt (path.numElements))), + lineStrideElements (maxEdgesPerLine * 2 + 1) { allocate(); int* t = table; @@ -404,7 +408,7 @@ void EdgeTable::remapTableForNumEdges (const int newNumEdgesPerLine) inline void EdgeTable::remapWithExtraSpace (int numPoints) { - remapTableForNumEdges (numPoints + jmax (juce_edgeTableDefaultEdgesPerLine, numPoints / 2)); + remapTableForNumEdges (numPoints * 2); jassert (numPoints < maxEdgesPerLine); } diff --git a/modules/juce_graphics/geometry/juce_Path.h b/modules/juce_graphics/geometry/juce_Path.h index c868b1ddde..eda4f2d5b1 100644 --- a/modules/juce_graphics/geometry/juce_Path.h +++ b/modules/juce_graphics/geometry/juce_Path.h @@ -781,9 +781,7 @@ public: void loadPathFromData (const void* data, size_t numberOfBytes); /** Stores the path by writing it out to a stream. - After writing out a path, you can reload it using loadPathFromStream(). - @see loadPathFromStream, loadPathFromData */ void writePathToStream (OutputStream& destination) const; @@ -803,6 +801,8 @@ private: //============================================================================== friend class PathFlatteningIterator; friend class Path::Iterator; + friend class EdgeTable; + ArrayAllocationBase data; size_t numElements = 0;