mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-27 00:26:51 +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);
|
void shapeReset(SwShape& shape);
|
||||||
bool shapeGenOutline(SwShape& shape, const Shape* sdata);
|
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 shapeDelOutline(SwShape& shape);
|
||||||
void shapeResetStroke(SwShape& shape, const Shape* sdata);
|
void shapeResetStroke(SwShape& shape, const Shape* sdata);
|
||||||
bool shapeGenStrokeRle(SwShape& shape, const Shape* sdata, const SwSize& clip);
|
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);
|
shapeReset(task->shape);
|
||||||
uint8_t alpha = 0;
|
uint8_t alpha = 0;
|
||||||
task->sdata->fill(nullptr, nullptr, nullptr, &alpha);
|
task->sdata->fill(nullptr, nullptr, nullptr, &alpha);
|
||||||
if (alpha > 0 || task->sdata->fill() || strokeAlpha > 0) {
|
bool renderShape = (alpha > 0 || task->sdata->fill());
|
||||||
if (!shapeGenRle(task->shape, task->sdata, task->clip, task->transform)) return;
|
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
|
//Fill
|
||||||
|
|
|
@ -463,25 +463,31 @@ bool _fastTrack(const SwOutline* outline)
|
||||||
/* External Class Implementation */
|
/* 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;
|
if (!shapeGenOutline(shape, sdata)) return false;
|
||||||
|
|
||||||
_transformOutline(shape.outline, transform);
|
_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
|
return true;
|
||||||
if ((shape.rect = _fastTrack(shape.outline))) return true;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool shapeGenRle(SwShape& shape, const Shape* sdata, const SwSize& clip)
|
||||||
|
{
|
||||||
|
//FIXME: Should we draw it?
|
||||||
//Case: Stroke Line
|
//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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue