Add fast-path for GPOS too
authorBehdad Esfahbod <behdad@behdad.org>
Sat, 9 Jun 2012 06:53:57 +0000 (02:53 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Sat, 9 Jun 2012 06:53:57 +0000 (02:53 -0400)
Shaves another 3% for DejaVu Sans long Latin strings.

src/hb-ot-layout-gpos-table.hh

index 0b7f548..b826264 100644 (file)
@@ -1311,6 +1311,15 @@ struct PosLookupSubTable
   inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
   {
     TRACE_APPLY ();
+    if (likely (lookup_type < Context) ||
+       (hb_in_range<unsigned int> (lookup_type, Context, ChainContext) &&
+        hb_in_range<unsigned int> (u.header.sub_format, 1, 2)))
+    {
+      /* Fast path, for most that have coverage in the same place. */
+      hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
+      unsigned int index = (this+u.header.coverage) (glyph_id);
+      if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
+    }
     switch (lookup_type) {
     case Single:               return TRACE_RETURN (u.single.apply (c));
     case Pair:                 return TRACE_RETURN (u.pair.apply (c));
@@ -1343,7 +1352,10 @@ struct PosLookupSubTable
 
   private:
   union {
-  USHORT               sub_format;
+  struct {
+    USHORT                     sub_format;
+    OffsetTo<Coverage>         coverage;
+  } header;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
@@ -1355,7 +1367,7 @@ struct PosLookupSubTable
   ExtensionPos         extension;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, sub_format);
+  DEFINE_SIZE_UNION (2, header.sub_format);
 };