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

View file

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

View file

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