[bdf] Speed up charmap access.

This makes FT_Get_Char_Index and FT_Get_Next_Char 4-5 times faster.

* src/bdf/bdfdrivr.c (bdf_cmap_char_{index,next}): Help binary search
with continuous prediction.
This commit is contained in:
Alexei Podtelezhnikov 2018-09-23 21:46:26 -04:00
parent 793a9ff9f5
commit 0f122fef34
2 changed files with 28 additions and 7 deletions

View File

@ -1,13 +1,22 @@
2018-09-20 Alexei Podtelezhnikov <apodtele@gmail.com> 2018-09-23 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftobjs.c (ft_glyphslot_reset_bimap): Another tweak. [bdf] Speed up charmap access.
This makes FT_Get_Char_Index and FT_Get_Next_Char 4-5 times faster.
* src/bdf/bdfdrivr.c (bdf_cmap_char_{index,next}): Help binary search
with continuous prediction.
2018-09-22 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftobjs.c (ft_glyphslot_preset_bimap): Another tweak.
This one should be clearer. When the rounded monochrome bbox collapses This one should be clearer. When the rounded monochrome bbox collapses
we add a pixel that covers most if not all original cbox. we add a pixel that covers most if not all original cbox.
2018-09-20 Alexei Podtelezhnikov <apodtele@gmail.com> 2018-09-21 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftobjs.c (ft_glyphslot_reset_bimap): Further tweak. * src/base/ftobjs.c (ft_glyphslot_preset_bimap): Further tweak.
2018-09-21 Ben Wagner <bungeman@google.com> 2018-09-21 Ben Wagner <bungeman@google.com>
@ -36,7 +45,7 @@
2018-09-20 Alexei Podtelezhnikov <apodtele@gmail.com> 2018-09-20 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftobjs.c (ft_glyphslot_reset_bimap): Tiny rounding tweak. * src/base/ftobjs.c (ft_glyphslot_preset_bimap): Tiny rounding tweak.
This adds pixels in case a contour goes through the center This adds pixels in case a contour goes through the center
and they need to be turned on in the b/w rasterizer. and they need to be turned on in the b/w rasterizer.

View File

@ -99,13 +99,16 @@ THE SOFTWARE.
min = 0; min = 0;
max = cmap->num_encodings; max = cmap->num_encodings;
mid = ( min + max ) >> 1;
while ( min < max ) while ( min < max )
{ {
FT_ULong code; FT_ULong code;
mid = ( min + max ) >> 1; if ( mid > max || mid < min )
mid = ( min + max ) >> 1;
code = encodings[mid].enc; code = encodings[mid].enc;
if ( charcode == code ) if ( charcode == code )
@ -120,6 +123,9 @@ THE SOFTWARE.
max = mid; max = mid;
else else
min = mid + 1; min = mid + 1;
/* prediction in a continuous block */
mid += charcode - code;
} }
return result; return result;
@ -139,13 +145,16 @@ THE SOFTWARE.
min = 0; min = 0;
max = cmap->num_encodings; max = cmap->num_encodings;
mid = ( min + max ) >> 1;
while ( min < max ) while ( min < max )
{ {
FT_ULong code; /* same as BDF_encoding_el.enc */ FT_ULong code; /* same as BDF_encoding_el.enc */
mid = ( min + max ) >> 1; if ( mid > max || mid < min )
mid = ( min + max ) >> 1;
code = encodings[mid].enc; code = encodings[mid].enc;
if ( charcode == code ) if ( charcode == code )
@ -160,6 +169,9 @@ THE SOFTWARE.
max = mid; max = mid;
else else
min = mid + 1; min = mid + 1;
/* prediction in a continuous block */
mid += charcode - code;
} }
charcode = 0; charcode = 0;