mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 21:53:41 +00:00
sw_engine shape: code refactoring.
move the exceptional code for the coherency, and ++ more history of the description.
This commit is contained in:
parent
caf4d846fc
commit
370b9b08ec
1 changed files with 34 additions and 27 deletions
|
@ -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?
|
//Fast Track: Othogonal rectangle?
|
||||||
if (outline->ptsCnt != 5) return false;
|
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 pt1 = outline->pts + 0;
|
||||||
auto pt2 = outline->pts + 1;
|
auto pt2 = outline->pts + 1;
|
||||||
auto pt3 = outline->pts + 2;
|
auto pt3 = outline->pts + 2;
|
||||||
|
@ -373,7 +376,35 @@ static bool _fastTrack(const SwOutline* outline)
|
||||||
auto a = SwPoint{pt1->x, pt3->y};
|
auto a = SwPoint{pt1->x, pt3->y};
|
||||||
auto b = SwPoint{pt3->x, pt1->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<SwCoord>(round(xMin / 64.0f));
|
||||||
|
bbox.max.x = static_cast<SwCoord>(round(xMax / 64.0f));
|
||||||
|
bbox.min.y = static_cast<SwCoord>(round(yMin / 64.0f));
|
||||||
|
bbox.max.y = static_cast<SwCoord>(round(yMax / 64.0f));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -509,32 +540,8 @@ bool shapeGenRle(SwShape* shape, TVG_UNUSED const Shape* sdata, bool antiAlias,
|
||||||
//if (shape.outline->opened) return true;
|
//if (shape.outline->opened) return true;
|
||||||
|
|
||||||
//Case A: Fast Track Rectangle Drawing
|
//Case A: Fast Track Rectangle Drawing
|
||||||
if (!hasComposite && (shape->rect = _fastTrack(shape->outline))) {
|
if (!hasComposite && (shape->rect = _fastTrack(shape->outline, shape->bbox))) return true;
|
||||||
//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<SwCoord>(round(xMin / 64.0f));
|
|
||||||
shape->bbox.max.x = static_cast<SwCoord>(round(xMax / 64.0f));
|
|
||||||
shape->bbox.min.y = static_cast<SwCoord>(round(yMin / 64.0f));
|
|
||||||
shape->bbox.max.y = static_cast<SwCoord>(round(yMax / 64.0f));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//Case B: Normal Shape RLE Drawing
|
//Case B: Normal Shape RLE Drawing
|
||||||
if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true;
|
if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue