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