12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/render_surface_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/debug_colors.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/quad_sink.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/render_pass_sink.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/debug_border_draw_quad.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/damage_tracker.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderSurfaceImpl::RenderSurfaceImpl(LayerImpl* owning_layer) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : owning_layer_(owning_layer), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_property_changed_(false), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_opacity_(1), 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_opacity_is_animating_(false), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_surface_transforms_are_animating_(false), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_transforms_are_animating_(false), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_clipped_(false), 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch contributes_to_drawn_surface_(false), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nearest_ancestor_that_moves_pixels_(NULL), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_render_surface_layer_index_history_(0), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_layer_index_history_(0) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_tracker_ = DamageTracker::Create(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderSurfaceImpl::~RenderSurfaceImpl() {} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::RectF RenderSurfaceImpl::DrawableContentRect() const { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF drawable_content_rect = 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(draw_transform_, content_rect_); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (owning_layer_->has_replica()) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drawable_content_rect.Union( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::MapClippedRect(replica_draw_transform_, content_rect_)); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return drawable_content_rect; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string RenderSurfaceImpl::Name() const { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::StringPrintf("RenderSurfaceImpl(id=%i,owner=%s)", 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->id(), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->debug_name().data()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int RenderSurfaceImpl::OwningLayerId() const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return owning_layer_ ? owning_layer_->id() : 0; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::SetClipRect(gfx::Rect clip_rect) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (clip_rect_ == clip_rect) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_property_changed_ = true; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clip_rect_ = clip_rect; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderSurfaceImpl::ContentsChanged() const { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !damage_tracker_->current_damage_rect().IsEmpty(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::SetContentRect(gfx::Rect content_rect) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content_rect_ == content_rect) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_property_changed_ = true; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect_ = content_rect; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderSurfaceImpl::SurfacePropertyChanged() const { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Surface property changes are tracked as follows: 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - surface_property_changed_ is flagged when the clip_rect or content_rect 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // change. As of now, these are the only two properties that can be affected 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by descendant layers. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - all other property changes come from the owning layer (or some ancestor 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer that propagates its change to the owning layer). 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(owning_layer_); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return surface_property_changed_ || owning_layer_->LayerPropertyChanged(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderSurfaceImpl::SurfacePropertyChangedOnlyFromDescendant() const { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return surface_property_changed_ && !owning_layer_->LayerPropertyChanged(); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::AddContributingDelegatedRenderPassLayer( 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* layer) { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(std::find(layer_list_.begin(), layer_list_.end(), layer) != 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_list_.end()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelegatedRendererLayerImpl* delegated_renderer_layer = 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<DelegatedRendererLayerImpl*>(layer); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_delegated_render_pass_layer_list_.push_back( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_renderer_layer); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::ClearLayerLists() { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_list_.clear(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_delegated_render_pass_layer_list_.clear(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderPass::Id RenderSurfaceImpl::RenderPassId() { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layer_id = owning_layer_->id(); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sub_id = 0; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(layer_id, 0); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderPass::Id(layer_id, sub_id); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::AppendRenderPasses(RenderPassSink* pass_sink) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i < contributing_delegated_render_pass_layer_list_.size(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++i) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelegatedRendererLayerImpl* delegated_renderer_layer = 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contributing_delegated_render_pass_layer_list_[i]; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_renderer_layer->AppendContributingRenderPasses(pass_sink); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> pass = RenderPass::Create(); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->SetNew(RenderPassId(), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect_, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_tracker_->current_damage_rect(), 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screen_space_transform_); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass_sink->AppendRenderPass(pass.Pass()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderSurfaceImpl::AppendQuads(QuadSink* quad_sink, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool for_replica, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id render_pass_id) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!for_replica || owning_layer_->has_replica()); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& draw_transform = 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_replica ? replica_draw_transform_ : draw_transform_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadState* shared_quad_state = 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_sink->UseSharedQuadState(SharedQuadState::Create()); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_quad_state->SetAll(draw_transform, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect_.size(), 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect_, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clip_rect_, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_clipped_, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_opacity_); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (owning_layer_->ShowDebugBorders()) { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color = for_replica ? 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugColors::SurfaceReplicaBorderColor() : 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugColors::SurfaceBorderColor(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float width = for_replica ? 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugColors::SurfaceReplicaBorderWidth( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->layer_tree_impl()) : 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugColors::SurfaceBorderWidth( 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->layer_tree_impl()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DebugBorderDrawQuad> debug_border_quad = 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugBorderDrawQuad::Create(); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_border_quad->SetNew(shared_quad_state, content_rect_, color, width); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(), append_quads_data); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(shawnsingh): By using the same RenderSurfaceImpl for both the content 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and its reflection, it's currently not possible to apply a separate mask to 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the reflection layer or correctly handle opacity in reflections (opacity 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // must be applied after drawing both the layer and its reflection). The 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // solution is to introduce yet another RenderSurfaceImpl to draw the layer 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and its reflection in. For now we only apply a separate reflection mask if 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the contents don't have a mask of their own. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* mask_layer = owning_layer_->mask_layer(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mask_layer && 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!mask_layer->DrawsContent() || mask_layer->bounds().IsEmpty())) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer = NULL; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mask_layer && for_replica) { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer = owning_layer_->replica_layer()->mask_layer(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mask_layer && 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!mask_layer->DrawsContent() || mask_layer->bounds().IsEmpty())) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer = NULL; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF mask_uv_rect(0.f, 0.f, 1.f, 1.f); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mask_layer) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2dF owning_layer_draw_scale = 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MathUtil::ComputeTransform2dScaleComponents( 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->draw_transform(), 1.f); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::SizeF unclipped_mask_target_size = gfx::ScaleSize( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->content_bounds(), 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_draw_scale.x(), 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_draw_scale.y()); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float uv_scale_x = 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_rect_.width() / unclipped_mask_target_size.width(); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float uv_scale_y = 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_rect_.height() / unclipped_mask_target_size.height(); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_uv_rect = gfx::RectF( 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uv_scale_x * content_rect_.x() / content_rect_.width(), 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uv_scale_y * content_rect_.y() / content_rect_.height(), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uv_scale_x, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uv_scale_y); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId mask_resource_id = 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer ? mask_layer->ContentsResourceId() : 0; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect contents_changed_since_last_frame = 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentsChanged() ? content_rect_ : gfx::Rect(); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad->SetNew(shared_quad_state, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect_, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_pass_id, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for_replica, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_resource_id, 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_changed_since_last_frame, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_uv_rect, 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->filters(), 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->filter(), 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owning_layer_->background_filters()); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 237