Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Unified Diff: Source/platform/graphics/skia/OpaqueRegionSkia.cpp

Issue 413313002: Treat calls to CanvasRenderingContext2D.clearRect as operations that clear the canvas (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698