static void drawGlyphsShadow(GraphicsContext* graphicsContext, const FloatPoint& point, PangoLayoutLine* layoutLine, PangoRegionType renderRegion) { ShadowBlur& shadow = graphicsContext->platformContext()->shadowBlur(); if (!(graphicsContext->textDrawingMode() & TextModeFill) || shadow.type() == ShadowBlur::NoShadow) return; FloatPoint totalOffset(point + graphicsContext->state().shadowOffset); // Optimize non-blurry shadows, by just drawing text without the ShadowBlur. if (!shadow.mustUseShadowBlur(graphicsContext)) { cairo_t* context = graphicsContext->platformContext()->cr(); cairo_save(context); cairo_translate(context, totalOffset.x(), totalOffset.y()); setSourceRGBAFromColor(context, graphicsContext->state().shadowColor); #if PLATFORM(GTK) gdk_cairo_region(context, renderRegion); #else appendRegionToCairoContext(context, renderRegion); #endif cairo_clip(context); pango_cairo_show_layout_line(context, layoutLine); cairo_restore(context); return; } FloatRect extents(getPangoRegionExtents(renderRegion)); extents.setLocation(FloatPoint(point.x(), point.y() - extents.height())); if (GraphicsContext* shadowContext = shadow.beginShadowLayer(graphicsContext, extents)) { cairo_t* cairoShadowContext = shadowContext->platformContext()->cr(); cairo_translate(cairoShadowContext, point.x(), point.y()); pango_cairo_show_layout_line(cairoShadowContext, layoutLine); // We need the clipping region to be active when we blit the blurred shadow back, // because we don't want any bits and pieces of characters out of range to be // drawn. Since ShadowBlur expects a consistent transform, we have to undo the // translation before calling endShadowLayer as well. cairo_t* context = graphicsContext->platformContext()->cr(); cairo_save(context); cairo_translate(context, totalOffset.x(), totalOffset.y()); #if PLATFORM(GTK) gdk_cairo_region(context, renderRegion); #else appendRegionToCairoContext(context, renderRegion); #endif cairo_clip(context); cairo_translate(context, -totalOffset.x(), -totalOffset.y()); shadow.endShadowLayer(graphicsContext); cairo_restore(context); } }
static void drawGlyphsShadow(GraphicsContext* graphicsContext, cairo_t* context, const FloatPoint& point, PangoLayoutLine* layoutLine, PangoRegionType renderRegion) { ContextShadow* shadow = graphicsContext->contextShadow(); ASSERT(shadow); if (!(graphicsContext->textDrawingMode() & TextModeFill) || shadow->m_type == ContextShadow::NoShadow) return; FloatPoint totalOffset(point + shadow->m_offset); // Optimize non-blurry shadows, by just drawing text without the ContextShadow. if (!shadow->mustUseContextShadow(context)) { cairo_save(context); cairo_translate(context, totalOffset.x(), totalOffset.y()); setSourceRGBAFromColor(context, shadow->m_color); gdk_cairo_region(context, renderRegion); cairo_clip(context); pango_cairo_show_layout_line(context, layoutLine); cairo_restore(context); return; } FloatRect extents(getPangoRegionExtents(renderRegion)); extents.setLocation(FloatPoint(point.x(), point.y() - extents.height())); cairo_t* shadowContext = shadow->beginShadowLayer(context, extents); if (shadowContext) { cairo_translate(shadowContext, point.x(), point.y()); pango_cairo_show_layout_line(shadowContext, layoutLine); // We need the clipping region to be active when we blit the blurred shadow back, // because we don't want any bits and pieces of characters out of range to be // drawn. Since ContextShadow expects a consistent transform, we have to undo the // translation before calling endShadowLayer as well. cairo_save(context); cairo_translate(context, totalOffset.x(), totalOffset.y()); gdk_cairo_region(context, renderRegion); cairo_clip(context); cairo_translate(context, -totalOffset.x(), -totalOffset.y()); shadow->endShadowLayer(context); cairo_restore(context); } }