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;