From: Hermet Park Date: Wed, 27 Oct 2021 07:34:03 +0000 (+0900) Subject: sw_engine shape: code refactoring. X-Git-Tag: accepted/tizen/unified/20211102.024808~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=763a2ef4bb849d5a143de6c51826d54dbb137ab8;p=platform%2Fcore%2Fgraphics%2Ftizenvg.git sw_engine shape: code refactoring. move the exceptional code for the coherency, and ++ more history of the description. --- diff --git a/src/lib/sw_engine/tvgSwShape.cpp b/src/lib/sw_engine/tvgSwShape.cpp index 0d93b55..411c59b 100644 --- a/src/lib/sw_engine/tvgSwShape.cpp +++ b/src/lib/sw_engine/tvgSwShape.cpp @@ -360,11 +360,14 @@ static SwOutline* _genDashOutline(const Shape* sdata, const Matrix* transform) } -static bool _fastTrack(const SwOutline* outline) +static bool _fastTrack(const SwOutline* outline, SwBBox& bbox) { //Fast Track: Othogonal rectangle? if (outline->ptsCnt != 5) return false; + /* NOTICE: If the antialiased pixels matter, we can turn off the fast track + in case the pixels have the pixel fraction. */ + auto pt1 = outline->pts + 0; auto pt2 = outline->pts + 1; auto pt3 = outline->pts + 2; @@ -373,7 +376,35 @@ static bool _fastTrack(const SwOutline* outline) auto a = SwPoint{pt1->x, pt3->y}; auto b = SwPoint{pt3->x, pt1->y}; - if ((*pt2 == a && *pt4 == b) || (*pt2 == b && *pt4 == a)) return true; + //Matched! + if ((*pt2 == a && *pt4 == b) || (*pt2 == b && *pt4 == a)) { + //Since no antialiasing is applied in the Fast Track case, + //the rasterization region has to be rearranged. + //https://github.com/Samsung/thorvg/issues/916 + auto corner1 = outline->pts; + auto corner3 = outline->pts + 2; + + auto xMin = corner1->x; + auto xMax = corner3->x; + if (xMin > xMax) { + xMax = xMin; + xMin = corner3->x; + } + + auto yMin = corner1->y; + auto yMax = corner3->y; + if (yMin > yMax) { + yMax = yMin; + yMin = corner3->y; + } + + bbox.min.x = static_cast(round(xMin / 64.0f)); + bbox.max.x = static_cast(round(xMax / 64.0f)); + bbox.min.y = static_cast(round(yMin / 64.0f)); + bbox.max.y = static_cast(round(yMax / 64.0f)); + + return true; + } return false; } @@ -509,32 +540,8 @@ bool shapeGenRle(SwShape* shape, TVG_UNUSED const Shape* sdata, bool antiAlias, //if (shape.outline->opened) return true; //Case A: Fast Track Rectangle Drawing - if (!hasComposite && (shape->rect = _fastTrack(shape->outline))) { - //Since no antialiasing is applied in the Fast Track case, - //the rasterization region has to be modified - auto corner1 = shape->outline->pts; - auto corner3 = shape->outline->pts + 2; - - auto xMin = corner1->x; - auto xMax = corner3->x; - if (xMin > xMax) { - xMax = xMin; - xMin = corner3->x; - } - auto yMin = corner1->y; - auto yMax = corner3->y; - if (yMin > yMax) { - yMax = yMin; - yMin = corner3->y; - } - - shape->bbox.min.x = static_cast(round(xMin / 64.0f)); - shape->bbox.max.x = static_cast(round(xMax / 64.0f)); - shape->bbox.min.y = static_cast(round(yMin / 64.0f)); - shape->bbox.max.y = static_cast(round(yMax / 64.0f)); + if (!hasComposite && (shape->rect = _fastTrack(shape->outline, shape->bbox))) return true; - return true; - } //Case B: Normal Shape RLE Drawing if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true;