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