diff --git a/src/lib/sw_engine/tvgSwCommon.h b/src/lib/sw_engine/tvgSwCommon.h index 88686b5b..5db4cd77 100644 --- a/src/lib/sw_engine/tvgSwCommon.h +++ b/src/lib/sw_engine/tvgSwCommon.h @@ -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); diff --git a/src/lib/sw_engine/tvgSwRenderer.cpp b/src/lib/sw_engine/tvgSwRenderer.cpp index f6fc88b6..b9ce7c0a 100644 --- a/src/lib/sw_engine/tvgSwRenderer.cpp +++ b/src/lib/sw_engine/tvgSwRenderer.cpp @@ -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 diff --git a/src/lib/sw_engine/tvgSwShape.cpp b/src/lib/sw_engine/tvgSwShape.cpp index 1c0a09ef..dbdfb6a4 100644 --- a/src/lib/sw_engine/tvgSwShape.cpp +++ b/src/lib/sw_engine/tvgSwShape.cpp @@ -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; }