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