summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp145
1 files changed, 35 insertions, 110 deletions
diff --git a/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp b/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp
index 7bed5bb..fcb78ed 100644
--- a/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp
@@ -26,8 +26,10 @@
#include "config.h"
+#define LOG_TAG "FontAndroid"
+
+#include "AndroidLog.h"
#include "EmojiFont.h"
-#include "GraphicsOperationCollection.h"
#include "GraphicsOperation.h"
#include "Font.h"
#include "FontData.h"
@@ -45,6 +47,7 @@
#include "SkTypeface.h"
#include "SkUtils.h"
#include "TextRun.h"
+#include "SkTypeface_android.h"
#ifdef SUPPORT_COMPLEX_SCRIPTS
#include "HarfbuzzSkia.h"
@@ -191,6 +194,12 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
// compile-time assert
SkASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t));
+ if (numGlyphs == 1 && glyphBuffer.glyphAt(from) == 0x3) {
+ // Webkit likes to draw end text control command for some reason
+ // Just ignore it
+ return;
+ }
+
SkPaint paint;
if (!setupForText(&paint, gc, font)) {
return;
@@ -220,10 +229,11 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
int localCount = 0;
for (int i = 0; i < numGlyphs; i++) {
if (EmojiFont::IsEmojiGlyph(glyphs[i])) {
- if (localCount)
+ if (localCount) {
canvas->drawPosText(&glyphs[localIndex],
- localCount * sizeof(uint16_t),
- &pos[localIndex], paint);
+ localCount * sizeof(uint16_t),
+ &pos[localIndex], paint);
+ }
EmojiFont::Draw(canvas, glyphs[i], x, y, paint);
// reset local index/count track for "real" glyphs
localCount = 0;
@@ -236,10 +246,11 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
y += SkFloatToScalar(adv[i].height());
}
// draw the last run of glyphs (if any)
- if (localCount)
+ if (localCount) {
canvas->drawPosText(&glyphs[localIndex],
- localCount * sizeof(uint16_t),
- &pos[localIndex], paint);
+ localCount * sizeof(uint16_t),
+ &pos[localIndex], paint);
+ }
} else {
for (int i = 0; i < numGlyphs; i++) {
pos[i].set(x, y);
@@ -255,13 +266,12 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
rotator.setRotate(90);
rotator.mapPoints(pos, numGlyphs);
}
-
- canvas->drawPosText(glyphs, numGlyphs * sizeof(uint16_t), pos, paint);
+ canvas->drawPosText(glyphs,
+ numGlyphs * sizeof(uint16_t), pos, paint);
if (font->platformData().orientation() == Vertical)
canvas->restore();
}
- gc->platformContext()->endRecording();
}
void Font::drawEmphasisMarksForComplexText(WebCore::GraphicsContext*, WebCore::TextRun const&, WTF::AtomicString const&, WebCore::FloatPoint const&, int, int) const
@@ -461,26 +471,8 @@ public:
}
private:
- enum CustomScript {
- Bengali,
- Devanagari,
- Hebrew,
- HebrewBold,
- Kannada,
- Malayalam,
- Naskh,
- Tamil,
- TamilBold,
- Telugu,
- Thai,
- NUM_SCRIPTS
- };
-
- static const char* paths[NUM_SCRIPTS];
-
void setupFontForScriptRun();
- const FontPlatformData* setupComplexFont(CustomScript script,
- const FontPlatformData& platformData);
+ const FontPlatformData* setupComplexFont(HB_Script script, const FontPlatformData& platformData);
HB_FontRec* allocHarfbuzzFont();
void deleteGlyphArrays();
void createGlyphArrays(int);
@@ -522,22 +514,6 @@ private:
unsigned m_letterSpacing; // pixels to be added after each glyph.
};
-
-// Indexed using enum CustomScript
-const char* TextRunWalker::paths[] = {
- "/system/fonts/Lohit-Bengali.ttf",
- "/system/fonts/DroidSansDevanagari-Regular.ttf",
- "/system/fonts/DroidSansHebrew-Regular.ttf",
- "/system/fonts/DroidSansHebrew-Bold.ttf",
- "/system/fonts/Lohit-Kannada.ttf",
- "/system/fonts/AnjaliNewLipi-light.ttf",
- "/system/fonts/DroidNaskh-Regular.ttf",
- "/system/fonts/DroidSansTamil-Regular.ttf",
- "/system/fonts/DroidSansTamil-Bold.ttf",
- "/system/fonts/Lohit-Telugu.ttf",
- "/system/fonts/DroidSansThai.ttf"
-};
-
TextRunWalker::TextRunWalker(const TextRun& run, int startingX, int startingY, const Font* font)
: m_font(font)
, m_startingX(startingX)
@@ -692,8 +668,7 @@ void TextRunWalker::setWordAndLetterSpacing(int wordSpacingAdjustment,
}
const FontPlatformData* TextRunWalker::setupComplexFont(
- CustomScript script,
- const FontPlatformData& platformData)
+ HB_Script script, const FontPlatformData& platformData)
{
static FallbackHash fallbackPlatformData;
@@ -703,15 +678,19 @@ const FontPlatformData* TextRunWalker::setupComplexFont(
// italic, then bold italic. additional fake style bits can be added.
int scriptStyleIndex = script;
if (platformData.isFakeBold())
- scriptStyleIndex += NUM_SCRIPTS;
+ scriptStyleIndex += HB_ScriptCount;
if (platformData.isFakeItalic())
- scriptStyleIndex += NUM_SCRIPTS << 1;
+ scriptStyleIndex += HB_ScriptCount << 1;
FallbackFontKey key(scriptStyleIndex, platformData.size());
FontPlatformData* newPlatformData = 0;
if (!fallbackPlatformData.contains(key)) {
- SkTypeface* typeface = SkTypeface::CreateFromFile(paths[script]);
+ SkTypeface::Style currentStyle = SkTypeface::kNormal;
+ if (platformData.typeface())
+ currentStyle = platformData.typeface()->style();
+ SkTypeface* typeface = SkCreateTypefaceForScript(script, currentStyle,
+ SkPaint::kElegant_Variant);
newPlatformData = new FontPlatformData(platformData, typeface);
SkSafeUnref(typeface);
fallbackPlatformData.set(key, newPlatformData);
@@ -729,61 +708,8 @@ void TextRunWalker::setupFontForScriptRun()
const FontData* fontData = m_font->glyphDataForCharacter(m_run[0], false).fontData;
const FontPlatformData& platformData =
fontData->fontDataForCharacter(' ')->platformData();
- const FontPlatformData* complexPlatformData = &platformData;
-
- switch (m_item.item.script) {
- case HB_Script_Bengali:
- complexPlatformData = setupComplexFont(Bengali, platformData);
- break;
- case HB_Script_Devanagari:
- complexPlatformData = setupComplexFont(Devanagari, platformData);
- break;
- case HB_Script_Hebrew:
- switch (platformData.typeface()->style()) {
- case SkTypeface::kBold:
- case SkTypeface::kBoldItalic:
- complexPlatformData = setupComplexFont(HebrewBold, platformData);
- break;
- case SkTypeface::kNormal:
- case SkTypeface::kItalic:
- default:
- complexPlatformData = setupComplexFont(Hebrew, platformData);
- break;
- }
- break;
- case HB_Script_Kannada:
- complexPlatformData = setupComplexFont(Kannada, platformData);
- break;
- case HB_Script_Malayalam:
- complexPlatformData = setupComplexFont(Malayalam, platformData);
- break;
- case HB_Script_Arabic:
- complexPlatformData = setupComplexFont(Naskh, platformData);
- break;
- case HB_Script_Tamil:
- switch (platformData.typeface()->style()) {
- case SkTypeface::kBold:
- case SkTypeface::kBoldItalic:
- complexPlatformData = setupComplexFont(TamilBold, platformData);
- break;
- case SkTypeface::kNormal:
- case SkTypeface::kItalic:
- default:
- complexPlatformData = setupComplexFont(Tamil, platformData);
- break;
- }
- break;
- case HB_Script_Telugu:
- complexPlatformData = setupComplexFont(Telugu, platformData);
- break;
- case HB_Script_Thai:
- complexPlatformData = setupComplexFont(Thai, platformData);
- break;
- default:
- // HB_Script_Common; includes Ethiopic
- complexPlatformData = &platformData;
- break;
- }
+ const FontPlatformData* complexPlatformData = setupComplexFont(m_item.item.script, platformData);
+
m_item.face = complexPlatformData->harfbuzzFace();
m_item.font->userData = const_cast<FontPlatformData*>(complexPlatformData);
@@ -1113,18 +1039,17 @@ void Font::drawComplexText(GraphicsContext* gc, TextRun const& run,
if (fill) {
walker.fontPlatformDataForScriptRun()->setupPaint(&fillPaint);
adjustTextRenderMode(&fillPaint, haveMultipleLayers);
- canvas->drawPosText(walker.glyphs(), walker.length() << 1,
- walker.positions(), fillPaint);
+ canvas->drawPosText(walker.glyphs(),
+ walker.length() << 1, walker.positions(), fillPaint);
}
if (stroke) {
walker.fontPlatformDataForScriptRun()->setupPaint(&strokePaint);
adjustTextRenderMode(&strokePaint, haveMultipleLayers);
- canvas->drawPosText(walker.glyphs(), walker.length() << 1,
- walker.positions(), strokePaint);
+ canvas->drawPosText(walker.glyphs(),
+ walker.length() << 1, walker.positions(), strokePaint);
}
}
- gc->platformContext()->endRecording();
}
float Font::floatWidthForComplexText(const TextRun& run,