renderer_pixeltest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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/test/fake_picture_pile_impl.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/pixel_test.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkMatrix.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using gpu::gles2::GLES2Interface;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_ANDROID)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                const gfx::Rect& rect) {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::RectF damage_rect = rect;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Transform transform_to_root_target;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RenderPass> CreateTestRenderPass(
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id id,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& transform_to_root_target) {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::RectF damage_rect = rect;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<SharedQuadState> CreateTestSharedQuadState(
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Transform content_to_target_transform, const gfx::Rect& rect) {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = rect;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect clip_rect = rect;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = false;
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       opacity,
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       blend_mode);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return shared_state.Pass();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<SharedQuadState> CreateTestSharedQuadStateClipped(
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform content_to_target_transform,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& clip_rect) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = clip_rect;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = true;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       opacity,
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       blend_mode);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return shared_state.Pass();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad(
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SharedQuadState* shared_state,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderPass::Id pass_id) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  quad->SetNew(shared_state,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               rect,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               pass_id,
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               false,                 // is_replica
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               0,                     // mask_resource_id
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               rect,                  // contents_changed_since_last_frame
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               gfx::RectF(1.f, 1.f),  // mask_uv_rect
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               FilterOperations(),    // foreground filters
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               FilterOperations());   // background filters
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return quad.PassAs<DrawQuad>();
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochscoped_ptr<TextureDrawQuad> CreateTestTextureDrawQuad(
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkColor texel_color,
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SkColor background_color,
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool premultiplied_alpha,
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SharedQuadState* shared_state,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResourceProvider* resource_provider) {
112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  SkPMColor pixel_color = premultiplied_alpha ?
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPreMultiplyColor(texel_color) :
114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPackARGB32NoCheck(SkColorGetA(texel_color),
115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetR(texel_color),
116a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetG(texel_color),
117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetB(texel_color));
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceProvider::ResourceId resource =
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      resource_provider->CreateResource(rect.size(),
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        GL_CLAMP_TO_EDGE,
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        ResourceProvider::TextureUsageAny,
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        RGBA_8888);
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  resource_provider->SetPixels(
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      resource,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      reinterpret_cast<uint8_t*>(&pixels.front()),
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Vector2d());
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  quad->SetNew(shared_state,
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               rect,
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::Rect(),
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               resource,
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               premultiplied_alpha,
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(0.0f, 0.0f),  // uv_top_left
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(1.0f, 1.0f),  // uv_bottom_right
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               background_color,
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               vertex_opacity,
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               false);  // flipped
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return quad.Pass();
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)typedef ::testing::Types<GLRenderer,
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRenderer,
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GLRendererWithExpandedViewport,
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRendererWithExpandedViewport> RendererTypes;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (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)TYPED_TEST(RendererPixelTest, SimpleGreenRect) {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN, false);
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
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,
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_small.png")),
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ExactPixelComparator(true)));
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithoutBackground) {
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> shared_state =
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SkColorSetARGB(128, 0, 255, 0),  // Texel color.
2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorTRANSPARENT,  // Background color.
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      true,  // Premultiplied alpha.
2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      shared_state.get(),
2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithBackground) {
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> texture_quad_state =
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
303a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
307a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkColorSetARGB(204, 120, 255, 120),  // Texel color.
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorGREEN,  // Background color.
3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      true,  // Premultiplied alpha.
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      texture_quad_state.get(),
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> color_quad_state =
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> shared_state =
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SkColorSetARGB(128, 0, 255, 0),  // Texel color.
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorTRANSPARENT,  // Background color.
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,  // Premultiplied alpha.
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      shared_state.get(),
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPass::Id id(1, 1);
3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> texture_quad_state =
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
372a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TextureDrawQuad> texture_quad = CreateTestTextureDrawQuad(
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Rect(this->device_viewport_size_),
376a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkColorSetARGB(204, 120, 255, 120),  // Texel color.
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorGREEN,  // Background color.
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,  // Premultiplied alpha.
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      texture_quad_state.get(),
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      this->resource_provider_.get());
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SharedQuadState> color_quad_state =
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoGLRendererPixelTest : public GLRendererPixelTest {
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad(
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SharedQuadState* shared_state, bool with_alpha, bool is_transparent) {
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect rect(this->device_viewport_size_);
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect opaque_rect(0, 0, 0, 0);
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId y_resource =
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LUMINANCE_8);
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId u_resource =
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LUMINANCE_8);
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId v_resource =
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        resource_provider_->CreateResource(
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this->device_viewport_size_,
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            GL_CLAMP_TO_EDGE,
422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            ResourceProvider::TextureUsageAny,
423d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            LUMINANCE_8);
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ResourceProvider::ResourceId a_resource = 0;
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha) {
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      a_resource = resource_provider_->CreateResource(
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       this->device_viewport_size_,
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       GL_CLAMP_TO_EDGE,
429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       ResourceProvider::TextureUsageAny,
430d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       LUMINANCE_8);
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int w = this->device_viewport_size_.width();
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int h = this->device_viewport_size_.height();
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const int y_plane_size = w * h;
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Rect uv_rect((w + 1) / 2, (h + 1) / 2);
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const int uv_plane_size = uv_rect.size().GetArea();
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> y_plane(new uint8_t[y_plane_size]);
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> u_plane(new uint8_t[uv_plane_size]);
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> v_plane(new uint8_t[uv_plane_size]);
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<uint8_t[]> a_plane;
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha)
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      a_plane.reset(new uint8_t[y_plane_size]);
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // YUV values representing Green.
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(y_plane.get(), 149, y_plane_size);
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(u_plane.get(), 43, uv_plane_size);
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    memset(v_plane.get(), 21, uv_plane_size);
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha)
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      memset(a_plane.get(), is_transparent ? 0 : 128, y_plane_size);
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(y_resource, y_plane.get(), rect, rect,
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(u_resource, u_plane.get(), uv_rect, uv_rect,
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_provider_->SetPixels(v_resource, v_plane.get(), uv_rect, uv_rect,
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  gfx::Vector2d());
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha) {
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      resource_provider_->SetPixels(a_resource, a_plane.get(), rect, rect,
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    gfx::Vector2d());
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create();
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    yuv_quad->SetNew(shared_state, rect, opaque_rect, gfx::Size(),
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     y_resource, u_resource, v_resource, a_resource);
465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return yuv_quad.Pass();
466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPass::Id id(1, 1);
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), false, false);
480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green.png")),
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExactPixelComparator(true)));
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPass::Id id(1, 1);
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), true, false);
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExactPixelComparator(true)));
520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPass::Id id(1, 1);
526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> shared_state =
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<YUVVideoDrawQuad> yuv_quad =
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestYUVVideoDrawQuad(shared_state.get(), true, true);
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  color_quad->SetNew(shared_state.get(), rect, SK_ColorBLACK, false);
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
546424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("black.png")),
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExactPixelComparator(true)));
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  white->SetNew(blank_state.get(),
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                viewport_rect,
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SK_ColorWHITE,
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = matrix[4] = 0;
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = matrix[9] = 0;
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = matrix[14] = 0;
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(skia::AdoptRef(
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new SkColorMatrixFilter(matrix)));
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
62268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperations filters;
62368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  filters.Append(FilterOperation::CreateReferenceFilter(filter));
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassDrawQuad::Create();
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           false,
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
63468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           filters,
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
647424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassSaturateFilter) {
6530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
6540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
6560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
6570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
6580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
6600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
6610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform transform_to_root;
6620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
6630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
6640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform content_to_target_transform;
6660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
6670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
6680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  shared_state->opacity = 0.5f;
6690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
6710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  blue->SetNew(shared_state.get(),
6720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               gfx::Rect(0,
6730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         0,
6740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         this->device_viewport_size_.width(),
6750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
6760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               SK_ColorBLUE,
6770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               false);
6780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
6790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  yellow->SetNew(shared_state.get(),
6800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 gfx::Rect(0,
6810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
6820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.width(),
6830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
6840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 SK_ColorYELLOW,
6850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 false);
6860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
6880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
6890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
6910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  white->SetNew(blank_state.get(),
6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                viewport_rect,
6930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                SK_ColorWHITE,
6940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                false);
6950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
6970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
6980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
6990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FilterOperations filters;
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateSaturateFilter(0.5f));
7050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
7070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      RenderPassDrawQuad::Create();
7080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
7090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
7100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           child_pass_id,
7110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           false,
7120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           0,
7130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
7140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           gfx::RectF(),
7150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           filters,
7160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           FilterOperations());
7170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
7190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPassList pass_list;
7210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
7220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
7230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
7250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      &pass_list,
7260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      PixelTest::NoOffscreenContext,
7270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
7280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ExactPixelComparator(true)));
7290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
7300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassFilterChain) {
7320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
7330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
7350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
7360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
7370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
7390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
7400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform transform_to_root;
7410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
7420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
7430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform content_to_target_transform;
7450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
7460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
7470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  shared_state->opacity = 0.5f;
7480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
7500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  blue->SetNew(shared_state.get(),
7510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               gfx::Rect(0,
7520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         0,
7530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         this->device_viewport_size_.width(),
7540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
7550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               SK_ColorBLUE,
7560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)               false);
7570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
7580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  yellow->SetNew(shared_state.get(),
7590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 gfx::Rect(0,
7600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
7610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.width(),
7620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
7630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 SK_ColorYELLOW,
7640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 false);
7650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
7670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
7680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
7700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  white->SetNew(blank_state.get(),
7710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                viewport_rect,
7720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                SK_ColorWHITE,
7730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                false);
7740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
7760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
7770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
7780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
7800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
7810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FilterOperations filters;
7830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateGrayscaleFilter(1.f));
7840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateBrightnessFilter(0.5f));
7850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
7870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      RenderPassDrawQuad::Create();
7880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
7890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
7900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           child_pass_id,
7910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           false,
7920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           0,
7930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
7940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           gfx::RectF(),
7950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           filters,
7960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           FilterOperations());
7970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
7990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPassList pass_list;
8010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
8020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
8030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
8050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      &pass_list,
8060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      PixelTest::NoOffscreenContext,
8070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
8080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ExactPixelComparator(true)));
8090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
8100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlphaTranslation) {
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blank_state =
847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  white->SetNew(blank_state.get(),
851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                viewport_rect,
852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SK_ColorWHITE,
853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(white.PassAs<DrawQuad>());
858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = 0;
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[4] = 20.f;
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = 0;
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[9] = 200.f;
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = 0;
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[14] = 1.5f;
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(skia::AdoptRef(
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new SkColorMatrixFilter(matrix)));
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
88568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperations filters;
88668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  filters.Append(FilterOperation::CreateReferenceFilter(filter));
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> render_pass_quad =
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      RenderPassDrawQuad::Create();
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state.get(),
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           false,
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
89768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           filters,
898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>());
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
910424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")),
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTexture) {
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(shared_state.get(),
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               gfx::Rect(0,
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         0,
9367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
9377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorBLUE,
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               false);
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(shared_state.get(),
9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
9437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
9447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
9457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SK_ColorYELLOW,
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 false);
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_pass->quad_list.push_back(
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPassDrawQuad(pass_shared_state.get(),
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   pass_rect,
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   child_pass_id));
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
967424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTextureWithAntiAliasing) {
9737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
9747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
9767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
9777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
9817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform transform_to_root;
9827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
9837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
9847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform content_to_target_transform;
9867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
9877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
9887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
9907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  blue->SetNew(shared_state.get(),
9917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               gfx::Rect(0,
9927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         0,
9937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.width(),
9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         this->device_viewport_size_.height() / 2),
9957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               SK_ColorBLUE,
9967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               false);
9977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
9987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  yellow->SetNew(shared_state.get(),
9997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 gfx::Rect(0,
10007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2,
10017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.width(),
10027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           this->device_viewport_size_.height() / 2),
10037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 SK_ColorYELLOW,
10047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 false);
10057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
10077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
10087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform aa_transform;
10107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aa_transform.Translate(0.5, 0.0);
10117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> pass_shared_state =
10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(aa_transform, pass_rect);
10147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  root_pass->quad_list.push_back(
10157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRenderPassDrawQuad(pass_shared_state.get(),
10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   pass_rect,
10177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   child_pass_id));
10187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SharedQuadState> root_shared_state =
10207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), viewport_rect);
10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> background = SolidColorDrawQuad::Create();
10227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  background->SetNew(root_shared_state.get(),
10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     gfx::Rect(this->device_viewport_size_),
10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     SK_ColorWHITE,
10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     false);
10267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  root_pass->quad_list.push_back(background.PassAs<DrawQuad>());
10277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPassList pass_list;
10297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
10307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
10317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
10337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &pass_list,
1036424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
10377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_anti_aliasing.png")),
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
10407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This tests the case where we have a RenderPass with a mask, but the quad
10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// for the masked surface does not include the full surface texture.
10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TYPED_TEST(RendererPixelTest, RenderPassAndMaskWithPartialQuad) {
10444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
10454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id root_pass_id(1, 1);
10474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
10494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> root_pass_shared_state =
10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), viewport_rect);
10514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id child_pass_id(2, 2);
10534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform transform_to_root;
10544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, viewport_rect, transform_to_root);
10564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> child_pass_shared_state =
10574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), viewport_rect);
10584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The child render pass is just a green box.
10604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const SkColor kCSSGreen = 0xff008000;
10614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
10624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  green->SetNew(child_pass_shared_state.get(), viewport_rect, kCSSGreen, false);
10634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  child_pass->quad_list.push_back(green.PassAs<DrawQuad>());
10644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make a mask.
10664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect mask_rect = viewport_rect;
10674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmap bitmap;
10684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bitmap.setConfig(
10694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      SkBitmap::kARGB_8888_Config, mask_rect.width(), mask_rect.height());
10704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bitmap.allocPixels();
10714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmapDevice bitmap_device(bitmap);
10724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(&bitmap_device));
10734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkPaint paint;
10744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setStyle(SkPaint::kStroke_Style);
10754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setStrokeWidth(SkIntToScalar(4));
10764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setColor(SK_ColorWHITE);
10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canvas->clear(SK_ColorTRANSPARENT);
10784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect rect = mask_rect;
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  while (!rect.IsEmpty()) {
10804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.Inset(6, 6, 4, 4);
10814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas->drawRect(
10824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()),
10834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        paint);
10844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.Inset(6, 6, 4, 4);
10854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
10864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
10874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ResourceProvider::ResourceId mask_resource_id =
10884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this->resource_provider_->CreateResource(
10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          mask_rect.size(),
10904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          GL_CLAMP_TO_EDGE,
10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          ResourceProvider::TextureUsageAny,
10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          RGBA_8888);
10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
10944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkAutoLockPixels lock(bitmap);
10954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this->resource_provider_->SetPixels(
10964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_resource_id,
10974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        reinterpret_cast<uint8_t*>(bitmap.getPixels()),
10984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_rect,
10994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_rect,
11004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        gfx::Vector2d());
11014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
11024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This RenderPassDrawQuad does not include the full |viewport_rect| which is
11044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // the size of the child render pass.
11054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect sub_rect = gfx::Rect(50, 50, 100, 100);
11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.x(), child_pass->output_rect.x());
11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.y(), child_pass->output_rect.y());
11084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.right(), child_pass->output_rect.right());
11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.bottom(), child_pass->output_rect.bottom());
11104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(child_pass->output_rect.Contains(sub_rect));
11114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set up a mask on the RenderPassDrawQuad.
11134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPassDrawQuad> mask_quad = RenderPassDrawQuad::Create();
11144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  mask_quad->SetNew(root_pass_shared_state.get(),
11154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    sub_rect,
11164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    child_pass_id,
11174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    false,  // is_replica
11184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    mask_resource_id,
11194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    sub_rect,              // contents_changed_since_last_frame
11204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    gfx::RectF(1.f, 1.f),  // mask_uv_rect
11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations(),    // foreground filters
11224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations());   // background filters
11234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  root_pass->quad_list.push_back(mask_quad.PassAs<DrawQuad>());
11244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // White background behind the masked render pass.
11264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
11274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  white->SetNew(
11284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      root_pass_shared_state.get(), viewport_rect, SK_ColorWHITE, false);
11294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  root_pass->quad_list.push_back(white.PassAs<DrawQuad>());
11304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList pass_list;
11324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
11334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
11344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
11364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &pass_list,
11374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      PixelTest::NoOffscreenContext,
11384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("image_mask_of_layer.png")),
11394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExactPixelComparator(true)));
11404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
11414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename RendererType>
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTestWithBackgroundFilter
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public RendererPixelTest<RendererType> {
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUpRenderPassList() {
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect device_viewport_rect(this->device_viewport_size_);
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id root_id(1, 1);
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass =
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRootRenderPass(root_id, device_viewport_rect);
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->has_transparent_background = false;
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_content_to_target_transform;
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderPass::Id filter_pass_id(2, 1);
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform transform_to_root;
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> filter_pass =
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRenderPass(filter_pass_id,
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             filter_pass_content_rect_,
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             transform_to_root);
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A non-visible quad in the filtering render pass.
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    filter_pass_content_rect_);
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(),
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         filter_pass_content_rect_,
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         SK_ColorTRANSPARENT,
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false);
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass->shared_quad_state_list.push_back(shared_state.Pass());
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(filter_pass_to_target_transform_,
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    filter_pass_content_rect_);
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<RenderPassDrawQuad> filter_pass_quad =
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          RenderPassDrawQuad::Create();
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass_quad->SetNew(
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          shared_state.get(),
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_content_rect_,
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_id,
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          false,  // is_replica
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          0,  // mask_resource_id
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_content_rect_,  // contents_changed_since_last_frame
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          gfx::RectF(),  // mask_uv_rect
1191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          FilterOperations(),  // filters
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this->background_filters_);
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>());
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int kColumnWidth = device_viewport_rect.width() / 3;
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20);
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) {
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    left_rect);
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN, false);
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      left_rect += gfx::Vector2d(0, left_rect.height() + 1);
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20);
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) {
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    middle_rect);
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED, false);
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      middle_rect += gfx::Vector2d(0, middle_rect.height() + 1);
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20);
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) {
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SharedQuadState> shared_state =
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          CreateTestSharedQuadState(identity_content_to_target_transform,
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    right_rect);
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE, false);
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_pass->shared_quad_state_list.push_back(shared_state.Pass());
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      right_rect += gfx::Vector2d(0, right_rect.height() + 1);
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SharedQuadState> shared_state =
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestSharedQuadState(identity_content_to_target_transform,
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  device_viewport_rect);
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SolidColorDrawQuad> background_quad =
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SolidColorDrawQuad::Create();
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    background_quad->SetNew(shared_state.get(),
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            device_viewport_rect,
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            SK_ColorWHITE,
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false);
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->quad_list.push_back(background_quad.PassAs<DrawQuad>());
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->shared_quad_state_list.push_back(shared_state.Pass());
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(filter_pass.Pass());
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(root_pass.Pass());
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list_;
1252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperations background_filters_;
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform filter_pass_to_target_transform_;
1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect filter_pass_content_rect_;
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef ::testing::Types<GLRenderer, SoftwareRenderer>
125890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BackgroundFilterRendererTypes;
125990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter,
126090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                BackgroundFilterRendererTypes);
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTestWithBackgroundFilter<GLRenderer>
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GLRendererPixelTestWithBackgroundFilter;
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(skaslev): The software renderer does not support filters yet.
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) {
1267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  this->background_filters_.Append(
1268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FilterOperation::CreateInvertFilter(1.f));
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_ = gfx::Rect(this->device_viewport_size_);
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_.Inset(12, 14, 16, 18);
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->SetUpRenderPassList();
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &this->pass_list_,
1276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::WithOffscreenContext,
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("background_filter.png")),
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1281fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass ExternalStencilPixelTest : public GLRendererPixelTest {
1282fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch protected:
1283fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void ClearBackgroundToGreen() {
12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLES2Interface* gl = output_surface_->context_provider()->ContextGL();
1285fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->EnsureBackbuffer();
1286fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->Reshape(device_viewport_size_, 1);
12875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearColor(0.f, 1.f, 0.f, 1.f);
12885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_COLOR_BUFFER_BIT);
1289fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
1290fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1291fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void PopulateStencilBuffer() {
1292fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    // Set two quadrants of the stencil buffer to 1.
12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLES2Interface* gl = output_surface_->context_provider()->ContextGL();
1294fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->EnsureBackbuffer();
1295fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->Reshape(device_viewport_size_, 1);
12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearStencil(0);
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Enable(GL_SCISSOR_TEST);
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearStencil(1);
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Scissor(0,
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                0,
13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.width() / 2,
13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height() / 2);
13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Scissor(device_viewport_size_.width() / 2,
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height() / 2,
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.width(),
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height());
13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
1310fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
1311fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch};
1312fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1313fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, StencilTestEnabled) {
1314fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  ClearBackgroundToGreen();
1315fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1316fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  this->EnableExternalStencilTest();
1317fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1318fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Draw a blue quad that covers the entire device viewport. It should be
1319fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // clipped to the bottom left and top right corners by the external stencil.
1320fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
1321fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPass::Id id(1, 1);
1322fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1323fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SharedQuadState> blue_shared_state =
1324fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
1325fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1326fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1327fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1328fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass->has_transparent_background = false;
1329fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1330fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(pass.Pass());
1331fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1332fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1333fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1335fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1336fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1337fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1338fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1339fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, StencilTestDisabled) {
1340fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1341fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1342fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Draw a green quad that covers the entire device viewport. The stencil
1343fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // buffer should be ignored.
1344fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
1345fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPass::Id id(1, 1);
1346fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1347fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SharedQuadState> green_shared_state =
1348fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
1349fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
1350fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  green->SetNew(green_shared_state.get(), rect, SK_ColorGREEN, false);
1351fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass->quad_list.push_back(green.PassAs<DrawQuad>());
1352fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1353fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(pass.Pass());
1354fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1355fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1356fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1357424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1358fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green.png")),
1359fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1360fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1361fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1362fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, RenderSurfacesIgnoreStencil) {
1363fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // The stencil test should apply only to the final render pass.
1364fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  ClearBackgroundToGreen();
1365fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1366fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  this->EnableExternalStencilTest();
1367fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1368fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect viewport_rect(this->device_viewport_size_);
1369fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1370fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPass::Id root_pass_id(1, 1);
1371fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> root_pass =
1372fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestRootRenderPass(root_pass_id, viewport_rect);
1373fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  root_pass->has_transparent_background = false;
1374fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1375fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPass::Id child_pass_id(2, 2);
1376fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect pass_rect(this->device_viewport_size_);
1377fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Transform transform_to_root;
1378fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> child_pass =
1379fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
1380fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1381fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Transform content_to_target_transform;
1382fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SharedQuadState> shared_state =
1383fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
1384fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1385fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1386fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  blue->SetNew(shared_state.get(),
1387fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               gfx::Rect(0,
1388fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                         0,
1389fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                         this->device_viewport_size_.width(),
1390fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                         this->device_viewport_size_.height()),
1391fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               SK_ColorBLUE,
1392fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch               false);
1393fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1394fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1395fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<SharedQuadState> pass_shared_state =
1396fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect);
1397fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  root_pass->quad_list.push_back(
1398fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestRenderPassDrawQuad(pass_shared_state.get(),
1399fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                                   pass_rect,
1400fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                                   child_pass_id));
1401fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1402fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(child_pass.Pass());
1403fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(root_pass.Pass());
1404fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1405fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1406fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1407424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1408fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1409fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1410fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1411fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
141258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalStencilPixelTest, DeviceClip) {
141358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ClearBackgroundToGreen();
141458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect clip_rect(gfx::Point(150, 150), gfx::Size(50, 50));
141558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  this->ForceDeviceClip(clip_rect);
141658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
141758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Draw a blue quad that covers the entire device viewport. It should be
141858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // clipped to the bottom right corner by the device clip.
141958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
142058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderPass::Id id(1, 1);
142158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
142258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
142358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
142458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
142558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
142658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
142758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderPassList pass_list;
142858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pass_list.push_back(pass.Pass());
142958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
143058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
143158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &pass_list,
143258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PixelTest::NoOffscreenContext,
143358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
143458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ExactPixelComparator(true)));
143558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
143658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Software renderer does not support anti-aliased edges.
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AntiAliasing) {
1439b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Rotate(10);
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> red_shared_state =
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(red_content_to_target_transform, rect);
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Rotate(5);
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> yellow_shared_state =
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(blue_content_to_target_transform, rect);
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")),
1480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that anti-aliasing works for axis aligned quads.
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AxisAligned) {
1486b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Translate(50, 50);
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Scale(
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> red_shared_state =
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(red_content_to_target_transform, rect);
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Translate(25.5f, 25.5f);
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Scale(0.5f, 0.5f);
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> yellow_shared_state =
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(blue_content_to_target_transform, rect);
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1531424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")),
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that forcing anti-aliasing off works as expected.
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, ForceAntiAliasingOff) {
1539b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform hole_content_to_target_transform;
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Translate(50, 50);
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Scale(
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> hole_shared_state =
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(hole_content_to_target_transform, rect);
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> hole = SolidColorDrawQuad::Create();
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole->SetAll(hole_shared_state.get(), rect, rect, rect, false,
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SK_ColorTRANSPARENT, true);
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(hole.PassAs<DrawQuad>());
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> green_shared_state =
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, rect);
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green->SetNew(green_shared_state.get(), rect, SK_ColorGREEN, false);
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green.PassAs<DrawQuad>());
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1573424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("force_anti_aliasing_off.png")),
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(false)));
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GLRendererPixelTest, AntiAliasingPerspective) {
1579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
1580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass =
1582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestRootRenderPass(RenderPass::Id(1, 1), rect);
1583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect red_rect(0, 0, 180, 500);
1585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Transform red_content_to_target_transform(
158668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      1.0f,  2.4520f,  10.6206f, 19.0f,
158768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f,  0.3528f,  5.9737f,  9.5f,
158868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f, -0.2250f, -0.9744f,  0.0f,
158968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f,  0.0225f,  0.0974f,  1.0f);
1590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> red_shared_state =
1591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(red_content_to_target_transform, red_rect);
1592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
1593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  red->SetNew(red_shared_state.get(), red_rect, SK_ColorRED, false);
1594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(red.PassAs<DrawQuad>());
1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect green_rect(19, 7, 180, 10);
1597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> green_shared_state =
1598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), green_rect);
1599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
1600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  green->SetNew(green_shared_state.get(), green_rect, SK_ColorGREEN, false);
1601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(green.PassAs<DrawQuad>());
1602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SharedQuadState> blue_shared_state =
1604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect);
1605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
1606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
1607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass->quad_list.push_back(blue.PassAs<DrawQuad>());
1608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
1610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
1611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
1613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
1614424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("anti_aliasing_perspective.png")),
1616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1623d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One clipped blue quad in the lower right corner.  Outside the clip
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is red, which should not appear.
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_rect(gfx::Size(100, 100));
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_clip_rect(gfx::Point(50, 50), gfx::Size(50, 50));
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> blue_pile =
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, blue_rect.size());
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_rect, red_paint);
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_clip_rect, blue_paint);
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->RerecordPile();
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2d offset(viewport.bottom_right() - blue_rect.bottom_right());
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.Translate(offset.x(), offset.y());
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_scissor_rect = blue_clip_rect;
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.TransformRect(&blue_scissor_rect);
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadStateClipped(blue_content_to_target_transform,
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       blue_rect,
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       gfx::ToEnclosingRect(blue_scissor_rect));
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state.get(),
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,  // Intentionally bigger than clip.
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport.size(),
1661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    texture_format,
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    1.f,
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    blue_pile);
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One viewport-filling green quad.
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, green_paint);
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> green_shared_state =
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, viewport);
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create();
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad->SetNew(green_shared_state.get(),
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::Rect(),
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::RectF(0.f, 0.f, 1.f, 1.f),
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport.size(),
1685d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     1.f,
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     green_pile);
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad.PassAs<DrawQuad>());
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1696424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1701424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Not WithSkiaGPUBackend since that path currently requires tiles for opacity.
1702424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
1703424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1704424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1705d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1706424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1707424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPass::Id id(1, 1);
1708424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform transform_to_root;
1709424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<RenderPass> pass =
1710424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1711424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1712424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // One viewport-filling 0.5-opacity green quad.
1713424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1714424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1715424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkPaint green_paint;
1716424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1717424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, green_paint);
1718424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_pile->RerecordPile();
1719424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1720424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1721424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<SharedQuadState> green_shared_state =
1722424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, viewport);
1723424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_shared_state->opacity = 0.5f;
1724424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1725424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create();
1726424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_quad->SetNew(green_shared_state.get(),
1727424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1728424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::Rect(),
1729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::RectF(0, 0, 1, 1),
1730424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport.size(),
1731d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1732424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1733424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     1.f,
1734424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     green_pile);
1735424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pass->quad_list.push_back(green_quad.PassAs<DrawQuad>());
1736424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1737424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // One viewport-filling white quad.
1738424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> white_pile =
1739424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1740424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkPaint white_paint;
1741424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_paint.setColor(SK_ColorWHITE);
1742424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_pile->add_draw_rect_with_paint(viewport, white_paint);
1743424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_pile->RerecordPile();
1744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1745424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform white_content_to_target_transform;
1746424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<SharedQuadState> white_shared_state =
1747424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateTestSharedQuadState(white_content_to_target_transform, viewport);
1748424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1749424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<PictureDrawQuad> white_quad = PictureDrawQuad::Create();
1750424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_quad->SetNew(white_shared_state.get(),
1751424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1752424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::Rect(),
1753424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::RectF(0, 0, 1, 1),
1754424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport.size(),
1755d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1756424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     1.f,
1758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     white_pile);
1759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pass->quad_list.push_back(white_quad.PassAs<DrawQuad>());
1760424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPassList pass_list;
1762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pass_list.push_back(pass.Pass());
1763424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1764424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1765424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      &pass_list,
1766424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1767424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
1768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FuzzyPixelOffByOneComparator(true)));
1769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
17714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<typename TypeParam> bool IsSoftwareRenderer() {
17724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
17734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
17744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<>
17764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool IsSoftwareRenderer<SoftwareRenderer>() {
17774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
17784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
17794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<>
17814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool IsSoftwareRenderer<SoftwareRendererWithExpandedViewport>() {
17824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
17834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
17844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// If we disable image filtering, then a 2x2 bitmap should appear as four
17864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// huge sharp squares.
17874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
17884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only care about this in software mode since bilinear filtering is
17894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // cheap in hardware.
17904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!IsSoftwareRenderer<TypeParam>())
17914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
17924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
17944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
17954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
17964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPass::Id id(1, 1);
17984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform transform_to_root;
17994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
18004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
18014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmap bitmap;
18034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
18044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bitmap.allocPixels();
18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
18064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkAutoLockPixels lock(bitmap);
18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkCanvas canvas(bitmap);
18084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(0, 0, SK_ColorGREEN);
18094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(0, 1, SK_ColorBLUE);
18104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(1, 0, SK_ColorBLUE);
18114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(1, 1, SK_ColorGREEN);
18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
18134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
18164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkPaint paint;
18174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setFilterLevel(SkPaint::kLow_FilterLevel);
18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pile->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
18194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pile->RerecordPile();
18204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform content_to_target_transform;
18224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
18234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, viewport);
18244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  quad->SetNew(shared_state.get(),
18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     viewport,
18284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     gfx::Rect(),
18294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     gfx::RectF(0, 0, 2, 2),
18304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     viewport.size(),
18314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     texture_format,
18324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     viewport,
18334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     1.f,
18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     pile);
18354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass->quad_list.push_back(quad.PassAs<DrawQuad>());
18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList pass_list;
18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(pass.Pass());
18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this->disable_picture_quad_image_filtering_ = true;
18414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
18434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &pass_list,
18444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      PixelTest::NoOffscreenContext,
18454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExactPixelComparator(true)));
18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
18484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1851b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1853d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPass::Id id(1, 1);
1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // As scaling up the blue checkerboards will cause sampling on the GPU,
1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a few extra "cleanup rects" need to be added to clobber the blending
1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to make the output image more clean.  This will also test subrects
1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the layer.
1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect1(gfx::Point(80, 0), gfx::Size(20, 100));
1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect2(gfx::Point(0, 80), gfx::Size(100, 20));
1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, red_paint);
1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect1, green_paint);
1875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect2, green_paint);
1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> top_right_green_shared_quad_state =
1879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(green_content_to_target_transform, viewport);
1880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad1 = PictureDrawQuad::Create();
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad1->SetNew(top_right_green_shared_quad_state.get(),
1883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1885b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect1.size()),
1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1.size(),
1887d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      texture_format,
1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_pile);
1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad1.PassAs<DrawQuad>());
1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> green_quad2 = PictureDrawQuad::Create();
1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_quad2->SetNew(top_right_green_shared_quad_state.get(),
1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1897b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect2.size()),
1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2.size(),
1899d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      texture_format,
1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_pile);
1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(green_quad2.PassAs<DrawQuad>());
1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a green clipped checkerboard in the bottom right to help test
1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // interleaving picture quad content and solid color content.
1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect bottom_right_rect(
1908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Point(viewport.width() / 2, viewport.height() / 2),
1909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Size(viewport.width() / 2, viewport.height() / 2));
1910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> bottom_right_green_shared_state =
1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadStateClipped(
1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          green_content_to_target_transform, viewport, bottom_right_rect);
1913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> bottom_right_color_quad =
1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SolidColorDrawQuad::Create();
1915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bottom_right_color_quad->SetNew(
1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bottom_right_green_shared_state.get(), viewport, SK_ColorGREEN, false);
1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(bottom_right_color_quad.PassAs<DrawQuad>());
1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add two blue checkerboards taking up the bottom left and top right,
1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // but use content scales as content rects to make this happen.
1921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The content is at a 4x content scale.
1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect layer_rect(gfx::Size(20, 30));
1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float contents_scale = 4.f;
1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Two rects that touch at their corners, arbitrarily placed in the layer.
1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect1(gfx::PointF(5.5f, 9.0f), gfx::SizeF(2.5f, 2.5f));
1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect2(gfx::PointF(8.0f, 6.5f), gfx::SizeF(2.5f, 2.5f));
1927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF union_layer_rect = blue_layer_rect1;
1928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  union_layer_rect.Union(blue_layer_rect2);
1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Because scaling up will cause sampling outside the rects, add one extra
1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pixel of buffer at the final content scale.
1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float inset = -1.f / contents_scale;
1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect1.Inset(inset, inset, inset, inset);
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect2.Inset(inset, inset, inset, inset);
1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_rect.size());
193890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
193990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Region outside(layer_rect);
194090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  outside.Subtract(gfx::ToEnclosingRect(union_layer_rect));
194190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (Region::Iterator iter(outside); iter.has_rect(); iter.next()) {
194290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    pile->add_draw_rect_with_paint(iter.rect(), red_paint);
194390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
194490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect1, blue_paint);
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect2, blue_paint);
1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_rect(
195290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::ScaleToEnclosingRect(layer_rect, contents_scale));
1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_union_rect(
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect, contents_scale)));
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // At a scale of 4x the rectangles with a width of 2.5 will take up 10 pixels,
1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so scale an additional 10x to make them 100x100.
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content_to_target_transform.Scale(10.0, 10.0);
1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect quad_content_rect(gfx::Size(20, 20));
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> blue_shared_state =
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(content_to_target_transform, quad_content_rect);
1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state.get(),
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
1967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect.size(),
1970d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    texture_format,
1971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect,
1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    contents_scale,
1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    pile);
1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fill left half of viewport with green.
1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform half_green_content_to_target_transform;
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect half_green_rect(gfx::Size(viewport.width() / 2, viewport.height()));
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SharedQuadState> half_green_shared_state =
1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestSharedQuadState(half_green_content_to_target_transform,
1981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                half_green_rect);
1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SolidColorDrawQuad> half_color_quad = SolidColorDrawQuad::Create();
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  half_color_quad->SetNew(
1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      half_green_shared_state.get(), half_green_rect, SK_ColorGREEN, false);
1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->quad_list.push_back(half_color_quad.PassAs<DrawQuad>());
1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1992424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PixelTest::NoOffscreenContext,
1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TYPED_TEST(RendererPixelTest, WrapModeRepeat) {
1998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPass::Id id(1, 1);
2001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<SharedQuadState> shared_state =
2004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateTestSharedQuadState(gfx::Transform(), rect);
2005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect texture_rect(4, 4);
2007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkPMColor colors[4] = {
2008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0, 255, 0)),
2009f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)),
2010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0,  64, 0)),
2011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0,   0, 0)),
2012f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
2013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  uint32_t pixels[16] = {
2014f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[0], colors[0], colors[1], colors[1],
2015f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[0], colors[0], colors[1], colors[1],
2016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[2], colors[2], colors[3], colors[3],
2017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[2], colors[2], colors[3], colors[3],
2018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
2019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ResourceProvider::ResourceId resource =
2020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->resource_provider_->CreateResource(
2021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          texture_rect.size(),
2022f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          GL_REPEAT,
2023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ResourceProvider::TextureUsageAny,
2024f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          RGBA_8888);
2025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  this->resource_provider_->SetPixels(
2026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      resource,
2027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<uint8_t*>(pixels),
2028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      texture_rect,
2029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      texture_rect,
2030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Vector2d());
2031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
2033f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create();
2034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  texture_quad->SetNew(
2035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      shared_state.get(),
2036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect(this->device_viewport_size_),
2037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect(),
2038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      resource,
2039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      true,  // premultiplied_alpha
2040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::PointF(0.0f, 0.0f),  // uv_top_left
2041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::PointF(  // uv_bottom_right
2042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          this->device_viewport_size_.width() / texture_rect.width(),
2043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          this->device_viewport_size_.height() / texture_rect.height()),
2044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SK_ColorWHITE,
2045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      vertex_opacity,
2046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      false);  // flipped
2047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
2048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassList pass_list;
2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
2051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
2053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &pass_list,
2054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      PixelTest::NoOffscreenContext,
2055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FuzzyPixelOffByOneComparator(true)));
2057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
2063