diff options
Diffstat (limited to 'WebCore/platform/graphics/chromium/FontChromiumWin.cpp')
-rw-r--r-- | WebCore/platform/graphics/chromium/FontChromiumWin.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/WebCore/platform/graphics/chromium/FontChromiumWin.cpp b/WebCore/platform/graphics/chromium/FontChromiumWin.cpp index 229188e..9f8f354 100644 --- a/WebCore/platform/graphics/chromium/FontChromiumWin.cpp +++ b/WebCore/platform/graphics/chromium/FontChromiumWin.cpp @@ -112,12 +112,16 @@ void TransparencyAwareFontPainter::init() void TransparencyAwareFontPainter::initializeForGDI() { + m_graphicsContext->save(); SkColor color = m_platformContext->effectiveFillColor(); + // Used only when m_createdTransparencyLayer is true. + float layerAlpha = 0.0f; if (SkColorGetA(color) != 0xFF) { // When the font has some transparency, apply it by creating a new - // transparency layer with that opacity applied. + // transparency layer with that opacity applied. We'll actually create + // a new transparency layer after we calculate the bounding box. m_createdTransparencyLayer = true; - m_graphicsContext->beginTransparencyLayer(SkColorGetA(color) / 255.0f); + layerAlpha = SkColorGetA(color) / 255.0f; // The color should be opaque now. color = SkColorSetRGB(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); } @@ -131,16 +135,22 @@ void TransparencyAwareFontPainter::initializeForGDI() // and we could do ClearType in that case. layerMode = TransparencyWin::TextComposite; layerRect = estimateTextBounds(); + m_graphicsContext->clip(layerRect); + if (m_createdTransparencyLayer) + m_graphicsContext->beginTransparencyLayer(layerAlpha); // The transparency helper requires that we draw text in black in // this mode and it will apply the color. m_transparency.setTextCompositeColor(color); color = SkColorSetRGB(0, 0, 0); - } else if (canvasHasMultipleLayers(m_platformContext->canvas())) { + } else if (m_createdTransparencyLayer || canvasHasMultipleLayers(m_platformContext->canvas())) { // When we're drawing a web page, we know the background is opaque, // but if we're drawing to a layer, we still need extra work. layerMode = TransparencyWin::OpaqueCompositeLayer; layerRect = estimateTextBounds(); + m_graphicsContext->clip(layerRect); + if (m_createdTransparencyLayer) + m_graphicsContext->beginTransparencyLayer(layerAlpha); } else { // Common case of drawing onto the bottom layer of a web page: we // know everything is opaque so don't need to do anything special. @@ -167,6 +177,7 @@ TransparencyAwareFontPainter::~TransparencyAwareFontPainter() m_transparency.composite(); if (m_createdTransparencyLayer) m_graphicsContext->endTransparencyLayer(); + m_graphicsContext->restore(); m_platformContext->canvas()->endPlatformPaint(); } |