summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics')
-rw-r--r--Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.cpp6
-rw-r--r--Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.h1
-rw-r--r--Source/WebCore/platform/graphics/android/layers/FixedPositioning.cpp2
-rw-r--r--Source/WebCore/platform/graphics/android/layers/LayerAndroid.cpp91
-rw-r--r--Source/WebCore/platform/graphics/android/layers/LayerAndroid.h6
5 files changed, 63 insertions, 43 deletions
diff --git a/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.cpp
index 085a356..f03a140 100644
--- a/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.cpp
@@ -49,6 +49,7 @@ namespace WebCore {
BaseLayerAndroid::BaseLayerAndroid(LayerContent* content)
: LayerAndroid((RenderLayer*)0)
, m_color(Color::white)
+ , m_positionsCalculated(false)
{
if (content) {
setContent(content);
@@ -79,12 +80,15 @@ IFrameLayerAndroid* BaseLayerAndroid::updatePosition(SkRect viewport,
void BaseLayerAndroid::updatePositionsRecursive(const SkRect& visibleContentRect)
{
TRACE_METHOD();
+
updateLayerPositions(visibleContentRect);
TransformationMatrix ident;
FloatRect clip(0, 0, getWidth(), getHeight());
+ bool forcePositionCalculation = !m_positionsCalculated;
float scale = state() ? state()->scale() : 1.0f;
- updateGLPositionsAndScale(ident, clip, 1, scale);
+ updateGLPositionsAndScale(ident, clip, 1, scale, forcePositionCalculation);
+ m_positionsCalculated = true;
}
ForegroundBaseLayerAndroid::ForegroundBaseLayerAndroid(LayerContent* content)
diff --git a/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.h b/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.h
index 55b4b21..b43dc83 100644
--- a/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/layers/BaseLayerAndroid.h
@@ -51,6 +51,7 @@ public:
private:
// TODO: move to SurfaceCollection.
Color m_color;
+ bool m_positionsCalculated;
};
class ForegroundBaseLayerAndroid : public LayerAndroid {
diff --git a/Source/WebCore/platform/graphics/android/layers/FixedPositioning.cpp b/Source/WebCore/platform/graphics/android/layers/FixedPositioning.cpp
index 3a04d28..82afe8f 100644
--- a/Source/WebCore/platform/graphics/android/layers/FixedPositioning.cpp
+++ b/Source/WebCore/platform/graphics/android/layers/FixedPositioning.cpp
@@ -120,7 +120,7 @@ BackgroundImagePositioning::BackgroundImagePositioning(LayerAndroid* layer, cons
// Executed on the UI
IFrameLayerAndroid* BackgroundImagePositioning::updatePosition(SkRect aViewport,
- IFrameLayerAndroid* parentIframeLayer)
+ IFrameLayerAndroid* parentIframeLayer)
{
SkRect viewport = getViewport(aViewport, parentIframeLayer);
diff --git a/Source/WebCore/platform/graphics/android/layers/LayerAndroid.cpp b/Source/WebCore/platform/graphics/android/layers/LayerAndroid.cpp
index 99af481..18f65c7 100644
--- a/Source/WebCore/platform/graphics/android/layers/LayerAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/layers/LayerAndroid.cpp
@@ -62,6 +62,7 @@ LayerAndroid::LayerAndroid(RenderLayer* owner) : Layer(),
m_haveClip(false),
m_backfaceVisibility(true),
m_visible(true),
+ m_backgroundColor(0),
m_preserves3D(false),
m_anchorPointZ(0),
m_isPositionAbsolute(false),
@@ -79,9 +80,6 @@ LayerAndroid::LayerAndroid(RenderLayer* owner) : Layer(),
m_originalLayer(0),
m_maskLayer(0)
{
- m_backgroundColor = 0;
-
- m_preserves3D = false;
m_dirtyRegion.setEmpty();
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("LayerAndroid");
@@ -92,9 +90,18 @@ LayerAndroid::LayerAndroid(RenderLayer* owner) : Layer(),
LayerAndroid::LayerAndroid(const LayerAndroid& layer) : Layer(layer),
m_uniqueId(layer.m_uniqueId),
m_haveClip(layer.m_haveClip),
+ m_backfaceVisibility(layer.m_backfaceVisibility),
+ m_visible(layer.m_visible),
+ m_backgroundColor(layer.m_backgroundColor),
+ m_preserves3D(layer.m_preserves3D),
+ m_anchorPointZ(layer.m_anchorPointZ),
m_isPositionAbsolute(layer.m_isPositionAbsolute),
m_fixedPosition(0),
m_zValue(layer.m_zValue),
+ m_content(layer.m_content),
+ m_imageCRC(layer.m_imageCRC),
+ m_scale(layer.m_scale),
+ m_lastComputeTextureSize(0),
m_owningLayer(layer.m_owningLayer),
m_type(LayerAndroid::UILayer),
m_intrinsicallyComposited(layer.m_intrinsicallyComposited),
@@ -103,31 +110,20 @@ LayerAndroid::LayerAndroid(const LayerAndroid& layer) : Layer(layer),
m_originalLayer(0),
m_maskLayer(0)
{
- m_imageCRC = layer.m_imageCRC;
if (m_imageCRC)
ImagesManager::instance()->retainImage(m_imageCRC);
- m_transform = layer.m_transform;
- m_backfaceVisibility = layer.m_backfaceVisibility;
- m_visible = layer.m_visible;
- m_backgroundColor = layer.m_backgroundColor;
-
- m_content = layer.m_content;
SkSafeRef(m_content);
- m_preserves3D = layer.m_preserves3D;
- m_anchorPointZ = layer.m_anchorPointZ;
-
if (layer.m_fixedPosition) {
m_fixedPosition = layer.m_fixedPosition->copy(this);
Layer::setShouldInheritFromRootTransform(true);
}
+ m_transform = layer.m_transform;
m_drawTransform = layer.m_drawTransform;
m_childrenTransform = layer.m_childrenTransform;
m_dirtyRegion = layer.m_dirtyRegion;
- m_scale = layer.m_scale;
- m_lastComputeTextureSize = 0;
m_replicatedLayerPosition = layer.m_replicatedLayerPosition;
@@ -389,29 +385,30 @@ void LayerAndroid::updatePositions()
this->getChild(i)->updatePositions();
}
-void LayerAndroid::updateGLPositionsAndScale(const TransformationMatrix& parentMatrix,
- const FloatRect& clipping, float opacity,
- float scale)
+void LayerAndroid::updateLocalGLPositionsAndScale(const TransformationMatrix& parentMatrix,
+ const FloatRect& clipping, float opacity,
+ float scale)
{
- IntSize layerSize(getSize().width(), getSize().height());
- FloatPoint anchorPoint(getAnchorPoint().fX, getAnchorPoint().fY);
- FloatPoint position(getPosition().fX + m_replicatedLayerPosition.x() - getScrollOffset().x(),
- getPosition().fY + m_replicatedLayerPosition.y() - getScrollOffset().y());
- float originX = anchorPoint.x() * layerSize.width();
- float originY = anchorPoint.y() * layerSize.height();
+ TRACE_METHOD();
+ FloatPoint position(getPosition().x() + m_replicatedLayerPosition.x() - getScrollOffset().x(),
+ getPosition().y() + m_replicatedLayerPosition.y() - getScrollOffset().y());
+ float originX = getAnchorPoint().x() * getWidth();
+ float originY = getAnchorPoint().y() * getHeight();
TransformationMatrix localMatrix;
- if (!isPositionFixed())
- localMatrix = parentMatrix;
- localMatrix.translate3d(originX + position.x(),
- originY + position.y(),
- anchorPointZ());
- localMatrix.multiply(m_transform);
- localMatrix.translate3d(-originX,
- -originY,
- -anchorPointZ());
-
- setDrawTransform(localMatrix);
+
+ if (isPositionFixed())
+ m_drawTransform.makeIdentity();
+ else
+ m_drawTransform = parentMatrix;
+ m_drawTransform.translate3d(originX + position.x(),
+ originY + position.y(),
+ anchorPointZ());
+ m_drawTransform.multiply(m_transform);
+ m_drawTransform.translate3d(-originX,
+ -originY,
+ -anchorPointZ());
+
if (m_drawTransform.isIdentityOrTranslation()
&& surface() && surface()->allowTransformFudging()) {
// adjust the translation coordinates of the draw transform matrix so
@@ -441,7 +438,7 @@ void LayerAndroid::updateGLPositionsAndScale(const TransformationMatrix& parentM
if (m_haveClip) {
// The clipping rect calculation and intersetion will be done in content
// coordinates.
- FloatRect rect(0, 0, layerSize.width(), layerSize.height());
+ FloatRect rect(0, 0, getWidth(), getHeight());
FloatRect clip = m_drawTransform.mapRect(rect);
clip.intersect(clipping);
setDrawClip(clip);
@@ -460,11 +457,25 @@ void LayerAndroid::updateGLPositionsAndScale(const TransformationMatrix& parentM
} else {
setVisible(true);
}
+}
- int count = this->countChildren();
- if (!count)
+void LayerAndroid::updateGLPositionsAndScale(const TransformationMatrix& parentMatrix,
+ const FloatRect& clipping, float opacity,
+ float scale, bool forceCalculation)
+{
+ // constantly recalculate the draw transform of layers that may require it (and their children)
+ forceCalculation |= isPositionFixed()
+ || contentIsScrollable()
+ || (m_animations.size() != 0);
+
+ if (forceCalculation)
+ updateLocalGLPositionsAndScale(parentMatrix, clipping, opacity, scale);
+
+ if (!countChildren())
return;
+ TransformationMatrix localMatrix = m_drawTransform;
+
// Flatten to 2D if the layer doesn't preserve 3D.
if (!preserves3D()) {
localMatrix.setM13(0);
@@ -486,8 +497,8 @@ void LayerAndroid::updateGLPositionsAndScale(const TransformationMatrix& parentM
childMatrix.multiply(m_childrenTransform);
childMatrix.translate(-getSize().width() * 0.5f, -getSize().height() * 0.5f);
}
- for (int i = 0; i < count; i++)
- this->getChild(i)->updateGLPositionsAndScale(childMatrix, drawClip(), opacity, scale);
+ for (int i = 0; i < countChildren(); i++)
+ this->getChild(i)->updateGLPositionsAndScale(childMatrix, drawClip(), opacity, scale, forceCalculation);
}
bool LayerAndroid::visible() {
diff --git a/Source/WebCore/platform/graphics/android/layers/LayerAndroid.h b/Source/WebCore/platform/graphics/android/layers/LayerAndroid.h
index a5c1a6a..cd26356 100644
--- a/Source/WebCore/platform/graphics/android/layers/LayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/layers/LayerAndroid.h
@@ -155,7 +155,8 @@ public:
bool drawChildrenCanvas(SkCanvas* canvas, PaintStyle style);
void updateGLPositionsAndScale(const TransformationMatrix& parentMatrix,
- const FloatRect& clip, float opacity, float scale);
+ const FloatRect& clip, float opacity, float scale,
+ bool forceCalculations);
void setDrawOpacity(float opacity) { m_drawOpacity = opacity; }
float drawOpacity() { return m_drawOpacity; }
bool visible();
@@ -302,6 +303,9 @@ protected:
int m_uniqueId;
private:
+ void updateLocalGLPositionsAndScale(const TransformationMatrix& parentMatrix,
+ const FloatRect& clip, float opacity, float scale);
+
#if DUMP_NAV_CACHE
friend class CachedLayer::Debug; // debugging access only
#endif