common: fix wrong viewport region.

in the clip rect, viewport must be accumulated to the smaller one.
this patch improves that corner-case.
This commit is contained in:
Hermet Park 2021-03-26 17:24:43 +09:00
parent f1fe36d8f6
commit 4a19e5b9f6
3 changed files with 15 additions and 1 deletions

View file

@ -401,7 +401,7 @@ bool shapeGenRle(SwShape* shape, TVG_UNUSED const Shape* sdata, bool antiAlias,
//Case A: Fast Track Rectangle Drawing //Case A: Fast Track Rectangle Drawing
if (!hasComposite && (shape->rect = _fastTrack(shape->outline))) return true; if (!hasComposite && (shape->rect = _fastTrack(shape->outline))) return true;
//Case B: Normale Shape RLE Drawing //Case B: Normale 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;
return false; return false;
} }

View file

@ -214,6 +214,7 @@ namespace tvg
RenderRegion viewport2; RenderRegion viewport2;
if ((cmpFastTrack = _clipPathFastTrack(cmpTarget, pTransform, viewport2))) { if ((cmpFastTrack = _clipPathFastTrack(cmpTarget, pTransform, viewport2))) {
viewport = renderer.viewport(); viewport = renderer.viewport();
viewport2.merge(viewport);
renderer.viewport(viewport2); renderer.viewport(viewport2);
} }
} }

View file

@ -48,6 +48,19 @@ struct Compositor {
struct RenderRegion { struct RenderRegion {
uint32_t x, y, w, h; uint32_t x, y, w, h;
void merge(const RenderRegion& rhs)
{
auto x1 = x + w;
auto y1 = y + h;
auto x2 = rhs.x + rhs.w;
auto y2 = rhs.y + rhs.h;
x = max(x, rhs.x);
y = max(y, rhs.y);
w = min(x1, x2) - x;
h = min(y1, y2) - y;
}
}; };
struct RenderTransform struct RenderTransform