diff options
Diffstat (limited to 'WebCore/platform/graphics/chromium/TransparencyWin.cpp')
-rw-r--r-- | WebCore/platform/graphics/chromium/TransparencyWin.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/WebCore/platform/graphics/chromium/TransparencyWin.cpp b/WebCore/platform/graphics/chromium/TransparencyWin.cpp index d3ced81..7957d5a 100644 --- a/WebCore/platform/graphics/chromium/TransparencyWin.cpp +++ b/WebCore/platform/graphics/chromium/TransparencyWin.cpp @@ -109,7 +109,7 @@ class TransparencyWin::OwnedBuffers { public: OwnedBuffers(const IntSize& size, bool needReferenceBuffer) { - m_destBitmap = ImageBuffer::create(size, false); + m_destBitmap = ImageBuffer::create(size); if (needReferenceBuffer) { m_referenceBitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height()); @@ -152,6 +152,7 @@ TransparencyWin::TransparencyWin() , m_savedOnDrawContext(false) , m_layerBuffer(0) , m_referenceBitmap(0) + , m_validLayer(false) { } @@ -237,11 +238,14 @@ void TransparencyWin::setupLayer() void TransparencyWin::setupLayerForNoLayer() { m_drawContext = m_destContext; // Draw to the source context. + m_validLayer = true; } void TransparencyWin::setupLayerForOpaqueCompositeLayer() { initializeNewContext(); + if (!m_validLayer) + return; TransformationMatrix mapping; mapping.translate(-m_transformedSourceRect.x(), -m_transformedSourceRect.y()); @@ -268,6 +272,9 @@ void TransparencyWin::setupLayerForTextComposite() void TransparencyWin::setupLayerForWhiteLayer() { initializeNewContext(); + if (!m_validLayer) + return; + m_drawContext->fillRect(IntRect(IntPoint(0, 0), m_layerSize), Color::white); // Layer rect represents the part of the original layer. } @@ -289,6 +296,9 @@ void TransparencyWin::setupTransform(const IntRect& region) void TransparencyWin::setupTransformForKeepTransform(const IntRect& region) { + if (!m_validLayer) + return; + if (m_layerMode != NoLayer) { // Need to save things since we're modifying the transform. m_drawContext->save(); @@ -319,6 +329,9 @@ void TransparencyWin::setupTransformForUntransform() void TransparencyWin::setupTransformForScaleTransform() { + if (!m_validLayer) + return; + if (m_layerMode == NoLayer) { // Need to save things since we're modifying the layer. m_drawContext->save(); @@ -345,16 +358,22 @@ void TransparencyWin::setTextCompositeColor(Color color) void TransparencyWin::initializeNewContext() { int pixelSize = m_layerSize.width() * m_layerSize.height(); + if (pixelSize <= 0) + return; + if (pixelSize > maxCachedBufferPixelSize) { // Create a 1-off buffer for drawing into. We only need the reference // buffer if we're making an OpaqueCompositeLayer. bool needReferenceBitmap = m_layerMode == OpaqueCompositeLayer; m_ownedBuffers.set(new OwnedBuffers(m_layerSize, needReferenceBitmap)); - m_layerBuffer = m_ownedBuffers->destBitmap(); + if (!m_layerBuffer) + return; + m_drawContext = m_layerBuffer->context(); if (needReferenceBitmap) m_referenceBitmap = m_ownedBuffers->referenceBitmap(); + m_validLayer = true; return; } @@ -366,6 +385,7 @@ void TransparencyWin::initializeNewContext() bitmapForContext(*m_drawContext).eraseARGB(0, 0, 0, 0); m_referenceBitmap = m_cachedBuffers->referenceBitmap(); m_referenceBitmap->eraseARGB(0, 0, 0, 0); + m_validLayer = true; return; } @@ -377,10 +397,14 @@ void TransparencyWin::initializeNewContext() m_layerBuffer = m_cachedBuffers->destBitmap(); m_drawContext = m_cachedBuffers->destBitmap()->context(); m_referenceBitmap = m_cachedBuffers->referenceBitmap(); + m_validLayer = true; } void TransparencyWin::compositeOpaqueComposite() { + if (!m_validLayer) + return; + SkCanvas* destCanvas = canvasForContext(*m_destContext); destCanvas->save(); @@ -436,6 +460,9 @@ void TransparencyWin::compositeOpaqueComposite() void TransparencyWin::compositeTextComposite() { + if (!m_validLayer) + return; + const SkBitmap& bitmap = m_layerBuffer->context()->platformContext()->canvas()->getTopPlatformDevice().accessBitmap(true); SkColor textColor = m_textCompositeColor.rgb(); for (int y = 0; y < m_layerSize.height(); y++) { @@ -451,6 +478,7 @@ void TransparencyWin::compositeTextComposite() // Now the layer has text with the proper color and opacity. SkCanvas* destCanvas = canvasForContext(*m_destContext); + destCanvas->save(); // We want to use Untransformed space (see above) SkMatrix identity; @@ -467,6 +495,9 @@ void TransparencyWin::compositeTextComposite() void TransparencyWin::makeLayerOpaque() { + if (!m_validLayer) + return; + SkBitmap& bitmap = const_cast<SkBitmap&>(m_drawContext->platformContext()-> canvas()->getTopPlatformDevice().accessBitmap(true)); for (int y = 0; y < m_layerSize.height(); y++) { @@ -477,4 +508,3 @@ void TransparencyWin::makeLayerOpaque() } } // namespace WebCore - |