diff options
Diffstat (limited to 'Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp b/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp index 53acb292c..5d39efa73 100644 --- a/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp +++ b/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzNGFaceSkia.cpp @@ -43,12 +43,21 @@ #include "SkUtils.h" #include "hb.h" +#include <wtf/HashMap.h> namespace WebCore { // Our implementation of the callbacks which Harfbuzz requires by using Skia // calls. See the Harfbuzz source for references about what these callbacks do. +struct HarfBuzzFontData { + HarfBuzzFontData(WTF::HashMap<uint32_t, uint16_t>* glyphCacheForFaceCacheEntry) + : m_glyphCacheForFaceCacheEntry(glyphCacheForFaceCacheEntry) + { } + SkPaint m_paint; + WTF::HashMap<uint32_t, uint16_t>* m_glyphCacheForFaceCacheEntry; +}; + static hb_position_t SkiaScalarToHarfbuzzPosition(SkScalar value) { return SkScalarToFixed(value); @@ -56,8 +65,7 @@ static hb_position_t SkiaScalarToHarfbuzzPosition(SkScalar value) static void SkiaGetGlyphWidthAndExtents(SkPaint* paint, hb_codepoint_t codepoint, hb_position_t* width, hb_glyph_extents_t* extents) { - if (codepoint > 0xFFFF) - return; + ASSERT(codepoint <= 0xFFFF); paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding); SkScalar skWidth; @@ -78,23 +86,27 @@ static void SkiaGetGlyphWidthAndExtents(SkPaint* paint, hb_codepoint_t codepoint static hb_bool_t harfbuzzGetGlyph(hb_font_t* hbFont, void* fontData, hb_codepoint_t unicode, hb_codepoint_t variationSelector, hb_codepoint_t* glyph, void* userData) { - SkPaint* paint = reinterpret_cast<SkPaint*>(fontData); - - paint->setTextEncoding(SkPaint::kUTF16_TextEncoding); - uint16_t text[4]; - size_t length = SkUTF16_FromUnichar(unicode, text); - uint16_t glyph16; - paint->textToGlyphs(text, length, &glyph16); - *glyph = glyph16; + HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData); + + WTF::HashMap<uint32_t, uint16_t>::AddResult result = hbFontData->m_glyphCacheForFaceCacheEntry->add(unicode, 0); + if (result.isNewEntry) { + SkPaint* paint = &hbFontData->m_paint; + paint->setTextEncoding(SkPaint::kUTF32_TextEncoding); + uint16_t glyph16; + paint->textToGlyphs(&unicode, sizeof(hb_codepoint_t), &glyph16); + result.iterator->value = glyph16; + *glyph = glyph16; + } + *glyph = result.iterator->value; return !!*glyph; } static hb_position_t harfbuzzGetGlyphHorizontalAdvance(hb_font_t* hbFont, void* fontData, hb_codepoint_t glyph, void* userData) { - SkPaint* paint = reinterpret_cast<SkPaint*>(fontData); + HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData); hb_position_t advance = 0; - SkiaGetGlyphWidthAndExtents(paint, glyph, &advance, 0); + SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, &advance, 0); return advance; } @@ -107,9 +119,9 @@ static hb_bool_t harfbuzzGetGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontD static hb_bool_t harfbuzzGetGlyphExtents(hb_font_t* hbFont, void* fontData, hb_codepoint_t glyph, hb_glyph_extents_t* extents, void* userData) { - SkPaint* paint = reinterpret_cast<SkPaint*>(fontData); + HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData); - SkiaGetGlyphWidthAndExtents(paint, glyph, 0, extents); + SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, 0, extents); return true; } @@ -132,16 +144,16 @@ static hb_font_funcs_t* harfbuzzSkiaGetFontFuncs() static hb_blob_t* harfbuzzSkiaGetTable(hb_face_t* face, hb_tag_t tag, void* userData) { - FontPlatformData* font = reinterpret_cast<FontPlatformData*>(userData); + SkFontID uniqueID = static_cast<SkFontID>(reinterpret_cast<uint64_t>(userData)); - const size_t tableSize = SkFontHost::GetTableSize(font->uniqueID(), tag); + const size_t tableSize = SkFontHost::GetTableSize(uniqueID, tag); if (!tableSize) return 0; char* buffer = reinterpret_cast<char*>(fastMalloc(tableSize)); if (!buffer) return 0; - size_t actualSize = SkFontHost::GetTableData(font->uniqueID(), tag, 0, tableSize, buffer); + size_t actualSize = SkFontHost::GetTableData(uniqueID, tag, 0, tableSize, buffer); if (tableSize != actualSize) { fastFree(buffer); return 0; @@ -151,25 +163,25 @@ static hb_blob_t* harfbuzzSkiaGetTable(hb_face_t* face, hb_tag_t tag, void* user HB_MEMORY_MODE_WRITABLE, buffer, fastFree); } -static void destroyPaint(void* userData) +static void destroyHarfBuzzFontData(void* userData) { - SkPaint* paint = reinterpret_cast<SkPaint*>(userData); - delete paint; + HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(userData); + delete hbFontData; } hb_face_t* HarfBuzzNGFace::createFace() { - hb_face_t* face = hb_face_create_for_tables(harfbuzzSkiaGetTable, m_platformData, 0); + hb_face_t* face = hb_face_create_for_tables(harfbuzzSkiaGetTable, reinterpret_cast<void*>(m_platformData->uniqueID()), 0); ASSERT(face); return face; } hb_font_t* HarfBuzzNGFace::createFont() { + HarfBuzzFontData* hbFontData = new HarfBuzzFontData(m_glyphCacheForFaceCacheEntry); + m_platformData->setupPaint(&hbFontData->m_paint); hb_font_t* font = hb_font_create(m_face); - SkPaint* paint = new SkPaint; - m_platformData->setupPaint(paint); - hb_font_set_funcs(font, harfbuzzSkiaGetFontFuncs(), paint, destroyPaint); + hb_font_set_funcs(font, harfbuzzSkiaGetFontFuncs(), hbFontData, destroyHarfBuzzFontData); float size = m_platformData->size(); int scale = SkiaScalarToHarfbuzzPosition(size); hb_font_set_scale(font, scale, scale); |