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) |