renderer_pixeltest.cc revision a3f7b4e666c476898878fa745f637129375cd889
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/output/gl_renderer.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/draw_quad.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/quads/picture_draw_quad.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/quads/texture_draw_quad.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/resources/platform_color.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/resources/sync_point_helper.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_picture_pile_impl.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/pixel_test.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkMatrix.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                gfx::Rect rect) {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::RectF damage_rect = rect;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Transform transform_to_root_target;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RenderPass> CreateTestRenderPass(
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id id,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect rect,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& transform_to_root_target) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::RectF damage_rect = rect;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<SharedQuadState> CreateTestSharedQuadState(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform content_to_target_transform, gfx::Rect rect) {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = rect;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect clip_rect = rect;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = false;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       opacity);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return shared_state.Pass();
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<SharedQuadState> CreateTestSharedQuadStateClipped(
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform content_to_target_transform,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect rect,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect clip_rect) {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = clip_rect;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = true;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       opacity);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return shared_state.Pass();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SharedQuadState* shared_state, gfx::Rect rect, RenderPass::Id pass_id) {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  quad->SetNew(shared_state,
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               rect,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               pass_id,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false,         // is_replica
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               0,             // mask_resource_id
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               rect,          // contents_changed_since_last_frame
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::RectF(),  // mask_uv_rect
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               FilterOperations(),   // foreground filters
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               skia::RefPtr<SkImageFilter>(),   // foreground filter
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               FilterOperations());  // background filters
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return quad.PassAs<DrawQuad>();
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochscoped_ptr<TextureDrawQuad> CreateTestTextureDrawQuad(
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gfx::Rect rect,
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkColor texel_color,
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkColor background_color,
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool premultiplied_alpha,
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SharedQuadState* shared_state,
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResourceProvider* resource_provider) {
105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  SkPMColor pixel_color = premultiplied_alpha ?
106a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPreMultiplyColor(texel_color) :
107a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPackARGB32NoCheck(SkColorGetA(texel_color),
108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetR(texel_color),
109a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetG(texel_color),
110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetB(texel_color));
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceProvider::ResourceId resource = resource_provider->CreateResource(
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect.size(), GL_RGBA, ResourceProvider::TextureUsageAny);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  resource_provider->SetPixels(
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      resource,
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      reinterpret_cast<uint8_t*>(&pixels.front()),
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Vector2d());
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  quad->SetNew(shared_state,
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               rect,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::Rect(),
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               resource,
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               premultiplied_alpha,
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(0.0f, 0.0f),  // uv_top_left
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(1.0f, 1.0f),  // uv_bottom_right
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               background_color,
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               vertex_opacity,
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               false);  // flipped
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return quad.Pass();
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)typedef ::testing::Types<GLRenderer,
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRenderer,
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GLRendererWithExpandedViewport,
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRendererWithExpandedViewport> RendererTypes;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef ::testing::Types<GLRenderer,
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         GLRendererWithSkiaGPUBackend,
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         SoftwareRenderer> RendererTypesWithSkiaGPUBackend;
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <typename RendererType>
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class RendererPixelTestWithSkiaGPUBackend
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public RendererPixelTest<RendererType> {
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTestWithSkiaGPUBackend,
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                RendererTypesWithSkiaGPUBackend);
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// All pixels can be off by one, but any more than that is an error.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FuzzyPixelOffByOneComparator : public FuzzyPixelComparator {
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit FuzzyPixelOffByOneComparator(bool discard_alpha)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : FuzzyPixelComparator(discard_alpha, 100.f, 0.f, 1.f, 1, 0) {}
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename RendererType>
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : fuzzy_(discard_alpha), exact_(discard_alpha) {}
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Compare(const SkBitmap& actual_bmp,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const SkBitmap& expected_bmp) const;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FuzzyPixelOffByOneComparator fuzzy_;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExactPixelComparator exact_;
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<>
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<SoftwareRenderer>::Compare(
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& actual_bmp,
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& expected_bmp) const {
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return fuzzy_.Compare(actual_bmp, expected_bmp);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SoftwareRendererWithExpandedViewport>::Compare(
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const SkBitmap& actual_bmp,
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const SkBitmap& expected_bmp) const {
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fuzzy_.Compare(actual_bmp, expected_bmp);
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<typename RendererType>
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<RendererType>::Compare(
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& actual_bmp,
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& expected_bmp) const {
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return exact_.Compare(actual_bmp, expected_bmp);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TYPED_TEST(RendererPixelTest, SimpleGreenRect) {
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN, false);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green.png")),
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TYPED_TEST(RendererPixelTest, SimpleGreenRect_NonRootRenderPass) {
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect small_rect(100, 100);
224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPass::Id child_id(2, 1);
226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestRenderPass(child_id, small_rect, gfx::Transform());
228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<SharedQuadState> child_shared_state =
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), small_rect);
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  color_quad->SetNew(child_shared_state.get(), rect, SK_ColorGREEN, false);
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  child_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPass::Id root_id(1, 1);
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestRenderPass(root_id, rect, gfx::Transform());
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<SharedQuadState> root_shared_state =
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<DrawQuad> render_pass_quad =
244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestRenderPassDrawQuad(root_shared_state.get(),
245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                   small_rect,
246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                   child_id);
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPass* child_pass_ptr = child_pass.get();
250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPassList pass_list;
252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTestWithReadbackTarget(
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      &pass_list,
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      child_pass_ptr,
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_small.png")),
259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ExactPixelComparator(true)));
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithoutBackground) {
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> shared_state =
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SkColorSetARGB(128, 0, 255, 0),  // Texel color.
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorTRANSPARENT,  // Background color.
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      true,  // Premultiplied alpha.
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      shared_state.get(),
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithBackground) {
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> texture_quad_state =
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
301a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
305a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkColorSetARGB(204, 120, 255, 120),  // Texel color.
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorGREEN,  // Background color.
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      true,  // Premultiplied alpha.
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      texture_quad_state.get(),
3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> color_quad_state =
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> shared_state =
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SkColorSetARGB(128, 0, 255, 0),  // Texel color.
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorTRANSPARENT,  // Background color.
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,  // Premultiplied alpha.
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      shared_state.get(),
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> texture_quad_state =
3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
368a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
372a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkColorSetARGB(204, 120, 255, 120),  // Texel color.
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorGREEN,  // Background color.
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,  // Premultiplied alpha.
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      texture_quad_state.get(),
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> color_quad_state =
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoGLRendererPixelTest : public GLRendererPixelTest {
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad(
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SharedQuadState* shared_state, bool with_alpha, bool is_transparent) {
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect rect(this->device_viewport_size_);
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect opaque_rect(0, 0, 0, 0);
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId y_resource =
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GL_LUMINANCE,
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            ResourceProvider::TextureUsageAny);
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId u_resource =
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GL_LUMINANCE,
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            ResourceProvider::TextureUsageAny);
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId v_resource =
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GL_LUMINANCE,
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            ResourceProvider::TextureUsageAny);
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId a_resource = 0;
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha) {
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      a_resource = resource_provider_->CreateResource(
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       this->device_viewport_size_,
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       GL_LUMINANCE,
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ResourceProvider::TextureUsageAny);
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int w = this->device_viewport_size_.width();
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int h = this->device_viewport_size_.height();
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const int y_plane_size = w * h;
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect uv_rect((w + 1) / 2, (h + 1) / 2);
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const int uv_plane_size = uv_rect.size().GetArea();
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> y_plane(new uint8_t[y_plane_size]);
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> u_plane(new uint8_t[uv_plane_size]);
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> v_plane(new uint8_t[uv_plane_size]);
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> a_plane;
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha)
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      a_plane.reset(new uint8_t[y_plane_size]);
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // YUV values representing Green.
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(y_plane.get(), 149, y_plane_size);
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(u_plane.get(), 43, uv_plane_size);
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(v_plane.get(), 21, uv_plane_size);
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha)
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      memset(a_plane.get(), is_transparent ? 0 : 128, y_plane_size);
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(y_resource, y_plane.get(), rect, rect,
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(u_resource, u_plane.get(), uv_rect, uv_rect,
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(v_resource, v_plane.get(), uv_rect, uv_rect,
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha) {
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      resource_provider_->SetPixels(a_resource, a_plane.get(), rect, rect,
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    gfx::Vector2d());
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<YUVVideoDrawQuad> yuv_quad = cc::YUVVideoDrawQuad::Create();
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    yuv_quad->SetNew(shared_state, rect, opaque_rect, gfx::Size(),
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     y_resource, u_resource, v_resource, a_resource);
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return yuv_quad.Pass();
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPass::Id id(1, 1);
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), false, false);
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green.png")),
480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExactPixelComparator(true)));
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPass::Id id(1, 1);
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), true, false);
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExactPixelComparator(true)));
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPass::Id id(1, 1);
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> shared_state =
518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), true, true);
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorBLACK, false);
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("black.png")),
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExactPixelComparator(true)));
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  white->SetNew(blank_state.get(),
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                viewport_rect,
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SK_ColorWHITE,
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = matrix[4] = 0;
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = matrix[9] = 0;
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = matrix[14] = 0;
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(skia::AdoptRef(
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new SkColorMatrixFilter(matrix)));
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassDrawQuad::Create();
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           false,
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations(),
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           filter,
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlphaTranslation) {
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
6607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
6667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
6677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
6687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
6697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  white->SetNew(blank_state.get(),
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                viewport_rect,
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SK_ColorWHITE,
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = 0;
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[4] = 20.f;
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = 0;
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[9] = 200.f;
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = 0;
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[14] = 1.5f;
706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(skia::AdoptRef(
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new SkColorMatrixFilter(matrix)));
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassDrawQuad::Create();
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           false,
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations(),
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           filter,
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")),
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTexture) {
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
7617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
7707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPassDrawQuad(pass_shared_state.get(),
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   pass_rect,
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   child_pass_id));
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTextureWithAntiAliasing) {
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
8027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform transform_to_root;
8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
8087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform content_to_target_transform;
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
8147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  blue->SetNew(shared_state.get(),
8157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               gfx::Rect(0,
8167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         0,
8177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
8187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               SK_ColorBLUE,
8207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               false);
8217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
8227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  yellow->SetNew(shared_state.get(),
8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 SK_ColorYELLOW,
8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 false);
8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
8327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform aa_transform;
8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aa_transform.Translate(0.5, 0.0);
8357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
8377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(aa_transform, pass_rect);
8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  root_pass->quad_list.push_back(
8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRenderPassDrawQuad(pass_shared_state.get(),
8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   pass_rect,
8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   child_pass_id));
8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> root_shared_state =
8447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), viewport_rect);
8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> background = SolidColorDrawQuad::Create();
8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  background->SetNew(root_shared_state.get(),
8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     gfx::Rect(this->device_viewport_size_),
8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     SK_ColorWHITE,
8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     false);
8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  root_pass->quad_list.push_back(background.PassAs<DrawQuad>());
8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPassList pass_list;
8537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
8577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &pass_list,
8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_anti_aliasing.png")),
861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename RendererType>
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTestWithBackgroundFilter
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public RendererPixelTest<RendererType> {
867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUpRenderPassList() {
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect device_viewport_rect(this->device_viewport_size_);
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id root_id(1, 1);
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass =
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRootRenderPass(root_id, device_viewport_rect);
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->has_transparent_background = false;
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_content_to_target_transform;
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id filter_pass_id(2, 1);
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform transform_to_root;
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> filter_pass =
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRenderPass(filter_pass_id,
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             filter_pass_content_rect_,
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             transform_to_root);
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A non-visible quad in the filtering render pass.
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    filter_pass_content_rect_);
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(),
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         filter_pass_content_rect_,
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         SK_ColorTRANSPARENT,
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false);
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass->shared_quad_state_list.push_back(shared_state.Pass());
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(filter_pass_to_target_transform_,
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    filter_pass_content_rect_);
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<RenderPassDrawQuad> filter_pass_quad =
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          RenderPassDrawQuad::Create();
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass_quad->SetNew(
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          shared_state.get(),
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_content_rect_,
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_id,
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          false,  // is_replica
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          0,  // mask_resource_id
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_content_rect_,  // contents_changed_since_last_frame
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          gfx::RectF(),  // mask_uv_rect
913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          FilterOperations(),  // filters
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          skia::RefPtr<SkImageFilter>(),  // filter
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this->background_filters_);
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>());
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int kColumnWidth = device_viewport_rect.width() / 3;
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20);
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) {
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    left_rect);
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN, false);
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      left_rect += gfx::Vector2d(0, left_rect.height() + 1);
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20);
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) {
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    middle_rect);
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED, false);
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      middle_rect += gfx::Vector2d(0, middle_rect.height() + 1);
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20);
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) {
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    right_rect);
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE, false);
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      right_rect += gfx::Vector2d(0, right_rect.height() + 1);
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SharedQuadState> shared_state =
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestSharedQuadState(identity_content_to_target_transform,
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  device_viewport_rect);
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SolidColorDrawQuad> background_quad =
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SolidColorDrawQuad::Create();
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    background_quad->SetNew(shared_state.get(),
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            device_viewport_rect,
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            SK_ColorWHITE,
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false);
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->quad_list.push_back(background_quad.PassAs<DrawQuad>());
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->shared_quad_state_list.push_back(shared_state.Pass());
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(filter_pass.Pass());
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(root_pass.Pass());
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list_;
975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperations background_filters_;
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform filter_pass_to_target_transform_;
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect filter_pass_content_rect_;
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef ::testing::Types<GLRenderer, SoftwareRenderer>
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BackgroundFilterRendererTypes;
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter,
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                BackgroundFilterRendererTypes);
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTestWithBackgroundFilter<GLRenderer>
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GLRendererPixelTestWithBackgroundFilter;
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(skaslev): The software renderer does not support filters yet.
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) {
990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  this->background_filters_.Append(
991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FilterOperation::CreateInvertFilter(1.f));
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_ = gfx::Rect(this->device_viewport_size_);
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_.Inset(12, 14, 16, 18);
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->SetUpRenderPassList();
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &this->pass_list_,
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("background_filter.png")),
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Software renderer does not support anti-aliased edges.
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AntiAliasing) {
1005b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Rotate(10);
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> red_shared_state =
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(red_content_to_target_transform, rect);
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Rotate(5);
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> yellow_shared_state =
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(blue_content_to_target_transform, rect);
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")),
1045eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that anti-aliasing works for axis aligned quads.
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AxisAligned) {
1051b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Translate(50, 50);
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Scale(
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> red_shared_state =
1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(red_content_to_target_transform, rect);
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Translate(25.5f, 25.5f);
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Scale(0.5f, 0.5f);
1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> yellow_shared_state =
1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(blue_content_to_target_transform, rect);
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")),
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that forcing anti-aliasing off works as expected.
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, ForceAntiAliasingOff) {
1103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform hole_content_to_target_transform;
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Translate(50, 50);
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Scale(
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> hole_shared_state =
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(hole_content_to_target_transform, rect);
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> hole = SolidColorDrawQuad::Create();
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole->SetAll(hole_shared_state.get(), rect, rect, rect, false,
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorTRANSPARENT, true);
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(hole.PassAs<DrawQuad>());
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> green_shared_state =
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, rect);
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green->SetNew(green_shared_state.get(), rect, SK_ColorGREEN, false);
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green.PassAs<DrawQuad>());
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("force_anti_aliasing_off.png")),
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(false)));
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GLRendererPixelTest, AntiAliasingPerspective) {
1142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
1143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass =
1145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestRootRenderPass(RenderPass::Id(1, 1), rect);
1146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect red_rect(0, 0, 180, 500);
1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Transform red_content_to_target_transform(
1149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      1.0,  2.4520,  10.6206, 19.0,
1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      0.0,  0.3528,  5.9737,  9.5,
1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      0.0, -0.2250, -0.9744,  0.0,
1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      0.0,  0.0225,  0.0974,  1.0);
1153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> red_shared_state =
1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(red_content_to_target_transform, red_rect);
1155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  red->SetNew(red_shared_state.get(), red_rect, SK_ColorRED, false);
1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect green_rect(19, 7, 180, 10);
1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> green_shared_state =
1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), green_rect);
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  green->SetNew(green_shared_state.get(), green_rect, SK_ColorGREEN, false);
1164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(green.PassAs<DrawQuad>());
1165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> blue_shared_state =
1167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
1168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
1173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("anti_aliasing_perspective.png")),
1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST(RendererPixelTestWithSkiaGPUBackend, PictureDrawQuadIdentityScale) {
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
118490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool use_skia_gpu_backend = this->UseSkiaGPUBackend();
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA);
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One clipped blue quad in the lower right corner.  Outside the clip
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is red, which should not appear.
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_rect(gfx::Size(100, 100));
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_clip_rect(gfx::Point(50, 50), gfx::Size(50, 50));
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> blue_pile =
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, blue_rect.size());
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_rect, red_paint);
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_clip_rect, blue_paint);
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->RerecordPile();
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2d offset(viewport.bottom_right() - blue_rect.bottom_right());
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.Translate(offset.x(), offset.y());
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_scissor_rect = blue_clip_rect;
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.TransformRect(&blue_scissor_rect);
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadStateClipped(blue_content_to_target_transform,
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       blue_rect,
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       gfx::ToEnclosingRect(blue_scissor_rect));
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state.get(),
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,  // Intentionally bigger than clip.
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport.size(),
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    contents_swizzled,
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    1.f,
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    use_skia_gpu_backend,
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    blue_pile);
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One viewport-filling green quad.
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, green_paint);
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> green_shared_state =
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, viewport);
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create();
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad->SetNew(green_shared_state.get(),
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::Rect(),
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::RectF(0.f, 0.f, 1.f, 1.f),
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport.size(),
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     contents_swizzled,
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     1.f,
125290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     use_skia_gpu_backend,
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     green_pile);
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad.PassAs<DrawQuad>());
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST(RendererPixelTestWithSkiaGPUBackend,
126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           PictureDrawQuadNonIdentityScale) {
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool use_skia_gpu_backend = this->UseSkiaGPUBackend();
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA);
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // As scaling up the blue checkerboards will cause sampling on the GPU,
1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a few extra "cleanup rects" need to be added to clobber the blending
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to make the output image more clean.  This will also test subrects
1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the layer.
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect1(gfx::Point(80, 0), gfx::Size(20, 100));
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect2(gfx::Point(0, 80), gfx::Size(100, 20));
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, red_paint);
1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect1, green_paint);
1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect2, green_paint);
1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> top_right_green_shared_quad_state =
1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, viewport);
1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad1 = PictureDrawQuad::Create();
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad1->SetNew(top_right_green_shared_quad_state.get(),
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect1.size()),
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1.size(),
1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      contents_swizzled,
1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
130890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      use_skia_gpu_backend,
1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_pile);
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad1.PassAs<DrawQuad>());
1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad2 = PictureDrawQuad::Create();
1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad2->SetNew(top_right_green_shared_quad_state.get(),
1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect2.size()),
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2.size(),
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      contents_swizzled,
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
132190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      use_skia_gpu_backend,
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_pile);
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad2.PassAs<DrawQuad>());
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a green clipped checkerboard in the bottom right to help test
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // interleaving picture quad content and solid color content.
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect bottom_right_rect(
1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Point(viewport.width() / 2, viewport.height() / 2),
1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Size(viewport.width() / 2, viewport.height() / 2));
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> bottom_right_green_shared_state =
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadStateClipped(
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          green_content_to_target_transform, viewport, bottom_right_rect);
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> bottom_right_color_quad =
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SolidColorDrawQuad::Create();
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bottom_right_color_quad->SetNew(
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bottom_right_green_shared_state.get(), viewport, SK_ColorGREEN, false);
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(bottom_right_color_quad.PassAs<DrawQuad>());
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add two blue checkerboards taking up the bottom left and top right,
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // but use content scales as content rects to make this happen.
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The content is at a 4x content scale.
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect layer_rect(gfx::Size(20, 30));
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float contents_scale = 4.f;
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Two rects that touch at their corners, arbitrarily placed in the layer.
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect1(gfx::PointF(5.5f, 9.0f), gfx::SizeF(2.5f, 2.5f));
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect2(gfx::PointF(8.0f, 6.5f), gfx::SizeF(2.5f, 2.5f));
1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF union_layer_rect = blue_layer_rect1;
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  union_layer_rect.Union(blue_layer_rect2);
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Because scaling up will cause sampling outside the rects, add one extra
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pixel of buffer at the final content scale.
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float inset = -1.f / contents_scale;
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect1.Inset(inset, inset, inset, inset);
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect2.Inset(inset, inset, inset, inset);
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_rect.size());
135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Region outside(layer_rect);
136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  outside.Subtract(gfx::ToEnclosingRect(union_layer_rect));
136190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (Region::Iterator iter(outside); iter.has_rect(); iter.next()) {
136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    pile->add_draw_rect_with_paint(iter.rect(), red_paint);
136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect1, blue_paint);
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect2, blue_paint);
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_rect(
137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::ScaleToEnclosingRect(layer_rect, contents_scale));
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_union_rect(
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect, contents_scale)));
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // At a scale of 4x the rectangles with a width of 2.5 will take up 10 pixels,
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so scale an additional 10x to make them 100x100.
1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content_to_target_transform.Scale(10.0, 10.0);
1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect quad_content_rect(gfx::Size(20, 20));
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, quad_content_rect);
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state.get(),
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect.size(),
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    contents_swizzled,
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect,
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    contents_scale,
139390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    use_skia_gpu_backend,
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    pile);
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fill left half of viewport with green.
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform half_green_content_to_target_transform;
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect half_green_rect(gfx::Size(viewport.width() / 2, viewport.height()));
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> half_green_shared_state =
1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(half_green_content_to_target_transform,
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                half_green_rect);
1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> half_color_quad = SolidColorDrawQuad::Create();
1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  half_color_quad->SetNew(
1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      half_green_shared_state.get(), half_green_rect, SK_ColorGREEN, false);
1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(half_color_quad.PassAs<DrawQuad>());
1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
1420