sw_engine: fix the broken scene clipping.

The implementation has been reverted by https://github.com/thorvg/thorvg/issues/1409

Since the sanitizer is not matured fully and it's false positive as far as I figured,
We revert the scene clipping part.

@Issue: https://github.com/thorvg/thorvg/issues/524
This commit is contained in:
Hermet Park 2023-05-06 19:14:36 +09:00 committed by Hermet Park
parent d7eb913741
commit 3c8a4afaa7

View file

@ -173,6 +173,8 @@ struct SwShapeTask : SwTask
//Clip Path //Clip Path
for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) {
auto clipper = static_cast<SwTask*>(*clip); auto clipper = static_cast<SwTask*>(*clip);
//Guarantee composition targets get ready.
clipper->done(tid);
//Clip shape rle //Clip shape rle
if (shape.rle && !clipper->clip(shape.rle)) goto err; if (shape.rle && !clipper->clip(shape.rle)) goto err;
//Clip stroke rle //Clip stroke rle
@ -223,17 +225,25 @@ struct SwSceneTask : SwTask
if (!sceneRle) sceneRle = static_cast<SwRleData*>(calloc(1, sizeof(SwRleData))); if (!sceneRle) sceneRle = static_cast<SwRleData*>(calloc(1, sizeof(SwRleData)));
else rleReset(sceneRle); else rleReset(sceneRle);
//Only one shape
if (scene.count == 1) {
auto clipper = static_cast<SwTask*>(*scene.data);
clipper->done(tid);
//Merge shapes if it has more than one shapes //Merge shapes if it has more than one shapes
if (scene.count > 1) { } else {
//Merge first two clippers //Merge first two clippers
auto clipper1 = static_cast<SwTask*>(*scene.data); auto clipper1 = static_cast<SwTask*>(*scene.data);
clipper1->done(tid);
auto clipper2 = static_cast<SwTask*>(*(scene.data + 1)); auto clipper2 = static_cast<SwTask*>(*(scene.data + 1));
clipper2->done(tid);
rleMerge(sceneRle, clipper1->rle(), clipper2->rle()); rleMerge(sceneRle, clipper1->rle(), clipper2->rle());
//Unify the remained clippers //Unify the remained clippers
for (auto rd = scene.data + 2; rd < (scene.data + scene.count); ++rd) { for (auto rd = scene.data + 2; rd < (scene.data + scene.count); ++rd) {
auto clipper = static_cast<SwTask*>(*rd); auto clipper = static_cast<SwTask*>(*rd);
clipper->done(tid);
rleMerge(sceneRle, sceneRle, clipper->rle()); rleMerge(sceneRle, sceneRle, clipper->rle());
} }
} }
@ -295,6 +305,8 @@ struct SwImageTask : SwTask
imageDelOutline(&image, mpool, tid); imageDelOutline(&image, mpool, tid);
for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) {
auto clipper = static_cast<SwTask*>(*clip); auto clipper = static_cast<SwTask*>(*clip);
//Guarantee composition targets get ready.
clipper->done(tid);
if (!clipper->clip(image.rle)) goto err; if (!clipper->clip(image.rle)) goto err;
} }
return; return;
@ -685,15 +697,6 @@ void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform,
//Finish previous task if it has duplicated request. //Finish previous task if it has duplicated request.
task->done(); task->done();
//TODO: Failed threading them. It would be better if it's possible.
//See: https://github.com/thorvg/thorvg/issues/1409
if (clips.count > 0) {
//Guarantee composition targets get ready.
for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) {
static_cast<SwTask*>(*clip)->done();
}
}
task->clips = clips; task->clips = clips;
if (transform) { if (transform) {