forked from minhngoc25a/freetype2
Implement binary search for SVG Document Lookup.
This commit is contained in:
parent
6962986cf3
commit
ba9e6f9d41
|
@ -127,8 +127,8 @@
|
||||||
{
|
{
|
||||||
FT_UShort start_glyph_id;
|
FT_UShort start_glyph_id;
|
||||||
FT_UShort end_glyph_id;
|
FT_UShort end_glyph_id;
|
||||||
FT_ULong cur_doc_offset;
|
FT_ULong offset;
|
||||||
FT_ULong cur_doc_length;
|
FT_ULong length;
|
||||||
} Svg_doc;
|
} Svg_doc;
|
||||||
|
|
||||||
Svg_doc
|
Svg_doc
|
||||||
|
@ -137,8 +137,8 @@
|
||||||
Svg_doc doc;
|
Svg_doc doc;
|
||||||
doc.start_glyph_id = FT_NEXT_USHORT( stream );
|
doc.start_glyph_id = FT_NEXT_USHORT( stream );
|
||||||
doc.end_glyph_id = FT_NEXT_USHORT( stream );
|
doc.end_glyph_id = FT_NEXT_USHORT( stream );
|
||||||
doc.cur_doc_offset = FT_NEXT_ULONG( stream );
|
doc.offset = FT_NEXT_ULONG( stream );
|
||||||
doc.cur_doc_length = FT_NEXT_ULONG( stream );
|
doc.length = FT_NEXT_ULONG( stream );
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,30 +165,68 @@
|
||||||
{
|
{
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
Svg_doc cur_doc;
|
Svg_doc cur_doc;
|
||||||
|
Svg_doc start_doc;
|
||||||
|
Svg_doc mid_doc;
|
||||||
|
Svg_doc end_doc;
|
||||||
|
|
||||||
|
FT_Bool found = FALSE;
|
||||||
|
FT_UInt i = 0;
|
||||||
|
FT_UInt start_index = 0;
|
||||||
|
FT_UInt end_index = num_entries - 1;
|
||||||
|
FT_Int comp_res;
|
||||||
|
|
||||||
FT_Bool found = FALSE;
|
|
||||||
FT_UInt i = 0;
|
|
||||||
|
|
||||||
/* TODO: (OT-SVG) Convert to efficient search algorithm */
|
/* TODO: (OT-SVG) Convert to efficient search algorithm */
|
||||||
for ( i = 0; i < num_entries; i++)
|
/* search algo */
|
||||||
|
|
||||||
|
if ( num_entries == 0 )
|
||||||
{
|
{
|
||||||
cur_doc = extract_svg_doc( stream );
|
error = FT_THROW( Invalid_Table );
|
||||||
stream += 12;
|
return error;
|
||||||
if ( compare_svg_doc( cur_doc, glyph_index ) == 0 )
|
}
|
||||||
|
|
||||||
|
start_doc = extract_svg_doc( stream + start_index * 12 );
|
||||||
|
end_doc = extract_svg_doc( stream + end_index * 12 );
|
||||||
|
if ( ( compare_svg_doc( start_doc, glyph_index ) == -1 ) ||
|
||||||
|
( compare_svg_doc( end_doc, glyph_index ) == 1 ) )
|
||||||
|
{
|
||||||
|
error = FT_THROW( Invalid_Glyph_Index );
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( start_index <= end_index )
|
||||||
|
{
|
||||||
|
i = ( start_index + end_index ) / 2;
|
||||||
|
mid_doc = extract_svg_doc( stream + i * 12 );
|
||||||
|
comp_res = compare_svg_doc( mid_doc, glyph_index );
|
||||||
|
if ( comp_res == 1 )
|
||||||
|
{
|
||||||
|
start_index = i + 1;
|
||||||
|
start_doc = extract_svg_doc( stream + start_index * 4 );
|
||||||
|
}
|
||||||
|
else if ( comp_res == -1 )
|
||||||
|
{
|
||||||
|
end_index = i - 1;
|
||||||
|
end_doc = extract_svg_doc( stream + end_index * 4 );
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
*doc_offset = cur_doc.cur_doc_offset;
|
|
||||||
*doc_length = cur_doc.cur_doc_length;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* search algo end */
|
||||||
|
/* must set `found', `doc_offset' and `doc_length'. */
|
||||||
|
/* also keep `cur_doc' alive */
|
||||||
if ( found != TRUE )
|
if ( found != TRUE )
|
||||||
error = FT_THROW( Invalid_Glyph_Index );
|
error = FT_THROW( Invalid_Glyph_Index );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*start_glyph = cur_doc.start_glyph_id;
|
*doc_offset = mid_doc.offset;
|
||||||
*end_glyph = cur_doc.end_glyph_id;
|
*doc_length = mid_doc.length;
|
||||||
|
*start_glyph = mid_doc.start_glyph_id;
|
||||||
|
*end_glyph = mid_doc.end_glyph_id;
|
||||||
error = FT_Err_Ok;
|
error = FT_Err_Ok;
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
|
Loading…
Reference in New Issue