From 115fcb6afd087fc9bd458c620db38d70cfe23dc9 Mon Sep 17 00:00:00 2001 From: mtehver Date: Fri, 9 Jun 2017 11:14:43 +0300 Subject: [PATCH] Implemented bounding box optimization for generateSDF_legacy method --- core/msdfgen.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/msdfgen.cpp b/core/msdfgen.cpp index e6c56d6..243cf5b 100644 --- a/core/msdfgen.cpp +++ b/core/msdfgen.cpp @@ -365,17 +365,26 @@ void generateMSDF(Bitmap &output, const Shape &shape, double range, co void generateSDF_legacy(Bitmap &output, const Shape &shape, double range, const Vector2 &scale, const Vector2 &translate) { int w = output.width(), h = output.height(); + std::vector edgeBounds = buildEdgeBounds(shape); #ifdef MSDFGEN_USE_OPENMP #pragma omp parallel for #endif + EdgeHolder closestEdge; for (int y = 0; y < h; ++y) { int row = shape.inverseYAxis ? h-y-1 : y; for (int x = 0; x < w; ++x) { double dummy; Point2 p = Vector2(x+.5, y+.5)/scale-translate; SignedDistance minDistance; + if (closestEdge) + minDistance = closestEdge->signedDistance(p, dummy); + std::vector::const_iterator bounds = edgeBounds.begin(); for (std::vector::const_iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) - for (std::vector::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge) { + for (std::vector::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge, ++bounds) { + double absDist = fabs(minDistance.distance); + if (p.x + absDist < bounds->l || bounds->r + absDist < p.x || p.y + absDist < bounds->b || bounds->t + absDist < p.y) + continue; + SignedDistance distance = (*edge)->signedDistance(p, dummy); if (distance < minDistance) minDistance = distance;