Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2223)

Unified Diff: cc/trees/draw_property_utils.cc

Issue 2762043005: cc : Delete target id and content target id from transform nodes (Closed)
Patch Set: blink changes Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/draw_property_utils.cc
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 85d73a5e71de2778a62e119f9a56501d08c80a60..0677b6088fba2ae22f7ebffee0db820f10ee9572 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -35,6 +35,18 @@ static bool IsRootLayer(const LayerImpl* layer) {
return layer->layer_tree_impl()->IsRootLayer(layer);
}
+static void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
+ gfx::Transform* transform) {
+ if (!effect_node) {
+ // This can happen when PaintArtifactCompositor builds property trees as it
+ // doesn't set effect ids on clip nodes.
+ return;
+ }
+ DCHECK(effect_node->has_render_surface);
+ transform->matrix().postScale(effect_node->surface_contents_scale.x(),
+ effect_node->surface_contents_scale.y(), 1.f);
+}
+
static bool ConvertRectBetweenSurfaceSpaces(const PropertyTrees* property_trees,
int source_effect_id,
int dest_effect_id,
@@ -404,10 +416,6 @@ static bool LayerNeedsUpdateInternal(LayerType* layer,
return true;
}
-
-
-} // namespace
-
template <typename LayerType>
static inline bool LayerShouldBeSkippedInternal(
LayerType* layer,
@@ -428,182 +436,173 @@ static inline bool LayerShouldBeSkippedInternal(
effect_node->hidden_by_backface_visibility || !effect_node->is_drawn;
}
-bool LayerShouldBeSkipped(LayerImpl* layer,
- const TransformTree& transform_tree,
- const EffectTree& effect_tree) {
- return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
+template <typename LayerType>
+static void UpdateElasticOverscrollInternal(
+ PropertyTrees* property_trees,
+ const LayerType* overscroll_elasticity_layer,
+ const gfx::Vector2dF& elastic_overscroll) {
+ if (!overscroll_elasticity_layer) {
+ DCHECK(elastic_overscroll.IsZero());
+ return;
+ }
+
+ TransformNode* node = property_trees->transform_tree.Node(
+ overscroll_elasticity_layer->transform_tree_index());
+ if (node->scroll_offset == gfx::ScrollOffset(elastic_overscroll))
+ return;
+
+ node->scroll_offset = gfx::ScrollOffset(elastic_overscroll);
+ node->needs_local_transform_update = true;
+ property_trees->transform_tree.set_needs_update(true);
}
-bool LayerShouldBeSkipped(Layer* layer,
- const TransformTree& transform_tree,
- const EffectTree& effect_tree) {
- return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
+#if DCHECK_IS_ON()
+static void ValidatePageScaleLayer(const Layer* page_scale_layer) {
+ DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString());
+ DCHECK_EQ(page_scale_layer->transform_origin().ToString(),
+ gfx::Point3F().ToString());
}
-void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
- const PropertyTrees* property_trees,
- LayerList* update_layer_list) {
- const TransformTree& transform_tree = property_trees->transform_tree;
- const EffectTree& effect_tree = property_trees->effect_tree;
- for (auto* layer : *layer_tree_host) {
- if (!IsRootLayer(layer) &&
- LayerShouldBeSkipped(layer, transform_tree, effect_tree))
- continue;
+static void ValidatePageScaleLayer(const LayerImpl* page_scale_layer) {}
+#endif
- bool layer_is_drawn =
- effect_tree.Node(layer->effect_tree_index())->is_drawn;
+template <typename LayerType>
+static void UpdatePageScaleFactorInternal(PropertyTrees* property_trees,
+ const LayerType* page_scale_layer,
+ float page_scale_factor,
+ float device_scale_factor,
+ gfx::Transform device_transform) {
+ if (property_trees->transform_tree.page_scale_factor() == page_scale_factor)
+ return;
- if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) {
- update_layer_list->push_back(layer);
- }
+ property_trees->transform_tree.set_page_scale_factor(page_scale_factor);
+ DCHECK(page_scale_layer);
+ DCHECK_GE(page_scale_layer->transform_tree_index(),
+ TransformTree::kRootNodeId);
+ TransformNode* node = property_trees->transform_tree.Node(
+ page_scale_layer->transform_tree_index());
+// TODO(enne): property trees can't ask the layer these things, but
+// the page scale layer should *just* be the page scale.
+#if DCHECK_IS_ON()
+ ValidatePageScaleLayer(page_scale_layer);
+#endif
- // Append mask layers to the update layer list. They don't have valid
- // visible rects, so need to get added after the above calculation.
- if (Layer* mask_layer = layer->mask_layer())
- update_layer_list->push_back(mask_layer);
+ if (IsRootLayer(page_scale_layer)) {
+ // When the page scale layer is also the root layer, the node should also
+ // store the combined scale factor and not just the page scale factor.
+ float post_local_scale_factor = page_scale_factor * device_scale_factor;
+ node->post_local_scale_factor = post_local_scale_factor;
+ node->post_local = device_transform;
+ node->post_local.Scale(post_local_scale_factor, post_local_scale_factor);
+ } else {
+ node->post_local_scale_factor = page_scale_factor;
+ node->update_post_local_transform(gfx::PointF(), gfx::Point3F());
}
+ node->needs_local_transform_update = true;
+ property_trees->transform_tree.set_needs_update(true);
}
-void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
- const PropertyTrees* property_trees,
- std::vector<LayerImpl*>* visible_layer_list) {
- const TransformTree& transform_tree = property_trees->transform_tree;
- const EffectTree& effect_tree = property_trees->effect_tree;
-
- for (auto* layer_impl : *layer_tree_impl) {
- if (!IsRootLayer(layer_impl) &&
- LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree))
- continue;
+static gfx::Rect LayerDrawableContentRect(
+ const LayerImpl* layer,
+ const gfx::Rect& layer_bounds_in_target_space,
+ const gfx::Rect& clip_rect) {
+ if (layer->is_clipped())
+ return IntersectRects(layer_bounds_in_target_space, clip_rect);
- bool layer_is_drawn =
- effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
+ return layer_bounds_in_target_space;
+}
- if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
- visible_layer_list->push_back(layer_impl);
+static void SetSurfaceDrawOpacity(const EffectTree& tree,
+ RenderSurfaceImpl* render_surface) {
+ // Draw opacity of a surface is the product of opacities between the surface
+ // (included) and its target surface (excluded).
+ const EffectNode* node = tree.Node(render_surface->EffectTreeIndex());
+ float draw_opacity = tree.EffectiveOpacity(node);
+ for (node = tree.parent(node); node && !node->has_render_surface;
+ node = tree.parent(node)) {
+ draw_opacity *= tree.EffectiveOpacity(node);
}
+ render_surface->SetDrawOpacity(draw_opacity);
}
-void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
- gfx::Transform* transform) {
- if (!effect_node) {
- // This can happen when PaintArtifactCompositor builds property trees as it
- // doesn't set effect ids on clip nodes.
- return;
+static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) {
+ if (!layer->render_target())
+ return 0.f;
+
+ const EffectNode* target_node =
+ tree.Node(layer->render_target()->EffectTreeIndex());
+ const EffectNode* node = tree.Node(layer->effect_tree_index());
+ if (node == target_node)
+ return 1.f;
+
+ float draw_opacity = 1.f;
+ while (node != target_node) {
+ draw_opacity *= tree.EffectiveOpacity(node);
+ node = tree.parent(node);
}
- DCHECK(effect_node->has_render_surface);
- transform->matrix().postScale(effect_node->surface_contents_scale.x(),
- effect_node->surface_contents_scale.y(), 1.f);
+ return draw_opacity;
}
-void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
- gfx::Transform* transform) {
- DCHECK(effect_node->has_render_surface);
- if (effect_node->surface_contents_scale.x() != 0.0 &&
- effect_node->surface_contents_scale.y() != 0.0)
- transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
- 1.0 / effect_node->surface_contents_scale.y());
+template <typename LayerType>
+static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
+ const TransformTree& tree) {
+ gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
+ layer->offset_to_transform_parent().y());
+ gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
+ xform.ConcatTransform(ssxform);
+ if (layer->should_flatten_transform_from_property_tree())
+ xform.FlattenTo2d();
+ return xform;
}
-void UpdateScrollTree(ScrollTree* scroll_tree,
- const LayerTreeHost* layer_tree_host) {
- if (!scroll_tree->needs_update())
+static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
+ PropertyTrees* property_trees,
+ RenderSurfaceImpl* render_surface) {
+ if (!render_surface->is_clipped()) {
+ render_surface->SetClipRect(gfx::Rect());
return;
+ }
- for (int i = ScrollTree::kRootNodeId;
- i < static_cast<int>(scroll_tree->size()); ++i) {
- ScrollNode* scroll_node = scroll_tree->Node(i);
- if (Layer* scroll_layer =
- layer_tree_host->LayerById(scroll_node->owning_layer_id)) {
- if (Layer* scroll_clip_layer = scroll_layer->scroll_clip_layer()) {
- scroll_node->scroll_clip_layer_bounds = scroll_clip_layer->bounds();
- }
- }
+ const EffectTree& effect_tree = property_trees->effect_tree;
+ const ClipTree& clip_tree = property_trees->clip_tree;
+ const EffectNode* effect_node =
+ effect_tree.Node(render_surface->EffectTreeIndex());
+ const EffectNode* target_node = effect_tree.Node(effect_node->target_id);
+ bool include_expanding_clips = false;
+ if (render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId) {
+ render_surface->SetClipRect(
+ gfx::ToEnclosingRect(clip_tree.Node(effect_node->clip_id)->clip));
+ } else {
+ ConditionalClip accumulated_clip_rect =
+ ComputeAccumulatedClip(property_trees, include_expanding_clips,
+ effect_node->clip_id, target_node->id);
+ render_surface->SetClipRect(
+ gfx::ToEnclosingRect(accumulated_clip_rect.clip_rect));
}
}
-void ComputeTransforms(TransformTree* transform_tree) {
- if (!transform_tree->needs_update())
+static void SetSurfaceDrawTransform(const PropertyTrees* property_trees,
+ RenderSurfaceImpl* render_surface) {
+ const TransformTree& transform_tree = property_trees->transform_tree;
+ const EffectTree& effect_tree = property_trees->effect_tree;
+ const TransformNode* transform_node =
+ transform_tree.Node(render_surface->TransformTreeIndex());
+ const EffectNode* effect_node =
+ effect_tree.Node(render_surface->EffectTreeIndex());
+ // The draw transform of root render surface is identity tranform.
+ if (transform_node->id == TransformTree::kRootNodeId) {
+ render_surface->SetDrawTransform(gfx::Transform());
return;
- for (int i = TransformTree::kContentsRootNodeId;
- i < static_cast<int>(transform_tree->size()); ++i)
- transform_tree->UpdateTransforms(i);
- transform_tree->set_needs_update(false);
-}
-
-void UpdateRenderTarget(EffectTree* effect_tree,
- bool can_render_to_separate_surface) {
- for (int i = EffectTree::kContentsRootNodeId;
- i < static_cast<int>(effect_tree->size()); ++i) {
- EffectNode* node = effect_tree->Node(i);
- if (i == EffectTree::kContentsRootNodeId) {
- // Render target of the node corresponding to root is itself.
- node->target_id = EffectTree::kContentsRootNodeId;
- } else if (!can_render_to_separate_surface) {
- node->target_id = EffectTree::kContentsRootNodeId;
- } else if (effect_tree->parent(node)->has_render_surface) {
- node->target_id = node->parent_id;
- } else {
- node->target_id = effect_tree->parent(node)->target_id;
- }
}
-}
-void ComputeEffects(EffectTree* effect_tree) {
- if (!effect_tree->needs_update())
- return;
- for (int i = EffectTree::kContentsRootNodeId;
- i < static_cast<int>(effect_tree->size()); ++i)
- effect_tree->UpdateEffects(i);
- effect_tree->set_needs_update(false);
-}
-
-void ComputeClips(PropertyTrees* property_trees) {
- DCHECK(!property_trees->transform_tree.needs_update());
- ClipTree* clip_tree = &property_trees->clip_tree;
- if (!clip_tree->needs_update())
- return;
- const int target_effect_id = EffectTree::kContentsRootNodeId;
- const int target_transform_id = TransformTree::kRootNodeId;
- const bool include_expanding_clips = true;
- for (int i = ClipTree::kViewportNodeId;
- i < static_cast<int>(clip_tree->size()); ++i) {
- ClipNode* clip_node = clip_tree->Node(i);
- // Clear the clip rect cache
- clip_node->cached_clip_rects = std::vector<ClipRectData>(1);
- if (clip_node->id == ClipTree::kViewportNodeId) {
- clip_node->cached_accumulated_rect_in_screen_space = clip_node->clip;
- continue;
- }
- ClipNode* parent_clip_node = clip_tree->parent(clip_node);
- DCHECK(parent_clip_node);
- gfx::RectF accumulated_clip =
- parent_clip_node->cached_accumulated_rect_in_screen_space;
- bool success = ApplyClipNodeToAccumulatedClip(
- property_trees, include_expanding_clips, target_effect_id,
- target_transform_id, clip_node, &accumulated_clip);
- DCHECK(success);
- clip_node->cached_accumulated_rect_in_screen_space = accumulated_clip;
- }
- clip_tree->set_needs_update(false);
-}
-
-static ConditionalClip LayerClipRect(PropertyTrees* property_trees,
- LayerImpl* layer) {
- const EffectTree* effect_tree = &property_trees->effect_tree;
- const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
- const EffectNode* target_node =
- effect_node->has_render_surface
- ? effect_node
- : effect_tree->Node(effect_node->target_id);
- // TODO(weiliangc): When effect node has up to date render surface info on
- // compositor thread, no need to check for resourceless draw mode
- if (!property_trees->non_root_surfaces_enabled) {
- target_node = effect_tree->Node(1);
- }
-
- bool include_expanding_clips = false;
- return ComputeAccumulatedClip(property_trees, include_expanding_clips,
- layer->clip_tree_index(), target_node->id);
+ gfx::Transform render_surface_transform;
+ const EffectNode* target_effect_node =
+ effect_tree.Node(effect_node->target_id);
+ property_trees->GetToTarget(transform_node->id, target_effect_node->id,
+ &render_surface_transform);
+
+ ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
+ render_surface->SetDrawTransform(render_surface_transform);
}
static gfx::Rect LayerVisibleRect(PropertyTrees* property_trees,
@@ -658,6 +657,174 @@ static gfx::Rect LayerVisibleRect(PropertyTrees* property_trees,
return visible_rect;
}
+static ConditionalClip LayerClipRect(PropertyTrees* property_trees,
+ LayerImpl* layer) {
+ const EffectTree* effect_tree = &property_trees->effect_tree;
+ const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
+ const EffectNode* target_node =
+ effect_node->has_render_surface
+ ? effect_node
+ : effect_tree->Node(effect_node->target_id);
+ // TODO(weiliangc): When effect node has up to date render surface info on
+ // compositor thread, no need to check for resourceless draw mode
+ if (!property_trees->non_root_surfaces_enabled) {
+ target_node = effect_tree->Node(1);
+ }
+
+ bool include_expanding_clips = false;
+ return ComputeAccumulatedClip(property_trees, include_expanding_clips,
+ layer->clip_tree_index(), target_node->id);
+}
+
+static void UpdateRenderTarget(EffectTree* effect_tree,
+ bool can_render_to_separate_surface) {
+ for (int i = EffectTree::kContentsRootNodeId;
+ i < static_cast<int>(effect_tree->size()); ++i) {
+ EffectNode* node = effect_tree->Node(i);
+ if (i == EffectTree::kContentsRootNodeId) {
+ // Render target of the node corresponding to root is itself.
+ node->target_id = EffectTree::kContentsRootNodeId;
+ } else if (!can_render_to_separate_surface) {
+ node->target_id = EffectTree::kContentsRootNodeId;
+ } else if (effect_tree->parent(node)->has_render_surface) {
+ node->target_id = node->parent_id;
+ } else {
+ node->target_id = effect_tree->parent(node)->target_id;
+ }
+ }
+}
+
+static void UpdateScrollTree(ScrollTree* scroll_tree,
+ const LayerTreeHost* layer_tree_host) {
+ if (!scroll_tree->needs_update())
+ return;
+
+ for (int i = ScrollTree::kRootNodeId;
+ i < static_cast<int>(scroll_tree->size()); ++i) {
+ ScrollNode* scroll_node = scroll_tree->Node(i);
+ if (Layer* scroll_layer =
+ layer_tree_host->LayerById(scroll_node->owning_layer_id)) {
+ if (Layer* scroll_clip_layer = scroll_layer->scroll_clip_layer()) {
+ scroll_node->scroll_clip_layer_bounds = scroll_clip_layer->bounds();
+ }
+ }
+ }
+}
+
+static void ComputeClips(PropertyTrees* property_trees) {
+ DCHECK(!property_trees->transform_tree.needs_update());
+ ClipTree* clip_tree = &property_trees->clip_tree;
+ if (!clip_tree->needs_update())
+ return;
+ const int target_effect_id = EffectTree::kContentsRootNodeId;
+ const int target_transform_id = TransformTree::kRootNodeId;
+ const bool include_expanding_clips = true;
+ for (int i = ClipTree::kViewportNodeId;
+ i < static_cast<int>(clip_tree->size()); ++i) {
+ ClipNode* clip_node = clip_tree->Node(i);
+ // Clear the clip rect cache
+ clip_node->cached_clip_rects = std::vector<ClipRectData>(1);
+ if (clip_node->id == ClipTree::kViewportNodeId) {
+ clip_node->cached_accumulated_rect_in_screen_space = clip_node->clip;
+ continue;
+ }
+ ClipNode* parent_clip_node = clip_tree->parent(clip_node);
+ DCHECK(parent_clip_node);
+ gfx::RectF accumulated_clip =
+ parent_clip_node->cached_accumulated_rect_in_screen_space;
+ bool success = ApplyClipNodeToAccumulatedClip(
+ property_trees, include_expanding_clips, target_effect_id,
+ target_transform_id, clip_node, &accumulated_clip);
+ DCHECK(success);
+ clip_node->cached_accumulated_rect_in_screen_space = accumulated_clip;
+ }
+ clip_tree->set_needs_update(false);
+}
+
+} // namespace
+
+void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
+ gfx::Transform* transform) {
+ DCHECK(effect_node->has_render_surface);
+ if (effect_node->surface_contents_scale.x() != 0.0 &&
+ effect_node->surface_contents_scale.y() != 0.0)
+ transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
+ 1.0 / effect_node->surface_contents_scale.y());
+}
+
+bool LayerShouldBeSkipped(LayerImpl* layer,
+ const TransformTree& transform_tree,
+ const EffectTree& effect_tree) {
+ return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
+}
+
+bool LayerShouldBeSkipped(Layer* layer,
+ const TransformTree& transform_tree,
+ const EffectTree& effect_tree) {
+ return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
+}
+
+void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
+ const PropertyTrees* property_trees,
+ LayerList* update_layer_list) {
+ const TransformTree& transform_tree = property_trees->transform_tree;
+ const EffectTree& effect_tree = property_trees->effect_tree;
+ for (auto* layer : *layer_tree_host) {
+ if (!IsRootLayer(layer) &&
+ LayerShouldBeSkipped(layer, transform_tree, effect_tree))
+ continue;
+
+ bool layer_is_drawn =
+ effect_tree.Node(layer->effect_tree_index())->is_drawn;
+
+ if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) {
+ update_layer_list->push_back(layer);
+ }
+
+ // Append mask layers to the update layer list. They don't have valid
+ // visible rects, so need to get added after the above calculation.
+ if (Layer* mask_layer = layer->mask_layer())
+ update_layer_list->push_back(mask_layer);
+ }
+}
+
+void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
+ const PropertyTrees* property_trees,
+ std::vector<LayerImpl*>* visible_layer_list) {
+ const TransformTree& transform_tree = property_trees->transform_tree;
+ const EffectTree& effect_tree = property_trees->effect_tree;
+
+ for (auto* layer_impl : *layer_tree_impl) {
+ if (!IsRootLayer(layer_impl) &&
+ LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree))
+ continue;
+
+ bool layer_is_drawn =
+ effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
+
+ if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
+ visible_layer_list->push_back(layer_impl);
+ }
+}
+
+void ComputeTransforms(TransformTree* transform_tree) {
+ if (!transform_tree->needs_update())
+ return;
+ for (int i = TransformTree::kContentsRootNodeId;
+ i < static_cast<int>(transform_tree->size()); ++i)
+ transform_tree->UpdateTransforms(i);
+ transform_tree->set_needs_update(false);
+}
+
+void ComputeEffects(EffectTree* effect_tree) {
+ if (!effect_tree->needs_update())
+ return;
+ for (int i = EffectTree::kContentsRootNodeId;
+ i < static_cast<int>(effect_tree->size()); ++i)
+ effect_tree->UpdateEffects(i);
+ effect_tree->set_needs_update(false);
+}
+
void UpdatePropertyTrees(LayerTreeHost* layer_tree_host,
PropertyTrees* property_trees,
bool can_render_to_separate_surface) {
@@ -742,68 +909,6 @@ gfx::Transform DrawTransform(const LayerImpl* layer,
return xform;
}
-static void SetSurfaceDrawTransform(const PropertyTrees* property_trees,
- RenderSurfaceImpl* render_surface) {
- const TransformTree& transform_tree = property_trees->transform_tree;
- const EffectTree& effect_tree = property_trees->effect_tree;
- const TransformNode* transform_node =
- transform_tree.Node(render_surface->TransformTreeIndex());
- const EffectNode* effect_node =
- effect_tree.Node(render_surface->EffectTreeIndex());
- // The draw transform of root render surface is identity tranform.
- if (transform_node->id == TransformTree::kRootNodeId) {
- render_surface->SetDrawTransform(gfx::Transform());
- return;
- }
-
- gfx::Transform render_surface_transform;
- const EffectNode* target_effect_node =
- effect_tree.Node(effect_node->target_id);
- property_trees->GetToTarget(transform_node->id, target_effect_node->id,
- &render_surface_transform);
-
- ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
- render_surface->SetDrawTransform(render_surface_transform);
-}
-
-static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
- PropertyTrees* property_trees,
- RenderSurfaceImpl* render_surface) {
- if (!render_surface->is_clipped()) {
- render_surface->SetClipRect(gfx::Rect());
- return;
- }
-
- const EffectTree& effect_tree = property_trees->effect_tree;
- const ClipTree& clip_tree = property_trees->clip_tree;
- const EffectNode* effect_node =
- effect_tree.Node(render_surface->EffectTreeIndex());
- const EffectNode* target_node = effect_tree.Node(effect_node->target_id);
- bool include_expanding_clips = false;
- if (render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId) {
- render_surface->SetClipRect(
- gfx::ToEnclosingRect(clip_tree.Node(effect_node->clip_id)->clip));
- } else {
- ConditionalClip accumulated_clip_rect =
- ComputeAccumulatedClip(property_trees, include_expanding_clips,
- effect_node->clip_id, target_node->id);
- render_surface->SetClipRect(
- gfx::ToEnclosingRect(accumulated_clip_rect.clip_rect));
- }
-}
-
-template <typename LayerType>
-static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
- const TransformTree& tree) {
- gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
- layer->offset_to_transform_parent().y());
- gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
- xform.ConcatTransform(ssxform);
- if (layer->should_flatten_transform_from_property_tree())
- xform.FlattenTo2d();
- return xform;
-}
-
gfx::Transform ScreenSpaceTransform(const Layer* layer,
const TransformTree& tree) {
return ScreenSpaceTransformInternal(layer, tree);
@@ -814,47 +919,6 @@ gfx::Transform ScreenSpaceTransform(const LayerImpl* layer,
return ScreenSpaceTransformInternal(layer, tree);
}
-static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) {
- if (!layer->render_target())
- return 0.f;
-
- const EffectNode* target_node =
- tree.Node(layer->render_target()->EffectTreeIndex());
- const EffectNode* node = tree.Node(layer->effect_tree_index());
- if (node == target_node)
- return 1.f;
-
- float draw_opacity = 1.f;
- while (node != target_node) {
- draw_opacity *= tree.EffectiveOpacity(node);
- node = tree.parent(node);
- }
- return draw_opacity;
-}
-
-static void SetSurfaceDrawOpacity(const EffectTree& tree,
- RenderSurfaceImpl* render_surface) {
- // Draw opacity of a surface is the product of opacities between the surface
- // (included) and its target surface (excluded).
- const EffectNode* node = tree.Node(render_surface->EffectTreeIndex());
- float draw_opacity = tree.EffectiveOpacity(node);
- for (node = tree.parent(node); node && !node->has_render_surface;
- node = tree.parent(node)) {
- draw_opacity *= tree.EffectiveOpacity(node);
- }
- render_surface->SetDrawOpacity(draw_opacity);
-}
-
-static gfx::Rect LayerDrawableContentRect(
- const LayerImpl* layer,
- const gfx::Rect& layer_bounds_in_target_space,
- const gfx::Rect& clip_rect) {
- if (layer->is_clipped())
- return IntersectRects(layer_bounds_in_target_space, clip_rect);
-
- return layer_bounds_in_target_space;
-}
-
void ComputeDrawPropertiesOfVisibleLayers(const LayerImplList* layer_list,
PropertyTrees* property_trees) {
// Compute transforms
@@ -936,52 +1000,6 @@ void ComputeSurfaceDrawProperties(PropertyTrees* property_trees,
SetSurfaceClipRect(clip_node, property_trees, render_surface);
}
-#if DCHECK_IS_ON()
-static void ValidatePageScaleLayer(const Layer* page_scale_layer) {
- DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString());
- DCHECK_EQ(page_scale_layer->transform_origin().ToString(),
- gfx::Point3F().ToString());
-}
-
-static void ValidatePageScaleLayer(const LayerImpl* page_scale_layer) {}
-#endif
-
-template <typename LayerType>
-static void UpdatePageScaleFactorInternal(PropertyTrees* property_trees,
- const LayerType* page_scale_layer,
- float page_scale_factor,
- float device_scale_factor,
- gfx::Transform device_transform) {
- if (property_trees->transform_tree.page_scale_factor() == page_scale_factor)
- return;
-
- property_trees->transform_tree.set_page_scale_factor(page_scale_factor);
- DCHECK(page_scale_layer);
- DCHECK_GE(page_scale_layer->transform_tree_index(),
- TransformTree::kRootNodeId);
- TransformNode* node = property_trees->transform_tree.Node(
- page_scale_layer->transform_tree_index());
- // TODO(enne): property trees can't ask the layer these things, but
- // the page scale layer should *just* be the page scale.
-#if DCHECK_IS_ON()
- ValidatePageScaleLayer(page_scale_layer);
-#endif
-
- if (IsRootLayer(page_scale_layer)) {
- // When the page scale layer is also the root layer, the node should also
- // store the combined scale factor and not just the page scale factor.
- float post_local_scale_factor = page_scale_factor * device_scale_factor;
- node->post_local_scale_factor = post_local_scale_factor;
- node->post_local = device_transform;
- node->post_local.Scale(post_local_scale_factor, post_local_scale_factor);
- } else {
- node->post_local_scale_factor = page_scale_factor;
- node->update_post_local_transform(gfx::PointF(), gfx::Point3F());
- }
- node->needs_local_transform_update = true;
- property_trees->transform_tree.set_needs_update(true);
-}
-
void UpdatePageScaleFactor(PropertyTrees* property_trees,
const LayerImpl* page_scale_layer,
float page_scale_factor,
@@ -1002,26 +1020,6 @@ void UpdatePageScaleFactor(PropertyTrees* property_trees,
device_transform);
}
-template <typename LayerType>
-static void UpdateElasticOverscrollInternal(
- PropertyTrees* property_trees,
- const LayerType* overscroll_elasticity_layer,
- const gfx::Vector2dF& elastic_overscroll) {
- if (!overscroll_elasticity_layer) {
- DCHECK(elastic_overscroll.IsZero());
- return;
- }
-
- TransformNode* node = property_trees->transform_tree.Node(
- overscroll_elasticity_layer->transform_tree_index());
- if (node->scroll_offset == gfx::ScrollOffset(elastic_overscroll))
- return;
-
- node->scroll_offset = gfx::ScrollOffset(elastic_overscroll);
- node->needs_local_transform_update = true;
- property_trees->transform_tree.set_needs_update(true);
-}
-
void UpdateElasticOverscroll(PropertyTrees* property_trees,
const LayerImpl* overscroll_elasticity_layer,
const gfx::Vector2dF& elastic_overscroll) {
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698