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:
Hermet Park 2020-07-01 16:49:03 +09:00
parent e0b66b1c3d
commit add79b07cd
3 changed files with 23 additions and 12 deletions

View file

@ -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);

View file

@ -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

View file

@ -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;
}