Chromium Code Reviews| Index: webkit/compositor_bindings/web_layer_impl_fixed_bounds.cc |
| diff --git a/webkit/compositor_bindings/web_layer_impl_fixed_bounds.cc b/webkit/compositor_bindings/web_layer_impl_fixed_bounds.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4c1ed4fbd067a9ea6edba9b810d78453e8ebe008 |
| --- /dev/null |
| +++ b/webkit/compositor_bindings/web_layer_impl_fixed_bounds.cc |
| @@ -0,0 +1,147 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "webkit/compositor_bindings/web_layer_impl_fixed_bounds.h" |
| + |
| +#include "cc/layer.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebFloatPoint.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebTransformationMatrix.h" |
| +#include "third_party/skia/include/utils/SkMatrix44.h" |
| +#include "webkit/compositor_bindings/web_transformation_matrix_util.h" |
| + |
| +using cc::Layer; |
| +using webkit::WebTransformationMatrixUtil; |
| + |
| +namespace WebKit { |
| + |
| +WebLayerImplFixedBounds::WebLayerImplFixedBounds() |
| +{ |
| +} |
| + |
| +WebLayerImplFixedBounds::WebLayerImplFixedBounds(scoped_refptr<Layer> layer) |
| + : WebLayerImpl(layer) |
| +{ |
| +} |
| + |
| + |
| +WebLayerImplFixedBounds::~WebLayerImplFixedBounds() |
| +{ |
| +} |
| + |
| +void WebLayerImplFixedBounds::invalidateRect(const WebFloatRect& rect) |
| +{ |
| + // Partial invalidations seldom occur for such layers. |
| + // Simply invalidate the whole layer to avoid transformation of coordinates. |
| + invalidate(); |
| +} |
| + |
| +void WebLayerImplFixedBounds::setAnchorPoint(const WebFloatPoint& anchorPoint) |
| +{ |
| + if (anchorPoint != this->anchorPoint()) { |
| + m_layer->setAnchorPoint(anchorPoint); |
| + updateLayerBoundsAndTransform(); |
| + } |
| +} |
| + |
| +void WebLayerImplFixedBounds::setBounds(const WebSize& bounds) |
| +{ |
| + if (m_originalBounds != gfx::Size(bounds)) { |
| + m_originalBounds = bounds; |
| + updateLayerBoundsAndTransform(); |
| + } |
| +} |
| + |
| +WebSize WebLayerImplFixedBounds::bounds() const |
| +{ |
| + return m_originalBounds; |
| +} |
| + |
| +void WebLayerImplFixedBounds::setSublayerTransform(const SkMatrix44& matrix) |
| +{ |
| + gfx::Transform transform; |
| + transform.matrix() = matrix; |
| + setSublayerTransformInternal(transform); |
| +} |
| + |
| +void WebLayerImplFixedBounds::setSublayerTransform(const WebTransformationMatrix& matrix) |
| +{ |
| + setSublayerTransformInternal(WebTransformationMatrixUtil::ToTransform(matrix)); |
| +} |
| + |
| +SkMatrix44 WebLayerImplFixedBounds::sublayerTransform() const |
| +{ |
| + return m_originalSublayerTransform.matrix(); |
| +} |
| + |
| +void WebLayerImplFixedBounds::setTransform(const SkMatrix44& matrix) |
| +{ |
| + gfx::Transform transform; |
| + transform.matrix() = matrix; |
| + setTransformInternal(transform); |
| +} |
| + |
| +void WebLayerImplFixedBounds::setTransform(const WebTransformationMatrix& matrix) |
| +{ |
| + setTransformInternal(WebTransformationMatrixUtil::ToTransform(matrix)); |
| +} |
| + |
| +SkMatrix44 WebLayerImplFixedBounds::transform() const |
| +{ |
| + return m_originalTransform.matrix(); |
| +} |
| + |
| +void WebLayerImplFixedBounds::setFixedBounds(const gfx::Size& fixedBounds) |
| +{ |
| + if (m_fixedBounds != fixedBounds) { |
| + m_fixedBounds = fixedBounds; |
| + updateLayerBoundsAndTransform(); |
| + } |
| +} |
| + |
| +void WebLayerImplFixedBounds::setSublayerTransformInternal(const gfx::Transform& transform) |
| +{ |
| + if (m_originalSublayerTransform != transform) { |
| + m_originalSublayerTransform = transform; |
| + updateLayerBoundsAndTransform(); |
| + } |
| +} |
| + |
| +void WebLayerImplFixedBounds::setTransformInternal(const gfx::Transform& transform) |
| +{ |
| + if (m_originalTransform != transform) { |
| + m_originalTransform = transform; |
| + updateLayerBoundsAndTransform(); |
| + } |
| +} |
| + |
| +void WebLayerImplFixedBounds::updateLayerBoundsAndTransform() |
| +{ |
| + if (m_fixedBounds.IsEmpty() || m_originalBounds.IsEmpty() || m_fixedBounds == m_originalBounds |
| + // Fall back to non-fixed bounds for non-zero anchor point. |
|
enne (OOO)
2013/02/22 23:53:32
Can you make this a TODO, so that it's clear that
Xianzhu
2013/02/23 00:56:19
Done.
|
| + || anchorPoint().x || anchorPoint().y) { |
| + m_layer->setBounds(m_originalBounds); |
| + m_layer->setTransform(m_originalTransform); |
| + m_layer->setSublayerTransform(m_originalSublayerTransform); |
| + return; |
| + } |
| + |
| + m_layer->setBounds(m_fixedBounds); |
| + |
| + // Apply bounds scale (bounds/fixedBounds) over original transform. |
| + gfx::Transform transformWithBoundsScale(m_originalTransform); |
| + float boundsScaleX = static_cast<float>(m_originalBounds.width()) / m_fixedBounds.width(); |
| + float boundsScaleY = static_cast<float>(m_originalBounds.height()) / m_fixedBounds.height(); |
| + transformWithBoundsScale.Scale(boundsScaleX, boundsScaleY); |
| + m_layer->setTransform(transformWithBoundsScale); |
| + |
| + // As we apply extra scale transform on this layer which will propagate to the sublayers, |
| + // here undo the scale on sublayers. |
| + gfx::Transform sublayerTransformWithInverseBoundsScale; |
| + sublayerTransformWithInverseBoundsScale.Scale(1.f / boundsScaleX, 1.f / boundsScaleY); |
| + sublayerTransformWithInverseBoundsScale.PreconcatTransform(m_originalSublayerTransform); |
| + m_layer->setSublayerTransform(sublayerTransformWithInverseBoundsScale); |
| +} |
| + |
| +} // namespace WebKit |