Index: cc/layer_tree_impl.cc |
diff --git a/cc/layer_tree_impl.cc b/cc/layer_tree_impl.cc |
index 7107b0c4e467752926fecfeeeb34ac581e4e4258..058f0c7f8be922d8a7c75c7097d77bd042b5d03b 100644 |
--- a/cc/layer_tree_impl.cc |
+++ b/cc/layer_tree_impl.cc |
@@ -19,6 +19,11 @@ LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) |
, currently_scrolling_layer_(0) |
, background_color_(0) |
, has_transparent_background_(false) |
+ , page_scale_factor_(1) |
+ , page_scale_delta_(1) |
+ , sent_page_scale_delta_(1) |
+ , min_page_scale_factor_(0) |
+ , max_page_scale_factor_(0) |
, scrolling_layer_id_from_previous_tree_(0) |
, contents_textures_purged_(false) |
, needs_update_draw_properties_(true) { |
@@ -94,6 +99,60 @@ void LayerTreeImpl::ClearCurrentlyScrollingLayer() { |
scrolling_layer_id_from_previous_tree_ = 0; |
} |
+void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, |
+ float min_page_scale_factor, float max_page_scale_factor) |
+{ |
+ if (!page_scale_factor) |
+ return; |
+ |
+ min_page_scale_factor_ = min_page_scale_factor; |
+ max_page_scale_factor_ = max_page_scale_factor; |
+ page_scale_factor_ = page_scale_factor; |
+} |
+ |
+void LayerTreeImpl::SetPageScaleDelta(float delta) |
+{ |
+ // Clamp to the current min/max limits. |
+ float total = page_scale_factor_ * delta; |
+ if (min_page_scale_factor_ && total < min_page_scale_factor_) |
+ delta = min_page_scale_factor_ / page_scale_factor_; |
+ else if (max_page_scale_factor_ && total > max_page_scale_factor_) |
+ delta = max_page_scale_factor_ / page_scale_factor_; |
+ |
+ if (delta == page_scale_delta_) |
+ return; |
+ |
+ page_scale_delta_ = delta; |
+ |
+ if (IsActiveTree()) |
+ { |
danakj
2013/01/28 20:29:03
nit: { on previous line
aelias_OOO_until_Jul13
2013/01/29 06:05:14
Done.
|
+ LayerTreeImpl* pending_tree = layer_tree_host_impl_->pendingTree(); |
danakj
2013/01/28 20:29:03
2 space indents and 80 col
aelias_OOO_until_Jul13
2013/01/29 06:05:14
Done.
|
+ if (pending_tree) { |
+ DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); |
+ pending_tree->SetPageScaleDelta(page_scale_delta_ / sent_page_scale_delta_); |
+ } |
+ } |
+ |
+#if 0 |
+ if (layerTreeImpl()->IsActiveTree()) |
+ { |
+ LayerImpl* pending_twin = layerTreeImpl()->FindPendingTreeLayerById(id()); |
+ if (pending_twin) { |
+ // The pending twin can't mirror the scroll delta of the active |
+ // layer. Although the delta - sent scroll delta difference is |
+ // identical for both twins, the sent scroll delta for the pending |
+ // layer is zero, as anything that has been sent has been baked |
+ // into the layer's position/scroll offset as a part of commit. |
+ DCHECK(pending_twin->sentScrollDelta().IsZero()); |
+ pending_twin->setScrollDelta(scrollDelta - sentScrollDelta()); |
+ } |
+ } |
+#endif |
+ |
+ UpdateMaxScrollOffset(); |
+ set_needs_update_draw_properties(); |
+} |
+ |
gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { |
gfx::SizeF view_bounds; |
// The clip layer should be used for scrolling bounds if available since it |
@@ -108,7 +167,7 @@ gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { |
view_bounds = gfx::ScaleSize(device_viewport_size(), |
1 / device_scale_factor()); |
} |
- view_bounds.Scale(1 / pinch_zoom_viewport().total_page_scale_factor()); |
+ view_bounds.Scale(1 / total_page_scale_factor()); |
return view_bounds; |
} |
@@ -127,6 +186,14 @@ void LayerTreeImpl::UpdateMaxScrollOffset() { |
root_scroll_layer_->setMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); |
} |
+gfx::Transform LayerTreeImpl::ImplTransform() const { |
+ gfx::Transform transform; |
+ transform.Scale(page_scale_delta_, page_scale_delta_); |
+ if (settings().pageScalePinchZoomEnabled) |
+ transform.Scale(page_scale_factor_, page_scale_factor_); |
+ return transform; |
+} |
+ |
struct UpdateTilePrioritiesForLayer { |
void operator()(LayerImpl *layer) { |
layer->updateTilePriorities(); |
@@ -152,8 +219,7 @@ void LayerTreeImpl::UpdateDrawProperties(UpdateDrawPropertiesReason reason) { |
return; |
if (root_scroll_layer_) { |
- root_scroll_layer_->setImplTransform( |
- layer_tree_host_impl_->implTransform()); |
+ root_scroll_layer_->setImplTransform(ImplTransform()); |
// Setting the impl transform re-sets this. |
needs_update_draw_properties_ = false; |
} |
@@ -167,7 +233,7 @@ void LayerTreeImpl::UpdateDrawProperties(UpdateDrawPropertiesReason reason) { |
RootLayer(), |
device_viewport_size(), |
device_scale_factor(), |
- pinch_zoom_viewport().total_page_scale_factor(), |
+ total_page_scale_factor(), |
MaxTextureSize(), |
settings().canUseLCDText, |
render_surface_layer_list_, |
@@ -363,8 +429,4 @@ AnimationRegistrar* LayerTreeImpl::animationRegistrar() const { |
return layer_tree_host_impl_->animationRegistrar(); |
} |
-const PinchZoomViewport& LayerTreeImpl::pinch_zoom_viewport() const { |
- return layer_tree_host_impl_->pinchZoomViewport(); |
-} |
- |
} // namespace cc |