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"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "cc/resources/video_resource_updater.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_picture_pile_impl.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/pixel_test.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "media/base/video_frame.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkColorPriv.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkMatrix.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/geometry/rect_conversions.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using gpu::gles2::GLES2Interface;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_ANDROID)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPassId id,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                const gfx::Rect& rect) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Rect damage_rect = rect;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Transform transform_to_root_target;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<RenderPass> CreateTestRenderPass(
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId id,
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& transform_to_root_target) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect output_rect = rect;
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Rect damage_rect = rect;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return pass.Pass();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SharedQuadState* CreateTestSharedQuadState(
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    gfx::Transform content_to_target_transform,
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const gfx::Rect& rect,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderPass* render_pass) {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = rect;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect clip_rect = rect;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = false;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  int sorting_context_id = 0;
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = render_pass->CreateAndAppendSharedQuadState();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       opacity,
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       blend_mode,
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       sorting_context_id);
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return shared_state;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SharedQuadState* CreateTestSharedQuadStateClipped(
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform content_to_target_transform,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Rect& rect,
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const gfx::Rect& clip_rect,
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RenderPass* render_pass) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Size content_bounds = rect.size();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const gfx::Rect visible_content_rect = clip_rect;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool is_clipped = true;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const float opacity = 1.0f;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  int sorting_context_id = 0;
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = render_pass->CreateAndAppendSharedQuadState();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->SetAll(content_to_target_transform,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       content_bounds,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       visible_content_rect,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       clip_rect,
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       is_clipped,
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       opacity,
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       blend_mode,
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                       sorting_context_id);
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return shared_state;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CreateTestRenderPassDrawQuad(const SharedQuadState* shared_state,
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  const gfx::Rect& rect,
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  RenderPassId pass_id,
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  RenderPass* render_pass) {
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* quad =
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  quad->SetNew(shared_state,
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               rect,
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               rect,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               pass_id,
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               0,                     // mask_resource_id
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               gfx::RectF(1.f, 1.f),  // mask_uv_rect
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               FilterOperations(),    // foreground filters
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               gfx::Vector2dF(),      // filters scale
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               FilterOperations());   // background filters
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CreateTestTextureDrawQuad(const gfx::Rect& rect,
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               SkColor texel_color,
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               SkColor background_color,
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               bool premultiplied_alpha,
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               const SharedQuadState* shared_state,
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               ResourceProvider* resource_provider,
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               RenderPass* render_pass) {
120a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  SkPMColor pixel_color = premultiplied_alpha ?
121a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPreMultiplyColor(texel_color) :
122a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      SkPackARGB32NoCheck(SkColorGetA(texel_color),
123a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetR(texel_color),
124a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetG(texel_color),
125a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                          SkColorGetB(texel_color));
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceProvider::ResourceId resource =
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      resource_provider->CreateResource(rect.size(),
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        GL_CLAMP_TO_EDGE,
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                        ResourceProvider::TextureHintImmutable,
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        RGBA_8888);
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  resource_provider->SetPixels(
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      resource,
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      reinterpret_cast<uint8_t*>(&pixels.front()),
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      rect,
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      gfx::Vector2d());
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* quad =
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  quad->SetNew(shared_state,
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               rect,
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::Rect(),
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               rect,
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               resource,
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               premultiplied_alpha,
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(0.0f, 0.0f),  // uv_top_left
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               gfx::PointF(1.0f, 1.0f),  // uv_bottom_right
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               background_color,
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               vertex_opacity,
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               false);  // flipped
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)typedef ::testing::Types<GLRenderer,
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRenderer,
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GLRendererWithExpandedViewport,
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         SoftwareRendererWithExpandedViewport> RendererTypes;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename RendererType>
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : fuzzy_(discard_alpha), exact_(discard_alpha) {}
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Compare(const SkBitmap& actual_bmp,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const SkBitmap& expected_bmp) const;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FuzzyPixelOffByOneComparator fuzzy_;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExactPixelComparator exact_;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<>
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<SoftwareRenderer>::Compare(
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& actual_bmp,
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& expected_bmp) const {
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return fuzzy_.Compare(actual_bmp, expected_bmp);
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <>
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SoftwareRendererWithExpandedViewport>::Compare(
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const SkBitmap& actual_bmp,
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const SkBitmap& expected_bmp) const {
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fuzzy_.Compare(actual_bmp, expected_bmp);
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<typename RendererType>
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool FuzzyForSoftwareOnlyPixelComparator<RendererType>::Compare(
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& actual_bmp,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SkBitmap& expected_bmp) const {
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return exact_.Compare(actual_bmp, expected_bmp);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TYPED_TEST(RendererPixelTest, SimpleGreenRect) {
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(shared_state, rect, rect, SK_ColorGREEN, false);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green.png")),
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TYPED_TEST(RendererPixelTest, SimpleGreenRect_NonRootRenderPass) {
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect small_rect(100, 100);
224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId 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)
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* child_shared_state =
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), small_rect, child_pass.get());
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(child_shared_state, rect, rect, SK_ColorGREEN, false);
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_id(1, 1);
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      CreateTestRenderPass(root_id, rect, gfx::Transform());
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* root_shared_state =
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, root_pass.get());
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestRenderPassDrawQuad(
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_shared_state, small_rect, child_id, root_pass.get());
245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPass* child_pass_ptr = child_pass.get();
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderPassList pass_list;
249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTestWithReadbackTarget(
253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      &pass_list,
254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      child_pass_ptr,
255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_small.png")),
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ExactPixelComparator(true)));
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithoutBackground) {
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_),
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SkColorSetARGB(128, 0, 255, 0),  // Texel color.
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SK_ColorTRANSPARENT,  // Background color.
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            true,                 // Premultiplied alpha.
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            shared_state,
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            this->resource_provider_.get(),
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            pass.get());
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTYPED_TEST(RendererPixelTest, PremultipliedTextureWithBackground) {
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* texture_quad_state =
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
297a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_),
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SkColorSetARGB(204, 120, 255, 120),  // Texel color.
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SK_ColorGREEN,  // Background color.
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            true,           // Premultiplied alpha.
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            texture_quad_state,
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            this->resource_provider_.get(),
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            pass.get());
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* color_quad_state =
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(color_quad_state, rect, rect, SK_ColorWHITE, false);
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_),
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SkColorSetARGB(128, 0, 255, 0),  // Texel color.
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SK_ColorTRANSPARENT,  // Background color.
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            false,                // Premultiplied alpha.
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            shared_state,
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            this->resource_provider_.get(),
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            pass.get());
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// TODO(skaslev): The software renderer does not support non-premultplied alpha.
3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* texture_quad_state =
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
362a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  texture_quad_state->opacity = 0.8f;
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestTextureDrawQuad(gfx::Rect(this->device_viewport_size_),
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SkColorSetARGB(204, 120, 255, 120),  // Texel color.
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            SK_ColorGREEN,  // Background color.
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            false,          // Premultiplied alpha.
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            texture_quad_state,
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            this->resource_provider_.get(),
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            pass.get());
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* color_quad_state =
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(color_quad_state, rect, rect, SK_ColorWHITE, false);
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RenderPassList pass_list;
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  pass_list.push_back(pass.Pass());
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      &pass_list,
3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FuzzyPixelOffByOneComparator(true)));
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class VideoGLRendererPixelTest : public GLRendererPixelTest {
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state,
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          media::VideoFrame::Format format,
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          bool is_transparent,
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          const gfx::RectF& tex_coord_rect,
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          RenderPass* render_pass) {
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const gfx::Rect rect(this->device_viewport_size_);
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<media::VideoFrame> video_frame =
397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        media::VideoFrame::CreateFrame(
398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            format, rect.size(), rect, rect.size(), base::TimeDelta());
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // YUV values representing a striped pattern, for validating texture
401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // coordinates for sampling.
402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    uint8_t y_value = 0;
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    uint8_t u_value = 0;
404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    uint8_t v_value = 0;
405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       video_frame->stride(media::VideoFrame::kYPlane) * i;
408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           ++j) {
410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        y_row[j] = (y_value += 1);
411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      }
412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       video_frame->stride(media::VideoFrame::kUPlane) * i;
416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       video_frame->stride(media::VideoFrame::kVPlane) * i;
418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           ++j) {
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        u_row[j] = (u_value += 3);
421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        v_row[j] = (v_value += 5);
422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      }
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateTestYUVVideoDrawQuad_FromVideoFrame(
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state,
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        media::VideoFrame::Format format,
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        bool is_transparent,
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        const gfx::RectF& tex_coord_rect,
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        uint8 y,
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        uint8 u,
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        uint8 v,
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        RenderPass* render_pass) {
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Rect rect(this->device_viewport_size_);
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<media::VideoFrame> video_frame =
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        media::VideoFrame::CreateFrame(
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            format, rect.size(), rect, rect.size(), base::TimeDelta());
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // YUV values of a solid, constant, color. Useful for testing that color
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // space/color range are being handled properly.
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    memset(video_frame->data(media::VideoFrame::kYPlane),
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           y,
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           video_frame->stride(media::VideoFrame::kYPlane) *
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               video_frame->rows(media::VideoFrame::kYPlane));
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    memset(video_frame->data(media::VideoFrame::kUPlane),
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           u,
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           video_frame->stride(media::VideoFrame::kUPlane) *
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               video_frame->rows(media::VideoFrame::kUPlane));
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    memset(video_frame->data(media::VideoFrame::kVPlane),
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           v,
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           video_frame->stride(media::VideoFrame::kVPlane) *
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               video_frame->rows(media::VideoFrame::kVPlane));
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateTestYUVVideoDrawQuad_FromVideoFrame(
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CreateTestYUVVideoDrawQuad_FromVideoFrame(
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const SharedQuadState* shared_state,
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      scoped_refptr<media::VideoFrame> video_frame,
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bool is_transparent,
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const gfx::RectF& tex_coord_rect,
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      RenderPass* render_pass) {
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const YUVVideoDrawQuad::ColorSpace color_space =
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        (video_frame->format() == media::VideoFrame::YV12J
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             ? YUVVideoDrawQuad::REC_601_JPEG
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             : YUVVideoDrawQuad::REC_601);
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Rect rect(this->device_viewport_size_);
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const gfx::Rect opaque_rect(0, 0, 0, 0);
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha)
476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      memset(video_frame->data(media::VideoFrame::kAPlane),
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch             is_transparent ? 0 : 128,
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch             video_frame->stride(media::VideoFrame::kAPlane) *
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 video_frame->rows(media::VideoFrame::kAPlane));
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    VideoFrameExternalResources resources =
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        video_resource_updater_->CreateExternalResourcesFromVideoFrame(
483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            video_frame);
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              resources.mailboxes.size());
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              resources.release_callbacks.size());
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ResourceProvider::ResourceId y_resource =
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        resource_provider_->CreateResourceFromTextureMailbox(
493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            resources.mailboxes[media::VideoFrame::kYPlane],
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            SingleReleaseCallbackImpl::Create(
495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                resources.release_callbacks[media::VideoFrame::kYPlane]));
496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ResourceProvider::ResourceId u_resource =
497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        resource_provider_->CreateResourceFromTextureMailbox(
498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            resources.mailboxes[media::VideoFrame::kUPlane],
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            SingleReleaseCallbackImpl::Create(
500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                resources.release_callbacks[media::VideoFrame::kUPlane]));
501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ResourceProvider::ResourceId v_resource =
502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        resource_provider_->CreateResourceFromTextureMailbox(
503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            resources.mailboxes[media::VideoFrame::kVPlane],
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            SingleReleaseCallbackImpl::Create(
505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                resources.release_callbacks[media::VideoFrame::kVPlane]));
506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ResourceProvider::ResourceId a_resource = 0;
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (with_alpha) {
508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      a_resource = resource_provider_->CreateResourceFromTextureMailbox(
509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          resources.mailboxes[media::VideoFrame::kAPlane],
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          SingleReleaseCallbackImpl::Create(
511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              resources.release_callbacks[media::VideoFrame::kAPlane]));
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    YUVVideoDrawQuad* yuv_quad =
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    yuv_quad->SetNew(shared_state,
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     rect,
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     opaque_rect,
519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     rect,
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                     tex_coord_rect,
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     y_resource,
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     u_resource,
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     v_resource,
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     a_resource,
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     color_space);
526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE {
529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GLRendererPixelTest::SetUp();
530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    video_resource_updater_.reset(new VideoResourceUpdater(
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        output_surface_->context_provider(), resource_provider_.get()));
532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<VideoResourceUpdater> video_resource_updater_;
536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Striped(shared_state,
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     media::VideoFrame::YV12,
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     false,
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     pass.get());
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPassList pass_list;
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  pass_list.push_back(pass.Pass());
555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      this->RunPixelTest(&pass_list,
558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
559effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         FuzzyPixelOffByOneComparator(true)));
560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
562effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
56503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Intentionally sets frame format to I420 for testing coverage.
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Striped(shared_state,
573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     media::VideoFrame::I420,
574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     false,
575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f),
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     pass.get());
577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FuzzyPixelOffByOneComparator(true)));
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) {
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // In MPEG color range YUV values of (15,128,128) should produce black.
597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Solid(shared_state,
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   media::VideoFrame::YV12,
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   false,
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   15,
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   128,
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   128,
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   pass.get());
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderPassList pass_list;
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pass_list.push_back(pass.Pass());
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If we didn't get black out of the YUV values above, then we probably have a
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // color range issue.
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(&pass_list,
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 base::FilePath(FILE_PATH_LITERAL("black.png")),
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 FuzzyPixelOffByOneComparator(true)));
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) {
617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // YUV of (149,43,21) should be green (0,255,0) in RGB.
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Solid(shared_state,
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   media::VideoFrame::YV12J,
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   false,
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   149,
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   43,
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   21,
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   pass.get());
634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderPassList pass_list;
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pass_list.push_back(pass.Pass());
637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(&pass_list,
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 base::FilePath(FILE_PATH_LITERAL("green.png")),
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 FuzzyPixelOffByOneComparator(true)));
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) {
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
64603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Dark grey in JPEG color range (in MPEG, this is black).
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Solid(shared_state,
654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   media::VideoFrame::YV12J,
655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   false,
656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   15,
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   128,
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   128,
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   pass.get());
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderPassList pass_list;
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pass_list.push_back(pass.Pass());
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this->RunPixelTest(&pass_list,
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         FuzzyPixelOffByOneComparator(true)));
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
67403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Striped(shared_state,
681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     media::VideoFrame::YV12A,
682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     false,
683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     pass.get());
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderPassList pass_list;
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pass_list.push_back(pass.Pass());
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &pass_list,
695effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
696effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FuzzyPixelOffByOneComparator(true)));
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
70203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestYUVVideoDrawQuad_Striped(shared_state,
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     media::VideoFrame::YV12A,
710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     true,
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     pass.get());
713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* color_quad =
715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false);
717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("black.png")),
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExactPixelComparator(true)));
725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blank_state = CreateTestSharedQuadState(
761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* white =
764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  white->SetNew(
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      blank_state, viewport_rect, viewport_rect, SK_ColorWHITE, false);
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = matrix[4] = 0;
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = matrix[9] = 0;
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = matrix[14] = 0;
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(
788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      skia::AdoptRef(SkColorMatrixFilter::Create(matrix)));
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
79168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperations filters;
79268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  filters.Append(FilterOperation::CreateReferenceFilter(filter));
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* render_pass_quad =
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state,
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pass_rect,
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
80268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           filters,
8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           gfx::Vector2dF(),
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassSaturateFilter) {
8190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
8200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
82103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
8220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
8230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
8240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
82503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
8260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
8270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform transform_to_root;
8280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
8290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
8300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform content_to_target_transform;
832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
8340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  shared_state->opacity = 0.5f;
8350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
8500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blank_state = CreateTestSharedQuadState(
852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
8530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* white =
855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  white->SetNew(
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      blank_state, viewport_rect, viewport_rect, SK_ColorWHITE, false);
8580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
8610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FilterOperations filters;
8630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateSaturateFilter(0.5f));
8640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* render_pass_quad =
866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state,
8680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pass_rect,
8700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           child_pass_id,
8710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           0,
8720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           gfx::RectF(),
8730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           filters,
8746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           gfx::Vector2dF(),
8750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           FilterOperations());
8760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPassList pass_list;
8780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
8790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
8800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
8820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      &pass_list,
8830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")),
8840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ExactPixelComparator(true)));
8850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
8860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassFilterChain) {
8880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
8890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
89003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
8910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
8920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
8930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
89403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
8950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
8960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform transform_to_root;
8970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
8980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
8990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Transform content_to_target_transform;
901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
9030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  shared_state->opacity = 0.5f;
9040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
905a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
907a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
915a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
916116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
9190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blank_state = CreateTestSharedQuadState(
921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
9220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* white =
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  white->SetNew(
926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      blank_state, viewport_rect, viewport_rect, SK_ColorWHITE, false);
9270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
9300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FilterOperations filters;
9320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateGrayscaleFilter(1.f));
9330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  filters.Append(FilterOperation::CreateBrightnessFilter(0.5f));
9340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* render_pass_quad =
936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state,
9380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           pass_rect,
939a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pass_rect,
9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           child_pass_id,
9410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           0,
9420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           gfx::RectF(),
9430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           filters,
9446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           gfx::Vector2dF(),
9450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           FilterOperations());
9460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RenderPassList pass_list;
9480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
9490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
9500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
9520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      &pass_list,
9530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")),
9540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ExactPixelComparator(true)));
9550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
9560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, FastPassColorFilterAlphaTranslation) {
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shared_state->opacity = 0.5f;
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
982a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blank_state = CreateTestSharedQuadState(
991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* white =
994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  white->SetNew(
996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      blank_state, viewport_rect, viewport_rect, SK_ColorWHITE, false);
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = 0;
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[4] = 20.f;
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = 0;
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[9] = 200.f;
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = 0;
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[14] = 1.5f;
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skia::RefPtr<SkColorFilter> colorFilter(
1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      skia::AdoptRef(SkColorMatrixFilter::Create(matrix)));
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter =
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      skia::AdoptRef(SkColorFilterImageFilter::Create(colorFilter.get(), NULL));
102468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperations filters;
102568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  filters.Append(FilterOperation::CreateReferenceFilter(filter));
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* render_pass_quad =
1028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  render_pass_quad->SetNew(pass_shared_state,
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           pass_rect,
1031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           pass_rect,
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           child_pass_id,
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           0,
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           gfx::RectF(),
103568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           filters,
10366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           gfx::Vector2dF(),
1037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           FilterOperations());
1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This test has alpha=254 for the software renderer vs. alpha=255 for the gl
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // renderer so use a fuzzy comparator.
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")),
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false)));
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTexture) {
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
1070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
1071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
1072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
1076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
1077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
1078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
1079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestRenderPassDrawQuad(
1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TYPED_TEST(RendererPixelTest, EnlargedRenderPassTextureWithAntiAliasing) {
11027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
11037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
110403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
11057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
11077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
110803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
11097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Rect pass_rect(this->device_viewport_size_);
11107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform transform_to_root;
11117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
11137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform content_to_target_transform;
1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
1116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
11177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
1119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
1120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
1121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height() / 2);
1122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
1125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect yellow_rect(0,
1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2,
1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.width(),
1128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        this->device_viewport_size_.height() / 2);
1129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
1130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
11327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gfx::Transform aa_transform;
11347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aa_transform.Translate(0.5, 0.0);
11357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
1137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(aa_transform, pass_rect, root_pass.get());
1138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestRenderPassDrawQuad(
1139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
11407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* root_shared_state = CreateTestSharedQuadState(
1142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::Transform(), viewport_rect, root_pass.get());
1143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* background =
1144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  background->SetNew(root_shared_state,
11467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     gfx::Rect(this->device_viewport_size_),
1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     gfx::Rect(this->device_viewport_size_),
11487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     SK_ColorWHITE,
11497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     false);
11507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RenderPassList pass_list;
11527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(child_pass.Pass());
11537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  pass_list.push_back(root_pass.Pass());
11547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
11567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
11587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      &pass_list,
11597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("blue_yellow_anti_aliasing.png")),
1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
11617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
11627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This tests the case where we have a RenderPass with a mask, but the quad
11644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// for the masked surface does not include the full surface texture.
11654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TYPED_TEST(RendererPixelTest, RenderPassAndMaskWithPartialQuad) {
11664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect viewport_rect(this->device_viewport_size_);
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
116803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
11694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> root_pass =
11704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRootRenderPass(root_pass_id, viewport_rect);
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* root_pass_shared_state = CreateTestSharedQuadState(
1172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::Transform(), viewport_rect, root_pass.get());
11734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
117403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
11754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform transform_to_root;
11764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> child_pass =
11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRenderPass(child_pass_id, viewport_rect, transform_to_root);
1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* child_pass_shared_state = CreateTestSharedQuadState(
1179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::Transform(), viewport_rect, child_pass.get());
11804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The child render pass is just a green box.
11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const SkColor kCSSGreen = 0xff008000;
1183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* green =
1184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green->SetNew(
1186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      child_pass_shared_state, viewport_rect, viewport_rect, kCSSGreen, false);
11874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make a mask.
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect mask_rect = viewport_rect;
11904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmap bitmap;
1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bitmap.allocPixels(
1192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      SkImageInfo::MakeN32Premul(mask_rect.width(), mask_rect.height()));
1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SkCanvas canvas(bitmap);
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkPaint paint;
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setStyle(SkPaint::kStroke_Style);
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setStrokeWidth(SkIntToScalar(4));
11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setColor(SK_ColorWHITE);
1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  canvas.clear(SK_ColorTRANSPARENT);
11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect rect = mask_rect;
12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  while (!rect.IsEmpty()) {
12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.Inset(6, 6, 4, 4);
1202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    canvas.drawRect(
12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()),
12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        paint);
12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.Inset(6, 6, 4, 4);
12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ResourceProvider::ResourceId mask_resource_id =
12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this->resource_provider_->CreateResource(
12104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          mask_rect.size(),
12114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          GL_CLAMP_TO_EDGE,
121203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ResourceProvider::TextureHintImmutable,
12134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          RGBA_8888);
12144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
12154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkAutoLockPixels lock(bitmap);
12164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this->resource_provider_->SetPixels(
12174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_resource_id,
12184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        reinterpret_cast<uint8_t*>(bitmap.getPixels()),
12194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_rect,
12204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mask_rect,
12214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        gfx::Vector2d());
12224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This RenderPassDrawQuad does not include the full |viewport_rect| which is
12254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // the size of the child render pass.
12264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect sub_rect = gfx::Rect(50, 50, 100, 100);
12274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.x(), child_pass->output_rect.x());
12284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.y(), child_pass->output_rect.y());
12294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.right(), child_pass->output_rect.right());
12304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(sub_rect.bottom(), child_pass->output_rect.bottom());
12314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(child_pass->output_rect.Contains(sub_rect));
12324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set up a mask on the RenderPassDrawQuad.
1234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderPassDrawQuad* mask_quad =
1235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  mask_quad->SetNew(root_pass_shared_state,
12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    sub_rect,
1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    sub_rect,
12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    child_pass_id,
12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    mask_resource_id,
12414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    gfx::RectF(1.f, 1.f),  // mask_uv_rect
12424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations(),    // foreground filters
12436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    gfx::Vector2dF(),      // filters scale
12444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    FilterOperations());   // background filters
12454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // White background behind the masked render pass.
1247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* white =
1248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  white->SetNew(root_pass_shared_state,
1250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                viewport_rect,
1251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                viewport_rect,
1252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                SK_ColorWHITE,
1253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                false);
12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList pass_list;
12564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(child_pass.Pass());
12574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(root_pass.Pass());
12584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
12604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &pass_list,
12614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("image_mask_of_layer.png")),
12624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExactPixelComparator(true)));
12634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
12644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename RendererType>
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RendererPixelTestWithBackgroundFilter
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public RendererPixelTest<RendererType> {
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUpRenderPassList() {
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect device_viewport_rect(this->device_viewport_size_);
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_id(1, 1);
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass =
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRootRenderPass(root_id, device_viewport_rect);
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_pass->has_transparent_background = false;
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform identity_content_to_target_transform;
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId filter_pass_id(2, 1);
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform transform_to_root;
1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<RenderPass> filter_pass =
1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        CreateTestRenderPass(filter_pass_id,
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             filter_pass_content_rect_,
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             transform_to_root);
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A non-visible quad in the filtering render pass.
1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
1288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SharedQuadState* shared_state =
1289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          CreateTestSharedQuadState(identity_content_to_target_transform,
1290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    filter_pass_content_rect_,
1291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    filter_pass.get());
1292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SolidColorDrawQuad* color_quad =
1293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          filter_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      color_quad->SetNew(shared_state,
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         filter_pass_content_rect_,
1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         filter_pass_content_rect_,
1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         SK_ColorTRANSPARENT,
1298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         false);
1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
1302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SharedQuadState* shared_state =
1303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          CreateTestSharedQuadState(filter_pass_to_target_transform_,
1304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    filter_pass_content_rect_,
1305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    filter_pass.get());
1306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      RenderPassDrawQuad* filter_pass_quad =
1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      filter_pass_quad->SetNew(
1309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shared_state,
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_content_rect_,
1311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          filter_pass_content_rect_,
1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          filter_pass_id,
1313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          0,                          // mask_resource_id
1314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          gfx::RectF(),               // mask_uv_rect
1315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          FilterOperations(),         // filters
13166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          gfx::Vector2dF(),           // filters_scale
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this->background_filters_);
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int kColumnWidth = device_viewport_rect.width() / 3;
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20);
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) {
1324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SharedQuadState* shared_state = CreateTestSharedQuadState(
1325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          identity_content_to_target_transform, left_rect, root_pass.get());
1326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SolidColorDrawQuad* color_quad =
1327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      color_quad->SetNew(
1329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shared_state, left_rect, left_rect, SK_ColorGREEN, false);
1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      left_rect += gfx::Vector2d(0, left_rect.height() + 1);
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20);
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) {
1335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SharedQuadState* shared_state = CreateTestSharedQuadState(
1336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          identity_content_to_target_transform, middle_rect, root_pass.get());
1337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SolidColorDrawQuad* color_quad =
1338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      color_quad->SetNew(
1340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shared_state, middle_rect, middle_rect, SK_ColorRED, false);
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      middle_rect += gfx::Vector2d(0, middle_rect.height() + 1);
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20);
1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) {
1346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SharedQuadState* shared_state = CreateTestSharedQuadState(
1347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          identity_content_to_target_transform, right_rect, root_pass.get());
1348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SolidColorDrawQuad* color_quad =
1349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      color_quad->SetNew(
1351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shared_state, right_rect, right_rect, SK_ColorBLUE, false);
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      right_rect += gfx::Vector2d(0, right_rect.height() + 1);
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SharedQuadState* shared_state =
1356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        CreateTestSharedQuadState(identity_content_to_target_transform,
1357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  device_viewport_rect,
1358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  root_pass.get());
1359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SolidColorDrawQuad* background_quad =
1360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        root_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    background_quad->SetNew(shared_state,
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            device_viewport_rect,
1363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            device_viewport_rect,
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            SK_ColorWHITE,
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false);
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(filter_pass.Pass());
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass_list_.push_back(root_pass.Pass());
1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list_;
1372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FilterOperations background_filters_;
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform filter_pass_to_target_transform_;
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect filter_pass_content_rect_;
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef ::testing::Types<GLRenderer, SoftwareRenderer>
137890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BackgroundFilterRendererTypes;
137990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter,
138090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                BackgroundFilterRendererTypes);
1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef RendererPixelTestWithBackgroundFilter<GLRenderer>
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GLRendererPixelTestWithBackgroundFilter;
1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(skaslev): The software renderer does not support filters yet.
1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) {
1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  this->background_filters_.Append(
1388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FilterOperation::CreateInvertFilter(1.f));
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_ = gfx::Rect(this->device_viewport_size_);
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->filter_pass_content_rect_.Inset(12, 14, 16, 18);
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this->SetUpRenderPassList();
1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &this->pass_list_,
1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("background_filter.png")),
1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1400fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass ExternalStencilPixelTest : public GLRendererPixelTest {
1401fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch protected:
1402fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void ClearBackgroundToGreen() {
14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLES2Interface* gl = output_surface_->context_provider()->ContextGL();
1404fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->EnsureBackbuffer();
1405fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->Reshape(device_viewport_size_, 1);
14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearColor(0.f, 1.f, 0.f, 1.f);
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_COLOR_BUFFER_BIT);
1408fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
1409fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1410fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  void PopulateStencilBuffer() {
1411fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    // Set two quadrants of the stencil buffer to 1.
14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLES2Interface* gl = output_surface_->context_provider()->ContextGL();
1413fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->EnsureBackbuffer();
1414fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    output_surface_->Reshape(device_viewport_size_, 1);
14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearStencil(0);
14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
14175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Enable(GL_SCISSOR_TEST);
14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->ClearStencil(1);
14195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Scissor(0,
14205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                0,
14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.width() / 2,
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height() / 2);
14235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Scissor(device_viewport_size_.width() / 2,
14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height() / 2,
14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.width(),
14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                device_viewport_size_.height());
14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gl->Clear(GL_STENCIL_BUFFER_BIT);
1429fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
1430fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch};
1431fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1432fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, StencilTestEnabled) {
1433fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  ClearBackgroundToGreen();
1434fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1435fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  this->EnableExternalStencilTest();
1436fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1437fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Draw a blue quad that covers the entire device viewport. It should be
1438fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // clipped to the bottom left and top right corners by the external stencil.
1439fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
144003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1441fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state =
1443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false);
1447fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass->has_transparent_background = false;
1448fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1449fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(pass.Pass());
1450fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1451fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1452fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1453fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1454fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1455fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1456fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1457fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, StencilTestDisabled) {
1458fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1459fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1460fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Draw a green quad that covers the entire device viewport. The stencil
1461fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // buffer should be ignored.
1462fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect rect(this->device_viewport_size_);
146303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1464fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* green_shared_state =
1466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* green =
1468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green->SetNew(green_shared_state, rect, rect, SK_ColorGREEN, false);
1470fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1471fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(pass.Pass());
1472fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1473fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1474fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1475fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("green.png")),
1476fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1477fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1478fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1479fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTEST_F(ExternalStencilPixelTest, RenderSurfacesIgnoreStencil) {
1480fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // The stencil test should apply only to the final render pass.
1481fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  ClearBackgroundToGreen();
1482fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  PopulateStencilBuffer();
1483fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  this->EnableExternalStencilTest();
1484fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1485fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect viewport_rect(this->device_viewport_size_);
1486fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
148703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 1);
1488fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> root_pass =
1489fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestRootRenderPass(root_pass_id, viewport_rect);
1490fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  root_pass->has_transparent_background = false;
1491fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
149203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 2);
1493fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Rect pass_rect(this->device_viewport_size_);
1494fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Transform transform_to_root;
1495fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  scoped_ptr<RenderPass> child_pass =
1496fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
1497fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1498fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  gfx::Transform content_to_target_transform;
1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
1500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport_rect, child_pass.get());
1501fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Rect blue_rect(0,
1503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      0,
1504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.width(),
1505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      this->device_viewport_size_.height());
1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
1509fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* pass_shared_state =
1511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
1512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestRenderPassDrawQuad(
1513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
1514fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  RenderPassList pass_list;
1515fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(child_pass.Pass());
1516fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  pass_list.push_back(root_pass.Pass());
1517fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
1518fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_TRUE(this->RunPixelTest(
1519fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      &pass_list,
1520fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
1521fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      ExactPixelComparator(true)));
1522fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
1523fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalStencilPixelTest, DeviceClip) {
152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ClearBackgroundToGreen();
152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect clip_rect(gfx::Point(150, 150), gfx::Size(50, 50));
152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  this->ForceDeviceClip(clip_rect);
152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Draw a blue quad that covers the entire device viewport. It should be
153058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // clipped to the bottom right corner by the device clip.
153158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
153203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state =
1535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false);
153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderPassList pass_list;
154058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pass_list.push_back(pass.Pass());
154158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
154258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
154358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &pass_list,
154458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
154558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ExactPixelComparator(true)));
154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Software renderer does not support anti-aliased edges.
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AntiAliasing) {
1550b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Rotate(10);
1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* red_shared_state = CreateTestSharedQuadState(
1558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      red_content_to_target_transform, rect, pass.get());
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* red = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  red->SetNew(red_shared_state, rect, rect, SK_ColorRED, false);
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Rotate(5);
1565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* yellow_shared_state = CreateTestSharedQuadState(
1566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      yellow_content_to_target_transform, rect, pass.get());
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
1569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(yellow_shared_state, rect, rect, SK_ColorYELLOW, false);
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state = CreateTestSharedQuadState(
1574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      blue_content_to_target_transform, rect, pass.get());
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false);
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")),
1586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that anti-aliasing works for axis aligned quads.
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, AxisAligned) {
1592b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform red_content_to_target_transform;
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Translate(50, 50);
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_content_to_target_transform.Scale(
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* red_shared_state = CreateTestSharedQuadState(
1605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      red_content_to_target_transform, rect, pass.get());
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* red = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  red->SetNew(red_shared_state, rect, rect, SK_ColorRED, false);
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform yellow_content_to_target_transform;
1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Translate(25.5f, 25.5f);
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  yellow_content_to_target_transform.Scale(0.5f, 0.5f);
1613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* yellow_shared_state = CreateTestSharedQuadState(
1614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      yellow_content_to_target_transform, rect, pass.get());
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* yellow =
1617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  yellow->SetNew(yellow_shared_state, rect, rect, SK_ColorYELLOW, false);
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state = CreateTestSharedQuadState(
1622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      blue_content_to_target_transform, rect, pass.get());
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false);
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")),
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test tests that forcing anti-aliasing off works as expected.
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Anti-aliasing is only supported in the gl renderer.
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererPixelTest, ForceAntiAliasingOff) {
1640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, rect, transform_to_root);
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform hole_content_to_target_transform;
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Translate(50, 50);
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hole_content_to_target_transform.Scale(
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.width() * 2.0f),
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0.5f + 1.0f / (rect.height() * 2.0f));
1652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* hole_shared_state = CreateTestSharedQuadState(
1653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      hole_content_to_target_transform, rect, pass.get());
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* hole =
1656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  hole->SetAll(
1658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      hole_shared_state, rect, rect, rect, false, SK_ColorTRANSPARENT, true);
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* green_shared_state = CreateTestSharedQuadState(
1662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      green_content_to_target_transform, rect, pass.get());
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* green =
1665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green->SetNew(green_shared_state, rect, rect, SK_ColorGREEN, false);
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("force_anti_aliasing_off.png")),
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(false)));
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GLRendererPixelTest, AntiAliasingPerspective) {
1678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect rect(this->device_viewport_size_);
1679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<RenderPass> pass =
168103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CreateTestRootRenderPass(RenderPassId(1, 1), rect);
1682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect red_rect(0, 0, 180, 500);
1684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Transform red_content_to_target_transform(
168568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      1.0f,  2.4520f,  10.6206f, 19.0f,
168668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f,  0.3528f,  5.9737f,  9.5f,
168768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f, -0.2250f, -0.9744f,  0.0f,
168868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      0.0f,  0.0225f,  0.0974f,  1.0f);
1689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* red_shared_state = CreateTestSharedQuadState(
1690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      red_content_to_target_transform, red_rect, pass.get());
1691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* red = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  red->SetNew(red_shared_state, red_rect, red_rect, SK_ColorRED, false);
1693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect green_rect(19, 7, 180, 10);
1695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* green_shared_state =
1696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), green_rect, pass.get());
1697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* green =
1698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  green->SetNew(
1700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      green_shared_state, green_rect, green_rect, SK_ColorGREEN, false);
1701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state =
1703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* blue =
1705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false);
1707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderPassList pass_list;
1709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pass_list.push_back(pass.Pass());
1710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(this->RunPixelTest(
1712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &pass_list,
1713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("anti_aliasing_perspective.png")),
1714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FuzzyPixelOffByOneComparator(true)));
1715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1721d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One clipped blue quad in the lower right corner.  Outside the clip
1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is red, which should not appear.
1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_rect(gfx::Size(100, 100));
1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect blue_clip_rect(gfx::Point(50, 50), gfx::Size(50, 50));
1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> blue_pile =
1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, blue_rect.size());
1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_rect, red_paint);
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->add_draw_rect_with_paint(blue_clip_rect, blue_paint);
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_pile->RerecordPile();
1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2d offset(viewport.bottom_right() - blue_rect.bottom_right());
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.Translate(offset.x(), offset.y());
1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_scissor_rect = blue_clip_rect;
1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_content_to_target_transform.TransformRect(&blue_scissor_rect);
1747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state =
1748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadStateClipped(blue_content_to_target_transform,
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       blue_rect,
1750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       gfx::ToEnclosingRect(blue_scissor_rect),
1751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       pass.get());
1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state,
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,  // Intentionally bigger than clip.
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    gfx::RectF(viewport),
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport.size(),
1761d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    texture_format,
1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    viewport,
1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    1.f,
17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    PicturePileImpl::CreateFromOther(blue_pile.get()));
1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One viewport-filling green quad.
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, green_paint);
1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* green_shared_state = CreateTestSharedQuadState(
1776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      green_content_to_target_transform, viewport, pass.get());
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* green_quad =
1779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green_quad->SetNew(green_shared_state,
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::Rect(),
1783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     viewport,
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     gfx::RectF(0.f, 0.f, 1.f, 1.f),
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport.size(),
1786d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport,
1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     1.f,
17891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     PicturePileImpl::CreateFromOther(green_pile.get()));
1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1800424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Not WithSkiaGPUBackend since that path currently requires tiles for opacity.
1801424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
1802424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1803424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1804d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1805424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
180603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1807424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform transform_to_root;
1808424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<RenderPass> pass =
1809424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1810424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1811424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // One viewport-filling 0.5-opacity green quad.
1812424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1813424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1814424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkPaint green_paint;
1815424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1816424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, green_paint);
1817424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_pile->RerecordPile();
1818424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1819424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* green_shared_state = CreateTestSharedQuadState(
1821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      green_content_to_target_transform, viewport, pass.get());
1822424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  green_shared_state->opacity = 0.5f;
1823424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* green_quad =
1825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green_quad->SetNew(green_shared_state,
1827424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1828424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::Rect(),
1829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     viewport,
1830424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::RectF(0, 0, 1, 1),
1831424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport.size(),
1832d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1833424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1834424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     1.f,
18351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     PicturePileImpl::CreateFromOther(green_pile.get()));
1836424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1837424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // One viewport-filling white quad.
1838424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> white_pile =
1839424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1840424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SkPaint white_paint;
1841424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_paint.setColor(SK_ColorWHITE);
1842424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_pile->add_draw_rect_with_paint(viewport, white_paint);
1843424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  white_pile->RerecordPile();
1844424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1845424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Transform white_content_to_target_transform;
1846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* white_shared_state = CreateTestSharedQuadState(
1847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      white_content_to_target_transform, viewport, pass.get());
1848424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* white_quad =
1850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  white_quad->SetNew(white_shared_state,
1852424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1853424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::Rect(),
1854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     viewport,
1855424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     gfx::RectF(0, 0, 1, 1),
1856424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport.size(),
1857d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     texture_format,
1858424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     viewport,
1859424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     1.f,
18601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     PicturePileImpl::CreateFromOther(white_pile.get()));
1861424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1862424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderPassList pass_list;
1863424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  pass_list.push_back(pass.Pass());
1864424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1865424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
1866424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      &pass_list,
1867424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
1868424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FuzzyPixelOffByOneComparator(true)));
1869424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1870424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<typename TypeParam> bool IsSoftwareRenderer() {
18724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
18734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
18744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<>
18764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool IsSoftwareRenderer<SoftwareRenderer>() {
18774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
18784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
18794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)template<>
18814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool IsSoftwareRenderer<SoftwareRendererWithExpandedViewport>() {
18824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return true;
18834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
18844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// If we disable image filtering, then a 2x2 bitmap should appear as four
18864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// huge sharp squares.
18874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
18884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only care about this in software mode since bilinear filtering is
18894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // cheap in hardware.
18904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!IsSoftwareRenderer<TypeParam>())
18914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
18924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
18944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
18954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
189703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform transform_to_root;
18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmap bitmap;
1903effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bitmap.allocN32Pixels(2, 2);
19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  {
19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkAutoLockPixels lock(bitmap);
19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SkCanvas canvas(bitmap);
19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(0, 0, SK_ColorGREEN);
19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(0, 1, SK_ColorBLUE);
19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(1, 0, SK_ColorBLUE);
19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canvas.drawPoint(1, 1, SK_ColorGREEN);
19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkPaint paint;
19164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  paint.setFilterLevel(SkPaint::kLow_FilterLevel);
19174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pile->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
19184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pile->RerecordPile();
19194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Transform content_to_target_transform;
1921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = CreateTestSharedQuadState(
1922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, viewport, pass.get());
19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  quad->SetNew(shared_state,
1926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               viewport,
1927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               gfx::Rect(),
1928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               viewport,
1929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               gfx::RectF(0, 0, 2, 2),
1930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               viewport.size(),
1931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               texture_format,
1932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               viewport,
1933a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               1.f,
19341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               PicturePileImpl::CreateFromOther(pile.get()));
19354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderPassList pass_list;
19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pass_list.push_back(pass.Pass());
19384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this->disable_picture_quad_image_filtering_ = true;
19404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &pass_list,
19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
19444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExactPixelComparator(true)));
19454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
19464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
1949b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(enne): the renderer should figure this out on its own.
1951d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat texture_format = RGBA_8888;
1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_to_root;
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<RenderPass> pass =
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // As scaling up the blue checkerboards will cause sampling on the GPU,
1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a few extra "cleanup rects" need to be added to clobber the blending
1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to make the output image more clean.  This will also test subrects
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of the layer.
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform green_content_to_target_transform;
1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect1(gfx::Point(80, 0), gfx::Size(20, 100));
1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect green_rect2(gfx::Point(0, 80), gfx::Size(100, 20));
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> green_pile =
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
1967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint red_paint;
1968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  red_paint.setColor(SK_ColorRED);
1969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(viewport, red_paint);
1970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint green_paint;
1971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_paint.setColor(SK_ColorGREEN);
1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect1, green_paint);
1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->add_draw_rect_with_paint(green_rect2, green_paint);
1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  green_pile->RerecordPile();
1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* top_right_green_shared_quad_state =
1977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CreateTestSharedQuadState(
1978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          green_content_to_target_transform, viewport, pass.get());
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* green_quad1 =
1981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green_quad1->SetNew(top_right_green_shared_quad_state,
1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      green_rect1,
1986b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect1.size()),
1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1.size(),
1988d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      texture_format,
1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect1,
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
19911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      PicturePileImpl::CreateFromOther(green_pile.get()));
1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* green_quad2 =
1994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
1995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  green_quad2->SetNew(top_right_green_shared_quad_state,
1996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
1997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      gfx::Rect(),
1998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      green_rect2,
1999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      gfx::RectF(green_rect2.size()),
2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2.size(),
2001d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      texture_format,
2002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      green_rect2,
2003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      1.f,
20041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      PicturePileImpl::CreateFromOther(green_pile.get()));
2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a green clipped checkerboard in the bottom right to help test
2007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // interleaving picture quad content and solid color content.
2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect bottom_right_rect(
2009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Point(viewport.width() / 2, viewport.height() / 2),
2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Size(viewport.width() / 2, viewport.height() / 2));
2011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* bottom_right_green_shared_state =
2012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadStateClipped(green_content_to_target_transform,
2013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       viewport,
2014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       bottom_right_rect,
2015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       pass.get());
2016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* bottom_right_color_quad =
2017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
2018010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bottom_right_color_quad->SetNew(bottom_right_green_shared_state,
2019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  viewport,
2020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  viewport,
2021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  SK_ColorGREEN,
2022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  false);
2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add two blue checkerboards taking up the bottom left and top right,
2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // but use content scales as content rects to make this happen.
2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The content is at a 4x content scale.
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect layer_rect(gfx::Size(20, 30));
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float contents_scale = 4.f;
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Two rects that touch at their corners, arbitrarily placed in the layer.
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect1(gfx::PointF(5.5f, 9.0f), gfx::SizeF(2.5f, 2.5f));
2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF blue_layer_rect2(gfx::PointF(8.0f, 6.5f), gfx::SizeF(2.5f, 2.5f));
2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::RectF union_layer_rect = blue_layer_rect1;
2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  union_layer_rect.Union(blue_layer_rect2);
2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Because scaling up will cause sampling outside the rects, add one extra
2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // pixel of buffer at the final content scale.
2037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float inset = -1.f / contents_scale;
2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect1.Inset(inset, inset, inset, inset);
2039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_layer_rect2.Inset(inset, inset, inset, inset);
2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_rect.size());
204390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
204490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Region outside(layer_rect);
204590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  outside.Subtract(gfx::ToEnclosingRect(union_layer_rect));
204690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (Region::Iterator iter(outside); iter.has_rect(); iter.next()) {
204790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    pile->add_draw_rect_with_paint(iter.rect(), red_paint);
204890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
204990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint blue_paint;
2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect1, blue_paint);
2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(blue_layer_rect2, blue_paint);
2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_rect(
205790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gfx::ScaleToEnclosingRect(layer_rect, contents_scale));
2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect content_union_rect(
2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect, contents_scale)));
2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // At a scale of 4x the rectangles with a width of 2.5 will take up 10 pixels,
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so scale an additional 10x to make them 100x100.
2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform content_to_target_transform;
2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content_to_target_transform.Scale(10.0, 10.0);
2065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect quad_content_rect(gfx::Size(20, 20));
2066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* blue_shared_state = CreateTestSharedQuadState(
2067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_to_target_transform, quad_content_rect, pass.get());
2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
2070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blue_quad->SetNew(blue_shared_state,
2071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    gfx::Rect(),
2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    quad_content_rect,
2074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    gfx::RectF(quad_content_rect),
2075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect.size(),
2076d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    texture_format,
2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    content_union_rect,
2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    contents_scale,
20791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    PicturePileImpl::CreateFromOther(pile.get()));
2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fill left half of viewport with green.
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform half_green_content_to_target_transform;
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect half_green_rect(gfx::Size(viewport.width() / 2, viewport.height()));
2084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* half_green_shared_state = CreateTestSharedQuadState(
2085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      half_green_content_to_target_transform, half_green_rect, pass.get());
2086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SolidColorDrawQuad* half_color_quad =
2087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
2088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  half_color_quad->SetNew(half_green_shared_state,
2089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          half_green_rect,
2090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          half_green_rect,
2091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          SK_ColorGREEN,
2092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          false);
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderPassList pass_list;
2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pass_list.push_back(pass.Pass());
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &pass_list,
2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExactPixelComparator(true)));
2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
21046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Size pile_tile_size(1000, 1000);
21056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Rect viewport(this->device_viewport_size_);
21066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResourceFormat texture_format = RGBA_4444;
21076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
210803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
21096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Transform transform_to_root;
21106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<RenderPass> pass =
21116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CreateTestRenderPass(id, viewport, transform_to_root);
21126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // One viewport-filling blue quad
21146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> blue_pile =
21156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
21166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SkPaint blue_paint;
21176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blue_paint.setColor(SK_ColorBLUE);
21186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blue_pile->add_draw_rect_with_paint(viewport, blue_paint);
21196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blue_pile->RerecordPile();
21206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Transform blue_content_to_target_transform;
21226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SharedQuadState* blue_shared_state = CreateTestSharedQuadState(
21236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      blue_content_to_target_transform, viewport, pass.get());
21246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
21266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blue_quad->SetNew(blue_shared_state,
21276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    viewport,
21286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    gfx::Rect(),
21296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    viewport,
21306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    gfx::RectF(0.f, 0.f, 1.f, 1.f),
21316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    viewport.size(),
21326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    texture_format,
21336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    viewport,
21346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    1.f,
21351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    PicturePileImpl::CreateFromOther(blue_pile.get()));
21366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderPassList pass_list;
21386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  pass_list.push_back(pass.Pass());
21396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(&pass_list,
21416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                 base::FilePath(FILE_PATH_LITERAL("blue.png")),
21426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                 ExactPixelComparator(true)));
21436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
21446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TYPED_TEST(RendererPixelTest, WrapModeRepeat) {
2146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect rect(this->device_viewport_size_);
2147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
214803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
2149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
2150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state =
2152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
2153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect texture_rect(4, 4);
2155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkPMColor colors[4] = {
2156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0, 255, 0)),
2157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)),
2158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0,  64, 0)),
2159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SkPreMultiplyColor(SkColorSetARGB(255, 0,   0, 0)),
2160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
2161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  uint32_t pixels[16] = {
2162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[0], colors[0], colors[1], colors[1],
2163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[0], colors[0], colors[1], colors[1],
2164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[2], colors[2], colors[3], colors[3],
2165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    colors[2], colors[2], colors[3], colors[3],
2166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
2167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ResourceProvider::ResourceId resource =
2168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->resource_provider_->CreateResource(
2169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          texture_rect.size(),
2170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          GL_REPEAT,
217103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ResourceProvider::TextureHintImmutable,
2172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          RGBA_8888);
2173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  this->resource_provider_->SetPixels(
2174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      resource,
2175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<uint8_t*>(pixels),
2176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      texture_rect,
2177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      texture_rect,
2178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Vector2d());
2179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
2181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* texture_quad =
2182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
2183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  texture_quad->SetNew(
2184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      shared_state,
2185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect(this->device_viewport_size_),
2186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Rect(),
2187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::Rect(this->device_viewport_size_),
2188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      resource,
2189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      true,                     // premultiplied_alpha
2190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::PointF(0.0f, 0.0f),  // uv_top_left
2191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::PointF(              // uv_bottom_right
2192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          this->device_viewport_size_.width() / texture_rect.width(),
2193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          this->device_viewport_size_.height() / texture_rect.height()),
2194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SK_ColorWHITE,
2195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      vertex_opacity,
2196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      false);  // flipped
2197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderPassList pass_list;
2199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
2200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(this->RunPixelTest(
2202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &pass_list,
2203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FuzzyPixelOffByOneComparator(true)));
2205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
2211