freetype-commit
[Top][All Lists]
Advanced

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

[Git][freetype/freetype][master] [cff, truetype] Improve prefix and suff


From: Alexei Podtelezhnikov (@apodtele)
Subject: [Git][freetype/freetype][master] [cff, truetype] Improve prefix and suffix removal.
Date: Fri, 08 Sep 2023 03:58:47 +0000

Alexei Podtelezhnikov pushed to branch master at FreeType / FreeType

Commits:

  • 9c51e21e
    by Alexei Podtelezhnikov at 2023-09-07T23:50:35-04:00
    [cff, truetype] Improve prefix and suffix removal.
    
    * src/cff/cffobjs.c (remove_style): Rewrite using pointers.
    (remove_subset_prefix): Unwrap loop and use `memmove`.
    * src/truetype/ttobjs.c (tt_skip_pdffont_random_tag): Unwrap loop
    and avoid `strlen`.
    

2 changed files:

Changes:

  • src/cff/cffobjs.c
    ... ... @@ -421,32 +421,23 @@
    421 421
       static void
    
    422 422
       remove_subset_prefix( FT_String*  name )
    
    423 423
       {
    
    424
    -    FT_Int32  idx             = 0;
    
    425
    -    FT_Int32  length          = (FT_Int32)ft_strlen( name ) + 1;
    
    426
    -    FT_Bool   continue_search = 1;
    
    424
    +    FT_UInt32  i = 0, idx = 0;
    
    427 425
     
    
    428 426
     
    
    429
    -    while ( continue_search )
    
    427
    +    /* six ASCII uppercase letters followed by a plus sign */
    
    428
    +    while ( 'A' <= name[i] && name[i++] <= 'Z' &&
    
    429
    +            'A' <= name[i] && name[i++] <= 'Z' &&
    
    430
    +            'A' <= name[i] && name[i++] <= 'Z' &&
    
    431
    +            'A' <= name[i] && name[i++] <= 'Z' &&
    
    432
    +            'A' <= name[i] && name[i++] <= 'Z' &&
    
    433
    +            'A' <= name[i] && name[i++] <= 'Z' &&
    
    434
    +                              name[i++] == '+' )
    
    430 435
         {
    
    431
    -      if ( length >= 7 && name[6] == '+' )
    
    432
    -      {
    
    433
    -        for ( idx = 0; idx < 6; idx++ )
    
    434
    -        {
    
    435
    -          /* ASCII uppercase letters */
    
    436
    -          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
    
    437
    -            continue_search = 0;
    
    438
    -        }
    
    439
    -
    
    440
    -        if ( continue_search )
    
    441
    -        {
    
    442
    -          for ( idx = 7; idx < length; idx++ )
    
    443
    -            name[idx - 7] = name[idx];
    
    444
    -          length -= 7;
    
    445
    -        }
    
    446
    -      }
    
    447
    -      else
    
    448
    -        continue_search = 0;
    
    436
    +      idx = i;
    
    449 437
         }
    
    438
    +
    
    439
    +    if ( idx )
    
    440
    +      FT_MEM_MOVE( name, name + idx, ft_strlen( name + idx ) + 1 );
    
    450 441
       }
    
    451 442
     
    
    452 443
     
    
    ... ... @@ -456,42 +447,20 @@
    456 447
       remove_style( FT_String*        family_name,
    
    457 448
                     const FT_String*  style_name )
    
    458 449
       {
    
    459
    -    FT_Int32  family_name_length, style_name_length;
    
    450
    +    FT_String*        f = family_name + ft_strlen( family_name );
    
    451
    +    const FT_String*  s =  style_name + ft_strlen(  style_name );
    
    460 452
     
    
    461 453
     
    
    462
    -    family_name_length = (FT_Int32)ft_strlen( family_name );
    
    463
    -    style_name_length  = (FT_Int32)ft_strlen( style_name );
    
    454
    +    /* compare strings moving backwards */
    
    455
    +    while ( s > style_name )
    
    456
    +      if ( f == family_name || *--s != *--f )
    
    457
    +        return;
    
    464 458
     
    
    465
    -    if ( family_name_length > style_name_length )
    
    466
    -    {
    
    467
    -      FT_Int  idx;
    
    468
    -
    
    469
    -
    
    470
    -      for ( idx = 1; idx <= style_name_length; idx++ )
    
    471
    -      {
    
    472
    -        if ( family_name[family_name_length - idx] !=
    
    473
    -             style_name[style_name_length - idx] )
    
    474
    -          break;
    
    475
    -      }
    
    476
    -
    
    477
    -      if ( idx > style_name_length )
    
    478
    -      {
    
    479
    -        /* family_name ends with style_name; remove it */
    
    480
    -        idx = family_name_length - style_name_length - 1;
    
    481
    -
    
    482
    -        /* also remove special characters     */
    
    483
    -        /* between real family name and style */
    
    484
    -        while ( idx > 0                     &&
    
    485
    -                ( family_name[idx] == '-' ||
    
    486
    -                  family_name[idx] == ' ' ||
    
    487
    -                  family_name[idx] == '_' ||
    
    488
    -                  family_name[idx] == '+' ) )
    
    489
    -          idx--;
    
    490
    -
    
    491
    -        if ( idx > 0 )
    
    492
    -          family_name[idx + 1] = '\0';
    
    493
    -      }
    
    494
    -    }
    
    459
    +    /* terminate and remove special characters */
    
    460
    +    do
    
    461
    +      *f = '\0';
    
    462
    +    while ( f-- > family_name                                    &&
    
    463
    +            ( *f == '-' || *f == ' ' || *f == '_' || *f == '+' ) );
    
    495 464
       }
    
    496 465
     
    
    497 466
     
    

  • src/truetype/ttobjs.c
    ... ... @@ -152,18 +152,20 @@
    152 152
       static const FT_String*
    
    153 153
       tt_skip_pdffont_random_tag( const FT_String*  name )
    
    154 154
       {
    
    155
    -    unsigned int  i;
    
    156
    -
    
    157
    -
    
    158
    -    if ( ft_strlen( name ) < 8 || name[6] != '+' )
    
    159
    -      return name;
    
    160
    -
    
    161
    -    for ( i = 0; i < 6; i++ )
    
    162
    -      if ( !ft_isupper( name[i] ) )
    
    163
    -        return name;
    
    155
    +    if ( ft_isupper( name[0] ) &&
    
    156
    +         ft_isupper( name[1] ) &&
    
    157
    +         ft_isupper( name[2] ) &&
    
    158
    +         ft_isupper( name[3] ) &&
    
    159
    +         ft_isupper( name[4] ) &&
    
    160
    +         ft_isupper( name[5] ) &&
    
    161
    +              '+' == name[6]   &&
    
    162
    +                     name[7]   )
    
    163
    +    {
    
    164
    +      FT_TRACE7(( "name without randomization tag: %s\n", name + 7 ));
    
    165
    +      return name + 7;
    
    166
    +    }
    
    164 167
     
    
    165
    -    FT_TRACE7(( "name without randomization tag: %s\n", name + 7 ));
    
    166
    -    return name + 7;
    
    168
    +    return name;
    
    167 169
       }
    
    168 170
     
    
    169 171
     
    


  • reply via email to

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