Minor. Better documentation. Adds TODOs for letter.
This commit is contained in:
parent
4d59b8535e
commit
9a55001454
|
@ -61,6 +61,8 @@ FT_BEGIN_HEADER
|
||||||
{
|
{
|
||||||
FT_GlyphSlotRec root;
|
FT_GlyphSlotRec root;
|
||||||
|
|
||||||
|
/* (OT-SVG) Added these here so that CFFGlyphSlot can be cast to
|
||||||
|
TT_GlyphSlot */
|
||||||
FT_Byte* svg_document;
|
FT_Byte* svg_document;
|
||||||
FT_ULong svg_document_length;
|
FT_ULong svg_document_length;
|
||||||
|
|
||||||
|
|
|
@ -312,7 +312,26 @@ FT_BEGIN_HEADER
|
||||||
TT_SBit_MetricsRec *ametrics );
|
TT_SBit_MetricsRec *ametrics );
|
||||||
|
|
||||||
|
|
||||||
/* OT-SVG to be documented later */
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* @functype:
|
||||||
|
* TT_Load_Svg_Doc_Func
|
||||||
|
*
|
||||||
|
* @description:
|
||||||
|
* Scans the SVG documents list to find the document containing the glyph
|
||||||
|
* that has the id `glyph<glyph_index>'
|
||||||
|
*
|
||||||
|
* @input:
|
||||||
|
* glyph ::
|
||||||
|
* The glyph slot from which pointers to SVG documents list will be
|
||||||
|
* grabbed. The results will be stored back in the slot too.
|
||||||
|
*
|
||||||
|
* glyph_index ::
|
||||||
|
* The index of the glyph that is to be looked up.
|
||||||
|
*
|
||||||
|
* @return:
|
||||||
|
* FreeType error code. 0 means success.
|
||||||
|
*/
|
||||||
typedef FT_Error
|
typedef FT_Error
|
||||||
(*TT_Load_Svg_Doc_Func)( FT_GlyphSlot glyph,
|
(*TT_Load_Svg_Doc_Func)( FT_GlyphSlot glyph,
|
||||||
FT_UInt glyph_index );
|
FT_UInt glyph_index );
|
||||||
|
|
|
@ -967,8 +967,8 @@ FT_BEGIN_HEADER
|
||||||
* This structure/class is defined here because it is common to the
|
* This structure/class is defined here because it is common to the
|
||||||
* following formats: TTF, OpenType-TT, and OpenType-CFF.
|
* following formats: TTF, OpenType-TT, and OpenType-CFF.
|
||||||
*
|
*
|
||||||
* Note, however, that the classes TT_Size and `TT_GlyphSlot'(not anymore),
|
* Note, however, that the class TT_Size is not shared between font driver,
|
||||||
* are not shared between font drivers, and are thus defined in `ttobjs.h`.
|
* and is thus defined in `ttobjs.h`.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -990,12 +990,28 @@ FT_BEGIN_HEADER
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* @Type:
|
* @type:
|
||||||
* TT_GlyphSlotRec_
|
* TT_GlyphSlotRec_
|
||||||
*
|
*
|
||||||
* @Description:
|
* @description:
|
||||||
* A glyph slot that inherits from FT_GlyphSlotRec_ but adds more fields
|
* A glyph slot that inherits from FT_GlyphSlotRec_ but adds more fields
|
||||||
*
|
*
|
||||||
|
* @fields:
|
||||||
|
* root ::
|
||||||
|
* Inherits this structure from FT_GlyphSlotRec. See note below.
|
||||||
|
*
|
||||||
|
* svg_document ::
|
||||||
|
* A pointer to the SVG Document stream under interest. The stream
|
||||||
|
* will be in plain text.
|
||||||
|
*
|
||||||
|
* svg_document_length ::
|
||||||
|
* The length of the `svg_document' stream.
|
||||||
|
*
|
||||||
|
* @note:
|
||||||
|
* This structure has been created to accomodate the needs of OT-SVG
|
||||||
|
* rendering. It inherits from FT_GlyphSlotRect. So that `TT_GlyphSlot'
|
||||||
|
* can be casted to `FT_GlyphSlot' and behave that way too. It's defined
|
||||||
|
* here because it is common to OpenType-TTF and OpenType-CFF.
|
||||||
*/
|
*/
|
||||||
typedef struct TT_GlyphSlotRec_
|
typedef struct TT_GlyphSlotRec_
|
||||||
{
|
{
|
||||||
|
@ -1004,14 +1020,8 @@ FT_BEGIN_HEADER
|
||||||
FT_ULong svg_document_length;
|
FT_ULong svg_document_length;
|
||||||
} TT_GlyphSlotRec;
|
} TT_GlyphSlotRec;
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
*
|
/* A handle to a TrueType glyph slot object. */
|
||||||
* @Type:
|
|
||||||
* TT_GlyphSlot
|
|
||||||
*
|
|
||||||
* @Description:
|
|
||||||
* A handle to a TrueType glyph slot object.
|
|
||||||
*/
|
|
||||||
typedef struct TT_GlyphSlotRec_* TT_GlyphSlot;
|
typedef struct TT_GlyphSlotRec_* TT_GlyphSlot;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -347,8 +347,8 @@
|
||||||
if ( load_flags & FT_LOAD_SBITS_ONLY )
|
if ( load_flags & FT_LOAD_SBITS_ONLY )
|
||||||
return FT_THROW( Invalid_Argument );
|
return FT_THROW( Invalid_Argument );
|
||||||
|
|
||||||
/* OpenType SVG Support Over here */
|
/* check for OT-SVG */
|
||||||
if ( ( load_flags & FT_LOAD_COLOR ) &&
|
if ( ( load_flags & FT_LOAD_COLOR ) &&
|
||||||
( ((TT_Face)glyph->root.face)->svg ) )
|
( ((TT_Face)glyph->root.face)->svg ) )
|
||||||
{
|
{
|
||||||
SFNT_Service sfnt = (SFNT_Service)(((TT_Face)glyph->root.face)->sfnt);
|
SFNT_Service sfnt = (SFNT_Service)(((TT_Face)glyph->root.face)->sfnt);
|
||||||
|
|
|
@ -1299,7 +1299,7 @@
|
||||||
sfnt_get_name_id, /* TT_Get_Name_ID_Func get_name_id */
|
sfnt_get_name_id, /* TT_Get_Name_ID_Func get_name_id */
|
||||||
tt_face_load_svg, /* TT_Load_Table_Func load_svg */
|
tt_face_load_svg, /* TT_Load_Table_Func load_svg */
|
||||||
tt_face_free_svg, /* TT_Free_Table_Func free_svg */
|
tt_face_free_svg, /* TT_Free_Table_Func free_svg */
|
||||||
tt_face_load_svg_doc
|
tt_face_load_svg_doc /* TT_Load_Svg_Doc_Func load_svg_doc */
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
|
|
||||||
#include "ttsvg.h"
|
#include "ttsvg.h"
|
||||||
|
|
||||||
|
/* TODO: (OT-SVG) Decide whether to add documentation here or not */
|
||||||
|
|
||||||
typedef struct Svg_
|
typedef struct Svg_
|
||||||
{
|
{
|
||||||
FT_UShort version; /* Table version (starting at 0) */
|
FT_UShort version; /* Table version (starting at 0) */
|
||||||
|
@ -131,15 +133,16 @@
|
||||||
FT_Bool found = FALSE;
|
FT_Bool found = FALSE;
|
||||||
FT_UInt i = 0;
|
FT_UInt i = 0;
|
||||||
|
|
||||||
/* For now it's linear search, later convert to binary search */
|
/* TODO: (OT-SVG) Convert to efficient search algorithm */
|
||||||
|
/* TODO: (OT-SVG) Use Frame Fields here instead of `FT_NEXT_*' */
|
||||||
for ( i = 0; i < num_entries; i++)
|
for ( i = 0; i < num_entries; i++)
|
||||||
{
|
{
|
||||||
start_glyph_id = FT_NEXT_USHORT( stream );
|
start_glyph_id = FT_NEXT_USHORT( stream );
|
||||||
end_glyph_id = FT_NEXT_USHORT( stream );
|
end_glyph_id = FT_NEXT_USHORT( stream );
|
||||||
cur_doc_offset = FT_NEXT_ULONG( stream );
|
cur_doc_offset = FT_NEXT_ULONG( stream );
|
||||||
cur_doc_length = FT_NEXT_ULONG( stream );
|
cur_doc_length = FT_NEXT_ULONG( stream );
|
||||||
|
|
||||||
if ( ( glyph_index >= start_glyph_id) &&
|
if ( ( glyph_index >= start_glyph_id) &&
|
||||||
( glyph_index <= end_glyph_id ) )
|
( glyph_index <= end_glyph_id ) )
|
||||||
{
|
{
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
|
@ -162,9 +165,9 @@
|
||||||
|
|
||||||
TT_GlyphSlot glyph = (TT_GlyphSlot) glyph_;
|
TT_GlyphSlot glyph = (TT_GlyphSlot) glyph_;
|
||||||
|
|
||||||
/* TODO: properly clean stuff here on errors */
|
/* TODO: (OT-SVG) properly clean stuff here on errors */
|
||||||
|
|
||||||
FT_Byte* doc_list; /* Pointer to the Svg Document List */
|
FT_Byte* doc_list; /* Pointer to the Svg Document List */
|
||||||
FT_UShort num_entries; /* Total no of entires in doc list */
|
FT_UShort num_entries; /* Total no of entires in doc list */
|
||||||
|
|
||||||
FT_ULong doc_offset;
|
FT_ULong doc_offset;
|
||||||
|
@ -176,32 +179,39 @@
|
||||||
FT_Bool is_gzip_encoded = FALSE;
|
FT_Bool is_gzip_encoded = FALSE;
|
||||||
|
|
||||||
FT_Error error = FT_Err_Ok;
|
FT_Error error = FT_Err_Ok;
|
||||||
TT_Face face = (TT_Face)glyph->root.face;
|
TT_Face face = (TT_Face)glyph->root.face;
|
||||||
FT_Memory memory = face->root.memory;
|
FT_Memory memory = face->root.memory;
|
||||||
Svg* svg = face->svg;
|
Svg* svg = face->svg;
|
||||||
|
|
||||||
/* handle svg being 0x0 situation here */
|
/* handle svg being 0x0 situation here */
|
||||||
doc_list = svg->svg_doc_list;
|
doc_list = svg->svg_doc_list;
|
||||||
num_entries = FT_NEXT_USHORT( doc_list );
|
num_entries = FT_NEXT_USHORT( doc_list );
|
||||||
|
|
||||||
error = find_doc( doc_list, num_entries, glyph_index,
|
error = find_doc( doc_list, num_entries, glyph_index,
|
||||||
&doc_offset, &doc_length );
|
&doc_offset, &doc_length );
|
||||||
if ( error != FT_Err_Ok )
|
if ( error != FT_Err_Ok )
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
doc_list = svg->svg_doc_list; /* Reset to so we can use it again */
|
doc_list = svg->svg_doc_list; /* Reset to so we can use it again */
|
||||||
doc_list = (FT_Byte*)( doc_list + doc_offset );
|
doc_list = (FT_Byte*)( doc_list + doc_offset );
|
||||||
|
|
||||||
if( ( doc_list[0] == 0x1F ) && ( doc_list[1] == 0x8B )
|
if( ( doc_list[0] == 0x1F ) && ( doc_list[1] == 0x8B )
|
||||||
&& ( doc_list[2] == 0x08 ) )
|
&& ( doc_list[2] == 0x08 ) )
|
||||||
{
|
{
|
||||||
is_gzip_encoded = TRUE;
|
is_gzip_encoded = TRUE;
|
||||||
|
|
||||||
|
/* get the size of the orignal document. This helps in alotting the
|
||||||
|
* buffer to accomodate the uncompressed version. The last 4 bytes
|
||||||
|
* of the compressed document are equal to orignal_size modulo 2^32.
|
||||||
|
* Since SVG docs will be lesser in size then 2^32, we can use this
|
||||||
|
* accurately. The four bytes are stored in little-endian format.
|
||||||
|
*/
|
||||||
uncomp_size = (FT_ULong)doc_list[doc_length - 1] << 24 |
|
uncomp_size = (FT_ULong)doc_list[doc_length - 1] << 24 |
|
||||||
(FT_ULong)doc_list[doc_length - 2] << 16 |
|
(FT_ULong)doc_list[doc_length - 2] << 16 |
|
||||||
(FT_ULong)doc_list[doc_length - 3] << 8 |
|
(FT_ULong)doc_list[doc_length - 3] << 8 |
|
||||||
(FT_ULong)doc_list[doc_length - 4];
|
(FT_ULong)doc_list[doc_length - 4];
|
||||||
|
|
||||||
/* TODO: memory allocated here needs to be freed somewhere */
|
/* TODO: (OT-SVG) memory allocated here needs to be freed somewhere */
|
||||||
uncomp_buffer = (FT_Byte*) memory->alloc(memory, uncomp_size);
|
uncomp_buffer = (FT_Byte*) memory->alloc(memory, uncomp_size);
|
||||||
error = FT_Gzip_Uncompress( memory, uncomp_buffer, &uncomp_size,
|
error = FT_Gzip_Uncompress( memory, uncomp_buffer, &uncomp_size,
|
||||||
doc_list, doc_length );
|
doc_list, doc_length );
|
||||||
|
@ -214,11 +224,9 @@
|
||||||
glyph->svg_document = uncomp_buffer;
|
glyph->svg_document = uncomp_buffer;
|
||||||
glyph->svg_document_length = uncomp_size;
|
glyph->svg_document_length = uncomp_size;
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
glyph->svg_document = doc_list;
|
glyph->svg_document = doc_list;
|
||||||
glyph->svg_document_length = doc_length;
|
glyph->svg_document_length = doc_length;
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2219,6 +2219,10 @@
|
||||||
|
|
||||||
FT_BBox bbox;
|
FT_BBox bbox;
|
||||||
FT_Fixed y_scale;
|
FT_Fixed y_scale;
|
||||||
|
|
||||||
|
/* TODO: (OT-SVG) Temporary hack to accomodate the change
|
||||||
|
* in the `TT_GlyphSlot' made. Rewrite properly
|
||||||
|
*/
|
||||||
TT_GlyphSlot glyph_ = (TT_GlyphSlot)loader->glyph;
|
TT_GlyphSlot glyph_ = (TT_GlyphSlot)loader->glyph;
|
||||||
FT_GlyphSlot glyph = (FT_GlyphSlot)glyph_;
|
FT_GlyphSlot glyph = (FT_GlyphSlot)glyph_;
|
||||||
TT_Size size = loader->size;
|
TT_Size size = loader->size;
|
||||||
|
@ -2407,7 +2411,9 @@
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
TT_SBit_MetricsRec sbit_metrics;
|
TT_SBit_MetricsRec sbit_metrics;
|
||||||
|
|
||||||
|
/* (OT-SVG) face assignment changed to accomodate the change in
|
||||||
|
* the structure of TT_GlyphSlot
|
||||||
|
*/
|
||||||
face = (TT_Face)(glyph->root.face);
|
face = (TT_Face)(glyph->root.face);
|
||||||
sfnt = (SFNT_Service)face->sfnt;
|
sfnt = (SFNT_Service)face->sfnt;
|
||||||
stream = face->root.stream;
|
stream = face->root.stream;
|
||||||
|
@ -2419,6 +2425,10 @@
|
||||||
stream,
|
stream,
|
||||||
&(glyph->root.bitmap),
|
&(glyph->root.bitmap),
|
||||||
&sbit_metrics );
|
&sbit_metrics );
|
||||||
|
/* TODO: (OT-SVG) So many `glyph->root' look ugly. Maybe create a new variable
|
||||||
|
* to make this look good.
|
||||||
|
*/
|
||||||
|
|
||||||
if ( !error )
|
if ( !error )
|
||||||
{
|
{
|
||||||
(glyph->root).outline.n_points = 0;
|
(glyph->root).outline.n_points = 0;
|
||||||
|
@ -2797,6 +2807,8 @@
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
TT_LoaderRec loader;
|
TT_LoaderRec loader;
|
||||||
SFNT_Service sfnt;
|
SFNT_Service sfnt;
|
||||||
|
|
||||||
|
/* TODO: (OT-SVG) maybe find a proper way to do this */
|
||||||
FT_GlyphSlot glyph = (FT_GlyphSlot)glyph_;
|
FT_GlyphSlot glyph = (FT_GlyphSlot)glyph_;
|
||||||
|
|
||||||
FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
|
FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
|
||||||
|
@ -2901,7 +2913,7 @@
|
||||||
|
|
||||||
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
||||||
|
|
||||||
/* OT-SVG part here */
|
/* check for OT-SVG */
|
||||||
if ( ( load_flags & FT_LOAD_COLOR ) && ( ((TT_Face)glyph->face)->svg ) )
|
if ( ( load_flags & FT_LOAD_COLOR ) && ( ((TT_Face)glyph->face)->svg ) )
|
||||||
{
|
{
|
||||||
sfnt = (SFNT_Service)((TT_Face)glyph->face)->sfnt;
|
sfnt = (SFNT_Service)((TT_Face)glyph->face)->sfnt;
|
||||||
|
|
Loading…
Reference in New Issue