| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layers/render_surface_impl.h" | 5 #include "cc/layers/render_surface_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 11 #include "cc/base/math_util.h" | 11 #include "cc/base/math_util.h" |
| 12 #include "cc/debug/debug_colors.h" | 12 #include "cc/debug/debug_colors.h" |
| 13 #include "cc/layers/delegated_renderer_layer_impl.h" | 13 #include "cc/layers/delegated_renderer_layer_impl.h" |
| 14 #include "cc/layers/layer_impl.h" | 14 #include "cc/layers/layer_impl.h" |
| 15 #include "cc/layers/render_pass_sink.h" | 15 #include "cc/layers/render_pass_sink.h" |
| 16 #include "cc/quads/debug_border_draw_quad.h" | 16 #include "cc/quads/debug_border_draw_quad.h" |
| 17 #include "cc/quads/render_pass.h" | 17 #include "cc/quads/render_pass.h" |
| 18 #include "cc/quads/render_pass_draw_quad.h" | 18 #include "cc/quads/render_pass_draw_quad.h" |
| 19 #include "cc/quads/shared_quad_state.h" | 19 #include "cc/quads/shared_quad_state.h" |
| 20 #include "cc/trees/damage_tracker.h" | 20 #include "cc/trees/damage_tracker.h" |
| 21 #include "cc/trees/occlusion_tracker.h" | 21 #include "cc/trees/occlusion.h" |
| 22 #include "third_party/skia/include/core/SkImageFilter.h" | 22 #include "third_party/skia/include/core/SkImageFilter.h" |
| 23 #include "ui/gfx/geometry/rect_conversions.h" | 23 #include "ui/gfx/geometry/rect_conversions.h" |
| 24 #include "ui/gfx/transform.h" | 24 #include "ui/gfx/transform.h" |
| 25 | 25 |
| 26 namespace cc { | 26 namespace cc { |
| 27 | 27 |
| 28 RenderSurfaceImpl::RenderSurfaceImpl(LayerImpl* owning_layer) | 28 RenderSurfaceImpl::RenderSurfaceImpl(LayerImpl* owning_layer) |
| 29 : owning_layer_(owning_layer), | 29 : owning_layer_(owning_layer), |
| 30 surface_property_changed_(false), | 30 surface_property_changed_(false), |
| 31 draw_opacity_is_animating_(false), | 31 draw_opacity_is_animating_(false), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 46 gfx::RectF drawable_content_rect = | 46 gfx::RectF drawable_content_rect = |
| 47 MathUtil::MapClippedRect(draw_transform_, content_rect_); | 47 MathUtil::MapClippedRect(draw_transform_, content_rect_); |
| 48 if (owning_layer_->has_replica()) { | 48 if (owning_layer_->has_replica()) { |
| 49 drawable_content_rect.Union( | 49 drawable_content_rect.Union( |
| 50 MathUtil::MapClippedRect(replica_draw_transform_, content_rect_)); | 50 MathUtil::MapClippedRect(replica_draw_transform_, content_rect_)); |
| 51 } | 51 } |
| 52 | 52 |
| 53 return drawable_content_rect; | 53 return drawable_content_rect; |
| 54 } | 54 } |
| 55 | 55 |
| 56 SkColor RenderSurfaceImpl::GetDebugBorderColor() const { |
| 57 return DebugColors::SurfaceBorderColor(); |
| 58 } |
| 59 |
| 60 SkColor RenderSurfaceImpl::GetReplicaDebugBorderColor() const { |
| 61 return DebugColors::SurfaceReplicaBorderColor(); |
| 62 } |
| 63 |
| 64 float RenderSurfaceImpl::GetDebugBorderWidth() const { |
| 65 return DebugColors::SurfaceBorderWidth(owning_layer_->layer_tree_impl()); |
| 66 } |
| 67 |
| 68 float RenderSurfaceImpl::GetReplicaDebugBorderWidth() const { |
| 69 return DebugColors::SurfaceReplicaBorderWidth( |
| 70 owning_layer_->layer_tree_impl()); |
| 71 } |
| 72 |
| 56 int RenderSurfaceImpl::OwningLayerId() const { | 73 int RenderSurfaceImpl::OwningLayerId() const { |
| 57 return owning_layer_ ? owning_layer_->id() : 0; | 74 return owning_layer_ ? owning_layer_->id() : 0; |
| 58 } | 75 } |
| 59 | 76 |
| 60 | 77 |
| 61 void RenderSurfaceImpl::SetClipRect(const gfx::Rect& clip_rect) { | 78 void RenderSurfaceImpl::SetClipRect(const gfx::Rect& clip_rect) { |
| 62 if (clip_rect_ == clip_rect) | 79 if (clip_rect_ == clip_rect) |
| 63 return; | 80 return; |
| 64 | 81 |
| 65 surface_property_changed_ = true; | 82 surface_property_changed_ = true; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 | 142 |
| 126 scoped_ptr<RenderPass> pass = RenderPass::Create(layer_list_.size()); | 143 scoped_ptr<RenderPass> pass = RenderPass::Create(layer_list_.size()); |
| 127 pass->SetNew(GetRenderPassId(), | 144 pass->SetNew(GetRenderPassId(), |
| 128 content_rect_, | 145 content_rect_, |
| 129 gfx::IntersectRects(content_rect_, | 146 gfx::IntersectRects(content_rect_, |
| 130 damage_tracker_->current_damage_rect()), | 147 damage_tracker_->current_damage_rect()), |
| 131 screen_space_transform_); | 148 screen_space_transform_); |
| 132 pass_sink->AppendRenderPass(pass.Pass()); | 149 pass_sink->AppendRenderPass(pass.Pass()); |
| 133 } | 150 } |
| 134 | 151 |
| 135 void RenderSurfaceImpl::AppendQuads( | 152 void RenderSurfaceImpl::AppendQuads(RenderPass* render_pass, |
| 136 RenderPass* render_pass, | 153 const gfx::Transform& draw_transform, |
| 137 const OcclusionTracker<LayerImpl>& occlusion_tracker, | 154 const Occlusion& occlusion_in_content_space, |
| 138 AppendQuadsData* append_quads_data, | 155 SkColor debug_border_color, |
| 139 bool for_replica, | 156 float debug_border_width, |
| 140 RenderPassId render_pass_id) { | 157 LayerImpl* mask_layer, |
| 141 DCHECK(!for_replica || owning_layer_->has_replica()); | 158 AppendQuadsData* append_quads_data, |
| 142 | 159 RenderPassId render_pass_id) { |
| 143 const gfx::Transform& draw_transform = | |
| 144 for_replica ? replica_draw_transform_ : draw_transform_; | |
| 145 gfx::Rect visible_content_rect = | 160 gfx::Rect visible_content_rect = |
| 146 occlusion_tracker.UnoccludedContributingSurfaceContentRect( | 161 occlusion_in_content_space.GetUnoccludedContentRect(content_rect_); |
| 147 content_rect_, draw_transform); | |
| 148 if (visible_content_rect.IsEmpty()) | 162 if (visible_content_rect.IsEmpty()) |
| 149 return; | 163 return; |
| 150 | 164 |
| 151 SharedQuadState* shared_quad_state = | 165 SharedQuadState* shared_quad_state = |
| 152 render_pass->CreateAndAppendSharedQuadState(); | 166 render_pass->CreateAndAppendSharedQuadState(); |
| 153 shared_quad_state->SetAll(draw_transform, | 167 shared_quad_state->SetAll(draw_transform, content_rect_.size(), content_rect_, |
| 154 content_rect_.size(), | 168 clip_rect_, is_clipped_, draw_opacity_, |
| 155 content_rect_, | |
| 156 clip_rect_, | |
| 157 is_clipped_, | |
| 158 draw_opacity_, | |
| 159 owning_layer_->blend_mode(), | 169 owning_layer_->blend_mode(), |
| 160 owning_layer_->sorting_context_id()); | 170 owning_layer_->sorting_context_id()); |
| 161 | 171 |
| 162 if (owning_layer_->ShowDebugBorders()) { | 172 if (owning_layer_->ShowDebugBorders()) { |
| 163 SkColor color = for_replica ? | |
| 164 DebugColors::SurfaceReplicaBorderColor() : | |
| 165 DebugColors::SurfaceBorderColor(); | |
| 166 float width = for_replica ? | |
| 167 DebugColors::SurfaceReplicaBorderWidth( | |
| 168 owning_layer_->layer_tree_impl()) : | |
| 169 DebugColors::SurfaceBorderWidth( | |
| 170 owning_layer_->layer_tree_impl()); | |
| 171 DebugBorderDrawQuad* debug_border_quad = | 173 DebugBorderDrawQuad* debug_border_quad = |
| 172 render_pass->CreateAndAppendDrawQuad<DebugBorderDrawQuad>(); | 174 render_pass->CreateAndAppendDrawQuad<DebugBorderDrawQuad>(); |
| 173 debug_border_quad->SetNew( | 175 debug_border_quad->SetNew(shared_quad_state, content_rect_, |
| 174 shared_quad_state, content_rect_, visible_content_rect, color, width); | 176 visible_content_rect, debug_border_color, |
| 175 } | 177 debug_border_width); |
| 176 | |
| 177 // TODO(shawnsingh): By using the same RenderSurfaceImpl for both the content | |
| 178 // and its reflection, it's currently not possible to apply a separate mask to | |
| 179 // the reflection layer or correctly handle opacity in reflections (opacity | |
| 180 // must be applied after drawing both the layer and its reflection). The | |
| 181 // solution is to introduce yet another RenderSurfaceImpl to draw the layer | |
| 182 // and its reflection in. For now we only apply a separate reflection mask if | |
| 183 // the contents don't have a mask of their own. | |
| 184 LayerImpl* mask_layer = owning_layer_->mask_layer(); | |
| 185 if (mask_layer && | |
| 186 (!mask_layer->DrawsContent() || mask_layer->bounds().IsEmpty())) | |
| 187 mask_layer = nullptr; | |
| 188 | |
| 189 if (!mask_layer && for_replica) { | |
| 190 mask_layer = owning_layer_->replica_layer()->mask_layer(); | |
| 191 if (mask_layer && | |
| 192 (!mask_layer->DrawsContent() || mask_layer->bounds().IsEmpty())) | |
| 193 mask_layer = nullptr; | |
| 194 } | 178 } |
| 195 | 179 |
| 196 ResourceProvider::ResourceId mask_resource_id = 0; | 180 ResourceProvider::ResourceId mask_resource_id = 0; |
| 197 gfx::Size mask_texture_size; | 181 gfx::Size mask_texture_size; |
| 198 gfx::Vector2dF mask_uv_scale; | 182 gfx::Vector2dF mask_uv_scale; |
| 199 if (mask_layer) { | 183 if (mask_layer && mask_layer->DrawsContent() && |
| 184 !mask_layer->bounds().IsEmpty()) { |
| 200 mask_layer->GetContentsResourceId(&mask_resource_id, &mask_texture_size); | 185 mask_layer->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
| 201 gfx::Vector2dF owning_layer_draw_scale = | 186 gfx::Vector2dF owning_layer_draw_scale = |
| 202 MathUtil::ComputeTransform2dScaleComponents( | 187 MathUtil::ComputeTransform2dScaleComponents( |
| 203 owning_layer_->draw_transform(), 1.f); | 188 owning_layer_->draw_transform(), 1.f); |
| 204 gfx::SizeF unclipped_mask_target_size = gfx::ScaleSize( | 189 gfx::SizeF unclipped_mask_target_size = gfx::ScaleSize( |
| 205 owning_layer_->content_bounds(), | 190 owning_layer_->content_bounds(), |
| 206 owning_layer_draw_scale.x(), | 191 owning_layer_draw_scale.x(), |
| 207 owning_layer_draw_scale.y()); | 192 owning_layer_draw_scale.y()); |
| 208 mask_uv_scale = gfx::Vector2dF( | 193 mask_uv_scale = gfx::Vector2dF( |
| 209 content_rect_.width() / unclipped_mask_target_size.width(), | 194 content_rect_.width() / unclipped_mask_target_size.width(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 224 render_pass_id, | 209 render_pass_id, |
| 225 mask_resource_id, | 210 mask_resource_id, |
| 226 mask_uv_scale, | 211 mask_uv_scale, |
| 227 mask_texture_size, | 212 mask_texture_size, |
| 228 owning_layer_->filters(), | 213 owning_layer_->filters(), |
| 229 owning_layer_to_target_scale, | 214 owning_layer_to_target_scale, |
| 230 owning_layer_->background_filters()); | 215 owning_layer_->background_filters()); |
| 231 } | 216 } |
| 232 | 217 |
| 233 } // namespace cc | 218 } // namespace cc |
| OLD | NEW |