summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/texmap
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-02-19 15:42:14 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-19 17:33:01 +0100
commit99be50464a52281c481dd8221144603fed582aa0 (patch)
tree884c51f03f0b090a29976cceaa7a2a0de18e1cd2 /Source/WebCore/platform/graphics/texmap
parentb6e4eda98d30e75dbd0062cb3bbd416ec3b9592c (diff)
downloadqtwebkit-99be50464a52281c481dd8221144603fed582aa0.tar.gz
[TexMap] Flickering after transitions on Apple HTML5 demo
https://bugs.webkit.org/show_bug.cgi?id=102501 Patch by Alexander Paschenko <alexander.pashenko@lge.com> on 2013-01-25 Reviewed by Noam Rosenthal. The problem is caused by inconsistent state of TextureMapperLayer's transformation matrix and opacity data during and after the end of animation. This patch solves the problem by introducing three additional private flags to TextureMapperLayer: m_shouldUpdateCurrentTransformFromGraphicsLayer, m_shouldUpdateCurrentOpacityFromGraphicsLayer, and m_shouldUpdateCurrentFiltersFromGraphicsLayer. The latter has been introduced in order to avoid similar future problems with m_currentFilters. On these flags' basis, TextureMapperLayer is able to decide whether to update its inner state or not. These flags themselves are set based on GraphicsLayerTextureMapper's changeMask which indicates what details of the state have been changed since the last sync. No new tests - this doesn't expose any testable surface. Eyes-only check has been made to ensure that the problem is gone now. * platform/graphics/texmap/TextureMapperLayer.cpp: (WebCore::TextureMapperLayer::setAnimatedTransform): sets m_shouldUpdateCurrentTransformFromGraphicsLayer to false and updates m_currentTransform based on the updated state from GraphicsLayerAnimation. (WebCore): (WebCore::TextureMapperLayer::setAnimatedOpacity): sets m_shouldUpdateCurrentOpacityFromGraphicsLayer to false and updates m_currentOpacity based on the updated state from GraphicsLayerAnimation. (WebCore::TextureMapperLayer::setAnimatedFilters): sets m_shouldUpdateCurrentFiltersFromGraphicsLayer to false and updates m_currentFilters based on the updated state from GraphicsLayerAnimation. (WebCore::TextureMapperLayer::flushCompositingStateForThisLayerOnly): sets m_shouldUpdateCurrent* flags based on GLTM's changeMask. Also illegal modification of m_currentTransform that caused flickering has been removed from this method. (WebCore::TextureMapperLayer::syncAnimations): updates m_currentTransform and/or m_currentOpacity and/or m_currentFilters if corresponding flags allow to do so. * platform/graphics/texmap/TextureMapperLayer.h: (WebCore::TextureMapperLayer::TextureMapperLayer): aforementioned flags get initialized in ctor. (TextureMapperLayer): aforementioned flags are declared in the class. Change-Id: I550dfbd523e59d366dc6e52400d9e8b1d636635d git-svn-id: http://svn.webkit.org/repository/webkit/trunk@140825 268f45cc-cd09-0410-ab3c-d52691b4dbfc Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'Source/WebCore/platform/graphics/texmap')
-rw-r--r--Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp35
-rw-r--r--Source/WebCore/platform/graphics/texmap/TextureMapperLayer.h17
2 files changed, 46 insertions, 6 deletions
diff --git a/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp b/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp
index d2a10aa66..9d8a21010 100644
--- a/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp
+++ b/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp
@@ -264,7 +264,25 @@ void TextureMapperLayer::paintSelfAndChildrenWithReplica(const TextureMapperPain
paintSelfAndChildren(options);
}
+void TextureMapperLayer::setAnimatedTransform(const TransformationMatrix& matrix)
+{
+ m_shouldUpdateCurrentTransformFromGraphicsLayer = false;
+ setTransform(matrix);
+}
+
+void TextureMapperLayer::setAnimatedOpacity(float opacity)
+{
+ m_shouldUpdateCurrentOpacityFromGraphicsLayer = false;
+ setOpacity(opacity);
+}
+
#if ENABLE(CSS_FILTERS)
+void TextureMapperLayer::setAnimatedFilters(const FilterOperations& filters)
+{
+ m_shouldUpdateCurrentFiltersFromGraphicsLayer = false;
+ setFilters(filters);
+}
+
static bool shouldKeepContentTexture(const FilterOperations& filters)
{
for (size_t i = 0; i < filters.size(); ++i) {
@@ -412,6 +430,17 @@ void TextureMapperLayer::flushCompositingStateSelf(GraphicsLayerTextureMapper* g
if (changeMask & AnimationChange)
m_animations = graphicsLayer->m_animations;
+
+ if (changeMask & TransformChange)
+ m_shouldUpdateCurrentTransformFromGraphicsLayer = true;
+
+ if (changeMask & OpacityChange)
+ m_shouldUpdateCurrentOpacityFromGraphicsLayer = true;
+
+#if ENABLE(CSS_FILTERS)
+ if (changeMask & FilterChange)
+ m_shouldUpdateCurrentFiltersFromGraphicsLayer = true;
+#endif
m_state.maskLayer = toTextureMapperLayer(graphicsLayer->maskLayer());
m_state.replicaLayer = toTextureMapperLayer(graphicsLayer->replicaLayer());
@@ -466,12 +495,12 @@ void TextureMapperLayer::applyAnimationsRecursively()
void TextureMapperLayer::syncAnimations()
{
m_animations.apply(this);
- if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyWebkitTransform))
+ if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyWebkitTransform) && m_shouldUpdateCurrentTransformFromGraphicsLayer)
setTransform(m_state.transform);
- if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyOpacity))
+ if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyOpacity) && m_shouldUpdateCurrentOpacityFromGraphicsLayer)
setOpacity(m_state.opacity);
#if ENABLE(CSS_FILTERS)
- if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyWebkitFilter))
+ if (!m_animations.hasActiveAnimationsOfType(AnimatedPropertyWebkitFilter) && m_shouldUpdateCurrentFiltersFromGraphicsLayer)
setFilters(m_state.filters);
#endif
}
diff --git a/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.h b/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.h
index 27a77f6fe..08c273740 100644
--- a/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.h
+++ b/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.h
@@ -98,6 +98,11 @@ public:
, m_contentsLayer(0)
, m_opacity(1)
, m_centerZ(0)
+ , m_shouldUpdateCurrentTransformFromGraphicsLayer(true)
+ , m_shouldUpdateCurrentOpacityFromGraphicsLayer(true)
+#if ENABLE(CSS_FILTERS)
+ , m_shouldUpdateCurrentFiltersFromGraphicsLayer(true)
+#endif
, m_textureMapper(0)
{ }
@@ -151,10 +156,10 @@ private:
void paintSelfAndChildrenWithReplica(const TextureMapperPaintOptions&);
// GraphicsLayerAnimation::Client
- void setAnimatedTransform(const TransformationMatrix& matrix) { setTransform(matrix); }
- void setAnimatedOpacity(float opacity) { setOpacity(opacity); }
+ virtual void setAnimatedTransform(const TransformationMatrix& matrix) OVERRIDE;
+ virtual void setAnimatedOpacity(float opacity) OVERRIDE;
#if ENABLE(CSS_FILTERS)
- virtual void setAnimatedFilters(const FilterOperations& filters) { setFilters(filters); }
+ virtual void setAnimatedFilters(const FilterOperations& filters) OVERRIDE;
#endif
void syncAnimations();
@@ -188,6 +193,12 @@ private:
float m_centerZ;
String m_name;
+ bool m_shouldUpdateCurrentTransformFromGraphicsLayer;
+ bool m_shouldUpdateCurrentOpacityFromGraphicsLayer;
+#if ENABLE(CSS_FILTERS)
+ bool m_shouldUpdateCurrentFiltersFromGraphicsLayer;
+#endif
+
struct State {
FloatPoint pos;
FloatPoint3D anchorPoint;