mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-26 08:09:14 +00:00
sw_engine: Draw shapes even though there is no explict closed command.
This behavior is not confiremd but it's beneficial for svg spec. Change-Id: Ia711c057811ae51e472b4e164b36f3dd6af9893f
This commit is contained in:
parent
e0b66b1c3d
commit
add79b07cd
3 changed files with 23 additions and 12 deletions
|
@ -264,7 +264,8 @@ SwFixed mathMean(SwFixed angle1, SwFixed angle2);
|
|||
|
||||
void shapeReset(SwShape& shape);
|
||||
bool shapeGenOutline(SwShape& shape, const Shape* sdata);
|
||||
bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform);
|
||||
bool shapePrepare(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform);
|
||||
bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip);
|
||||
void shapeDelOutline(SwShape& shape);
|
||||
void shapeResetStroke(SwShape& shape, const Shape* sdata);
|
||||
bool shapeGenStrokeRle(SwShape& shape, const Shape* sdata, const SwSize& clip);
|
||||
|
|
|
@ -187,8 +187,12 @@ void* SwRenderer::prepare(const Shape& sdata, void* data, const RenderTransform*
|
|||
shapeReset(task->shape);
|
||||
uint8_t alpha = 0;
|
||||
task->sdata->fill(nullptr, nullptr, nullptr, &alpha);
|
||||
if (alpha > 0 || task->sdata->fill() || strokeAlpha > 0) {
|
||||
if (!shapeGenRle(task->shape, task->sdata, task->clip, task->transform)) return;
|
||||
bool renderShape = (alpha > 0 || task->sdata->fill());
|
||||
if (renderShape || strokeAlpha > 0) {
|
||||
if (!shapePrepare(task->shape, task->sdata, task->clip, task->transform)) return;
|
||||
if (renderShape) {
|
||||
if (!shapeGenRle(task->shape, task->sdata, task->clip)) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Fill
|
||||
|
|
|
@ -463,25 +463,31 @@ bool _fastTrack(const SwOutline* outline)
|
|||
/* External Class Implementation */
|
||||
/************************************************************************/
|
||||
|
||||
bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform)
|
||||
bool shapePrepare(SwShape& shape, const Shape* sdata, const SwSize& clip, const Matrix* transform)
|
||||
{
|
||||
if (!shapeGenOutline(shape, sdata)) return false;
|
||||
|
||||
_transformOutline(shape.outline, transform);
|
||||
|
||||
if (!_updateBBox(shape.outline, shape.bbox)) goto end;
|
||||
if (!_updateBBox(shape.outline, shape.bbox)) return false;
|
||||
|
||||
if (!_checkValid(shape.outline, shape.bbox, clip)) goto end;
|
||||
if (!_checkValid(shape.outline, shape.bbox, clip)) return false;
|
||||
|
||||
//Case: Fast Track Rectangle Drawing
|
||||
if ((shape.rect = _fastTrack(shape.outline))) return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip)
|
||||
{
|
||||
//FIXME: Should we draw it?
|
||||
//Case: Stroke Line
|
||||
if (shape.outline->opened) return true;
|
||||
//if (shape.outline->opened) return true;
|
||||
|
||||
//Case A: Fast Track Rectangle Drawing
|
||||
if ((shape.rect = _fastTrack(shape.outline))) return true;
|
||||
//Case B: Normale Shape RLE Drawing
|
||||
if ((shape.rle = rleRender(shape.outline, shape.bbox, clip))) return true;
|
||||
|
||||
shape.rle = rleRender(shape.outline, shape.bbox, clip);
|
||||
end:
|
||||
if (shape.rle) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue