diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-05-25 09:47:07 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-05-25 09:47:07 +0200 |
commit | ef31021c3ec96a70777217f1f613f7d27d6f5a15 (patch) | |
tree | b51453a9f663cf478c61d392188e8696e42846d9 | |
parent | bbd3a98a7aeb4872d9bcb120306173ef975b3f8f (diff) | |
parent | 8b2647154aa08a498624fa144d55fdefbeebe320 (diff) | |
download | qtwebkit-ef31021c3ec96a70777217f1f613f7d27d6f5a15.tar.gz |
Merge remote-tracking branch 'origin/5.4.2' into 5.4
Change-Id: Iafbf406788fa3b89d01bc11c45c56727f058b189
-rw-r--r-- | Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp | 40 | ||||
-rw-r--r-- | Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.h | 1 |
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; |