summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/chromium/TransparencyWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/chromium/TransparencyWin.cpp')
-rw-r--r--WebCore/platform/graphics/chromium/TransparencyWin.cpp36
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
-