| /******************************************************************* |
| * |
| * 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 */ |