Home | History | Annotate | Download | only in include
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  ftsystem.h                                                             */
      4 /*                                                                         */
      5 /*    FreeType low-level system interface definition (specification).      */
      6 /*                                                                         */
      7 /*  Copyright 1996-2015 by                                                 */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #ifndef __FTSYSTEM_H__
     20 #define __FTSYSTEM_H__
     21 
     22 
     23 #include <ft2build.h>
     24 
     25 
     26 FT_BEGIN_HEADER
     27 
     28 
     29   /*************************************************************************/
     30   /*                                                                       */
     31   /* <Section>                                                             */
     32   /*   system_interface                                                    */
     33   /*                                                                       */
     34   /* <Title>                                                               */
     35   /*   System Interface                                                    */
     36   /*                                                                       */
     37   /* <Abstract>                                                            */
     38   /*   How FreeType manages memory and i/o.                                */
     39   /*                                                                       */
     40   /* <Description>                                                         */
     41   /*   This section contains various definitions related to memory         */
     42   /*   management and i/o access.  You need to understand this             */
     43   /*   information if you want to use a custom memory manager or you own   */
     44   /*   i/o streams.                                                        */
     45   /*                                                                       */
     46   /*************************************************************************/
     47 
     48 
     49   /*************************************************************************/
     50   /*                                                                       */
     51   /*                  M E M O R Y   M A N A G E M E N T                    */
     52   /*                                                                       */
     53   /*************************************************************************/
     54 
     55 
     56   /*************************************************************************
     57    *
     58    * @type:
     59    *   FT_Memory
     60    *
     61    * @description:
     62    *   A handle to a given memory manager object, defined with an
     63    *   @FT_MemoryRec structure.
     64    *
     65    */
     66   typedef struct FT_MemoryRec_*  FT_Memory;
     67 
     68 
     69   /*************************************************************************
     70    *
     71    * @functype:
     72    *   FT_Alloc_Func
     73    *
     74    * @description:
     75    *   A function used to allocate `size' bytes from `memory'.
     76    *
     77    * @input:
     78    *   memory ::
     79    *     A handle to the source memory manager.
     80    *
     81    *   size ::
     82    *     The size in bytes to allocate.
     83    *
     84    * @return:
     85    *   Address of new memory block.  0~in case of failure.
     86    *
     87    */
     88   typedef void*
     89   (*FT_Alloc_Func)( FT_Memory  memory,
     90                     long       size );
     91 
     92 
     93   /*************************************************************************
     94    *
     95    * @functype:
     96    *   FT_Free_Func
     97    *
     98    * @description:
     99    *   A function used to release a given block of memory.
    100    *
    101    * @input:
    102    *   memory ::
    103    *     A handle to the source memory manager.
    104    *
    105    *   block ::
    106    *     The address of the target memory block.
    107    *
    108    */
    109   typedef void
    110   (*FT_Free_Func)( FT_Memory  memory,
    111                    void*      block );
    112 
    113 
    114   /*************************************************************************
    115    *
    116    * @functype:
    117    *   FT_Realloc_Func
    118    *
    119    * @description:
    120    *   A function used to re-allocate a given block of memory.
    121    *
    122    * @input:
    123    *   memory ::
    124    *     A handle to the source memory manager.
    125    *
    126    *   cur_size ::
    127    *     The block's current size in bytes.
    128    *
    129    *   new_size ::
    130    *     The block's requested new size.
    131    *
    132    *   block ::
    133    *     The block's current address.
    134    *
    135    * @return:
    136    *   New block address.  0~in case of memory shortage.
    137    *
    138    * @note:
    139    *   In case of error, the old block must still be available.
    140    *
    141    */
    142   typedef void*
    143   (*FT_Realloc_Func)( FT_Memory  memory,
    144                       long       cur_size,
    145                       long       new_size,
    146                       void*      block );
    147 
    148 
    149   /*************************************************************************
    150    *
    151    * @struct:
    152    *   FT_MemoryRec
    153    *
    154    * @description:
    155    *   A structure used to describe a given memory manager to FreeType~2.
    156    *
    157    * @fields:
    158    *   user ::
    159    *     A generic typeless pointer for user data.
    160    *
    161    *   alloc ::
    162    *     A pointer type to an allocation function.
    163    *
    164    *   free ::
    165    *     A pointer type to an memory freeing function.
    166    *
    167    *   realloc ::
    168    *     A pointer type to a reallocation function.
    169    *
    170    */
    171   struct  FT_MemoryRec_
    172   {
    173     void*            user;
    174     FT_Alloc_Func    alloc;
    175     FT_Free_Func     free;
    176     FT_Realloc_Func  realloc;
    177   };
    178 
    179 
    180   /*************************************************************************/
    181   /*                                                                       */
    182   /*                       I / O   M A N A G E M E N T                     */
    183   /*                                                                       */
    184   /*************************************************************************/
    185 
    186 
    187   /*************************************************************************
    188    *
    189    * @type:
    190    *   FT_Stream
    191    *
    192    * @description:
    193    *   A handle to an input stream.
    194    *
    195    * @also:
    196    *   See @FT_StreamRec for the publicly accessible fields of a given
    197    *   stream object.
    198    *
    199    */
    200   typedef struct FT_StreamRec_*  FT_Stream;
    201 
    202 
    203   /*************************************************************************
    204    *
    205    * @struct:
    206    *   FT_StreamDesc
    207    *
    208    * @description:
    209    *   A union type used to store either a long or a pointer.  This is used
    210    *   to store a file descriptor or a `FILE*' in an input stream.
    211    *
    212    */
    213   typedef union  FT_StreamDesc_
    214   {
    215     long   value;
    216     void*  pointer;
    217 
    218   } FT_StreamDesc;
    219 
    220 
    221   /*************************************************************************
    222    *
    223    * @functype:
    224    *   FT_Stream_IoFunc
    225    *
    226    * @description:
    227    *   A function used to seek and read data from a given input stream.
    228    *
    229    * @input:
    230    *   stream ::
    231    *     A handle to the source stream.
    232    *
    233    *   offset ::
    234    *     The offset of read in stream (always from start).
    235    *
    236    *   buffer ::
    237    *     The address of the read buffer.
    238    *
    239    *   count ::
    240    *     The number of bytes to read from the stream.
    241    *
    242    * @return:
    243    *   The number of bytes effectively read by the stream.
    244    *
    245    * @note:
    246    *   This function might be called to perform a seek or skip operation
    247    *   with a `count' of~0.  A non-zero return value then indicates an
    248    *   error.
    249    *
    250    */
    251   typedef unsigned long
    252   (*FT_Stream_IoFunc)( FT_Stream       stream,
    253                        unsigned long   offset,
    254                        unsigned char*  buffer,
    255                        unsigned long   count );
    256 
    257 
    258   /*************************************************************************
    259    *
    260    * @functype:
    261    *   FT_Stream_CloseFunc
    262    *
    263    * @description:
    264    *   A function used to close a given input stream.
    265    *
    266    * @input:
    267    *  stream ::
    268    *     A handle to the target stream.
    269    *
    270    */
    271   typedef void
    272   (*FT_Stream_CloseFunc)( FT_Stream  stream );
    273 
    274 
    275   /*************************************************************************
    276    *
    277    * @struct:
    278    *   FT_StreamRec
    279    *
    280    * @description:
    281    *   A structure used to describe an input stream.
    282    *
    283    * @input:
    284    *   base ::
    285    *     For memory-based streams, this is the address of the first stream
    286    *     byte in memory.  This field should always be set to NULL for
    287    *     disk-based streams.
    288    *
    289    *   size ::
    290    *     The stream size in bytes.
    291    *
    292    *     In case of compressed streams where the size is unknown before
    293    *     actually doing the decompression, the value is set to 0x7FFFFFFF.
    294    *     (Note that this size value can occur for normal streams also; it is
    295    *     thus just a hint.)
    296    *
    297    *   pos ::
    298    *     The current position within the stream.
    299    *
    300    *   descriptor ::
    301    *     This field is a union that can hold an integer or a pointer.  It is
    302    *     used by stream implementations to store file descriptors or `FILE*'
    303    *     pointers.
    304    *
    305    *   pathname ::
    306    *     This field is completely ignored by FreeType.  However, it is often
    307    *     useful during debugging to use it to store the stream's filename
    308    *     (where available).
    309    *
    310    *   read ::
    311    *     The stream's input function.
    312    *
    313    *   close ::
    314    *     The stream's close function.
    315    *
    316    *   memory ::
    317    *     The memory manager to use to preload frames.  This is set
    318    *     internally by FreeType and shouldn't be touched by stream
    319    *     implementations.
    320    *
    321    *   cursor ::
    322    *     This field is set and used internally by FreeType when parsing
    323    *     frames.
    324    *
    325    *   limit ::
    326    *     This field is set and used internally by FreeType when parsing
    327    *     frames.
    328    *
    329    */
    330   typedef struct  FT_StreamRec_
    331   {
    332     unsigned char*       base;
    333     unsigned long        size;
    334     unsigned long        pos;
    335 
    336     FT_StreamDesc        descriptor;
    337     FT_StreamDesc        pathname;
    338     FT_Stream_IoFunc     read;
    339     FT_Stream_CloseFunc  close;
    340 
    341     FT_Memory            memory;
    342     unsigned char*       cursor;
    343     unsigned char*       limit;
    344 
    345   } FT_StreamRec;
    346 
    347   /* */
    348 
    349 
    350 FT_END_HEADER
    351 
    352 #endif /* __FTSYSTEM_H__ */
    353 
    354 
    355 /* END */
    356