OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layer_impl.h" | 5 #include "cc/layers/layer_impl.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "cc/animation/animation_registrar.h" | 10 #include "cc/animation/animation_registrar.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 use_parent_backface_visibility_(false), | 56 use_parent_backface_visibility_(false), |
57 draw_checkerboard_for_missing_tiles_(false), | 57 draw_checkerboard_for_missing_tiles_(false), |
58 draws_content_(false), | 58 draws_content_(false), |
59 hide_layer_and_subtree_(false), | 59 hide_layer_and_subtree_(false), |
60 force_render_surface_(false), | 60 force_render_surface_(false), |
61 is_container_for_fixed_position_layers_(false), | 61 is_container_for_fixed_position_layers_(false), |
62 background_color_(0), | 62 background_color_(0), |
63 opacity_(1.0), | 63 opacity_(1.0), |
64 blend_mode_(SkXfermode::kSrcOver_Mode), | 64 blend_mode_(SkXfermode::kSrcOver_Mode), |
65 draw_depth_(0.f), | 65 draw_depth_(0.f), |
66 compositing_reasons_(kCompositingReasonUnknown), | |
67 current_draw_mode_(DRAW_MODE_NONE), | 66 current_draw_mode_(DRAW_MODE_NONE), |
68 horizontal_scrollbar_layer_(NULL), | 67 horizontal_scrollbar_layer_(NULL), |
69 vertical_scrollbar_layer_(NULL) { | 68 vertical_scrollbar_layer_(NULL) { |
70 DCHECK_GT(layer_id_, 0); | 69 DCHECK_GT(layer_id_, 0); |
71 DCHECK(layer_tree_impl_); | 70 DCHECK(layer_tree_impl_); |
72 layer_tree_impl_->RegisterLayer(this); | 71 layer_tree_impl_->RegisterLayer(this); |
73 AnimationRegistrar* registrar = layer_tree_impl_->animationRegistrar(); | 72 AnimationRegistrar* registrar = layer_tree_impl_->animationRegistrar(); |
74 layer_animation_controller_ = | 73 layer_animation_controller_ = |
75 registrar->GetAnimationControllerForId(layer_id_); | 74 registrar->GetAnimationControllerForId(layer_id_); |
76 layer_animation_controller_->AddValueObserver(this); | 75 layer_animation_controller_->AddValueObserver(this); |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 } | 497 } |
499 | 498 |
500 void LayerImpl::PushPropertiesTo(LayerImpl* layer) { | 499 void LayerImpl::PushPropertiesTo(LayerImpl* layer) { |
501 layer->SetAnchorPoint(anchor_point_); | 500 layer->SetAnchorPoint(anchor_point_); |
502 layer->SetAnchorPointZ(anchor_point_z_); | 501 layer->SetAnchorPointZ(anchor_point_z_); |
503 layer->SetBackgroundColor(background_color_); | 502 layer->SetBackgroundColor(background_color_); |
504 layer->SetBounds(bounds_); | 503 layer->SetBounds(bounds_); |
505 layer->SetContentBounds(content_bounds()); | 504 layer->SetContentBounds(content_bounds()); |
506 layer->SetContentsScale(contents_scale_x(), contents_scale_y()); | 505 layer->SetContentsScale(contents_scale_x(), contents_scale_y()); |
507 layer->SetDebugName(debug_name_); | 506 layer->SetDebugName(debug_name_); |
508 layer->SetCompositingReasons(compositing_reasons_); | |
509 layer->SetDoubleSided(double_sided_); | 507 layer->SetDoubleSided(double_sided_); |
510 layer->SetDrawCheckerboardForMissingTiles( | 508 layer->SetDrawCheckerboardForMissingTiles( |
511 draw_checkerboard_for_missing_tiles_); | 509 draw_checkerboard_for_missing_tiles_); |
512 layer->SetForceRenderSurface(force_render_surface_); | 510 layer->SetForceRenderSurface(force_render_surface_); |
513 layer->SetDrawsContent(DrawsContent()); | 511 layer->SetDrawsContent(DrawsContent()); |
514 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); | 512 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); |
515 layer->SetFilters(filters()); | 513 layer->SetFilters(filters()); |
516 layer->SetBackgroundFilters(background_filters()); | 514 layer->SetBackgroundFilters(background_filters()); |
517 layer->SetMasksToBounds(masks_to_bounds_); | 515 layer->SetMasksToBounds(masks_to_bounds_); |
518 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); | 516 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 horizontal_scrollbar_layer_->set_scroll_layer_id(id()); | 1184 horizontal_scrollbar_layer_->set_scroll_layer_id(id()); |
1187 } | 1185 } |
1188 | 1186 |
1189 void LayerImpl::SetVerticalScrollbarLayer( | 1187 void LayerImpl::SetVerticalScrollbarLayer( |
1190 ScrollbarLayerImplBase* scrollbar_layer) { | 1188 ScrollbarLayerImplBase* scrollbar_layer) { |
1191 vertical_scrollbar_layer_ = scrollbar_layer; | 1189 vertical_scrollbar_layer_ = scrollbar_layer; |
1192 if (vertical_scrollbar_layer_) | 1190 if (vertical_scrollbar_layer_) |
1193 vertical_scrollbar_layer_->set_scroll_layer_id(id()); | 1191 vertical_scrollbar_layer_->set_scroll_layer_id(id()); |
1194 } | 1192 } |
1195 | 1193 |
1196 static scoped_ptr<base::Value> | |
1197 CompositingReasonsAsValue(CompositingReasons reasons) { | |
1198 scoped_ptr<base::ListValue> reason_list(new base::ListValue()); | |
1199 | |
1200 if (reasons == kCompositingReasonUnknown) { | |
1201 reason_list->AppendString("No reasons given"); | |
1202 return reason_list.PassAs<base::Value>(); | |
1203 } | |
1204 | |
1205 if (reasons & kCompositingReason3DTransform) | |
1206 reason_list->AppendString("Has a 3d Transform"); | |
1207 | |
1208 if (reasons & kCompositingReasonVideo) | |
1209 reason_list->AppendString("Is accelerated video"); | |
1210 | |
1211 if (reasons & kCompositingReasonCanvas) | |
1212 reason_list->AppendString("Is accelerated canvas"); | |
1213 | |
1214 if (reasons & kCompositingReasonPlugin) | |
1215 reason_list->AppendString("Is accelerated plugin"); | |
1216 | |
1217 if (reasons & kCompositingReasonIFrame) | |
1218 reason_list->AppendString("Is accelerated iframe"); | |
1219 | |
1220 if (reasons & kCompositingReasonBackfaceVisibilityHidden) | |
1221 reason_list->AppendString("Has backface-visibility: hidden"); | |
1222 | |
1223 if (reasons & kCompositingReasonAnimation) | |
1224 reason_list->AppendString("Has accelerated animation or transition"); | |
1225 | |
1226 if (reasons & kCompositingReasonFilters) | |
1227 reason_list->AppendString("Has accelerated filters"); | |
1228 | |
1229 if (reasons & kCompositingReasonPositionFixed) | |
1230 reason_list->AppendString("Is fixed position"); | |
1231 | |
1232 if (reasons & kCompositingReasonPositionSticky) | |
1233 reason_list->AppendString("Is sticky position"); | |
1234 | |
1235 if (reasons & kCompositingReasonOverflowScrollingTouch) | |
1236 reason_list->AppendString("Is a scrollable overflow element"); | |
1237 | |
1238 if (reasons & kCompositingReasonAssumedOverlap) | |
1239 reason_list->AppendString("Might overlap a composited animation"); | |
1240 | |
1241 if (reasons & kCompositingReasonOverlap) | |
1242 reason_list->AppendString("Overlaps other composited content"); | |
1243 | |
1244 if (reasons & kCompositingReasonNegativeZIndexChildren) { | |
1245 reason_list->AppendString("Might overlap negative z-index " | |
1246 "composited content"); | |
1247 } | |
1248 | |
1249 if (reasons & kCompositingReasonTransformWithCompositedDescendants) { | |
1250 reason_list->AppendString("Has transform needed by a " | |
1251 "composited descendant"); | |
1252 } | |
1253 | |
1254 if (reasons & kCompositingReasonOpacityWithCompositedDescendants) | |
1255 reason_list->AppendString("Has opacity needed by a composited descendant"); | |
1256 | |
1257 if (reasons & kCompositingReasonMaskWithCompositedDescendants) | |
1258 reason_list->AppendString("Has a mask needed by a composited descendant"); | |
1259 | |
1260 if (reasons & kCompositingReasonReflectionWithCompositedDescendants) | |
1261 reason_list->AppendString("Has a reflection with a composited descendant"); | |
1262 | |
1263 if (reasons & kCompositingReasonFilterWithCompositedDescendants) | |
1264 reason_list->AppendString("Has filter effect with a composited descendant"); | |
1265 | |
1266 if (reasons & kCompositingReasonBlendingWithCompositedDescendants) | |
1267 reason_list->AppendString("Has a blend mode with a composited descendant"); | |
1268 | |
1269 if (reasons & kCompositingReasonClipsCompositingDescendants) | |
1270 reason_list->AppendString("Clips a composited descendant"); | |
1271 | |
1272 if (reasons & kCompositingReasonPerspective) { | |
1273 reason_list->AppendString("Has a perspective transform needed by a " | |
1274 "composited 3d descendant"); | |
1275 } | |
1276 | |
1277 if (reasons & kCompositingReasonPreserve3D) { | |
1278 reason_list->AppendString("Has preserves-3d style with composited " | |
1279 "3d descendant"); | |
1280 } | |
1281 | |
1282 if (reasons & kCompositingReasonReflectionOfCompositedParent) | |
1283 reason_list->AppendString("Is the reflection of a composited layer"); | |
1284 | |
1285 if (reasons & kCompositingReasonRoot) | |
1286 reason_list->AppendString("Is the root"); | |
1287 | |
1288 if (reasons & kCompositingReasonLayerForClip) | |
1289 reason_list->AppendString("Convenience layer, to clip subtree"); | |
1290 | |
1291 if (reasons & kCompositingReasonLayerForScrollbar) | |
1292 reason_list->AppendString("Convenience layer for rendering scrollbar"); | |
1293 | |
1294 if (reasons & kCompositingReasonLayerForScrollingContainer) | |
1295 reason_list->AppendString("Convenience layer, the scrolling container"); | |
1296 | |
1297 if (reasons & kCompositingReasonLayerForForeground) { | |
1298 reason_list->AppendString("Convenience layer, foreground when main layer " | |
1299 "has negative z-index composited content"); | |
1300 } | |
1301 | |
1302 if (reasons & kCompositingReasonLayerForBackground) { | |
1303 reason_list->AppendString("Convenience layer, background when main layer " | |
1304 "has a composited background"); | |
1305 } | |
1306 | |
1307 if (reasons & kCompositingReasonLayerForMask) | |
1308 reason_list->AppendString("Is a mask layer"); | |
1309 | |
1310 if (reasons & kCompositingReasonOverflowScrollingParent) | |
1311 reason_list->AppendString("Scroll parent is not an ancestor"); | |
1312 | |
1313 if (reasons & kCompositingReasonOutOfFlowClipping) | |
1314 reason_list->AppendString("Has clipping ancestor"); | |
1315 | |
1316 if (reasons & kCompositingReasonIsolateCompositedDescendants) | |
1317 reason_list->AppendString("Should isolate composited descendants"); | |
1318 | |
1319 return reason_list.PassAs<base::Value>(); | |
1320 } | |
1321 | |
1322 void LayerImpl::AsValueInto(base::DictionaryValue* state) const { | 1194 void LayerImpl::AsValueInto(base::DictionaryValue* state) const { |
1323 TracedValue::MakeDictIntoImplicitSnapshot(state, LayerTypeAsString(), this); | 1195 TracedValue::MakeDictIntoImplicitSnapshot(state, LayerTypeAsString(), this); |
1324 state->SetInteger("layer_id", id()); | 1196 state->SetInteger("layer_id", id()); |
1325 state->SetString("layer_name", debug_name()); | 1197 state->SetString("layer_name", debug_name()); |
1326 state->Set("bounds", MathUtil::AsValue(bounds()).release()); | 1198 state->Set("bounds", MathUtil::AsValue(bounds()).release()); |
1327 state->SetInteger("draws_content", DrawsContent()); | 1199 state->SetInteger("draws_content", DrawsContent()); |
1328 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); | 1200 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); |
1329 state->Set("compositing_reasons", | |
1330 CompositingReasonsAsValue(compositing_reasons_).release()); | |
1331 | 1201 |
1332 bool clipped; | 1202 bool clipped; |
1333 gfx::QuadF layer_quad = MathUtil::MapQuad( | 1203 gfx::QuadF layer_quad = MathUtil::MapQuad( |
1334 screen_space_transform(), | 1204 screen_space_transform(), |
1335 gfx::QuadF(gfx::Rect(content_bounds())), | 1205 gfx::QuadF(gfx::Rect(content_bounds())), |
1336 &clipped); | 1206 &clipped); |
1337 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release()); | 1207 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release()); |
1338 | 1208 |
1339 if (!touch_event_handler_region_.IsEmpty()) { | 1209 if (!touch_event_handler_region_.IsEmpty()) { |
1340 state->Set("touch_event_handler_region", | 1210 state->Set("touch_event_handler_region", |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1376 if (layer_animation_controller_->AnimatedBoundsForBox(box, &inflated)) | 1246 if (layer_animation_controller_->AnimatedBoundsForBox(box, &inflated)) |
1377 state->Set("animated_bounds", MathUtil::AsValue(inflated).release()); | 1247 state->Set("animated_bounds", MathUtil::AsValue(inflated).release()); |
1378 } | 1248 } |
1379 | 1249 |
1380 if (debug_info_.get()) { | 1250 if (debug_info_.get()) { |
1381 std::string str; | 1251 std::string str; |
1382 debug_info_->AppendAsTraceFormat(&str); | 1252 debug_info_->AppendAsTraceFormat(&str); |
1383 base::JSONReader json_reader; | 1253 base::JSONReader json_reader; |
1384 scoped_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str)); | 1254 scoped_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str)); |
1385 | 1255 |
1386 // TODO(vollick): The TYPE_LIST code below is brittle; it assumes the only | 1256 if (debug_info_value->IsType(base::Value::TYPE_DICTIONARY)) { |
1387 // debug info is the layout rects. In future, this will be generalized, and | |
1388 // debug info will return a dictionary to be merged into state. Until then, | |
1389 // we unfortunately have to support both situations. Once we've migrated, | |
1390 // the TYPE_LIST branch will be deleted. | |
1391 if (debug_info_value->IsType(base::Value::TYPE_LIST)) { | |
1392 // Parsing the JSON and re-encoding it is not very efficient, | |
1393 // but it's the simplest way to achieve the desired effect, which | |
1394 // is to output: | |
1395 // {..., layout_rects: [{geometry_rect: ...}, ...], ...} | |
1396 // rather than: | |
1397 // {layout_rects: "[{geometry_rect: ...}, ...]", ...} | |
1398 state->Set("layout_rects", debug_info_value.release()); | |
1399 } else if (debug_info_value->IsType(base::Value::TYPE_DICTIONARY)) { | |
1400 base::DictionaryValue* dictionary_value = NULL; | 1257 base::DictionaryValue* dictionary_value = NULL; |
1401 bool converted_to_dictionary = | 1258 bool converted_to_dictionary = |
1402 debug_info_value->GetAsDictionary(&dictionary_value); | 1259 debug_info_value->GetAsDictionary(&dictionary_value); |
1403 DCHECK(converted_to_dictionary); | 1260 DCHECK(converted_to_dictionary); |
1404 state->MergeDictionary(dictionary_value); | 1261 state->MergeDictionary(dictionary_value); |
1405 } else { | 1262 } else { |
1406 NOTREACHED(); | 1263 NOTREACHED(); |
1407 } | 1264 } |
1408 } | 1265 } |
1409 } | 1266 } |
1410 | 1267 |
1411 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } | 1268 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } |
1412 | 1269 |
1413 scoped_ptr<base::Value> LayerImpl::AsValue() const { | 1270 scoped_ptr<base::Value> LayerImpl::AsValue() const { |
1414 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 1271 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
1415 AsValueInto(state.get()); | 1272 AsValueInto(state.get()); |
1416 return state.PassAs<base::Value>(); | 1273 return state.PassAs<base::Value>(); |
1417 } | 1274 } |
1418 | 1275 |
1419 void LayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) { | 1276 void LayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) { |
1420 benchmark->RunOnLayer(this); | 1277 benchmark->RunOnLayer(this); |
1421 } | 1278 } |
1422 | 1279 |
1423 } // namespace cc | 1280 } // namespace cc |
OLD | NEW |