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