15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
2883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
29a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/BitmapImage.h"
3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/graphics/DisplayList.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBuffer.h"
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/skia/NativeImageSkia.h"
3307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h"
3407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "third_party/skia/include/core/SkCanvas.h"
3510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "third_party/skia/include/core/SkPicture.h"
3683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include <gtest/gtest.h>
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define EXPECT_EQ_RECT(a, b) \
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(a.x(), b.x()); \
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(a.y(), b.y()); \
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(a.width(), b.width()); \
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(a.height(), b.height());
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define EXPECT_PIXELS_MATCH(bitmap, opaqueRect) \
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ \
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkAutoLockPixels locker(bitmap); \
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int y = opaqueRect.y(); y < opaqueRect.maxY(); ++y) \
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int x = opaqueRect.x(); x < opaqueRect.maxX(); ++x) { \
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int alpha = *bitmap.getAddr32(x, y) >> 24; \
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            EXPECT_EQ(255, alpha); \
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } \
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define EXPECT_PIXELS_MATCH_EXACT(bitmap, opaqueRect) \
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ \
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkAutoLockPixels locker(bitmap); \
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int y = 0; y < bitmap.height(); ++y) \
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int x = 0; x < bitmap.width(); ++x) {     \
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int alpha = *bitmap.getAddr32(x, y) >> 24; \
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bool opaque = opaqueRect.contains(x, y); \
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            EXPECT_EQ(opaque, alpha == 255); \
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } \
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6983750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueTest)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), alpha, CompositeSourceOver);
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(99, 13, 10, 90), opaque, CompositePlusLighter);
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(99, 13, 10, 90), opaque, CompositeSourceIn);
9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(99, 13, 10, 90), alpha, CompositeSourceIn);
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 89, 90), context.opaqueRegion().asRect());
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(8, 8, 3, 90), opaque, CompositeSourceOut);
10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(11, 10, 88, 90), context.opaqueRegion().asRect());
10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(30, 30, 290, 290), opaque, CompositeSourceOver);
10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 290, 290), context.opaqueRegion().asRect());
10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(40, 20, 290, 50), opaque, CompositeSourceOver);
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 290, 290), context.opaqueRegion().asRect());
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 390, 50), opaque, CompositeSourceIn);
11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 290, 290), context.opaqueRegion().asRect());
11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 390, 50), alpha);
11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 290, 290), context.opaqueRegion().asRect());
12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 390, 50), opaque, CompositeSourceOver);
12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 10, 290, 310), context.opaqueRegion().asRect());
12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12783750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueClipTest)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(FloatRect(0, 0, 10, 10));
1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
14953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(FloatRect(20, 20, 10, 10));
1585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
15953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 10, 10), context.opaqueRegion().asRect());
16053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
16353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The intersection of the two clips becomes empty.
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(FloatRect(30, 20, 10, 10));
1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
16853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
16953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
17353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The transform and the clip need to interact correctly (transform first)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.translate(10, 10);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(FloatRect(20, 20, 10, 10));
1795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
18053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 10, 10), context.opaqueRegion().asRect());
18153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
18553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The transform and the clip need to interact correctly (clip first)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(FloatRect(20, 20, 10, 10));
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.translate(10, 10);
1915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
19253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 10, 10), context.opaqueRegion().asRect());
19353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(10, 10, 90, 90));
19753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Path path;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(0, 0));
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(100, 0));
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Non-rectangular clips just cause the paint to be considered non-opaque.
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clipPath(path, RULE_EVENODD);
2065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
20753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
20853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Another non-rectangular clip.
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(IntRect(30, 30, 20, 20));
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clipOut(IntRect(30, 30, 10, 10));
2155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
21653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
21753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22183750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackImageMask)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
229c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Image masks are done by drawing a bitmap into a transparency layer that uses DstIn to mask
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out a transparency layer below that is filled with the mask color. In the end this should
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // not be marked opaque.
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(1);
2405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 10, 10), opaque, CompositeSourceOver);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeDestinationIn);
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(1);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<ImageBuffer> alphaImage = ImageBuffer::create(IntSize(100, 100));
2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_FALSE(!alphaImage);
2475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    alphaImage->context()->fillRect(IntRect(0, 0, 100, 100), alpha);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
2505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImageBuffer(alphaImage.get(), FloatRect(10, 10, 10, 10));
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
252c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
253c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
25653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25983750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackImageMaskWithOpaqueRect)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Image masks are done by drawing a bitmap into a transparency layer that uses DstIn to mask
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // out a transparency layer below that is filled with the mask color. In the end this should
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // not be marked opaque.
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(1);
2785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 10, 10), opaque, CompositeSourceOver);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeDestinationIn);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(1);
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<ImageBuffer> alphaImage = ImageBuffer::create(IntSize(100, 100));
2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_FALSE(!alphaImage);
2855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    alphaImage->context()->fillRect(IntRect(0, 0, 100, 100), alpha);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
2885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImageBuffer(alphaImage.get(), FloatRect(10, 10, 10, 10));
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We can't have an opaque mask actually, but we can pretend here like it would look if we did.
2915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(12, 12, 3, 3), opaque, CompositeSourceOver);
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
293c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
294c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(12, 12, 3, 3), context.opaqueRegion().asRect());
29753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30083750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueJoinTest)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 20, 10, 10), opaque, CompositeSourceOver);
31353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 10, 10), context.opaqueRegion().asRect());
31453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Doesn't join
3175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(31, 20, 10, 10), opaque, CompositeSourceOver);
31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 10, 10), context.opaqueRegion().asRect());
31953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Does join
3225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(30, 20, 10, 10), opaque, CompositeSourceOver);
32353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 20, 10), context.opaqueRegion().asRect());
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Doesn't join
3275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 31, 20, 10), opaque, CompositeSourceOver);
32853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 20, 10), context.opaqueRegion().asRect());
32953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Does join
3325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 30, 20, 10), opaque, CompositeSourceOver);
33353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 20, 20), context.opaqueRegion().asRect());
33453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Doesn't join
3375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(9, 20, 10, 20), opaque, CompositeSourceOver);
33853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 20, 20), context.opaqueRegion().asRect());
33953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Does join
3425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 20, 10, 20), opaque, CompositeSourceOver);
34353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 20, 30, 20), context.opaqueRegion().asRect());
34453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Doesn't join
3475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 9, 30, 10), opaque, CompositeSourceOver);
34853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 20, 30, 20), context.opaqueRegion().asRect());
34953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Does join
3525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 30, 10), opaque, CompositeSourceOver);
35353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 30, 30), context.opaqueRegion().asRect());
35453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35783750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueLineTest)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
3607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
365c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setMiterLimit(0);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeThickness(4);
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineCap(SquareCap);
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeStyle(SolidStroke);
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
37853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
37953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceIn);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
3845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(alpha);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 0), IntPoint(100, 0));
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
38753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
38853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
3915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(opaque);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 10), IntPoint(100, 10));
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
39453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
39553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(alpha);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 10), IntPoint(100, 10));
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 13, 90, 87), context.opaqueRegion().asRect());
40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(alpha);
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 11), IntPoint(100, 11));
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 14, 90, 86), context.opaqueRegion().asRect());
40953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(true);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
41653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceIn);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(alpha);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 0), IntPoint(100, 0));
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
42453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
42553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
4295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(opaque);
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 10), IntPoint(100, 10));
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
43253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
43353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(true);
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
4375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(opaque);
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 10), IntPoint(100, 10));
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
44053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 13, 90, 87), context.opaqueRegion().asRect());
44153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
4445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setStrokeColor(alpha);
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.drawLine(IntPoint(0, 11), IntPoint(100, 11));
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
44753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 14, 90, 86), context.opaqueRegion().asRect());
44853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45183750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaquePathTest)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
4547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
458c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
46453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
46553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setMiterLimit(1);
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeThickness(5);
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineCap(SquareCap);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeStyle(SolidStroke);
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceIn);
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Path path;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(0, 0));
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(100, 0));
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.fillPath(path);
48053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
48153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.clear();
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(opaque);
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(0, 10));
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(100, 13));
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.fillPath(path);
48853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
48953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.clear();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(0, 10));
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(100, 13));
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.fillPath(path);
49653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 13, 90, 87), context.opaqueRegion().asRect());
49753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.clear();
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(0, 14));
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(100, 10));
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.fillPath(path);
50453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 14, 90, 86), context.opaqueRegion().asRect());
50553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.clear();
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50983750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueImageTest)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
5127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
516c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkBitmap opaqueBitmap;
5227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    opaqueBitmap.allocN32Pixels(10, 10, true /* opaque */);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (int y = 0; y < opaqueBitmap.height(); ++y)
52553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (int x = 0; x < opaqueBitmap.width(); ++x)
52653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
52753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RefPtr<BitmapImage> opaqueImage = BitmapImage::create(NativeImageSkia::create(opaqueBitmap));
528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_TRUE(opaqueImage->currentFrameKnownToBeOpaque());
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkBitmap alphaBitmap;
5317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    alphaBitmap.allocN32Pixels(10, 10);
53253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
53353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (int y = 0; y < alphaBitmap.height(); ++y)
53453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (int x = 0; x < alphaBitmap.width(); ++x)
53553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            *alphaBitmap.getAddr32(x, y) = 0x00000000;
53653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RefPtr<BitmapImage> alphaImage = BitmapImage::create(NativeImageSkia::create(alphaBitmap));
537926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(alphaImage->currentFrameKnownToBeOpaque());
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
54053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
54153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(opaqueImage.get(), IntPoint(0, 0));
54453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
54553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(alphaImage.get(), IntPoint(0, 0));
54753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
54853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(opaqueImage.get(), IntPoint(5, 5));
55153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(alphaImage.get(), IntPoint(5, 5));
55453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
55553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(opaqueImage.get(), IntPoint(10, 10));
55853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
55953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(alphaImage.get(), IntPoint(10, 10));
56153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
56253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(alphaImage.get(), IntPoint(20, 10), CompositeSourceIn);
56553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 20, 90, 80), context.opaqueRegion().asRect());
56653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    context.setAlphaAsFloat(0.5);
5705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(opaqueImage.get(), IntPoint(25, 15), CompositeSourceIn);
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
57253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 25, 90, 75), context.opaqueRegion().asRect());
57353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
57653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
57753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(alphaImage.get(), IntPoint(10, 20), CompositeSourceIn);
58053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 10, 80, 90), context.opaqueRegion().asRect());
58153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    context.setAlphaAsFloat(0.5);
5855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.drawImage(opaqueImage.get(), IntPoint(15, 25), CompositeSourceIn);
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
58753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(25, 10, 75, 90), context.opaqueRegion().asRect());
58853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59183750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueOvalTest)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
5947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
599c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect());
60553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
607f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.fillEllipse(FloatRect(10, 10, 90, 90));
608f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.strokeEllipse(FloatRect(10, 10, 90, 90));
60953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect());
61053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
61353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
61453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceIn);
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(opaque);
621f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.fillEllipse(FloatRect(10, 10, 50, 30));
622f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.strokeEllipse(FloatRect(10, 10, 50, 30));
62353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
62453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
627f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.fillEllipse(FloatRect(10, 10, 30, 50));
628f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.strokeEllipse(FloatRect(10, 10, 30, 50));
62953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(40, 10, 60, 90), context.opaqueRegion().asRect());
63053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(true);
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(opaque);
635f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.fillEllipse(FloatRect(10, 10, 50, 30));
636f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.strokeEllipse(FloatRect(10, 10, 50, 30));
63753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(40, 41, 60, 59), context.opaqueRegion().asRect());
63853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
641f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.fillEllipse(FloatRect(20, 10, 30, 50));
642f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context.strokeEllipse(FloatRect(20, 10, 30, 50));
64353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(51, 41, 49, 59), context.opaqueRegion().asRect());
64453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64783750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueRoundedRectTest)
648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap bitmap;
6507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas canvas(bitmap);
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
65353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
654c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntSize radii(10, 10);
659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
66053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect());
66153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRoundedRect(IntRect(10, 10, 90, 90), radii, radii, radii, radii, opaque);
66453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect());
66553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
66853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
66953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceIn);
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    context.setShouldAntialias(false);
673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRoundedRect(IntRect(10, 10, 50, 30), radii, radii, radii, radii, opaque);
67553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
67653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRoundedRect(IntRect(10, 10, 30, 50), radii, radii, radii, radii, alpha);
67953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(40, 10, 60, 90), context.opaqueRegion().asRect());
68053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRoundedRect(IntRect(10, 0, 50, 30), radii, radii, radii, radii, alpha);
68353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(40, 30, 60, 70), context.opaqueRegion().asRect());
68453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRoundedRect(IntRect(30, 0, 70, 50), radii, radii, radii, radii, opaque);
68753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(40, 30, 60, 70), context.opaqueRegion().asRect());
68853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
69183750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueTextTest)
692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
69393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    int width = 200, height = 200;
694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap bitmap;
6957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(width, height);
696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bitmap.eraseColor(0);
697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas canvas(bitmap);
69893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    SkRect textRect = SkRect::MakeWH(width, height);
699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
70053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
701c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
705926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPaint opaquePaint;
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    opaquePaint.setColor(opaque.rgb());
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    opaquePaint.setXfermodeMode(SkXfermode::kSrc_Mode);
709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPaint alphaPaint;
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    alphaPaint.setColor(alpha.rgb());
711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    alphaPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPoint point = SkPoint::Make(0, 0);
714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(50, 50, 50, 50), opaque, CompositeSourceOver);
71653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), context.opaqueRegion().asRect());
71753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    context.drawPosText("A", 1, &point, textRect, opaquePaint);
72053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), context.opaqueRegion().asRect());
72153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
72393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    context.drawPosText("A", 1, &point, textRect, alphaPaint);
72453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(0, 0, 0, 0), context.opaqueRegion().asRect());
72553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(50, 50, 50, 50), opaque, CompositeSourceOver);
72853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), context.opaqueRegion().asRect());
72953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(50, 50, 50, 50), opaque, CompositeSourceOver);
73253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(50, 50, 50, 50), context.opaqueRegion().asRect());
73353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73683750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueWritePixelsTest)
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap bitmap;
7397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bitmap.eraseColor(0);
741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas canvas(bitmap);
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
744c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap opaqueBitmap;
7497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    opaqueBitmap.allocN32Pixels(10, 10, true /* opaque */);
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < opaqueBitmap.height(); ++y)
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < opaqueBitmap.width(); ++x)
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap alphaBitmap;
7557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    alphaBitmap.allocN32Pixels(10, 10);
756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < alphaBitmap.height(); ++y)
757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < alphaBitmap.width(); ++x)
758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *alphaBitmap.getAddr32(x, y) = 0x00000000;
759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPaint paint;
761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
76353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.writePixels(opaqueBitmap, 50, 50);
76453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(50, 50, 10, 10), context.opaqueRegion().asRect());
76553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
76853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
76953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.writePixels(alphaBitmap, 10, 0);
77253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
77353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.writePixels(alphaBitmap, 10, 1);
77653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
77753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.writePixels(alphaBitmap, 0, 10);
78053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
78153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
782926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
78353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.writePixels(alphaBitmap, 1, 10);
78453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), context.opaqueRegion().asRect());
78553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
786926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
787926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
78883750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueDrawBitmapTest)
789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
790926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap bitmap;
7917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
792926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bitmap.eraseColor(0);
793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas canvas(bitmap);
794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
79553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
796c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap opaqueBitmap;
8017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    opaqueBitmap.allocN32Pixels(10, 10, true /* opaque */);
802926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < opaqueBitmap.height(); ++y)
803926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < opaqueBitmap.width(); ++x)
804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap alphaBitmap;
8077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    alphaBitmap.allocN32Pixels(10, 10);
808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < alphaBitmap.height(); ++y)
809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < alphaBitmap.width(); ++x)
810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *alphaBitmap.getAddr32(x, y) = 0x00000000;
811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPaint paint;
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
81553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmap(opaqueBitmap, 10, 10, &paint);
81653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 10, 10), context.opaqueRegion().asRect());
81753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 90, 90), opaque, CompositeSourceOver);
82053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
82153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmap(alphaBitmap, 10, 0, &paint);
82453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
82553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmap(alphaBitmap, 10, 1, &paint);
82853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
82953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
83153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmap(alphaBitmap, 0, 10, &paint);
83253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
83353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
83553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmap(alphaBitmap, 1, 10, &paint);
83653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), context.opaqueRegion().asRect());
83753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
84083750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, trackOpaqueDrawBitmapRectTest)
841926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
842926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap bitmap;
8437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(200, 200);
844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bitmap.eraseColor(0);
845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas canvas(bitmap);
846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
84753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
848c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap opaqueBitmap;
8537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    opaqueBitmap.allocN32Pixels(10, 10, true /* opaque */);
854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < opaqueBitmap.height(); ++y)
855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < opaqueBitmap.width(); ++x)
856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *opaqueBitmap.getAddr32(x, y) = 0xFFFFFFFF;
857926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkBitmap alphaBitmap;
8597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    alphaBitmap.allocN32Pixels(10, 10);
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int y = 0; y < alphaBitmap.height(); ++y)
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (int x = 0; x < alphaBitmap.width(); ++x)
862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *alphaBitmap.getAddr32(x, y) = 0x00000000;
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkPaint paint;
865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
86753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmapRect(opaqueBitmap, 0, SkRect::MakeXYWH(10, 10, 90, 90), &paint);
86853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
86953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(10, 0, 10, 10), &paint);
87253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 90, 90), context.opaqueRegion().asRect());
87353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(10, 0, 10, 11), &paint);
87653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
87753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(0, 10, 10, 10), &paint);
88053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 11, 90, 89), context.opaqueRegion().asRect());
88153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
882926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
88353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    context.drawBitmapRect(alphaBitmap, 0, SkRect::MakeXYWH(0, 10, 11, 10), &paint);
88453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(11, 11, 89, 89), context.opaqueRegion().asRect());
88553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
88883750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, contextTransparencyLayerTest)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
8917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
896c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
89781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
8995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 20, 10, 10), opaque, CompositeSourceOver);
90053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 10, 10), context.opaqueRegion().asRect());
90153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
90281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(20, 20, 10, 10));
90453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.save();
9085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 20, 10, 10), opaque, CompositeSourceOver);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.restore();
910c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
91153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clearRect(FloatRect(20, 20, 10, 10));
91453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
9175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(20, 20, 10, 10), opaque, CompositeSourceOver);
918c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
91953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92283750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, UnboundedDrawsAreClipped)
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
9257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
930c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Path path;
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setMiterLimit(1);
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeThickness(5);
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineCap(SquareCap);
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeStyle(SolidStroke);
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make skia unable to compute fast bounds for our paths.
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DashArray dashArray;
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dashArray.append(1);
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dashArray.append(0);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineDash(dashArray, 0);
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make the device opaque in 10,10 40x40.
9495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 40, 40), opaque, CompositeSourceOver);
95053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 40, 40), context.opaqueRegion().asRect());
95153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clip to the left edge of the opaque area.
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.clip(IntRect(10, 10, 10, 40));
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Draw a path that gets clipped. This should destroy the opaque area but only inside the clip.
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
9585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(alpha);
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(10, 10));
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(40, 40));
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.strokePath(path);
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 10, 30, 40), context.opaqueRegion().asRect());
96453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96783750176c3ee2cea66c8a9751271026a5901be3aBen MurdochTEST(GraphicsContextTest, PreserveOpaqueOnlyMattersForFirstLayer)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap bitmap;
9707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap.eraseColor(0);
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkCanvas canvas(bitmap);
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext context(&canvas);
975c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color alpha(0.0f, 0.0f, 0.0f, 0.0f);
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Path path;
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setShouldAntialias(false);
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setMiterLimit(1);
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeThickness(5);
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineCap(SquareCap);
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setStrokeStyle(SolidStroke);
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make skia unable to compute fast bounds for our paths.
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DashArray dashArray;
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dashArray.append(1);
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dashArray.append(0);
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setLineDash(dashArray, 0);
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make the device opaque in 10,10 40x40.
9945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 40, 40), opaque, CompositeSourceOver);
99553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 40, 40), context.opaqueRegion().asRect());
99653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Begin a layer that preserves opaque.
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Begin a layer that does not preserve opaque.
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This should not destroy the device opaqueness.
10075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 40, 40), opaque, CompositeSourceOver);
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This should not destroy the device opaqueness either.
10105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(opaque);
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(10, 10));
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(40, 40));
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.strokePath(path);
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
1016c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
101753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(10, 10, 40, 40), context.opaqueRegion().asRect());
101853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now begin a layer that does not preserve opaque and draw through it to the device.
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This should destroy the device opaqueness.
10255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.fillRect(FloatRect(10, 10, 40, 40), opaque, CompositeSourceOver);
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1027c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
102853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
102953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now we draw with a path for which it cannot compute fast bounds. This should destroy the entire opaque region.
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.beginTransparencyLayer(0.5);
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This should nuke the device opaqueness.
10375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    context.setFillColor(opaque);
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.moveTo(FloatPoint(10, 10));
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    path.addLineTo(FloatPoint(40, 40));
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context.strokePath(path);
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1042c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    context.endLayer();
104353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
104453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_PIXELS_MATCH_EXACT(bitmap, context.opaqueRegion().asRect());
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1047e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)TEST(GraphicsContextTest, OpaqueRegionForLayerWithNonRectDeviceClip)
1048e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
1049e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SkBitmap bitmap;
10507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(100, 100);
1051e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bitmap.eraseColor(0);
1052e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SkCanvas canvas(bitmap);
1053e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1054e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    GraphicsContext context(&canvas);
1055e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
1056e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
1057e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1058e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.fillRect(FloatRect(30, 30, 90, 90), opaque, CompositeSourceOver);
1059e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1060e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
1061e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.beginTransparencyLayer(0.5);
1062e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.endLayer();
1063e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 70, 70), context.opaqueRegion().asRect());
1064e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1065e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Path path;
1066e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    path.moveTo(FloatPoint(0, 0));
1067e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    path.addLineTo(FloatPoint(50, 50));
1068e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1069e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // For opaque preserving mode and deviceClip is not rect
1070e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // we will not alter opaque rect.
1071e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.clipPath(path, RULE_EVENODD);
1072e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1073e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
1074e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.beginTransparencyLayer(0.5);
1075e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.endLayer();
1076e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 70, 70), context.opaqueRegion().asRect());
1077e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1078e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // For non-opaque preserving mode and deviceClip is not rect
1079e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // we will mark opaque rect as empty.
1080e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
1081e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.beginTransparencyLayer(0.5);
1082e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1083e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.endLayer();
1084e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1085e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1086e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1087e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)TEST(GraphicsContextTest, OpaqueRegionForLayerWithRectDeviceClip)
1088e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
1089e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SkBitmap bitmap;
10907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(100, 100);
1091e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bitmap.eraseColor(0);
1092e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    SkCanvas canvas(bitmap);
1093e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1094e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Color opaque(1.0f, 0.0f, 0.0f, 1.0f);
1095e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1096e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    GraphicsContext context(&canvas);
1097e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setRegionTrackingMode(GraphicsContext::RegionTrackingOpaque);
1098e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1099e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.fillRect(FloatRect(30, 30, 90, 90), opaque, CompositeSourceOver);
1100e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(30, 30, 70, 70), context.opaqueRegion().asRect());
1101e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1102e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // For non-opaque preserving mode and deviceClip is rect
1103e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // we will mark device clip rect as non opaque.
1104e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceOut);
1105e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.beginTransparencyLayer(0.5);
1106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.endLayer();
1107e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(), context.opaqueRegion().asRect());
1108e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1109e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1110e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.clip(FloatRect(0, 0, 50, 50));
1111e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.fillRect(FloatRect(20, 20, 100, 100), opaque, CompositeSourceOver);
1112e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1113e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // For opaque preserving mode and deviceClip is rect
1114e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // we will intersect device clip rect with src opaque rect.
1115e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.setCompositeOperation(CompositeSourceOver);
1116e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.beginTransparencyLayer(0.5);
1117e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    context.endLayer();
1118e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ_RECT(IntRect(20, 20, 30, 30), context.opaqueRegion().asRect());
1119e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_PIXELS_MATCH(bitmap, context.opaqueRegion().asRect());
1120e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1121e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
11225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#define DISPATCH1(c1, c2, op, param1) do { c1.op(param1); c2.op(param1); } while (0);
11235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#define DISPATCH2(c1, c2, op, param1, param2) do { c1.op(param1, param2); c2.op(param1, param2); } while (0);
112451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
112551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TEST(GraphicsContextTest, RecordingTotalMatrix)
112651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
112751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SkBitmap bitmap;
11287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(400, 400);
112951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bitmap.eraseColor(0);
113051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SkCanvas canvas(bitmap);
113151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    GraphicsContext context(&canvas);
113251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
113307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    SkCanvas controlCanvas(400, 400);
113451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    GraphicsContext controlContext(&controlCanvas);
113551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
113651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
11375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DISPATCH2(context, controlContext, scale, 2, 2);
113851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
113951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
114051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    controlContext.save();
114151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    context.beginRecording(FloatRect(0, 0, 200, 200));
11425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DISPATCH2(context, controlContext, translate, 10, 10);
114351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
114451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
114551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    controlContext.save();
114651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    context.beginRecording(FloatRect(10, 10, 100, 100));
11475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DISPATCH1(context, controlContext, rotate, 45);
114851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
114951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
115051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    controlContext.restore();
115151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    context.endRecording();
115251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
115351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
115451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    controlContext.restore();
115551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    context.endRecording();
115651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(context.getCTM(), controlContext.getCTM());
115751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
115851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
11597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST(GraphicsContextTest, RecordingCanvas)
116010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
11617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SkBitmap bitmap;
11627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.allocN32Pixels(1, 1);
11637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bitmap.eraseColor(0);
11647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SkCanvas canvas(bitmap);
11657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    GraphicsContext context(&canvas);
116610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
11677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    FloatRect rect(0, 0, 1, 1);
116810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
116910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Two beginRecordings in a row generate two canvases.
117010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Unfortunately the new one could be allocated in the same
117110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // spot as the old one so ref the first one to prolong its life.
11727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context.beginRecording(rect);
11737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SkCanvas* canvas1 = context.canvas();
117410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_TRUE(canvas1);
11757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context.beginRecording(rect);
11767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SkCanvas* canvas2 = context.canvas();
117710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_TRUE(canvas2);
117810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
117910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_NE(canvas1, canvas2);
118010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_EQ(1, canvas1->getRefCnt());
118110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
118210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // endRecording finally makes the picture accessible
11837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtr<DisplayList> dl = context.endRecording();
11847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    SkPicture* pic = dl->picture();
118510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_TRUE(pic);
118610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_EQ(1, pic->getRefCnt());
11877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
11887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context.endRecording();
118910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
119010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1192