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