| Index: src/gpu/GrClipStackClip.cpp
|
| diff --git a/src/gpu/GrClipStackClip.cpp b/src/gpu/GrClipStackClip.cpp
|
| index 14c2dbe8accdb2250315b58a416493798e2bb796..7afaa92bd315548a11eca08242056f20f2b509a2 100644
|
| --- a/src/gpu/GrClipStackClip.cpp
|
| +++ b/src/gpu/GrClipStackClip.cpp
|
| @@ -298,7 +298,13 @@ bool GrClipStackClip::apply(GrContext* context, GrRenderTargetContext* renderTar
|
| return InitialState::kAllIn == reducedClip.initialState();
|
| }
|
|
|
| +#ifdef SK_DEBUG
|
| SkASSERT(reducedClip.hasIBounds());
|
| + SkIRect rtIBounds = SkIRect::MakeWH(renderTargetContext->width(),
|
| + renderTargetContext->height());
|
| + SkIRect clipIBounds = reducedClip.ibounds().makeOffset(-fOrigin.x(), -fOrigin.y());
|
| + SkASSERT(rtIBounds.contains(clipIBounds)); // Mask shouldn't be larger than the RT.
|
| +#endif
|
|
|
| // An element count of 4 was chosen because of the common pattern in Blink of:
|
| // isect RR
|
| @@ -380,8 +386,10 @@ static void GetClipMaskKey(int32_t clipGenID, const SkIRect& bounds, GrUniqueKey
|
| static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
|
| GrUniqueKey::Builder builder(key, kDomain, 3);
|
| builder[0] = clipGenID;
|
| - builder[1] = SkToU16(bounds.fLeft) | (SkToU16(bounds.fRight) << 16);
|
| - builder[2] = SkToU16(bounds.fTop) | (SkToU16(bounds.fBottom) << 16);
|
| + // SkToS16 because image filters outset layers to a size indicated by the filter, which can
|
| + // sometimes result in negative coordinates from clip space.
|
| + builder[1] = SkToS16(bounds.fLeft) | (SkToS16(bounds.fRight) << 16);
|
| + builder[2] = SkToS16(bounds.fTop) | (SkToS16(bounds.fBottom) << 16);
|
| }
|
|
|
| sk_sp<GrTexture> GrClipStackClip::CreateAlphaClipMask(GrContext* context,
|
| @@ -432,7 +440,9 @@ sk_sp<GrTexture> GrClipStackClip::CreateSoftwareClipMask(GrTextureProvider* texP
|
| SkMatrix translate;
|
| translate.setTranslate(SkIntToScalar(-reducedClip.left()), SkIntToScalar(-reducedClip.top()));
|
|
|
| - helper.init(maskSpaceIBounds, &translate);
|
| + if (!helper.init(maskSpaceIBounds, &translate)) {
|
| + return nullptr;
|
| + }
|
| helper.clear(InitialState::kAllIn == reducedClip.initialState() ? 0xFF : 0x00);
|
|
|
| for (ElementList::Iter iter(reducedClip.elements()); iter.get(); iter.next()) {
|
|
|