Chromium Code Reviews| Index: Source/platform/graphics/skia/OpaqueRegionSkia.cpp |
| diff --git a/Source/platform/graphics/skia/OpaqueRegionSkia.cpp b/Source/platform/graphics/skia/OpaqueRegionSkia.cpp |
| index 24c0369d2ee641c597367d4f4541d6d0d6364fa1..dfcfce2ac872c4f137ba43a1c1e5aa41ffc982ae 100644 |
| --- a/Source/platform/graphics/skia/OpaqueRegionSkia.cpp |
| +++ b/Source/platform/graphics/skia/OpaqueRegionSkia.cpp |
| @@ -41,6 +41,7 @@ namespace blink { |
| OpaqueRegionSkia::OpaqueRegionSkia() |
| : m_opaqueRect(SkRect::MakeEmpty()) |
| + , m_treatOverwriteAsOpaque(false) |
| { |
| } |
| @@ -96,6 +97,23 @@ static inline bool xfermodeIsOpaque(const SkPaint& paint, bool srcIsOpaque) |
| } |
| } |
| +static inline bool xfermodeIsOverwrite(const SkPaint& paint) |
| +{ |
| + SkXfermode* xfermode = paint.getXfermode(); |
| + if (!xfermode) |
| + return false; // default to kSrcOver_Mode |
| + SkXfermode::Mode mode; |
| + if (!xfermode->asMode(&mode)) |
| + return false; |
| + switch (mode) { |
| + case SkXfermode::kSrc_Mode: |
| + case SkXfermode::kClear_Mode: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| // Returns true if the xfermode will keep the dst opaque, assuming the dst is already opaque. |
| static inline bool xfermodePreservesOpaque(const SkPaint& paint, bool srcIsOpaque) |
| { |
| @@ -302,14 +320,21 @@ void OpaqueRegionSkia::didDraw(const GraphicsContext* context, const SkRect& rec |
| else if (!targetRect.intersect(deviceClipRect)) |
| return; |
| + if (m_treatOverwriteAsOpaque && fillsBounds && xfermodeIsOverwrite(paint)) { |
| + markRectAsOpaque(targetRect); |
| + return; |
| + } |
| + |
| bool drawsOpaque = paintIsOpaque(paint, drawType, sourceBitmap); |
| bool xfersOpaque = xfermodeIsOpaque(paint, drawsOpaque); |
| - bool preservesOpaque = xfermodePreservesOpaque(paint, drawsOpaque); |
| - if (fillsBounds && xfersOpaque) |
| + if (fillsBounds && xfersOpaque) { |
| markRectAsOpaque(targetRect); |
| - else if (!preservesOpaque) |
| - markRectAsNonOpaque(targetRect); |
| + } else if (!m_treatOverwriteAsOpaque) { |
| + bool preservesOpaque = xfermodePreservesOpaque(paint, drawsOpaque); |
| + if (!preservesOpaque) |
|
Stephen White
2014/07/25 19:29:06
Nit: unless I'm missing something, this could all
|
| + markRectAsNonOpaque(targetRect); |
| + } |
| } |
| void OpaqueRegionSkia::didDrawUnbounded(const GraphicsContext* context, const SkPaint& paint, DrawType drawType) |