void Font::drawGlyphs(GraphicsContext* graphicsContext, const SimpleFontData* font, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point) const { SkColor color = graphicsContext->platformContext()->effectiveFillColor(); unsigned char alpha = SkColorGetA(color); // Skip 100% transparent text; no need to draw anything. if (!alpha && graphicsContext->platformContext()->getStrokeStyle() == NoStroke && !graphicsContext->hasShadow()) return; if (!alpha || windowsCanHandleDrawTextShadow(graphicsContext) || !windowsCanHandleTextDrawingWithoutShadow(graphicsContext)) { drawGlyphsWin(graphicsContext, font, glyphBuffer, from, numGlyphs, point); return; } // Draw in two passes: skia for the shadow, GDI for foreground text // pass1: shadow (will use skia) graphicsContext->save(); graphicsContext->setFillColor(Color::transparent, graphicsContext->fillColorSpace()); drawGlyphsWin(graphicsContext, font, glyphBuffer, from, numGlyphs, point); graphicsContext->restore(); // pass2: foreground text (will use GDI) FloatSize shadowOffset; float shadowBlur; Color shadowColor; ColorSpace shadowColorSpace; graphicsContext->getShadow(shadowOffset, shadowBlur, shadowColor, shadowColorSpace); graphicsContext->setShadow(shadowOffset, shadowBlur, Color::transparent, shadowColorSpace); drawGlyphsWin(graphicsContext, font, glyphBuffer, from, numGlyphs, point); graphicsContext->setShadow(shadowOffset, shadowBlur, shadowColor, shadowColorSpace); }
bool windowsCanHandleTextDrawing(GraphicsContext* context) { if (!windowsCanHandleTextDrawingWithoutShadow(context)) return false; // Check for shadow effects. if (!windowsCanHandleDrawTextShadow(context)) return false; return true; }