Title: [136125] trunk/Source
Revision
136125
Author
fmal...@chromium.org
Date
2012-11-29 05:34:34 -0800 (Thu, 29 Nov 2012)

Log Message

[Skia] Add missing OpaqueRegionSkia notifier calls
https://bugs.webkit.org/show_bug.cgi?id=102824

Reviewed by Stephen White.

Source/WebCore:

http://trac.webkit.org/changeset/135390 exposed some canvas draw clients which are not
updating the opaque region tracker. This patch adds the required notifier calls.

No new tests: platform unit tests added.

* platform/graphics/skia/OpaqueRegionSkia.h:
(OpaqueRegionSkia):
* platform/graphics/skia/PlatformContextSkia.h:
(WebCore::PlatformContextSkia::writePixels):
(WebCore::PlatformContextSkia::drawBitmap):
(WebCore::PlatformContextSkia::drawBitmapRect):
(WebCore::PlatformContextSkia::drawIRect):
(WebCore::PlatformContextSkia::drawPosText):
(WebCore::PlatformContextSkia::drawPosTextH):
(WebCore::PlatformContextSkia::drawTextOnPath):

Source/WebKit/chromium:

Add opaque region tracking unit tests for the new PlatformContextSkia draw methods.

* tests/PlatformContextSkiaTest.cpp:
(WebCore::TEST):
(WebCore):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (136124 => 136125)


--- trunk/Source/WebCore/ChangeLog	2012-11-29 13:25:53 UTC (rev 136124)
+++ trunk/Source/WebCore/ChangeLog	2012-11-29 13:34:34 UTC (rev 136125)
@@ -1,3 +1,26 @@
+2012-11-29  Florin Malita  <fmal...@chromium.org>
+
+        [Skia] Add missing OpaqueRegionSkia notifier calls
+        https://bugs.webkit.org/show_bug.cgi?id=102824
+
+        Reviewed by Stephen White.
+
+        http://trac.webkit.org/changeset/135390 exposed some canvas draw clients which are not
+        updating the opaque region tracker. This patch adds the required notifier calls.
+
+        No new tests: platform unit tests added.
+
+        * platform/graphics/skia/OpaqueRegionSkia.h:
+        (OpaqueRegionSkia):
+        * platform/graphics/skia/PlatformContextSkia.h:
+        (WebCore::PlatformContextSkia::writePixels):
+        (WebCore::PlatformContextSkia::drawBitmap):
+        (WebCore::PlatformContextSkia::drawBitmapRect):
+        (WebCore::PlatformContextSkia::drawIRect):
+        (WebCore::PlatformContextSkia::drawPosText):
+        (WebCore::PlatformContextSkia::drawPosTextH):
+        (WebCore::PlatformContextSkia::drawTextOnPath):
+
 2012-11-29  Andy Shaw  <andy.s...@digia.com>
 
         [Qt] Implement support for Cocoa based NPAPI plugins on Mac

Modified: trunk/Source/WebCore/platform/graphics/skia/OpaqueRegionSkia.h (136124 => 136125)


--- trunk/Source/WebCore/platform/graphics/skia/OpaqueRegionSkia.h	2012-11-29 13:25:53 UTC (rev 136124)
+++ trunk/Source/WebCore/platform/graphics/skia/OpaqueRegionSkia.h	2012-11-29 13:34:34 UTC (rev 136125)
@@ -57,16 +57,17 @@
 
     void setImageMask(const SkRect& imageOpaqueRect);
 
+    enum DrawType {
+        FillOnly,
+        FillOrStroke
+    };
+
     void didDrawRect(const PlatformContextSkia*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap);
     void didDrawPath(const PlatformContextSkia*, const SkPath&, const SkPaint&);
     void didDrawPoints(const PlatformContextSkia*, SkCanvas::PointMode, int numPoints, const SkPoint[], const SkPaint&);
     void didDrawBounded(const PlatformContextSkia*, const SkRect&, const SkPaint&);
+    void didDrawUnbounded(const PlatformContextSkia*, const SkPaint&, DrawType);
 
-    enum DrawType {
-        FillOnly,
-        FillOrStroke
-    };
-
     struct CanvasLayerState {
         CanvasLayerState()
             : hasImageMask(false)
@@ -85,7 +86,6 @@
 
 private:
     void didDraw(const PlatformContextSkia*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap, bool fillsBounds, DrawType);
-    void didDrawUnbounded(const PlatformContextSkia*, const SkPaint&, DrawType);
     void applyOpaqueRegionFromLayer(const PlatformContextSkia*, const SkRect& layerOpaqueRect, const SkPaint&);
     void markRectAsOpaque(const SkRect&);
     void markRectAsNonOpaque(const SkRect&);

Modified: trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h (136124 => 136125)


--- trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h	2012-11-29 13:25:53 UTC (rev 136124)
+++ trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h	2012-11-29 13:34:34 UTC (rev 136125)
@@ -302,6 +302,14 @@
     SkCanvas::Config8888 config8888)
 {
     m_canvas->writePixels(bitmap, x, y, config8888);
+
+    if (m_trackOpaqueRegion) {
+        SkRect rect = SkRect::MakeXYWH(x, y, bitmap.width(), bitmap.height());
+        SkPaint paint;
+
+        paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+        m_opaqueRegion.didDrawRect(this, rect, paint, &bitmap);
+    }
 }
 
 inline bool PlatformContextSkia::isDrawingToLayer() const
@@ -363,12 +371,20 @@
     const SkPaint* paint)
 {
     m_canvas->drawBitmap(bitmap, left, top, paint);
+
+    if (m_trackOpaqueRegion) {
+        SkRect rect = SkRect::MakeXYWH(left, top, bitmap.width(), bitmap.height());
+        m_opaqueRegion.didDrawRect(this, rect, *paint, &bitmap);
+    }
 }
 
 inline void PlatformContextSkia::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* isrc,
     const SkRect& dst, const SkPaint* paint)
 {
     m_canvas->drawBitmapRect(bitmap, isrc, dst, paint);
+
+    if (m_trackOpaqueRegion)
+        m_opaqueRegion.didDrawRect(this, dst, *paint, &bitmap);
 }
 
 inline void PlatformContextSkia::drawOval(const SkRect& oval, const SkPaint& paint)
@@ -407,24 +423,41 @@
 inline void PlatformContextSkia::drawIRect(const SkIRect& rect, const SkPaint& paint)
 {
     m_canvas->drawIRect(rect, paint);
+
+    if (m_trackOpaqueRegion) {
+        SkRect r = SkRect::MakeFromIRect(rect);
+        m_opaqueRegion.didDrawRect(this, r, paint, 0);
+    }
 }
 
 inline void PlatformContextSkia::drawPosText(const void* text, size_t byteLength,
     const SkPoint pos[], const SkPaint& paint)
 {
     m_canvas->drawPosText(text, byteLength, pos, paint);
+
+    // FIXME: compute bounds for positioned text.
+    if (m_trackOpaqueRegion)
+        m_opaqueRegion.didDrawUnbounded(this, paint, OpaqueRegionSkia::FillOrStroke);
 }
 
 inline void PlatformContextSkia::drawPosTextH(const void* text, size_t byteLength,
     const SkScalar xpos[], SkScalar constY, const SkPaint& paint)
 {
     m_canvas->drawPosTextH(text, byteLength, xpos, constY, paint);
+
+    // FIXME: compute bounds for positioned text.
+    if (m_trackOpaqueRegion)
+        m_opaqueRegion.didDrawUnbounded(this, paint, OpaqueRegionSkia::FillOrStroke);
 }
 
 inline void PlatformContextSkia::drawTextOnPath(const void* text, size_t byteLength,
     const SkPath& path, const SkMatrix* matrix, const SkPaint& paint)
 {
     m_canvas->drawTextOnPath(text, byteLength, path, matrix, paint);
+
+    // FIXME: compute bounds for positioned text.
+    if (m_trackOpaqueRegion)
+        m_opaqueRegion.didDrawUnbounded(this, paint, OpaqueRegionSkia::FillOrStroke);
 }
 
 }

Modified: trunk/Source/WebKit/chromium/ChangeLog (136124 => 136125)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-11-29 13:25:53 UTC (rev 136124)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-11-29 13:34:34 UTC (rev 136125)
@@ -1,3 +1,16 @@
+2012-11-29  Florin Malita  <fmal...@chromium.org>
+
+        [Skia] Add missing OpaqueRegionSkia notifier calls
+        https://bugs.webkit.org/show_bug.cgi?id=102824
+
+        Reviewed by Stephen White.
+
+        Add opaque region tracking unit tests for the new PlatformContextSkia draw methods.
+
+        * tests/PlatformContextSkiaTest.cpp:
+        (WebCore::TEST):
+        (WebCore):
+
 2012-11-29  Miguel Garcia  <migu...@chromium.org>
 
         Fix typo in description of openDateTimeChooser documentation

Modified: trunk/Source/WebKit/chromium/tests/PlatformContextSkiaTest.cpp (136124 => 136125)


--- trunk/Source/WebKit/chromium/tests/PlatformContextSkiaTest.cpp	2012-11-29 13:25:53 UTC (rev 136124)
+++ trunk/Source/WebKit/chromium/tests/PlatformContextSkiaTest.cpp	2012-11-29 13:34:34 UTC (rev 136125)
@@ -664,6 +664,283 @@
     EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
 }
 
+TEST(PlatformContextSkiaTest, trackOpaqueIRectTest)
+{
+    SkBitmap bitmap;
+    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
+    bitmap.allocPixels();
+    bitmap.eraseColor(0);
+    SkCanvas canvas(bitmap);
+
+    PlatformContextSkia platformContext(&canvas);
+    platformContext.setTrackOpaqueRegion(true);
+    GraphicsContext context(&platformContext);
+
+    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
+    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
+
+    SkPaint opaquePaint;
+    opaquePaint.setColor(opaque.rgb());
+    opaquePaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+    SkPaint alphaPaint;
+    alphaPaint.setColor(alpha.rgb());
+    alphaPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawIRect(SkIRect::MakeXYWH(10, 10, 90, 90), opaquePaint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawIRect(SkIRect::MakeXYWH(0, 0, 100, 10), alphaPaint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawIRect(SkIRect::MakeXYWH(0, 0, 100, 20), alphaPaint);
+    EXPECT_EQ_RECT(IntRect(10, 20, 90, 80), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawIRect(SkIRect::MakeXYWH(50, 0, 50, 100), alphaPaint);
+    EXPECT_EQ_RECT(IntRect(10, 20, 40, 80), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+}
+
+TEST(PlatformContextSkiaTest, trackOpaqueTextTest)
+{
+    SkBitmap bitmap;
+    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
+    bitmap.allocPixels();
+    bitmap.eraseColor(0);
+    SkCanvas canvas(bitmap);
+
+    PlatformContextSkia platformContext(&canvas);
+    platformContext.setTrackOpaqueRegion(true);
+    GraphicsContext context(&platformContext);
+
+    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
+    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
+
+    SkPaint opaquePaint;
+    opaquePaint.setColor(opaque.rgb());
+    opaquePaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+    SkPaint alphaPaint;
+    alphaPaint.setColor(alpha.rgb());
+    alphaPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+    SkPoint point = SkPoint::Make(0, 0);
+    SkScalar pointX = 0;
+    SkPath path;
+    path.moveTo(SkPoint::Make(0, 0));
+    path.lineTo(SkPoint::Make(100, 0));
+
+    context.fillRect(FloatRect(50, 50, 50, 50), opaque, ColorSpaceDeviceRGB, CompositeSourceOver);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawPosText("A", 1, &point, opaquePaint);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawPosText("A", 1, &point, alphaPaint);
+    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    context.fillRect(FloatRect(50, 50, 50, 50), opaque, ColorSpaceDeviceRGB, CompositeSourceOver);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawPosTextH("A", 1, &pointX, 0, opaquePaint);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawPosTextH("A", 1, &pointX, 0, alphaPaint);
+    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    context.fillRect(FloatRect(50, 50, 50, 50), opaque, ColorSpaceDeviceRGB, CompositeSourceOver);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawTextOnPath("A", 1, path, 0, opaquePaint);
+    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawTextOnPath("A", 1, path, 0, alphaPaint);
+    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+}
+
+TEST(PlatformContextSkiaTest, trackOpaqueWritePixelsTest)
+{
+    SkBitmap bitmap;
+    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
+    bitmap.allocPixels();
+    bitmap.eraseColor(0);
+    SkCanvas canvas(bitmap);
+
+    PlatformContextSkia platformContext(&canvas);
+    platformContext.setTrackOpaqueRegion(true);
+    GraphicsContext context(&platformContext);
+
+    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
+
+    SkBitmap opaqueBitmap;
+    opaqueBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    opaqueBitmap.allocPixels();
+    opaqueBitmap.setIsOpaque(true);
+    for (int y = 0; y < opaqueBitmap.height(); ++y)
+        for (int x = 0; x < opaqueBitmap.width(); ++x)
+            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
+
+    SkBitmap alphaBitmap;
+    alphaBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    alphaBitmap.allocPixels();
+    alphaBitmap.setIsOpaque(false);
+    for (int y = 0; y < alphaBitmap.height(); ++y)
+        for (int x = 0; x < alphaBitmap.width(); ++x)
+            *alphaBitmap.getAddr32(x, y) = 0x00000000;
+
+    SkPaint paint;
+    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+    platformContext.writePixels(opaqueBitmap, 50, 50);
+    EXPECT_EQ_RECT(IntRect(50, 50, 10, 10), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    context.fillRect(FloatRect(10, 10, 90, 90), opaque, ColorSpaceDeviceRGB, CompositeSourceOver);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.writePixels(alphaBitmap, 10, 0);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.writePixels(alphaBitmap, 10, 1);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.writePixels(alphaBitmap, 0, 10);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.writePixels(alphaBitmap, 1, 10);
+    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+}
+
+TEST(PlatformContextSkiaTest, trackOpaqueDrawBitmapTest)
+{
+    SkBitmap bitmap;
+    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
+    bitmap.allocPixels();
+    bitmap.eraseColor(0);
+    SkCanvas canvas(bitmap);
+
+    PlatformContextSkia platformContext(&canvas);
+    platformContext.setTrackOpaqueRegion(true);
+    GraphicsContext context(&platformContext);
+
+    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
+
+    SkBitmap opaqueBitmap;
+    opaqueBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    opaqueBitmap.allocPixels();
+    opaqueBitmap.setIsOpaque(true);
+    for (int y = 0; y < opaqueBitmap.height(); ++y)
+        for (int x = 0; x < opaqueBitmap.width(); ++x)
+            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
+
+    SkBitmap alphaBitmap;
+    alphaBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    alphaBitmap.allocPixels();
+    alphaBitmap.setIsOpaque(false);
+    for (int y = 0; y < alphaBitmap.height(); ++y)
+        for (int x = 0; x < alphaBitmap.width(); ++x)
+            *alphaBitmap.getAddr32(x, y) = 0x00000000;
+
+    SkPaint paint;
+    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+    platformContext.drawBitmap(opaqueBitmap, 10, 10, &paint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 10, 10), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    context.fillRect(FloatRect(10, 10, 90, 90), opaque, ColorSpaceDeviceRGB, CompositeSourceOver);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmap(alphaBitmap, 10, 0, &paint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmap(alphaBitmap, 10, 1, &paint);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmap(alphaBitmap, 0, 10, &paint);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmap(alphaBitmap, 1, 10, &paint);
+    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+}
+
+TEST(PlatformContextSkiaTest, trackOpaqueDrawBitmapRectTest)
+{
+    SkBitmap bitmap;
+    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
+    bitmap.allocPixels();
+    bitmap.eraseColor(0);
+    SkCanvas canvas(bitmap);
+
+    PlatformContextSkia platformContext(&canvas);
+    platformContext.setTrackOpaqueRegion(true);
+    GraphicsContext context(&platformContext);
+
+    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
+
+    SkBitmap opaqueBitmap;
+    opaqueBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    opaqueBitmap.allocPixels();
+    opaqueBitmap.setIsOpaque(true);
+    for (int y = 0; y < opaqueBitmap.height(); ++y)
+        for (int x = 0; x < opaqueBitmap.width(); ++x)
+            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
+
+    SkBitmap alphaBitmap;
+    alphaBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
+    alphaBitmap.allocPixels();
+    alphaBitmap.setIsOpaque(false);
+    for (int y = 0; y < alphaBitmap.height(); ++y)
+        for (int x = 0; x < alphaBitmap.width(); ++x)
+            *alphaBitmap.getAddr32(x, y) = 0x00000000;
+
+    SkPaint paint;
+    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+    platformContext.drawBitmapRect(opaqueBitmap, 0, SkRect::MakeXYWH(10, 10, 90, 90), &paint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(10, 0, 10, 10), &paint);
+    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(10, 0, 10, 11), &paint);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(0, 10, 10, 10), &paint);
+    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+
+    platformContext.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(0, 10, 11, 10), &paint);
+    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), platformContext.opaqueRegion().asRect());
+    EXPECT_PIXELS_MATCH(bitmap, platformContext.opaqueRegion().asRect());
+}
+
 TEST(PlatformContextSkiaTest, contextTransparencyLayerTest)
 {
     SkBitmap bitmap;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to