12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/analysis_canvas.h" 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "skia/ext/refptr.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkPictureRecorder.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkShader.h" 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "third_party/skia/include/effects/SkOffsetImageFilter.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SolidColorFill(skia::AnalysisCanvas& canvas) { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clear(SkColorSetARGB(255, 255, 255, 255)); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TransparentFill(skia::AnalysisCanvas& canvas) { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clear(SkColorSetARGB(0, 0, 0, 0)); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace skia { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, EmptyCanvas) { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color; 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&color)); 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(color, SkColorSetARGB(0, 0, 0, 0)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, ClearCanvas) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Transparent color 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color = SkColorSetARGB(0, 12, 34, 56); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clear(color); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor outputColor; 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Solid color 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(255, 65, 43, 21); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clear(color); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(outputColor, color); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Translucent color 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(128, 11, 22, 33); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clear(color); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test helper methods 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransparentFill(canvas); 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, ComplexActions) { 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Draw paint test. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color = SkColorSetARGB(255, 11, 22, 33); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawPaint(paint); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor outputColor; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) //TODO(vmpstr): This should return true. (crbug.com/180597) 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Draw points test. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPoint points[4] = { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPoint::Make(0, 0), 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPoint::Make(255, 0), 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPoint::Make(255, 255), 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPoint::Make(0, 255) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawPoints(SkCanvas::kLines_PointMode, 4, points, paint); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Draw oval test. 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawOval(SkRect::MakeWH(255, 255), paint); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Draw bitmap test. 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap secondBitmap; 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) secondBitmap.allocN32Pixels(255, 255); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawBitmap(secondBitmap, 0, 0); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, SimpleDrawRect) { 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color = SkColorSetARGB(255, 11, 22, 33); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clipRect(SkRect::MakeWH(255, 255)); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(255, 255), paint); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor outputColor; 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(color, outputColor); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(255, 22, 33, 44); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.translate(-128, -128); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(382, 382), paint); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(255, 33, 44, 55); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(383, 383), paint); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(color, outputColor); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(0, 0, 0, 0); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(383, 383), paint); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This test relies on canvas treating a paint with 0-color as a no-op 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // thus not changing its "is_solid" status. 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(outputColor, SkColorSetARGB(255, 33, 44, 55)); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(128, 128, 128, 128); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(383, 383), paint); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setXfermodeMode(SkXfermode::kClear_Mode); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(382, 382), paint); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(383, 383), paint); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.translate(128, 128); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color = SkColorSetARGB(255, 11, 22, 33); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(color); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(255, 255), paint); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(color, outputColor); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.rotate(50); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(255, 255), paint); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(AnalysisCanvasTest, FilterPaint) { 18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkPaint paint; 18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) skia::RefPtr<SkImageFilter> filter = skia::AdoptRef(SkOffsetImageFilter::Create(10, 10)); 18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) paint.setImageFilter(filter.get()); 18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) canvas.drawRect(SkRect::MakeWH(255, 255), paint); 19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkColor outputColor; 19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, ClipPath) { 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Skia will look for paths that are actually rects and treat 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // them as such. We add a divot to the following path to prevent 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this optimization and truly test clipPath's behavior. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPath path; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.moveTo(0, 0); 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) path.lineTo(128, 50); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.lineTo(255, 0); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.lineTo(255, 255); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.lineTo(0, 255); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor outputColor; 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clipPath(path); 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.save(); 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.clipPath(path); 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.restore(); 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AnalysisCanvasTest, SaveLayerRestore) { 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor outputColor; 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkRect bounds = SkRect::MakeWH(255, 255); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(SkColorSetARGB(255, 255, 255, 255)); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should force non-transparency 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch canvas.saveLayer(&bounds, &paint); 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransparentFill(canvas); 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setXfermodeMode(SkXfermode::kDst_Mode); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should force non-solid color 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch canvas.saveLayer(&bounds, &paint); 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransparentFill(canvas); 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.restore(); 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransparentFill(canvas); 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas.restore(); 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TransparentFill(canvas); 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SolidColorFill(canvas); 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(AnalysisCanvasTest, EarlyOutNotSolid) { 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SkTileGridFactory::TileGridInfo tile_grid_info; 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tile_grid_info.fTileInterval.set(256, 256); 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tile_grid_info.fOffset.setZero(); 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tile_grid_info.fMargin.setEmpty(); 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SkTileGridFactory factory(tile_grid_info); 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SkPictureRecorder recorder; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Create a picture with 3 commands, last of which is non-solid. 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) skia::RefPtr<SkCanvas> record_canvas = 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) skia::SharePtr(recorder.beginRecording(256, 256, &factory)); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string text = "text"; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPoint point = SkPoint::Make(SkIntToScalar(25), SkIntToScalar(25)); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) paint.setColor(SkColorSetARGB(255, 255, 255, 255)); 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) record_canvas->drawRect(SkRect::MakeWH(256, 256), paint); 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) record_canvas->drawRect(SkRect::MakeWH(256, 256), paint); 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) record_canvas->drawText( 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) text.c_str(), text.length(), point.fX, point.fY, paint); 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Draw the picture into the analysis canvas, using the canvas as a callback 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // as well. 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) skia::AnalysisCanvas canvas(256, 256); 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) picture->draw(&canvas, &canvas); 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Ensure that canvas is not solid. 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SkColor output_color; 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&output_color)); 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Verify that we aborted drawing. 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(canvas.abortDrawing()); 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(AnalysisCanvasTest, ClipComplexRegion) { 32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) skia::AnalysisCanvas canvas(255, 255); 32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkPath path; 32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) path.moveTo(0, 0); 33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) path.lineTo(128, 50); 33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) path.lineTo(255, 0); 33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) path.lineTo(255, 255); 33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) path.lineTo(0, 255); 33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkIRect pathBounds = path.getBounds().round(); 33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkRegion region; 33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) region.setPath(path, SkRegion(pathBounds)); 33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkColor outputColor; 33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SolidColorFill(canvas); 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canvas.clipRegion(region); 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canvas.save(); 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canvas.clipRegion(region); 34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) canvas.restore(); 35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SolidColorFill(canvas); 35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); 35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace skia 357