From babb10b7f3eeaa58c33a575fccf3ecb7cd2569c4 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Sat, 23 Oct 2021 21:31:02 +0200 Subject: [PATCH] sw_engine: rasterization region edited in the case of fast tracking Since no antialiasing is applied for the fastTracking cases, the shape's rasterization region needs to be edited. To establish the rastered bbox, the rounding is performed before the bbox corners are casted to the SwCoords. --- src/lib/sw_engine/tvgSwShape.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/lib/sw_engine/tvgSwShape.cpp b/src/lib/sw_engine/tvgSwShape.cpp index 08cd6949..0d93b559 100644 --- a/src/lib/sw_engine/tvgSwShape.cpp +++ b/src/lib/sw_engine/tvgSwShape.cpp @@ -22,6 +22,7 @@ #include "tvgSwCommon.h" #include "tvgBezier.h" #include +#include /************************************************************************/ /* Internal Class Implementation */ @@ -508,8 +509,33 @@ 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))) return true; - //Case B: Normale Shape RLE 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)); + + return true; + } + //Case B: Normal Shape RLE Drawing if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true; return false;