| 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;
|
| }
|
|
|