[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,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2] master 7ad9d57c3 2/2: [type1, cid, type42] Streamline dictionary parsing.,
Werner Lemberg <=