15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/test/tiled_layer_test_common.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeLayerUpdater::Resource::Resource(FakeLayerUpdater* layer, 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PrioritizedResource> texture) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerUpdater::Resource(texture.Pass()), layer_(layer) { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_.allocPixels(); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeLayerUpdater::Resource::~Resource() {} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeLayerUpdater::Resource::Update(ResourceUpdateQueue* queue, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect source_rect, 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d dest_offset, 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool partial_update) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect kRect(0, 0, 10, 10); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture(), &bitmap_, kRect, kRect, gfx::Vector2d()); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (partial_update) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendPartialUpload(upload); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendFullUpload(upload); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->Update(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeLayerUpdater::FakeLayerUpdater() : prepare_count_(0), update_count_(0) {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeLayerUpdater::~FakeLayerUpdater() {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeLayerUpdater::PrepareToUpdate(gfx::Rect content_rect, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size tile_size, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float contents_width_scale, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float contents_height_scale, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect* resulting_opaque_rect) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prepare_count_++; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_update_rect_ = content_rect; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!rect_to_invalidate_.IsEmpty()) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->InvalidateContentRect(rect_to_invalidate_); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect_to_invalidate_ = gfx::Rect(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_ = NULL; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *resulting_opaque_rect = opaque_paint_rect_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeLayerUpdater::SetRectToInvalidate(gfx::Rect rect, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeTiledLayer* layer) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect_to_invalidate_ = rect; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_ = layer; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerUpdater::Resource> FakeLayerUpdater::CreateResource( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager* manager) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<LayerUpdater::Resource>( 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new Resource(this, PrioritizedResource::Create(manager))); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayerImpl::FakeTiledLayerImpl(LayerTreeImpl* tree_impl, int id) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TiledLayerImpl(tree_impl, id) {} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayerImpl::~FakeTiledLayerImpl() {} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayer::FakeTiledLayer(PrioritizedResourceManager* resource_manager) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TiledLayer(), 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_updater_(make_scoped_refptr(new FakeLayerUpdater)), 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_manager_(resource_manager) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetTileSize(tile_size()); 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SetTextureFormat(RGBA_8888); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBorderTexelOption(LayerTilingData::NO_BORDER_TEXELS); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // So that we don't get false positives if any of these 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tests expect to return false from DrawsContent() for other reasons. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetIsDrawable(true); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayerWithScaledBounds::FakeTiledLayerWithScaledBounds( 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrioritizedResourceManager* resource_manager) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : FakeTiledLayer(resource_manager) {} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayerWithScaledBounds::~FakeTiledLayerWithScaledBounds() {} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeTiledLayer::~FakeTiledLayer() {} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeTiledLayer::SetNeedsDisplayRect(const gfx::RectF& rect) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_needs_display_rect_ = rect; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TiledLayer::SetNeedsDisplayRect(rect); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeTiledLayer::SetTexturePriorities( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PriorityCalculator& calculator) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure there is always a target render surface available. If none has been 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // set (the layer is an orphan for the test), then just set a surface on 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // itself. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool missing_target_render_surface = !render_target(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (missing_target_render_surface) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateRenderSurface(); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TiledLayer::SetTexturePriorities(calculator); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (missing_target_render_surface) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearRenderSurface(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_properties().render_target = 0; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)PrioritizedResourceManager* FakeTiledLayer::ResourceManager() { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return resource_manager_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeTiledLayer::UpdateContentsScale(float ideal_contents_scale) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CalculateContentsScale(ideal_contents_scale, 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1.f, 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1.f, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, // animating_transform_to_screen 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &draw_properties().contents_scale_x, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &draw_properties().contents_scale_y, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &draw_properties().content_bounds); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FakeTiledLayer::ResetNumDependentsNeedPushProperties() { 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t num = 0; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (mask_layer()) { 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (mask_layer()->needs_push_properties() || 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mask_layer()->descendant_needs_push_properties()) 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num; 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (replica_layer()) { 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (replica_layer()->needs_push_properties() || 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch replica_layer()->descendant_needs_push_properties()) 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num; 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < children().size(); ++i) { 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (children()[i]->needs_push_properties() || 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch children()[i]->descendant_needs_push_properties()) 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ++num; 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_dependents_need_push_properties_ = num; 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerUpdater* FakeTiledLayer::Updater() const { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_updater_.get(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeTiledLayerWithScaledBounds::SetContentBounds( 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size content_bounds) { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forced_content_bounds_ = content_bounds; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_properties().content_bounds = forced_content_bounds_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeTiledLayerWithScaledBounds::CalculateContentsScale( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ideal_contents_scale, 158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float device_scale_factor, 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) float page_scale_factor, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool animating_transform_to_screen, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* contents_scale_x, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* contents_scale_y, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size* content_bounds) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *contents_scale_x = 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(forced_content_bounds_.width()) / bounds().width(); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *contents_scale_y = 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<float>(forced_content_bounds_.height()) / bounds().height(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *content_bounds = forced_content_bounds_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 172