Index: webkit/port/platform/graphics/chromium/FontLinux.cpp |
diff --git a/webkit/port/platform/graphics/chromium/FontLinux.cpp b/webkit/port/platform/graphics/chromium/FontLinux.cpp |
index 2c186d1ea75cf7c626ac86d3045c9e176a03a546..230e31ad351b38aebb024ddcf09259ebc9cac4b8 100644 |
--- a/webkit/port/platform/graphics/chromium/FontLinux.cpp |
+++ b/webkit/port/platform/graphics/chromium/FontLinux.cpp |
@@ -5,64 +5,58 @@ |
#include "config.h" |
#include "Font.h" |
-#include <pango/pango.h> |
-#include <pango/pangoft2.h> |
- |
#include "FloatRect.h" |
+#include "GlyphBuffer.h" |
+#include "GraphicsContext.h" |
#include "NotImplemented.h" |
#include "PlatformContextSkia.h" |
-#include "GraphicsContext.h" |
#include "SimpleFontData.h" |
-#include "GlyphBuffer.h" |
+ |
+#include "SkCanvas.h" |
+#include "SkPaint.h" |
+#include "SkTemplates.h" |
+#include "SkTypeface.h" |
+#include "SkUtils.h" |
namespace WebCore { |
-// ----------------------------------------------------------------------------- |
-// Bitblit a Freetype bitmap onto a canvas at the given location in the given |
-// colour. |
-// pgc: the Skia canvas |
-// bm: A freetype bitmap which is an 8-bit alpha bitmap |
-// ----------------------------------------------------------------------------- |
-static void bitBlitAlpha(PlatformGraphicsContext* pgc, FT_Bitmap* bm, |
- int x, int y, const Color& col) |
-{ |
+void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font, |
+ const GlyphBuffer& glyphBuffer, int from, int numGlyphs, |
+ const FloatPoint& point) const { |
+ SkCanvas* canvas = gc->platformContext()->canvas(); |
SkPaint paint; |
- paint.setARGB(col.alpha(), col.red(), col.green(), col.blue()); |
- |
- // Here we are constructing an SkBitmap by pointing directly into the |
- // Freetype bitmap data |
- SkBitmap glyph; |
- glyph.setConfig(SkBitmap::kA8_Config, bm->width, bm->rows, bm->pitch); |
- glyph.setPixels(bm->buffer); |
- pgc->canvas()->drawBitmap(glyph, x, y, &paint); |
-} |
-void Font::drawGlyphs(GraphicsContext* ctx, const SimpleFontData* sfd, |
- const GlyphBuffer& glyphBuffer, int from, int to, |
- const FloatPoint& point) const |
-{ |
- // For now we draw text by getting the Freetype face from Pango and asking |
- // Freetype to render each glyph as an 8-bit alpha bitmap and drawing that |
- // to the canvas. This, obviously, ignores kerning, ligatures and other |
- // things that we should have in the real version. |
- GlyphBufferGlyph* glyphs = (GlyphBufferGlyph*)glyphBuffer.glyphs(from); |
- PlatformGraphicsContext* pgc = ctx->platformContext(); |
- FT_Face face = pango_ft2_font_get_face(sfd->m_font.m_font); |
- FT_GlyphSlot slot = face->glyph; |
- |
- int x = point.x(), y = point.y(); |
- |
- for (int i = from; i < to; ++i) { |
- const FT_Error error = FT_Load_Glyph(face, glyphs[i], FT_LOAD_RENDER); |
- if (error) |
- continue; |
- |
- bitBlitAlpha(pgc, &slot->bitmap, x + slot->bitmap_left, |
- y - slot->bitmap_top, ctx->fillColor()); |
- // Freetype works in 1/64ths of a pixel, so we divide by 64 to get the |
- // number of pixels to advance. |
- x += slot->advance.x >> 6; |
+ font->platformData().setupPaint(&paint); |
+ paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
+ paint.setColor(gc->fillColor().rgb()); |
+ |
+ SkASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t)); // compile-time assert |
+ |
+ const GlyphBufferGlyph* glyphs = glyphBuffer.glyphs(from); |
+ SkScalar x = SkFloatToScalar(point.x()); |
+ SkScalar y = SkFloatToScalar(point.y()); |
+ |
+ // TODO(port): Android WebCore has patches for PLATFORM(SGL) which involves |
+ // this, however we don't have these patches and it's unclear when Android |
+ // may upstream them. |
+#if 0 |
+ if (glyphBuffer.hasAdjustedWidths()) { |
+ const GlyphBufferAdvance* adv = glyphBuffer.advances(from); |
+ SkAutoSTMalloc<32, SkPoint> storage(numGlyphs); |
+ SkPoint* pos = storage.get(); |
+ |
+ for (int i = 0; i < numGlyphs; i++) { |
+ pos[i].set(x, y); |
+ x += SkFloatToScalar(adv[i].width()); |
+ y += SkFloatToScalar(adv[i].height()); |
+ } |
+ canvas->drawPosText(glyphs, numGlyphs << 1, pos, paint); |
+ } else { |
+ canvas->drawText(glyphs, numGlyphs << 1, x, y, paint); |
} |
+#endif |
+ |
+ canvas->drawText(glyphs, numGlyphs << 1, x, y, paint); |
} |
void Font::drawComplexText(GraphicsContext* context, const TextRun& run, |
@@ -78,7 +72,7 @@ float Font::floatWidthForComplexText(const TextRun& run) const |
} |
int Font::offsetForPositionForComplexText(const TextRun& run, int x, |
- bool includePartialGlyphs) const |
+ bool includePartialGlyphs) const |
{ |
notImplemented(); |
return 0; |
@@ -86,7 +80,7 @@ int Font::offsetForPositionForComplexText(const TextRun& run, int x, |
FloatRect Font::selectionRectForComplexText(const TextRun& run, |
const IntPoint& point, int h, |
- int from, int to) const |
+ int from, int to) const |
{ |
notImplemented(); |
return FloatRect(); |