Bug 1572415: Convert clip paths when potentially changing canvas backend in CanvasRenderingContext2D. r=jrmuizel

The clip Paths in mStyleStack might not be compatible with the new mTarget, so
this converts them to make sure they are.

Differential Revision: https://phabricator.services.mozilla.com/D51668

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Bob Owen 2019-11-29 21:55:04 +00:00
Родитель 353b658d5a
Коммит 9fa23d568b
2 изменённых файлов: 17 добавлений и 5 удалений

Просмотреть файл

@ -1221,15 +1221,25 @@ void CanvasRenderingContext2D::RestoreClipsAndTransformToTarget() {
mTarget->PushClipRect(gfx::Rect(0, 0, mWidth, mHeight));
}
for (const auto& style : mStyleStack) {
for (const auto& clipOrTransform : style.clipsAndTransforms) {
if (clipOrTransform.IsClip()) {
mTarget->PushClip(clipOrTransform.clip);
for (auto& style : mStyleStack) {
for (auto clipOrTransform = style.clipsAndTransforms.begin();
clipOrTransform != style.clipsAndTransforms.end(); clipOrTransform++) {
if (clipOrTransform->IsClip()) {
if (mClipsNeedConverting) {
// We have possibly changed backends, so we need to convert the clips
// in case they are no longer compatible with mTarget.
RefPtr<PathBuilder> pathBuilder = mTarget->CreatePathBuilder();
clipOrTransform->clip->StreamToSink(pathBuilder);
clipOrTransform->clip = pathBuilder->Finish();
}
mTarget->PushClip(clipOrTransform->clip);
} else {
mTarget->SetTransform(clipOrTransform.transform);
mTarget->SetTransform(clipOrTransform->transform);
}
}
}
mClipsNeedConverting = false;
}
bool CanvasRenderingContext2D::EnsureTarget(const gfx::Rect* aCoveredRect,
@ -1419,6 +1429,7 @@ bool CanvasRenderingContext2D::TrySharedTarget(
// we are already using a shared buffer provider, we are allocating a new
// one because the current one failed so let's just fall back to the basic
// provider.
mClipsNeedConverting = true;
return false;
}

Просмотреть файл

@ -1041,6 +1041,7 @@ class CanvasRenderingContext2D final : public nsICanvasRenderingContextInternal,
bool IsWriteOnly() const { return mWriteOnly; }
bool mWriteOnly;
bool mClipsNeedConverting = false;
};
size_t BindingJSObjectMallocBytes(CanvasRenderingContext2D* aContext);