summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-05-25 09:47:07 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2015-05-25 09:47:07 +0200
commitef31021c3ec96a70777217f1f613f7d27d6f5a15 (patch)
treeb51453a9f663cf478c61d392188e8696e42846d9
parentbbd3a98a7aeb4872d9bcb120306173ef975b3f8f (diff)
parent8b2647154aa08a498624fa144d55fdefbeebe320 (diff)
Merge remote-tracking branch 'origin/5.4.2' into 5.4
-rw-r--r--Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp40
-rw-r--r--Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h1
2 files changed, 39 insertions, 2 deletions
diff --git a/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp b/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp
index e390792a3..73a6afc02 100644
--- a/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp
+++ b/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp
@@ -48,6 +48,31 @@ PassOwnPtr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client)
return adoptPtr(new GraphicsLayerTextureMapper(client));
}
+// A fallback layer to handle painting when we decide dynamically to avoid compositing due to layer size.
+class DirectPaintLayer : public TextureMapperPlatformLayer {
+public:
+ DirectPaintLayer(GraphicsLayer* sourceLayer) : m_sourceLayer(sourceLayer)
+ { }
+ void paintToTextureMapper(TextureMapper*, const FloatRect&, const TransformationMatrix& modelViewMatrix, float opacity) OVERRIDE;
+
+private:
+ GraphicsLayer* m_sourceLayer;
+};
+
+void DirectPaintLayer::paintToTextureMapper(TextureMapper* textureMapper, const FloatRect& targetRect, const TransformationMatrix& matrix, float opacity)
+{
+ GraphicsContext* context = textureMapper->graphicsContext();
+ context->save();
+ context->setAlpha(opacity);
+#if ENABLE(3D_RENDERING)
+ context->concat3DTransform(matrix);
+#else
+ context->concatCTM(matrix.toAffineTransform());
+#endif
+ m_sourceLayer->paintGraphicsLayerContents(*context, enclosingIntRect(targetRect));
+ context->restore();
+}
+
GraphicsLayerTextureMapper::GraphicsLayerTextureMapper(GraphicsLayerClient* client)
: GraphicsLayer(client)
, m_layer(adoptPtr(new TextureMapperLayer()))
@@ -57,6 +82,7 @@ GraphicsLayerTextureMapper::GraphicsLayerTextureMapper(GraphicsLayerClient* clie
, m_fixedToViewport(false)
, m_debugBorderWidth(0)
, m_contentsLayer(0)
+ , m_directLayer(0)
, m_animationStartTime(0)
, m_isScrollable(false)
{
@@ -79,7 +105,8 @@ GraphicsLayerTextureMapper::~GraphicsLayerTextureMapper()
{
if (m_contentsLayer)
m_contentsLayer->setClient(0);
-
+ delete m_directLayer;
+ m_directLayer = 0;
willBeDestroyed();
}
@@ -233,6 +260,15 @@ void GraphicsLayerTextureMapper::setSize(const FloatSize& value)
if (maskLayer())
maskLayer()->setSize(value);
notifyChange(SizeChange);
+
+ if (m_size.width() * m_size.height() <= 8192*8192) {
+ if (m_contentsLayer == m_directLayer)
+ setContentsToMedia(0);
+ } else if (!m_contentsLayer) {
+ if (!m_directLayer)
+ m_directLayer = new DirectPaintLayer(this);
+ setContentsToMedia(m_directLayer);
+ }
}
/* \reimp (GraphicsLayer.h)
@@ -627,7 +663,7 @@ void GraphicsLayerTextureMapper::updateBackingStoreIfNeeded()
bool GraphicsLayerTextureMapper::shouldHaveBackingStore() const
{
- return drawsContent() && contentsAreVisible() && !m_size.isEmpty() && (m_size.width() * m_size.height() <= 8192*8192);
+ return drawsContent() && contentsAreVisible() && !m_size.isEmpty() && !m_contentsLayer;
}
bool GraphicsLayerTextureMapper::addAnimation(const KeyframeValueList& valueList, const IntSize& boxSize, const Animation* anim, const String& keyframesName, double timeOffset)
diff --git a/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h b/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h
index 16e4ebad0..548a95c29 100644
--- a/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h
+++ b/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h
@@ -176,6 +176,7 @@ private:
float m_debugBorderWidth;
TextureMapperPlatformLayer* m_contentsLayer;
+ TextureMapperPlatformLayer* m_directLayer;
FloatRect m_needsDisplayRect;
GraphicsLayerAnimations m_animations;
double m_animationStartTime;