freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master 7ad9d57c3 2/2: [type1, cid, type42] Streamline dictio


From: Werner Lemberg
Subject: [freetype2] master 7ad9d57c3 2/2: [type1, cid, type42] Streamline dictionary parsing.
Date: Sat, 9 Sep 2023 15:34:09 -0400 (EDT)

branch: master
commit 7ad9d57c3bc1d67d5cd4cee1d1d76537c1f18300
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    [type1, cid, type42] Streamline dictionary parsing.
    
    When matching the keywords, we avoid calculating their lengths by
    checking the stored values. This itself is a sufficient pre-check
    before diving into `memcmp`. Therefore, we remove explicit check of
    the first characters.
    
    * include/freetype/internal/psaux.h (T1_FieldRec): Store length.
    * src/cid/cidload.c (cid_parse_dict): Use `memcmp` and stored length.
    * src/type1/t1load.c (parse_dict): Ditto.
    * src/type42/t42parse.c (t42_parse_dict): Ditto.
---
 include/freetype/internal/psaux.h |  5 +++++
 src/cid/cidload.c                 | 28 +++++++++-------------------
 src/type1/t1load.c                |  5 ++---
 src/type42/t42parse.c             |  5 ++---
 4 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/include/freetype/internal/psaux.h 
b/include/freetype/internal/psaux.h
index dfb1987f8..d2dabc7fe 100644
--- a/include/freetype/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -249,6 +249,7 @@ FT_BEGIN_HEADER
   /* structure type used to model object fields */
   typedef struct  T1_FieldRec_
   {
+    FT_UInt             len;          /* field identifier length        */
     const char*         ident;        /* field identifier               */
     T1_FieldLocation    location;
     T1_FieldType        type;         /* type of field                  */
@@ -273,6 +274,7 @@ FT_BEGIN_HEADER
 
 #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
           {                                                 \
+            sizeof ( _ident ) - 1,                          \
             _ident, T1CODE, _type,                          \
             0,                                              \
             FT_FIELD_OFFSET( _fname ),                      \
@@ -283,6 +285,7 @@ FT_BEGIN_HEADER
 
 #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
           {                                             \
+            sizeof ( _ident ) - 1,                      \
             _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
             (T1_Field_ParseFunc)_reader,                \
             0, 0,                                       \
@@ -292,6 +295,7 @@ FT_BEGIN_HEADER
 
 #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
           {                                                      \
+            sizeof ( _ident ) - 1,                               \
             _ident, T1CODE, _type,                               \
             0,                                                   \
             FT_FIELD_OFFSET( _fname ),                           \
@@ -303,6 +307,7 @@ FT_BEGIN_HEADER
 
 #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
           {                                                       \
+            sizeof ( _ident ) - 1,                                \
             _ident, T1CODE, _type,                                \
             0,                                                    \
             FT_FIELD_OFFSET( _fname ),                            \
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
index a7da8ea39..f54fd7544 100644
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -478,26 +478,16 @@
               if ( !name )
                 break;
 
-              if ( cur[0] == name[0]                     &&
-                   len == ft_strlen( (const char*)name ) )
+              if ( keyword->len == len              &&
+                   ft_memcmp( cur, name, len ) == 0 )
               {
-                FT_UInt  n;
-
-
-                for ( n = 1; n < len; n++ )
-                  if ( cur[n] != name[n] )
-                    break;
-
-                if ( n >= len )
-                {
-                  /* we found it - run the parsing callback */
-                  parser->root.error = cid_load_keyword( face,
-                                                         loader,
-                                                         keyword );
-                  if ( parser->root.error )
-                    return parser->root.error;
-                  break;
-                }
+                /* we found it - run the parsing callback */
+                parser->root.error = cid_load_keyword( face,
+                                                       loader,
+                                                       keyword );
+                if ( parser->root.error )
+                  return parser->root.error;
+                break;
               }
               keyword++;
             }
diff --git a/src/type1/t1load.c b/src/type1/t1load.c
index be7cd0fd5..fb685ff26 100644
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -2401,9 +2401,8 @@
             if ( !name )
               break;
 
-            if ( cur[0] == name[0]                      &&
-                 len == ft_strlen( (const char *)name ) &&
-                 ft_memcmp( cur, name, len ) == 0       )
+            if ( keyword->len == len              &&
+                 ft_memcmp( cur, name, len ) == 0 )
             {
               /* We found it -- run the parsing callback!     */
               /* We record every instance of every field      */
diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c
index f96a43b14..fa165b7b9 100644
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -1288,9 +1288,8 @@
             if ( !name )
               continue;
 
-            if ( cur[0] == name[0]                      &&
-                 len == ft_strlen( (const char *)name ) &&
-                 ft_memcmp( cur, name, len ) == 0       )
+            if ( keyword->len == len              &&
+                 ft_memcmp( cur, name, len ) == 0 )
             {
               /* we found it -- run the parsing callback! */
               parser->root.error = t42_load_keyword( face,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]