summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/cairo/FontCairo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/cairo/FontCairo.cpp')
-rw-r--r--WebCore/platform/graphics/cairo/FontCairo.cpp175
1 files changed, 0 insertions, 175 deletions
diff --git a/WebCore/platform/graphics/cairo/FontCairo.cpp b/WebCore/platform/graphics/cairo/FontCairo.cpp
deleted file mode 100644
index 0d92ada..0000000
--- a/WebCore/platform/graphics/cairo/FontCairo.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
- * Copyright (C) 2007, 2008 Alp Toker <alp@atoker.com>
- * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
- * Copyright (C) 2010 Holger Hans Peter Freyther
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "Font.h"
-
-#include "AffineTransform.h"
-#include "CairoUtilities.h"
-#include "ContextShadow.h"
-#include "GlyphBuffer.h"
-#include "Gradient.h"
-#include "GraphicsContext.h"
-#include "ImageBuffer.h"
-#include "Pattern.h"
-#include "SimpleFontData.h"
-
-namespace WebCore {
-
-static void prepareContextForGlyphDrawing(cairo_t* context, const SimpleFontData* font, const FloatPoint& point)
-{
- static const float syntheticObliqueSkew = -tanf(14 * acosf(0) / 90);
- cairo_set_scaled_font(context, font->platformData().scaledFont());
- if (font->platformData().syntheticOblique()) {
- cairo_matrix_t mat = {1, 0, syntheticObliqueSkew, 1, point.x(), point.y()};
- cairo_transform(context, &mat);
- } else
- cairo_translate(context, point.x(), point.y());
-}
-
-static void drawGlyphsToContext(cairo_t* context, const SimpleFontData* font, GlyphBufferGlyph* glyphs, int numGlyphs)
-{
- cairo_show_glyphs(context, glyphs, numGlyphs);
- if (font->syntheticBoldOffset()) {
- // We could use cairo_save/cairo_restore here, but two translations are likely faster.
- cairo_translate(context, font->syntheticBoldOffset(), 0);
- cairo_show_glyphs(context, glyphs, numGlyphs);
- cairo_translate(context, -font->syntheticBoldOffset(), 0);
- }
-}
-
-static void drawGlyphsShadow(GraphicsContext* graphicsContext, cairo_t* context, const FloatPoint& point, const SimpleFontData* font, GlyphBufferGlyph* glyphs, int numGlyphs)
-{
- ContextShadow* shadow = graphicsContext->contextShadow();
- ASSERT(shadow);
-
- if (!(graphicsContext->textDrawingMode() & TextModeFill) || shadow->m_type == ContextShadow::NoShadow)
- return;
-
- if (!shadow->mustUseContextShadow(context)) {
- // Optimize non-blurry shadows, by just drawing text without the ContextShadow.
- cairo_save(context);
- cairo_translate(context, shadow->m_offset.width(), shadow->m_offset.height());
- setSourceRGBAFromColor(context, shadow->m_color);
- prepareContextForGlyphDrawing(context, font, point);
- cairo_show_glyphs(context, glyphs, numGlyphs);
- cairo_restore(context);
- return;
- }
-
- cairo_text_extents_t extents;
- cairo_scaled_font_glyph_extents(font->platformData().scaledFont(), glyphs, numGlyphs, &extents);
- FloatRect fontExtentsRect(point.x(), point.y() - extents.height, extents.width, extents.height);
- cairo_t* shadowContext = shadow->beginShadowLayer(context, fontExtentsRect);
- if (shadowContext) {
- prepareContextForGlyphDrawing(shadowContext, font, point);
- drawGlyphsToContext(shadowContext, font, glyphs, numGlyphs);
- shadow->endShadowLayer(context);
- }
-}
-
-void Font::drawGlyphs(GraphicsContext* context, const SimpleFontData* font, const GlyphBuffer& glyphBuffer,
- int from, int numGlyphs, const FloatPoint& point) const
-{
- GlyphBufferGlyph* glyphs = (GlyphBufferGlyph*)glyphBuffer.glyphs(from);
-
- float offset = 0.0f;
- for (int i = 0; i < numGlyphs; i++) {
- glyphs[i].x = offset;
- glyphs[i].y = 0.0f;
- offset += glyphBuffer.advanceAt(from + i);
- }
-
- cairo_t* cr = context->platformContext();
- drawGlyphsShadow(context, cr, point, font, glyphs, numGlyphs);
-
- cairo_save(cr);
- prepareContextForGlyphDrawing(cr, font, point);
- if (context->textDrawingMode() & TextModeFill) {
- if (context->fillGradient()) {
- cairo_set_source(cr, context->fillGradient()->platformGradient());
- if (context->getAlpha() < 1.0f) {
- cairo_push_group(cr);
- cairo_paint_with_alpha(cr, context->getAlpha());
- cairo_pop_group_to_source(cr);
- }
- } else if (context->fillPattern()) {
- AffineTransform affine;
- cairo_pattern_t* pattern = context->fillPattern()->createPlatformPattern(affine);
- cairo_set_source(cr, pattern);
- if (context->getAlpha() < 1.0f) {
- cairo_push_group(cr);
- cairo_paint_with_alpha(cr, context->getAlpha());
- cairo_pop_group_to_source(cr);
- }
- cairo_pattern_destroy(pattern);
- } else {
- float red, green, blue, alpha;
- context->fillColor().getRGBA(red, green, blue, alpha);
- cairo_set_source_rgba(cr, red, green, blue, alpha * context->getAlpha());
- }
- drawGlyphsToContext(cr, font, glyphs, numGlyphs);
- }
-
- // Prevent running into a long computation within cairo. If the stroke width is
- // twice the size of the width of the text we will not ask cairo to stroke
- // the text as even one single stroke would cover the full wdth of the text.
- // See https://bugs.webkit.org/show_bug.cgi?id=33759.
- if (context->textDrawingMode() & TextModeStroke && context->strokeThickness() < 2 * offset) {
- if (context->strokeGradient()) {
- cairo_set_source(cr, context->strokeGradient()->platformGradient());
- if (context->getAlpha() < 1.0f) {
- cairo_push_group(cr);
- cairo_paint_with_alpha(cr, context->getAlpha());
- cairo_pop_group_to_source(cr);
- }
- } else if (context->strokePattern()) {
- AffineTransform affine;
- cairo_pattern_t* pattern = context->strokePattern()->createPlatformPattern(affine);
- cairo_set_source(cr, pattern);
- if (context->getAlpha() < 1.0f) {
- cairo_push_group(cr);
- cairo_paint_with_alpha(cr, context->getAlpha());
- cairo_pop_group_to_source(cr);
- }
- cairo_pattern_destroy(pattern);
- } else {
- float red, green, blue, alpha;
- context->strokeColor().getRGBA(red, green, blue, alpha);
- cairo_set_source_rgba(cr, red, green, blue, alpha * context->getAlpha());
- }
- cairo_glyph_path(cr, glyphs, numGlyphs);
- cairo_set_line_width(cr, context->strokeThickness());
- cairo_stroke(cr);
- }
-
- cairo_restore(cr);
-}
-
-}