Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2369)

Unified Diff: Source/platform/fonts/FontPlatformData.cpp

Issue 1192223002: Optimize Complex Text Shaping and Caching (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Change CachingWordShaperTest as suggested Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/fonts/FontPlatformData.h ('k') | Source/platform/fonts/WidthCache.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/fonts/FontPlatformData.cpp
diff --git a/Source/platform/fonts/FontPlatformData.cpp b/Source/platform/fonts/FontPlatformData.cpp
index 30b9974845c9f5f39071a447db162266d9f7b56d..45bf8089543b9e662c2eb2af53860ee3b05aeea9 100644
--- a/Source/platform/fonts/FontPlatformData.cpp
+++ b/Source/platform/fonts/FontPlatformData.cpp
@@ -23,6 +23,9 @@
#include "SkEndian.h"
#include "SkTypeface.h"
+#include "hb-ot.h"
+#include "hb.h"
+#include "platform/fonts/Character.h"
#include "platform/fonts/FontCache.h"
#include "platform/fonts/shaping/HarfBuzzFace.h"
#include "wtf/HashMap.h"
@@ -268,6 +271,56 @@ HarfBuzzFace* FontPlatformData::harfBuzzFace() const
return m_harfBuzzFace.get();
}
+static inline bool tableHasSpace(hb_face_t* face, hb_set_t* glyphs,
+ hb_tag_t tag, hb_codepoint_t space)
+{
+ unsigned count = hb_ot_layout_table_get_lookup_count(face, tag);
+ for (unsigned i = 0; i < count; i++) {
+ hb_ot_layout_lookup_collect_glyphs(face, tag, i, glyphs, glyphs, glyphs,
+ 0);
+ if (hb_set_has(glyphs, space))
+ return true;
+ }
+ return false;
+}
+
+bool FontPlatformData::hasSpaceInLigaturesOrKerning(
+ TypesettingFeatures features) const
+{
+ const HarfBuzzFace* hbFace = harfBuzzFace();
+ if (!hbFace)
+ return true;
+
+ hb_face_t* face = hbFace->face();
+ ASSERT(face);
+ hb_font_t* font = hbFace->createFont();
+ ASSERT(font);
+
+ hb_codepoint_t space;
+ // If the space glyph isn't present in the font then each space character
+ // will be rendering using a fallback font, which grantees that it cannot
+ // affect the shape of the preceding word.
+ if (!hb_font_get_glyph(font, spaceCharacter, 0, &space))
+ return true;
+
+ if (!hb_ot_layout_has_substitution(face)
+ && !hb_ot_layout_has_positioning(face)) {
+ return true;
+ }
+
+ bool foundSpaceInTable = false;
+ hb_set_t* glyphs = hb_set_create();
+ if (features & Kerning)
+ foundSpaceInTable = tableHasSpace(face, glyphs, HB_OT_TAG_GPOS, space);
+ if (!foundSpaceInTable && (features & Ligatures))
+ foundSpaceInTable = tableHasSpace(face, glyphs, HB_OT_TAG_GSUB, space);
+
+ hb_set_destroy(glyphs);
+ hb_font_destroy(font);
+
+ return foundSpaceInTable;
+}
+
unsigned FontPlatformData::hash() const
{
unsigned h = SkTypeface::UniqueID(typeface());
« no previous file with comments | « Source/platform/fonts/FontPlatformData.h ('k') | Source/platform/fonts/WidthCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698