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 |