Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1164)

Unified Diff: Source/core/platform/graphics/skia/ImageBufferSkia.cpp

Issue 14298018: This CL implements the first draft of Canvas 2D Context Attributes, aka getContext('2d', { alpha: f… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased to ToT; test cleanup Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/platform/graphics/skia/ImageBufferSkia.cpp
diff --git a/Source/core/platform/graphics/skia/ImageBufferSkia.cpp b/Source/core/platform/graphics/skia/ImageBufferSkia.cpp
index e5f24e6973308f6a0d79d9bafe4c3093aa93ed98..72efc6e387ee5773210bf22b96345fe677d0fb9e 100644
--- a/Source/core/platform/graphics/skia/ImageBufferSkia.cpp
+++ b/Source/core/platform/graphics/skia/ImageBufferSkia.cpp
@@ -70,7 +70,7 @@ ImageBufferData::ImageBufferData(const IntSize& size)
{
}
-static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* data)
+static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* data, OpacityMode opacityMode)
{
RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get();
if (!context3D)
@@ -79,6 +79,7 @@ static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* d
if (!gr)
return 0;
gr->resetContext();
+ Canvas2DLayerBridge::OpacityMode bridgeOpacityMode = opacityMode == Opaque ? Canvas2DLayerBridge::Opaque : Canvas2DLayerBridge::NonOpaque;
Canvas2DLayerBridge::ThreadMode threadMode = WebKit::Platform::current()->isThreadedCompositingEnabled() ? Canvas2DLayerBridge::Threaded : Canvas2DLayerBridge::SingleThread;
SkImage::Info info;
info.fWidth = size.width();
@@ -89,7 +90,7 @@ static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* d
if (!surface.get())
return 0;
SkDeferredCanvas* canvas = new SkDeferredCanvas(surface.get());
- data->m_layerBridge = Canvas2DLayerBridge::create(context3D.release(), canvas, threadMode);
+ data->m_layerBridge = Canvas2DLayerBridge::create(context3D.release(), canvas, bridgeOpacityMode, threadMode);
// If canvas buffer allocation failed, debug build will have asserted
// For release builds, we must verify whether the device has a render target
data->m_platformContext.setAccelerated(true);
@@ -144,7 +145,7 @@ ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace,
success = true;
}
-ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace, RenderingMode renderingMode, bool& success)
+ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace, RenderingMode renderingMode, OpacityMode opacityMode, bool& success)
: m_data(size)
, m_size(size)
, m_logicalSize(size)
@@ -153,7 +154,7 @@ ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace,
OwnPtr<SkCanvas> canvas;
if (renderingMode == Accelerated)
- canvas = adoptPtr(createAcceleratedCanvas(size, &m_data));
+ canvas = adoptPtr(createAcceleratedCanvas(size, &m_data, opacityMode));
else if (renderingMode == UnacceleratedNonPlatformBuffer)
canvas = adoptPtr(createNonPlatformCanvas(size));
@@ -168,13 +169,16 @@ ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace,
m_data.m_canvas = canvas.release();
m_data.m_platformContext.setCanvas(m_data.m_canvas.get());
m_context = adoptPtr(new GraphicsContext(&m_data.m_platformContext));
- m_context->setShouldSmoothFonts(false);
+ m_context->setShouldSmoothFonts(opacityMode == Opaque);
m_context->scale(FloatSize(m_resolutionScale, m_resolutionScale));
- // Make the background transparent. It would be nice if this wasn't
+ // Clear the background transparent or opaque, as required. It would be nice if this wasn't
// required, but the canvas is currently filled with the magic transparency
// color. Can we have another way to manage this?
- m_data.m_canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode);
+ if (opacityMode == Opaque)
+ m_data.m_canvas->drawARGB(255, 0, 0, 0, SkXfermode::kSrc_Mode);
+ else
+ m_data.m_canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode);
success = true;
}

Powered by Google App Engine
This is Rietveld 408576698