blob: 1d072190ebb10b393ccb4c452ed3e304a913879e [file] [log] [blame]
/*******************************************************************
*
* ttapi.c
*
* High-level interface implementation
*
* Copyright 1996-1998 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
* modified, and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
* Notes:
*
* This file is used to implement most of the functions that are
* defined in the file "freetype.h". However, two functions are
* implemented elsewhere :
*
******************************************************************/
#include <freetype/freetype.h>
#include <freetype/internal/ftdebug.h>
#include <freetype/internal/ftstream.h>
#include <freetype/internal/ftcalc.h>
#include <freetype/internal/ftlist.h>
#include <freetype/internal/ftraster.h>
#include <../truetype/ttdriver.h>
#include <../truetype/ttobjs.h>
#include <../truetype/ttcmap.h>
#define _TRUETYPE_
#include <truetype.h> /* backwards compatible interface */
/* required by the tracing mode */
#undef FT_COMPONENT
#define FT_COMPONENT trace_ttapi
#define RENDER_POOL_SIZE 64000
static
const FT_DriverInterface* tt_interface = &tt_driver_interface;
static
const TT_DriverInterface* tt_extension = &tt_format_interface;
/***********************************************************************/
/* */
/* <Function> TT_Init_FreeType */
/* */
/* <Description> */
/* Creates a new TrueType driver/engine object. */
/* */
/* <Output> */
/* engine :: handle to the new engine object */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* This function is provided for stand-alone compiles of the */
/* TrueType driver. */
/* */
EXPORT_FUNC
TT_Error TT_Init_FreeType( TT_Engine* engine )
{
FT_Library library;
FT_System system;
TT_Error error;
*engine = 0;
error = FT_New_System( &system );
if (error) return error;
error = FT_New_Library( system, &library );
if (!error)
/* Now create a new TrueType driver object */
error = FT_Add_Driver( library,
(FT_DriverInterface*)&tt_driver_interface );
if (error)
FT_Done_Library(library);
else
*engine = (TT_Engine)library;
return error;
}
/***********************************************************************/
/* */
/* <Function> TT_Done_FreeType */
/* */
/* <Description> */
/* Destroys a given TrueType engine object created with */
/* TT_Init_FreeType. All associated objects, (i.e. faces, outlines */
/* and charmaps) will be destroyed.. */
/* */
/* <Input> */
/* engine :: handle to the engine object */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* This function is provided for stand-alone compiles of the */
/* TrueType driver. The FreeType library uses the TT_Done_Engine */
/* API. */
/* */
EXPORT_FUNC
TT_Error TT_Done_FreeType( TT_Engine engine )
{
FT_Library library = (FT_Library)engine;
FT_Done_FreeType( library );
return FT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Raster_Gray_Palette */
/* */
/* <Description> */
/* Sets the raster's gray 5-levels palette. Entry 0 correspond to */
/* the background, Entry 4 to the foreground. Intermediate entries */
/* correspond to gray levels.. */
/* */
/* <Input> */
/* engine :: handle to the engine object */
/* palette :: an array of 5 bytes used to render 8-bit pixmaps */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* This function is provided for stand-alone compiles of the */
/* TrueType driver. The FreeType library accesses directly the */
/* raster object to set the palette. */
/* */
/* This function ONLY supports 5 levels of grays. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Raster_Gray_Palette( TT_Engine engine,
const TT_Byte* palette )
{
FT_Library library;
if (!engine)
return TT_Err_Invalid_Engine;
library = (FT_Library)engine;
return FT_Set_Raster_Palette( library, 5, (unsigned char*)palette );
}
/***********************************************************************/
/* */
/* <Function> TT_Open_Face */
/* */
/* <Description> */
/* Creates a new face object from a given resource. The file can */
/* be either a TrueType file (ttf) or a TrueType collection (ttc). */
/* In the latter case, only the first face is opened. The number */
/* of faces in a collection can be obtained in the face's */
/* properties field "num_Faces". Other faces can be opened with */
/* TT_Open_Collection (see below). */
/* */
/* <Input> */
/* engine :: the parent engine object where to create the face */
/* object. */
/* */
/* pathname :: pathname for the font file. */
/* */
/* <Output> */
/* face :: a handle to the fresh face object. */
/* */
/* <Return> */
/* TrueType error code. 0 means success.. */
/* */
/* <MT-Note> */
/* Yes. */
/* */
/* <Note> */
/* This API is provided fro backwards compatibility. Please use */
/* the functions TT_New_Face/TT_Done_Face now to create and */
/* discard face objects.. */
/* */
static
TT_Error open_face( FT_Library library,
const TT_Text* pathname,
TT_Int face_index,
TT_Face *aface )
{
TT_Error error;
FT_Resource resource;
*aface = 0;
error = FT_New_Resource( library, pathname, &resource );
if (error) return error;
#if 0
error = FT_Add_Resource( library, resource );
if (error) goto Fail_Install;
#endif
error = FT_New_Face( resource, face_index, (FT_Face*)aface );
/* Destroy glyph slot to comply with the 1.x API */
if (!error)
FT_Done_GlyphSlot( (*aface)->root.slot );
if (error)
FT_Done_Resource(resource);
return error;
}
EXPORT_DEF
TT_Error TT_Open_Face( TT_Engine engine,
const TT_Text* pathname,
TT_Face* aface )
{
if (!engine)
return TT_Err_Invalid_Driver_Handle;
return open_face( (FT_Library)engine, pathname, 0, aface );
}
/***********************************************************************/
/* */
/* <Function> TT_Open_Collection */
/* */
/* <Description> */
/* Loads a given face within a collection. */
/* */
/* <Input> */
/* engine :: TrueType engine object where to load the face */
/* pathname :: the collection's pathname */
/* fontIndex :: index of face within the collection. first is 0 */
/* */
/* <Output> */
/* face :: handle to the new face object. Always set to NULL */
/* in case of error */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* Yes. */
/* */
/* <Note> */
/* This API is provided for backwards compatibility. Please use */
/* the functions TT_New_Collection/TT_Done_Face now to create and */
/* discard face/collection objects. */
/* */
EXPORT_DEF
TT_Error TT_Open_Collection( TT_Engine engine,
const TT_Text* pathname,
TT_ULong fontIndex,
TT_Face* aface )
{
if (!engine)
return TT_Err_Invalid_Driver_Handle;
return open_face( (FT_Library)engine, pathname, fontIndex, aface );
}
/***********************************************************************/
/* */
/* <Function> TT_Close_Face */
/* */
/* <Description> */
/* Destroys a given face object opened through either TT_Open_Face */
/* of TT_Open_Collection. */
/* */
/* <Input> */
/* face :: handle to the target face object */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* This API is provided for backwards compatibility. Please use */
/* the functions TT_New_Face/TT_Done_Face now to create and */
/* discard face/collection objects. */
/* */
EXPORT_DEF
TT_Error TT_Close_Face( TT_Face face )
{
FT_Resource resource;
if (!face)
return TT_Err_Invalid_Face_Handle;
resource = face->root.resource;
FT_Done_Face( (FT_Face)face );
/* uninstall corresponding resource */
FT_Done_Resource( resource );
return TT_Err_Ok;
}
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/*********** ***********/
/*********** End of backwards compatible APIs.. ***********/
/*********** ***********/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/* */
/* <Function> TT_Get_Face_Properties */
/* */
/* <Description> */
/* Return a given face's properties to the caller. */
/* */
/* <Input> */
/* face :: handle to the source face object */
/* */
/* <Output> */
/* properties :: target properties structure */
/* */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
/* <MT-Note> */
/* Yes. */
/* */
EXPORT_FUNC
TT_Error TT_Get_Face_Properties( TT_Face face,
TT_Face_Properties* props )
{
props->num_Glyphs = (TT_UShort)face->root.num_glyphs;
props->max_Points = (TT_UShort)face->root.max_points;
props->max_Contours = (TT_UShort)face->root.max_contours;
props->num_CharMaps = (TT_UShort)face->root.num_charmaps;
props->num_Faces = face->root.num_faces;
props->num_Names = face->num_names;
props->header = &face->header;
props->horizontal = &face->horizontal;
/* The driver supports old Mac fonts where there are no OS/2 */
/* tables present in the file. However, this is not true of */
/* FreeType 1.1. For the sake of backwards compatibility, we */
/* always return the address of the face's os2 table, even if */
/* it is empty (in which case, the 'props.os2' field is set */
/* to NULL.. */
/* */
/* Note however, that the 'os2->version' field is set to */
/* 0xFFFF to indicate a missing table though... */
/* */
props->os2 = &face->os2;
props->postscript = &face->postscript;
props->hdmx = &face->hdmx;
props->vertical = ( face->vertical_info ? &face->vertical : 0 );
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Face_Pointer. */
/* */
/* <Description> */
/* Each face object contains a typeless pointer, which use is left */
/* to client applications (or the high-level library). This API is */
/* used to set this generic pointer. It is ignored by the driver. */
/* */
/* <Input> */
/* face :: target face object */
/* data :: generic pointer's value */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* The generic pointer is used by the HLib when using the driver */
/* within the FreeType library. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Face_Pointer( TT_Face face,
void* data )
{
if ( !face )
return TT_Err_Invalid_Face_Handle;
else
face->root.generic.data = data;
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Face_Pointer */
/* */
/* <Description> */
/* Each face object contains a typeless pointer, which use is left */
/* to client applications (or the high-level library). This API is */
/* used to retrieve this generic pointer, which is ignored by the */
/* driver. */
/* */
/* <Input> */
/* face :: handle to source face object */
/* */
/* <Return> */
/* generic pointer value. NULL if the face handle is invalid.. */
/* */
/* <MT-Note> */
/* No. */
/* */
EXPORT_FUNC
void* TT_Get_Face_Pointer( TT_Face face )
{
return ( face ? face->root.generic.data : NULL );
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Face_Metrics */
/* */
/* <Description> */
/* Get the metrics of a given array of glyphs. Returns any number */
/* of metrics arrays. */
/* */
/* <Input> */
/* face :: handle to the source face object */
/* firstGlyph :: index of first glyph in the array */
/* lastGlyph :: index of last glyph in the array */
/* */
/* <Output> */
/* leftBearings :: target array of shorts for the glyph left side */
/* bearings. Set this field to NULL if you're not */
/* interested in these metrics. */
/* */
/* widths :: target array of unsigned shorts for the glyph advance */
/* widths. Set this field to NULL if you're not */
/* interested in these metrics. */
/* */
/* topBearings :: target array of shorts for the glyph top side */
/* bearings. Set this field to NULL if you're not */
/* interested in these metrics. */
/* */
/* heights :: target array of unsigned shorts for the glyph advance */
/* heights. Set this field to NULL if you're not */
/* interested in these metrics. */
/* */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
/* <MT-Note> */
/* No. */
/* */
/********************************************************/
/* Return horizontal or vertical metrics in font units */
/* for a given glyph. The metrics are the left side */
/* bearing (resp. top side bearing) and advance width */
/* (resp. advance height). */
/* */
/* This function will much probably move to another */
/* component in the short future, but I haven't decided */
/* which yet... */
static
void get_metrics( TT_HoriHeader* header,
TT_Int index,
TT_Short* bearing,
TT_UShort* advance )
{
TT_LongMetrics* longs_m;
TT_UShort k = header->number_Of_HMetrics;
if ( index < k )
{
longs_m = (TT_LongMetrics*)header->long_metrics + index;
*bearing = longs_m->bearing;
*advance = longs_m->advance;
}
else
{
*bearing = ((TT_ShortMetrics*)header->short_metrics)[index - k];
*advance = ((TT_LongMetrics*)header->long_metrics)[k - 1].advance;
}
}
EXPORT_FUNC
TT_Error TT_Get_Face_Metrics( TT_Face face,
TT_UShort firstGlyph,
TT_UShort lastGlyph,
TT_Short* leftBearings,
TT_UShort* widths,
TT_Short* topBearings,
TT_UShort* heights )
{
TT_UShort num;
if ( !face )
return TT_Err_Invalid_Face_Handle;
/* Check the glyph range */
if ( lastGlyph >= face->root.num_glyphs || firstGlyph > lastGlyph )
return TT_Err_Invalid_Argument;
num = lastGlyph - firstGlyph; /* number of elements-1 in each array */
/* store the left side bearings and advance widths first */
{
TT_UShort n;
TT_Short left_bearing;
TT_UShort advance_width;
for ( n = 0; n <= num; n++ )
{
get_metrics( &face->horizontal,
firstGlyph + n, &left_bearing, &advance_width );
if ( leftBearings ) leftBearings[n] = left_bearing;
if ( widths ) widths[n] = advance_width;
}
}
/* check for vertical data if topBearings or heights is non-NULL */
if ( !topBearings && !heights )
return TT_Err_Ok;
if ( !face->vertical_info )
return TT_Err_No_Vertical_Data;
/* store the top side bearings */
{
TT_UShort n;
TT_Short top_bearing;
TT_UShort advance_height;
for ( n = 0; n <= num; n++ )
{
get_metrics( (TT_HoriHeader*)&face->vertical,
firstGlyph + n, &top_bearing, &advance_height );
if ( topBearings ) topBearings[n] = top_bearing;
if ( heights ) heights[n] = advance_height;
}
}
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_New_Instance */
/* */
/* <Description> */
/* Creates a new instance object from a given face */
/* */
/* <Input> */
/* face :: handle to source/parent face object */
/* */
/* <Output> */
/* instance :: handle to fresh object. Set to NULL in case of */
/* error. */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* Yes. */
/* */
/* <Note> */
/* Any new instance uses a default resolution of 96x96 dpi, and */
/* a default point size of 10 pts. You can change these anytime */
/* with TT_Set_Instance_Resolutions/CharSize/CharSizes/PixelSizes */
/* (see below). */
/* */
EXPORT_FUNC
TT_Error TT_New_Instance( TT_Face face,
TT_Instance* instance )
{
return FT_New_Size( (FT_Face)face, (FT_Size*)instance );
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_Resolutions */
/* */
/* <Description> */
/* Sets an instance resolutions in dot-per-inches. Default values */
/* for "new" instances are 96x96 dpi, but these can be changed any */
/* time by calling this API. */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* xResolution :: horizontal device resolution in dpi. */
/* yResolution :: vertical device resolution in dpi. */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* You should set the charsize or pixel size immediately after */
/* call in multi-htreaded programs. This will force the instance */
/* data to be resetted. Otherwise, you may encounter corruption */
/* when loading two glyphs from the same instance concurrently! */
/* */
/* Happily, 99.99% will do just that :-) */
/* */
/* */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_Resolutions( TT_Instance ins,
TT_UShort xResolution,
TT_UShort yResolution )
{
return FT_Set_Resolutions( (FT_Size)ins, xResolution, yResolution );
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_CharSizes */
/* */
/* <Description> */
/* Same as TT_Set_Instance_CharSize, but used to specify distinct */
/* horizontal and vertical coordinates. */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* charWidth :: horizontal character size (26.6 points) */
/* charHeight :: vertical character size (26.6 points) */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* There is no check for overflow; with other words, the product */
/* of glyph dimensions times the device resolution must have */
/* reasonable values. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_CharSizes( TT_Instance ins,
TT_F26Dot6 charWidth,
TT_F26Dot6 charHeight )
{
return FT_Set_Char_Sizes( (FT_Size)ins, charWidth, charHeight );
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_CharSize */
/* */
/* <Description> */
/* Sets an instance's character size. The size is in fractional */
/* (26.6) point units. This function sets the horizontal and */
/* vertical sizes to be equal. Use TT_Set_Instance_CharSizes */
/* for distinct X and Y char sizes. */
/* */
/* The default charsize of a new instance object is 10 pts. */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* charSize :: character size expressed in 26.6 fixed float */
/* points. 1 point = 1/72 dpi. */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_CharSize( TT_Instance instance,
TT_F26Dot6 charSize )
{
return TT_Set_Instance_CharSizes( instance, charSize, charSize );
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_PixelSizes */
/* */
/* <Description> */
/* This function is used to set an instance's pixel sizes directly */
/* It ignores the instance's resolutions fields, and you'll have to */
/* specify the corresponding pointsize in 26.6 fixed float point */
/* units. The latter is a requirement of the TrueType bytecode */
/* interpreter but can be ignored (or more safely, set to the */
/* maximum pixel size multiplied by 64). */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* pixelWidth :: horizontal pixel width (integer value) */
/* pixelHeight :: vertical pixel height (integer value) */
/* pointSize :: corresponding point size (26.6 points) */
/* */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
/* <MT-Note> */
/* No. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_PixelSizes( TT_Instance ins,
TT_UShort pixelWidth,
TT_UShort pixelHeight,
TT_F26Dot6 pointSize )
{
/* The point size is now ignored by the driver */
(void)pointSize;
return FT_Set_Pixel_Sizes( (FT_Size)ins, pixelWidth, pixelHeight );
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Instance_Metrics */
/* */
/* <Description> */
/* Returns an instance's metrics into caller space. */
/* */
/* <Input> */
/* instance :: handle to source instance object */
/* */
/* <Output> */
/* metrics :: target instance metrics structure */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* The TT_Instance_Metrics structure differs slightly from the */
/* FT_Instance_Metrics one, which is why we re-implement this */
/* function, rather than call a driver method for this.. */
/* */
EXPORT_FUNC
TT_Error TT_Get_Instance_Metrics( TT_Instance ins,
TT_Instance_Metrics* metrics )
{
TT_Size size = (TT_Size)ins;
if (!ins)
return TT_Err_Invalid_Instance_Handle;
metrics->x_scale = size->root.metrics.x_scale;
metrics->y_scale = size->root.metrics.y_scale;
metrics->x_resolution = size->root.metrics.x_resolution;
metrics->y_resolution = size->root.metrics.y_resolution;
metrics->x_ppem = size->root.metrics.x_ppem;
metrics->y_ppem = size->root.metrics.y_ppem;
metrics->pointSize = size->root.metrics.pointSize;
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_Pointer */
/* */
/* <Description> */
/* Each instance object contains a typeless pointer, which use is */
/* left to client applications (or the high-level library). This */
/* API is used to set this generic pointer. It is ignored by the */
/* driver. */
/* */
/* <Input> */
/* instance :: handle to the target instance object */
/* data :: value of the generic pointer */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_Pointer( TT_Instance ins,
void* data )
{
if ( !ins )
return TT_Err_Invalid_Instance_Handle;
else
((FT_Size)ins)->generic.data = data;
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Instance_Pointer */
/* */
/* <Description> */
/* Each instance object contains a typeless pointer, which use is */
/* left to client applications (or the high-level library). This */
/* API is used to retrieve this generic pointer. It is ignored by */
/* the driver. */
/* */
/* <Input> */
/* instance :: handle to source instance object */
/* */
/* <Return> */
/* value of generic pointer. NULL if invalid instance */
/* */
/* <MT-Note> */
/* No. */
EXPORT_FUNC
void* TT_Get_Instance_Pointer( TT_Instance instance )
{
if ( !instance )
return NULL;
else
return ((FT_Size)instance)->generic.data;
}
/***********************************************************************/
/* */
/* <Function> TT_Done_Instance */
/* */
/* <Description> */
/* Destroys a given instance object. All instances are destroyed */
/* automatically when their parent face object is discarded. */
/* However, this API can be used to save memory. */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
EXPORT_FUNC
TT_Error TT_Done_Instance( TT_Instance ins )
{
FT_Done_Size( (FT_Size)ins );
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> TT_Set_Instance_Transform_Flags */
/* */
/* <Description> */
/* Nothing. This function has been deprecated... */
/* */
/* <Input> */
/* instance :: handle to target instance object */
/* rotated :: 'rotation' flag.. */
/* stretched :: 'stretch' flag.. */
/* */
/* <Return> */
/* Always 0. */
/* */
/* <Note> */
/* This function has been deprecated !! Do not use it, it doesn't */
/* do anything now.. */
/* */
EXPORT_FUNC
TT_Error TT_Set_Instance_Transform_Flags( TT_Instance instance,
TT_Bool rotated,
TT_Bool stretched )
{
(void)instance; /* the parameters are unused, the (void) prevents */
(void)rotated; /* warnings from pedantic compilers.. */
(void)stretched;
return TT_Err_Ok;
}
/***********************************************************************/
/* */
/* <Function> */
/* */
/* <Description> */
/* */
/* */
/* <Input> */
/* */
/* */
/* <Output> */
/* */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* */
/* <MT-Note> */
/* */
/* */
/* */
/* <Note> */
/* */
/* */
/* */
/*******************************************************************
*
* Function : TT_New_Glyph
*
* Description : Creates a new glyph object related to a given
* face.
*
* Input : face the face handle
* glyph address of target glyph handle
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_New_Glyph( TT_Face face,
TT_Glyph* aglyph )
{
return FT_New_GlyphSlot( (FT_Face)face, (FT_GlyphSlot*)aglyph );
}
/*******************************************************************
*
* Function : TT_Done_Glyph
*
* Description : Destroys a given glyph object.
*
* Input : glyph the glyph handle
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Done_Glyph( TT_Glyph glyph )
{
FT_Done_GlyphSlot( (FT_GlyphSlot)glyph );
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Load_Glyph
*
* Description : Loads a glyph.
*
* Input : instance the instance handle
* glyph the glyph handle
* glyphIndex the glyph index
* loadFlags flags controlling how to load the glyph
* (none, scaled, hinted, both)
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Load_Glyph( TT_Instance instance,
TT_Glyph glyph,
TT_UShort glyphIndex,
TT_UShort loadFlags )
{
TT_Int result, flags;
flags = 0;
/* Convert load flags */
if ( (loadFlags & TTLOAD_SCALE_GLYPH) == 0 )
flags = FT_LOAD_NO_SCALE;
else if ( (loadFlags & TTLOAD_HINT_GLYPH) == 0 )
flags = FT_LOAD_NO_HINTING;
else
flags = FT_LOAD_DEFAULT;
flags |= FT_LOAD_NO_BITMAP | /* prevent bitmap loading for */
FT_LOAD_LINEAR; /* compatibility purposes.. */
return FT_Load_Glyph( (FT_GlyphSlot)glyph,
(FT_Size)instance,
glyphIndex,
flags,
&result );
}
/*******************************************************************
*
* Function : TT_Get_Glyph_Outline
*
* Description : Returns the glyph's outline data.
*
* Input : glyph the glyph handle
* outline address where the glyph outline will be returned
*
* Output : Error code.
*
* MT-Safe : YES! Reads only semi-permanent data.
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Glyph_Outline( TT_Glyph glyph,
TT_Outline* outline )
{
FT_GlyphSlot slot = (FT_GlyphSlot)glyph;
if (!glyph)
return TT_Err_Invalid_Glyph_Handle;
/* the structures TT_Outline and FT_Outline are equivalent */
*((FT_Outline*)outline) = slot->outline;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_Glyph_Metrics
*
* Description : Extracts the glyph's horizontal metrics information.
*
* Input : glyph glyph object handle
* metrics address where metrics will be returned
*
* Output : Error code.
*
* MT-Safe : NO! Glyph containers can't be shared.
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Glyph_Metrics( TT_Glyph glyph,
TT_Glyph_Metrics* metrics )
{
FT_GlyphSlot slot = (FT_GlyphSlot)glyph;
if (!glyph)
return TT_Err_Invalid_Glyph_Handle;
/* TT_Glyph_Metrics and FT_Glyph_Metrics are slightly different */
metrics->bbox.xMin = slot->metrics.horiBearingX;
metrics->bbox.xMax = slot->metrics.horiBearingX +
slot->metrics.width;
metrics->bbox.yMax = slot->metrics.horiBearingY;
metrics->bbox.yMin = slot->metrics.horiBearingY -
slot->metrics.height;
metrics->bearingX = slot->metrics.horiBearingX;
metrics->bearingY = slot->metrics.horiBearingY;
metrics->advance = slot->metrics.horiAdvance;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_Big_Glyph_Metrics
*
* Description : Extracts the glyph's big metrics information.
*
* Input : glyph glyph object handle
* metrics address where big metrics will be returned
*
* Output : Error code.
*
* MT-Safe : NO! Glyph containers can't be shared.
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Glyph_Big_Metrics( TT_Glyph glyph,
TT_Big_Glyph_Metrics* metrics )
{
FT_GlyphSlot slot = (FT_GlyphSlot)glyph;
FT_Glyph_Metrics* met;
FT_Glyph_Metrics* met2;
if (!glyph)
return TT_Err_Invalid_Glyph_Handle;
met = &slot->metrics;
met2 = &slot->metrics2;
metrics->bbox.xMin = met->horiBearingX;
metrics->bbox.xMax = met->horiBearingX + met->width;
metrics->bbox.yMin = met->horiBearingY - met->height;
metrics->bbox.yMax = met->horiBearingY;
metrics->horiBearingX = met->horiBearingX;
metrics->horiBearingY = met->horiBearingY;
metrics->horiAdvance = met->horiAdvance;
metrics->vertBearingX = met->vertBearingX;
metrics->vertBearingY = met->vertBearingY;
metrics->vertAdvance = met->vertAdvance;
metrics->linearHoriAdvance = met2->horiAdvance;
metrics->linearHoriBearingX = met2->horiBearingX;
metrics->linearVertAdvance = met2->vertAdvance;
metrics->linearVertBearingY = met2->vertBearingY;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_Glyph_Bitmap
*
* Description : Produces a bitmap from a glyph outline.
*
* Input : glyph the glyph container's handle
* map target pixmap description block
* xOffset x offset in fractional pixels (26.6 format)
* yOffset y offset in fractional pixels (26.6 format)
*
* Output : Error code.
*
* Note : Only use integer pixel offsets if you want to preserve
* the fine hints applied to the outline. This means that
* xOffset and yOffset must be multiples of 64!
*
* MT-Safe : NO! Glyph containers can't be shared.
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Glyph_Bitmap( TT_Glyph glyph,
TT_Raster_Map* map,
TT_F26Dot6 xOffset,
TT_F26Dot6 yOffset )
{
FT_Library library;
TT_Error error;
FT_GlyphSlot slot = (FT_GlyphSlot)glyph;
FT_Outline outline;
FT_Raster_Map bitmap;
if ( !glyph )
return TT_Err_Invalid_Glyph_Handle;
library = slot->face->resource->library;
outline = slot->outline;
/* XXX : For now, use only dropout mode 2 */
/* outline.dropout_mode = _glyph->scan_type; */
outline.dropout_mode = 2;
bitmap.width = map->width;
bitmap.rows = map->rows;
bitmap.cols = map->cols;
bitmap.flow = map->flow;
bitmap.pix_bits = 1;
bitmap.buffer = map->bitmap;
FT_Translate_Outline( &outline, xOffset, yOffset );
error = FT_Get_Outline_Bitmap( library, &outline, &bitmap );
FT_Translate_Outline( &outline, -xOffset, -yOffset );
return error;
}
/*******************************************************************
*
* Function : TT_Get_Glyph_Pixmap
*
* Description : Produces a grayscaled pixmap from a glyph
* outline.
*
* Input : glyph the glyph container's handle
* map target pixmap description block
* xOffset x offset in fractional pixels (26.6 format)
* yOffset y offset in fractional pixels (26.6 format)
*
* Output : Error code.
*
* Note : Only use integer pixel offsets to preserve the fine
* hinting of the glyph and the 'correct' anti-aliasing
* (where vertical and horizontal stems aren't grayed).
* This means that xOffset and yOffset must be multiples
* of 64!
*
* You can experiment with offsets of +32 to get 'blurred'
* versions of the glyphs (a nice effect at large sizes that
* some graphic designers may appreciate :)
*
* MT-Safe : NO! Glyph containers can't be shared.
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Glyph_Pixmap( TT_Glyph glyph,
TT_Raster_Map* map,
TT_F26Dot6 xOffset,
TT_F26Dot6 yOffset )
{
FT_Library library;
TT_Error error;
FT_GlyphSlot slot = (FT_GlyphSlot)glyph;
FT_Outline outline;
FT_Raster_Map bitmap;
if ( !glyph )
return TT_Err_Invalid_Glyph_Handle;
library = slot->face->resource->library;
outline = slot->outline;
/* XXX : For now, use only dropout mode 2 */
/* outline.dropout_mode = _glyph->scan_type; */
outline.dropout_mode = 2;
bitmap.width = map->width;
bitmap.rows = map->rows;
bitmap.cols = map->cols;
bitmap.flow = map->flow;
bitmap.pix_bits = 8;
bitmap.buffer = map->bitmap;
FT_Translate_Outline( &outline, xOffset, yOffset );
error = FT_Get_Outline_Bitmap( library, &outline, &bitmap );
FT_Translate_Outline( &outline, -xOffset, -yOffset );
return error;
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Outline_Bitmap */
/* */
/* <Description> */
/* Renders an outline within a bitmap. The outline's image is */
/* simply or-ed to the target bitmap. */
/* */
/* <Input> */
/* engine :: handle to the TrueType driver object */
/* outline :: pointer to the source outline descriptor */
/* raster :: pointer to the target bitmap descriptor */
/* */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
/* <MT-Note> */
/* Yes. */
/* */
EXPORT_FUNC
TT_Error TT_Get_Outline_Bitmap( TT_Engine engine,
TT_Outline* outline,
TT_Raster_Map* map )
{
FT_Library library = (FT_Library)engine;
FT_Raster_Map bitmap;
if ( !engine )
return TT_Err_Invalid_Engine;
if ( !outline || !map )
return TT_Err_Invalid_Argument;
bitmap.width = map->width;
bitmap.rows = map->rows;
bitmap.cols = map->cols;
bitmap.flow = map->flow;
bitmap.pix_bits = 1;
bitmap.buffer = map->bitmap;
return FT_Get_Outline_Bitmap( library, (FT_Outline*)outline, &bitmap );
}
/***********************************************************************/
/* */
/* <Function> TT_Get_Outline_Pixmap */
/* */
/* <Description> */
/* Renders an outline within a pixmap. The outline's image is */
/* simply or-ed to the target pixmap. */
/* */
/* <Input> */
/* engine :: handle to the TrueType driver object */
/* outline :: pointer to the source outline descriptor */
/* raster :: pointer to the target pixmap descriptor */
/* */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
/* <MT-Note> */
/* Yes. */
/* */
EXPORT_FUNC
TT_Error TT_Get_Outline_Pixmap( TT_Engine engine,
TT_Outline* outline,
TT_Raster_Map* map )
{
FT_Library library = (FT_Library)engine;
FT_Raster_Map bitmap;
if ( !engine )
return TT_Err_Invalid_Engine;
if ( !outline || !map )
return TT_Err_Invalid_Argument;
bitmap.width = map->width;
bitmap.rows = map->rows;
bitmap.cols = map->cols;
bitmap.flow = map->flow;
bitmap.pix_bits = 8;
bitmap.buffer = map->bitmap;
return FT_Get_Outline_Bitmap( library, (FT_Outline*)outline, &bitmap );
}
/***********************************************************************/
/* */
/* <Function> TT_New_Outline */
/* */
/* <Description> */
/* Creates a new outline of a given size. */
/* */
/* <Input> */
/* numPoints :: maximum number of points within the outline */
/* */
/* numContours :: maximum number of contours within the outline */
/* */
/* <Output> */
/* outline :: target outline descriptor. */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* Yes. */
/* */
/* <Note> */
/* This function uses 'malloc' to allocate the outline's array, */
/* _unlike_ all other functions in the TrueType API. This means */
/* that the outline won't be destroyed when the TrueType engine */
/* is finalized.. */
/* */
/* It is provided for backwards compatibility ONLY. Use the new */
/* FT_New_Outline function defined in "ftoutln.h" instead if you're */
/* working with the FreeType 2.0 API. */
/* */
#include <stdlib.h> /* for malloc and free */
static TT_Outline null_api_outline = { 0, 0, NULL, NULL, NULL,
0, 0, 0, 0 };
EXPORT_FUNC
TT_Error TT_New_Outline( TT_UShort numPoints,
TT_Short numContours,
TT_Outline* outline )
{
if ( !outline )
return TT_Err_Invalid_Argument;
*outline = null_api_outline;
if ( numPoints > 0 && numContours > 0 )
{
outline->points = (TT_Vector*)malloc( numPoints * sizeof(TT_Vector) );
outline->flags = (TT_Byte*) malloc( numPoints * sizeof(TT_Char) );
outline->contours = (TT_UShort*)malloc( numPoints * sizeof(TT_UShort) );
if ( !outline->points || !outline->flags || !outline->contours )
goto Fail;
outline->n_points = numPoints;
outline->n_contours = numContours;
outline->owner = TRUE;
}
return TT_Err_Ok;
Fail:
outline->owner = TRUE;
TT_Done_Outline( outline );
return TT_Err_Out_Of_Memory;
}
/***********************************************************************/
/* */
/* <Function> TT_Done_Outline */
/* */
/* <Description> */
/* Destroys an outline created with FT_New_Outline */
/* */
/* <Input> */
/* outline :: */
/* pointer to the outline destructor to discard. This function */
/* doesn't destroy the TT_Outline sturcture, only the data it */
/* contains/own. */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
/* <MT-Note> */
/* No. */
/* */
/* <Note> */
/* This function uses 'free' to discard the outline's arrays. */
/* You should only discard outline allocated with TT_New_Outline. */
/* */
/* It is provided for backwards compatibility ONLY. Use the new */
/* FT_Done_Outline function defined in "ftoutln.h" instead if you're*/
/* working with the FreeType 2.0 API. */
/* */
EXPORT_FUNC
TT_Error TT_Done_Outline( TT_Outline* outline )
{
if ( outline )
{
if ( outline->owner )
{
free( outline->points );
free( outline->flags );
free( outline->contours );
}
*outline = null_api_outline;
return TT_Err_Ok;
}
else
return TT_Err_Invalid_Argument;
}
/***********************************************************************/
/* */
/* <Function> TT_Copy_Outline */
/* */
/* <Description> */
/* Copy an outline into another one. Both objects must have */
/* the same sizes ( num. points & num. contours ) when this */
/* function is called.. */
/* */
/* <Input> */
/* source :: handle to source outline */
/* target :: handle to target outline */
/* */
/* <Return> */
/* TrueType error code. 0 means success */
/* */
EXPORT_FUNC
TT_Error TT_Copy_Outline( TT_Outline* source,
TT_Outline* target )
{
return FT_Copy_Outline( (FT_Outline*)source,
(FT_Outline*)target );
}
/*******************************************************************
*
* Function : TT_Transform_Outline
*
* Description : Applies a simple transformation to an outline.
*
* Input : outline the glyph's outline. Can be extracted
* from a glyph container through
* TT_Get_Glyph_Outline().
*
* matrix simple matrix with 16.16 fixed floats
*
* Output : Error code (always TT_Err_Ok).
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
void TT_Transform_Outline( TT_Outline* outline,
TT_Matrix* matrix )
{
FT_Transform_Outline( (FT_Outline*)outline, (FT_Matrix*)matrix );
}
/*******************************************************************
*
* Function : TT_Transform_Vector
*
* Description : Apply a simple transform to a vector
*
* Input : x, y the vector.
*
* matrix simple matrix with 16.16 fixed floats
*
* Output : None.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
void TT_Transform_Vector( TT_F26Dot6* x,
TT_F26Dot6* y,
TT_Matrix* matrix )
{
FT_Transform_Vector( x, y, (FT_Matrix*) matrix );
}
/*******************************************************************
*
* Function : TT_Translate_Outline
*
* Description : Applies a simple translation.
*
* Input : outline no comment :)
* xOffset
* yOffset
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
void TT_Translate_Outline( TT_Outline* outline,
TT_F26Dot6 xOffset,
TT_F26Dot6 yOffset )
{
FT_Translate_Outline( (FT_Outline*)outline, xOffset, yOffset );
}
/*******************************************************************
*
* Function : TT_Get_Outline_BBox
*
* Description : Returns an outline's bounding box.
*
* Input : outline no comment :)
* bbox address where the bounding box is returned
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Outline_BBox( TT_Outline* outline,
TT_BBox* bbox )
{
return FT_Get_Outline_CBox( (FT_Outline*)outline, (FT_BBox*)bbox );
}
/***********************************************************************/
/* */
/* <Function> */
/* */
/* <Description> */
/* */
/* */
/* <Input> */
/* */
/* */
/* <Output> */
/* */
/* */
/* <Return> */
/* */
/* */
/* <MT-Note> */
/* */
/* */
/* */
/* <Note> */
/* */
/* */
/* */
/* Compute A*B/C with 64 bits intermediate precision. */
EXPORT_FUNC
TT_Long TT_MulDiv( TT_Long A, TT_Long B, TT_Long C )
{
return FT_MulDiv( A, B, C );
}
/***********************************************************************/
/* */
/* <Function> */
/* */
/* <Description> */
/* */
/* */
/* <Input> */
/* */
/* */
/* <Output> */
/* */
/* */
/* <Return> */
/* */
/* */
/* <MT-Note> */
/* */
/* */
/* */
/* <Note> */
/* */
/* */
/* */
/* Compute A*B/0x10000 with 64 bits intermediate precision. */
/* Useful to multiply by a 16.16 fixed float value. */
EXPORT_FUNC
TT_Long TT_MulFix( TT_Long A, TT_Long B )
{
return FT_MulFix( A, B );
}
/* ----------------- character mappings support ------------- */
/*******************************************************************
*
* Function : TT_Get_CharMap_Count
*
* Description : Returns the number of charmaps in a given face.
*
* Input : face face object handle
*
* Output : Number of tables. -1 in case of error (bad handle).
*
* Note : DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED!
*
* It is retained for backwards compatibility only and will
* fail on 16bit systems.
*
* MT-Safe : YES !
*
******************************************************************/
EXPORT_FUNC
int TT_Get_CharMap_Count( TT_Face face )
{
FT_Face _face = (FT_Face)face;
return ( _face ? _face->num_charmaps : -1 );
}
/*******************************************************************
*
* Function : TT_Get_CharMap_ID
*
* Description : Returns the ID of a given charmap.
*
* Input : face face object handle
* charmapIndex index of charmap in directory
* platformID address of returned platform ID
* encodingID address of returned encoding ID
*
* Output : error code
*
* MT-Safe : YES !
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_CharMap_ID( TT_Face face,
TT_UShort charmapIndex,
TT_UShort* platformID,
TT_UShort* encodingID )
{
TT_CharMap cmap;
if ( !face )
return TT_Err_Invalid_Face_Handle;
if ( charmapIndex >= face->num_charmaps )
return TT_Err_Bad_Argument;
cmap = (TT_CharMap)face->charmaps + charmapIndex;
*platformID = cmap->root.platform_id;
*encodingID = cmap->root.encoding_id;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_CharMap
*
* Description : Looks up a charmap.
*
* Input : face face object handle
* charmapIndex index of charmap in directory
* charMap address of returned charmap handle
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_CharMap( TT_Face face,
TT_UShort charmapIndex,
TT_CharMap* charMap )
{
if ( !face )
return TT_Err_Invalid_Face_Handle;
if ( charmapIndex >= face->num_charmaps )
return TT_Err_Bad_Argument;
*charMap = (TT_CharMap)face->charmaps + charmapIndex;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Char_Index
*
* Description : Returns the glyph index corresponding to
* a given character code defined for the 'charmap'.
*
* Input : charMap charmap handle
* charcode character code
*
* Output : glyph index.
*
* Notes : Character code 0 is the unknown glyph, which should never
* be displayed.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_UShort TT_Char_Index( TT_CharMap charMap,
TT_UShort charCode )
{
return tt_interface->get_char_index( (FT_CharMap)charMap, charCode );
}
/*******************************************************************
*
* Function : TT_Get_Name_Count
*
* Description : Returns the number of strings found in the
* name table.
*
* Input : face face handle
*
* Output : number of strings.
*
* Notes : Returns -1 on error (invalid handle).
*
* DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED!
*
* It is retained for backwards compatibility only and will
* fail on 16bit systems.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
int TT_Get_Name_Count( TT_Face face )
{
if ( !face )
return -1;
return face->num_names;
}
/*******************************************************************
*
* Function : TT_Get_Name_ID
*
* Description : Returns the IDs of the string number 'nameIndex'
* in the name table of a given face.
*
* Input : face face handle
* nameIndex index of string. First is 0
* platformID addresses of returned IDs
* encodingID
* languageID
* nameID
*
* Output : Error code.
*
* Notes : Some files have a corrupt or unusual name table, with some
* entries having a platformID > 3. These can usually
* be ignored by a client application.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Name_ID( TT_Face face,
TT_UShort nameIndex,
TT_UShort* platformID,
TT_UShort* encodingID,
TT_UShort* languageID,
TT_UShort* nameID )
{
TT_NameRec* name;
if (!face)
return TT_Err_Invalid_Face_Handle;
if ( nameIndex >= face->num_names )
return TT_Err_Bad_Argument;
name = face->name_table.names + nameIndex;
*platformID = name->platformID;
*encodingID = name->encodingID;
*languageID = name->languageID;
*nameID = name->nameID;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_Name_String
*
* Description : Returns the address and length of a given
* string found in the name table.
*
* Input : face face handle
* nameIndex string index
* stringPtr address of returned pointer to string
* length address of returned string length
*
* Output : Error code.
*
* Notes : If the string's platformID is invalid,
* stringPtr is NULL, and length is 0.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Name_String( TT_Face face,
TT_UShort nameIndex,
TT_String** stringPtr,
TT_UShort* length )
{
TT_NameRec* name;
if (!face)
return TT_Err_Invalid_Face_Handle;
if ( nameIndex >= face->num_names )
return TT_Err_Bad_Argument;
name = face->name_table.names + nameIndex;
*stringPtr = (TT_String*)name->string;
*length = name->stringLength;
return TT_Err_Ok;
}
/*******************************************************************
*
* Function : TT_Get_Font_Data
*
* Description : Loads any font table in client memory. Used by
* the TT_Get_Font_Data().
*
* Input : face Face object to look for.
*
* tag Tag of table to load. Use the value 0 if you
* want to access the whole font file, else set
* this parameter to a valid TrueType table tag
* that you can forge with the MAKE_TT_TAG
* macro.
*
* offset Starting offset in the table (or the file
* if tag == 0).
*
* buffer Address of target buffer
*
* length Address of decision variable:
*
* if length == NULL:
* Load the whole table. Returns an
* an error if 'offset' != 0.
*
* if *length == 0 :
* Exit immediately, returning the
* length of the given table, or of
* the font file, depending on the
* value of 'tag'.
*
* if *length != 0 :
* Load the next 'length' bytes of
* table or font, starting at offset
* 'offset' (in table or font too).
*
* Output : Error code.
*
* MT-Safe : YES!
*
******************************************************************/
EXPORT_FUNC
TT_Error TT_Get_Font_Data( TT_Face face,
TT_ULong tag,
TT_Long offset,
void* buffer,
TT_Long* length )
{
return tt_extension->get_font_data( face, tag, offset, buffer, length );
}
/*******************************************************************/
/* */
/* */
/* */
/* Postscript Names extension */
/* */
/* */
/* */
/*******************************************************************/
/* Initialise the Postscript Names extension */
EXPORT_FUNC
TT_Error TT_Init_Post_Extension( TT_Engine engine )
{
(void)engine;
return TT_Err_Ok;
}
/* Load the Postscript Names table - notice that the 'post' parameter */
/* will be ignored in 2.0. */
EXPORT_DEF
TT_Error TT_Load_PS_Names( TT_Face face,
void* post )
{
(void)post;
(void)face;
/* the names are now loaded on demand in 2.0 */
return TT_Err_Ok;
}
/* The following is directly implemented in the TrueType driver */
#if 0
/* Gets the postscript name of a single glyph */
EXPORT_DEF
TT_Error TT_Get_PS_Name( TT_Face face,
TT_UShort index,
TT_String** PSname );
#endif
/*******************************************************************/
/* */
/* */
/* */
/* Embedded Bitmap (sbits) extension */
/* */
/* */
/* */
/*******************************************************************/
/*************************************************************/
/* */
/* <Function> */
/* TT_Init_SBit_Extension */
/* */
/* <Description> */
/* Initialise the embedded bitmaps extension for the */
/* FreeType engine. */
/* */
/* <Input> */
/* engine :: handle to current FreeType library instance */
/* */
/* <Return> */
/* Error code. 0 means success. */
/* */
EXPORT_FUNC
TT_Error TT_Init_SBit_Extension( TT_Engine engine )
{
(void)engine;
return TT_Err_Ok;
}
/*************************************************************/
/* */
/* <Function> */
/* TT_Get_Face_Bitmaps */
/* */
/* <Description> */
/* Loads the "EBLC" table from a font file, if any. */
/* */
/* <Input> */
/* face :: handle to the source TrueType font/face */
/* */
/* <Output> */
/* eblc_table :: a descriptor for the EBLC table */
/* */
/* <Return> */
/* Error code. 0 means success. */
/* */
/* <Note> */
/* This function returns TT_Err_Table_Missing when the */
/* font contains no embedded bitmaps. All fields in */
/* "eblc_table" will then be set to 0. */
/* */
EXPORT_FUNC
TT_Error TT_Get_Face_Bitmaps( TT_Face face,
TT_EBLC *eblc_table )
{
if (!face)
return FT_Err_Invalid_Face_Handle;
eblc_table->num_strikes = face->num_sbit_strikes;
eblc_table->strikes = face->sbit_strikes;
if ( face->num_sbit_strikes > 0 )
{
eblc_table->version = 0x00002000;
return TT_Err_Ok;
}
eblc_table->version = 0;
return TT_Err_Table_Missing;
}
/*************************************************************/
/* */
/* <Function> */
/* TT_New_SBit_Image */
/* */
/* <Description> */
/* Allocates a new embedded bitmap container */
/* */
/* <Output> */
/* image :: sbit image */
/* */
/* <Return> */
/* Error code. 0 means success. */
/* */
EXPORT_DEF
TT_Error TT_New_SBit_Image( TT_SBit_Image* *image )
{
*image = (TT_SBit_Image*)malloc( sizeof(**image) );
if ( !*image )
return TT_Err_Out_Of_Memory;
MEM_Set( *image, sizeof(**image), 0 );
return TT_Err_Ok;
}
/*************************************************************/
/* */
/* <Function> */
/* TT_Done_SBit_Image */
/* */
/* <Description> */
/* Releases an embedded bitmap container */
/* */
/* <Input> */
/* image :: sbit image */
/* */
EXPORT_DEF
void TT_Done_SBit_Image( TT_SBit_Image* image )
{
free( image->map.bitmap );
free( image );
}
/*************************************************************/
/* */
/* <Function> */
/* TT_Load_Glyph_Bitmap */
/* */
/* <Description> */
/* Loads a given glyph embedded bitmap */
/* */
/* <Input> */
/* face :: handle to the source TrueType font/face */
/* instance :: current size/transform instance */
/* glyph_index :: index of source glyph */
/* bitmap :: target embedded bitmap descriptor */
/* */
/* <Return> */
/* Error code. 0 means success. */
/* */
/* <Note> */
/* This function returns an error if there is no */
/* embedded bitmap for the glyph at the given */
/* instance. */
/* */
EXPORT_FUNC
TT_Error TT_Load_Glyph_Bitmap( TT_Face face,
TT_Instance instance,
TT_UShort glyph_index,
TT_SBit_Image* bitmap )
{
FT_GlyphSlot slot;
TT_Error error;
error = FT_New_GlyphSlot( (FT_Face)face, &slot );
if (error) goto Exit;
error = FT_Load_Glyph( slot, (FT_Size)instance, glyph_index,
FT_LOAD_NO_OUTLINE, 0 );
if (!error)
{
/* copy bitmap */
bitmap->map.width = slot->bitmap.width;
bitmap->map.rows = slot->bitmap.rows;
bitmap->map.cols = slot->bitmap.cols;
bitmap->map.flow = slot->bitmap.flow;
bitmap->bit_depth = slot->bitmap.pix_bits;
bitmap->map.bitmap = slot->bitmap.buffer;
/* copy metrics */
bitmap->metrics.bbox.xMin = slot->metrics.horiBearingX >> 6;
bitmap->metrics.bbox.xMax = bitmap->metrics.bbox.xMin +
(slot->metrics.width >> 6);
bitmap->metrics.bbox.yMax = slot->metrics.horiBearingY >> 6;
bitmap->metrics.bbox.yMin = bitmap->metrics.bbox.yMax -
(slot->metrics.height >> 6);
bitmap->metrics.horiBearingX = bitmap->metrics.bbox.xMin;
bitmap->metrics.horiBearingY = bitmap->metrics.bbox.yMax;
bitmap->metrics.horiAdvance = slot->metrics.horiAdvance >> 6;
bitmap->metrics.vertBearingX = slot->metrics.vertBearingX >> 6;
bitmap->metrics.vertBearingY = slot->metrics.vertBearingY >> 6;
bitmap->metrics.vertAdvance = slot->metrics.vertAdvance >> 6;
slot->bitmap.buffer = 0;
}
FT_Done_GlyphSlot( slot );
Exit:
return error;
}
/* END */