2018-06-03 22:00:42 +02:00
|
|
|
/****************************************************************************
|
|
|
|
*
|
|
|
|
* ftsystem.h
|
|
|
|
*
|
|
|
|
* FreeType low-level system interface definition (specification).
|
|
|
|
*
|
2024-01-27 17:11:22 +01:00
|
|
|
* Copyright (C) 1996-2024 by
|
2018-06-03 22:00:42 +02:00
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
2000-07-11 08:12:20 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2016-01-12 21:37:13 +01:00
|
|
|
#ifndef FTSYSTEM_H_
|
|
|
|
#define FTSYSTEM_H_
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-07-11 08:12:20 +02:00
|
|
|
|
2000-12-09 01:45:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
FT_BEGIN_HEADER
|
2000-08-01 15:17:04 +02:00
|
|
|
|
2002-03-29 08:43:04 +01:00
|
|
|
|
2018-06-03 22:00:42 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
2018-06-17 21:08:36 +02:00
|
|
|
* @section:
|
2018-06-03 22:00:42 +02:00
|
|
|
* system_interface
|
|
|
|
*
|
2018-06-17 21:08:36 +02:00
|
|
|
* @title:
|
2018-06-03 22:00:42 +02:00
|
|
|
* System Interface
|
|
|
|
*
|
2018-06-17 21:08:36 +02:00
|
|
|
* @abstract:
|
2018-06-03 22:00:42 +02:00
|
|
|
* How FreeType manages memory and i/o.
|
|
|
|
*
|
2018-06-17 21:08:36 +02:00
|
|
|
* @description:
|
2018-08-24 18:52:30 +02:00
|
|
|
* This section contains various definitions related to memory management
|
|
|
|
* and i/o access. You need to understand this information if you want to
|
|
|
|
* use a custom memory manager or you own i/o streams.
|
2018-06-03 22:00:42 +02:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* M E M O R Y M A N A G E M E N T
|
|
|
|
*
|
|
|
|
*/
|
2000-07-11 08:12:20 +02:00
|
|
|
|
2001-06-19 11:11:18 +02:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @type:
|
|
|
|
* FT_Memory
|
|
|
|
*
|
|
|
|
* @description:
|
2006-05-12 15:55:04 +02:00
|
|
|
* A handle to a given memory manager object, defined with an
|
2005-10-27 23:28:35 +02:00
|
|
|
* @FT_MemoryRec structure.
|
|
|
|
*
|
|
|
|
*/
|
1999-12-17 00:11:37 +01:00
|
|
|
typedef struct FT_MemoryRec_* FT_Memory;
|
2000-04-04 18:46:12 +02:00
|
|
|
|
2000-07-11 08:12:20 +02:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @functype:
|
|
|
|
* FT_Alloc_Func
|
|
|
|
*
|
|
|
|
* @description:
|
2018-09-04 10:37:44 +02:00
|
|
|
* A function used to allocate `size` bytes from `memory`.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* memory ::
|
|
|
|
* A handle to the source memory manager.
|
|
|
|
*
|
|
|
|
* size ::
|
|
|
|
* The size in bytes to allocate.
|
|
|
|
*
|
|
|
|
* @return:
|
2008-06-26 21:56:51 +02:00
|
|
|
* Address of new memory block. 0~in case of failure.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
*/
|
2001-06-28 09:17:51 +02:00
|
|
|
typedef void*
|
|
|
|
(*FT_Alloc_Func)( FT_Memory memory,
|
2018-10-27 04:52:25 +02:00
|
|
|
long size );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2001-01-10 07:53:49 +01:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @functype:
|
|
|
|
* FT_Free_Func
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A function used to release a given block of memory.
|
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* memory ::
|
|
|
|
* A handle to the source memory manager.
|
|
|
|
*
|
|
|
|
* block ::
|
|
|
|
* The address of the target memory block.
|
|
|
|
*
|
|
|
|
*/
|
2001-06-28 09:17:51 +02:00
|
|
|
typedef void
|
|
|
|
(*FT_Free_Func)( FT_Memory memory,
|
|
|
|
void* block );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2001-06-19 11:11:18 +02:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @functype:
|
|
|
|
* FT_Realloc_Func
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A function used to re-allocate a given block of memory.
|
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* memory ::
|
|
|
|
* A handle to the source memory manager.
|
|
|
|
*
|
|
|
|
* cur_size ::
|
|
|
|
* The block's current size in bytes.
|
|
|
|
*
|
|
|
|
* new_size ::
|
|
|
|
* The block's requested new size.
|
|
|
|
*
|
|
|
|
* block ::
|
|
|
|
* The block's current address.
|
|
|
|
*
|
|
|
|
* @return:
|
2008-06-26 21:56:51 +02:00
|
|
|
* New block address. 0~in case of memory shortage.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @note:
|
|
|
|
* In case of error, the old block must still be available.
|
|
|
|
*
|
|
|
|
*/
|
2001-06-28 09:17:51 +02:00
|
|
|
typedef void*
|
|
|
|
(*FT_Realloc_Func)( FT_Memory memory,
|
2018-10-27 04:52:25 +02:00
|
|
|
long cur_size,
|
|
|
|
long new_size,
|
2001-06-28 09:17:51 +02:00
|
|
|
void* block );
|
2000-07-11 08:12:20 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @struct:
|
|
|
|
* FT_MemoryRec
|
|
|
|
*
|
|
|
|
* @description:
|
2008-06-26 21:56:51 +02:00
|
|
|
* A structure used to describe a given memory manager to FreeType~2.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @fields:
|
|
|
|
* user ::
|
|
|
|
* A generic typeless pointer for user data.
|
|
|
|
*
|
|
|
|
* alloc ::
|
|
|
|
* A pointer type to an allocation function.
|
|
|
|
*
|
|
|
|
* free ::
|
|
|
|
* A pointer type to an memory freeing function.
|
|
|
|
*
|
|
|
|
* realloc ::
|
|
|
|
* A pointer type to a reallocation function.
|
|
|
|
*
|
|
|
|
*/
|
2001-06-19 11:11:18 +02:00
|
|
|
struct FT_MemoryRec_
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
|
|
|
void* user;
|
|
|
|
FT_Alloc_Func alloc;
|
|
|
|
FT_Free_Func free;
|
|
|
|
FT_Realloc_Func realloc;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2018-06-03 22:00:42 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* I / O M A N A G E M E N T
|
|
|
|
*
|
|
|
|
*/
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-04-04 18:46:12 +02:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @type:
|
|
|
|
* FT_Stream
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A handle to an input stream.
|
|
|
|
*
|
2014-12-13 07:15:18 +01:00
|
|
|
* @also:
|
2018-08-24 18:52:30 +02:00
|
|
|
* See @FT_StreamRec for the publicly accessible fields of a given stream
|
|
|
|
* object.
|
2014-12-13 07:15:18 +01:00
|
|
|
*
|
2005-10-27 23:28:35 +02:00
|
|
|
*/
|
2001-01-10 07:53:49 +01:00
|
|
|
typedef struct FT_StreamRec_* FT_Stream;
|
|
|
|
|
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @struct:
|
|
|
|
* FT_StreamDesc
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A union type used to store either a long or a pointer. This is used
|
2018-09-04 10:37:44 +02:00
|
|
|
* to store a file descriptor or a `FILE*` in an input stream.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
*/
|
2000-07-11 08:12:20 +02:00
|
|
|
typedef union FT_StreamDesc_
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-07-11 08:12:20 +02:00
|
|
|
long value;
|
|
|
|
void* pointer;
|
2000-04-04 18:46:12 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
} FT_StreamDesc;
|
|
|
|
|
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @functype:
|
|
|
|
* FT_Stream_IoFunc
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A function used to seek and read data from a given input stream.
|
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* stream ::
|
|
|
|
* A handle to the source stream.
|
|
|
|
*
|
|
|
|
* offset ::
|
2023-03-16 05:25:36 +01:00
|
|
|
* The offset from the start of the stream to seek to.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* buffer ::
|
|
|
|
* The address of the read buffer.
|
|
|
|
*
|
|
|
|
* count ::
|
|
|
|
* The number of bytes to read from the stream.
|
|
|
|
*
|
|
|
|
* @return:
|
2023-03-16 05:25:36 +01:00
|
|
|
* If count >~0, return the number of bytes effectively read by the
|
|
|
|
* stream (after seeking to `offset`). If count ==~0, return the status
|
|
|
|
* of the seek operation (non-zero indicates an error).
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
*/
|
2001-06-28 09:17:51 +02:00
|
|
|
typedef unsigned long
|
2002-02-24 06:26:57 +01:00
|
|
|
(*FT_Stream_IoFunc)( FT_Stream stream,
|
|
|
|
unsigned long offset,
|
|
|
|
unsigned char* buffer,
|
|
|
|
unsigned long count );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2001-06-19 11:11:18 +02:00
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @functype:
|
|
|
|
* FT_Stream_CloseFunc
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A function used to close a given input stream.
|
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* stream ::
|
2018-06-03 22:00:42 +02:00
|
|
|
* A handle to the target stream.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
*/
|
2001-06-28 09:17:51 +02:00
|
|
|
typedef void
|
2002-02-24 06:26:57 +01:00
|
|
|
(*FT_Stream_CloseFunc)( FT_Stream stream );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
2018-09-04 08:00:58 +02:00
|
|
|
/**************************************************************************
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* @struct:
|
|
|
|
* FT_StreamRec
|
|
|
|
*
|
|
|
|
* @description:
|
|
|
|
* A structure used to describe an input stream.
|
|
|
|
*
|
|
|
|
* @input:
|
|
|
|
* base ::
|
|
|
|
* For memory-based streams, this is the address of the first stream
|
2019-02-20 16:18:40 +01:00
|
|
|
* byte in memory. This field should always be set to `NULL` for
|
2005-10-27 23:28:35 +02:00
|
|
|
* disk-based streams.
|
|
|
|
*
|
|
|
|
* size ::
|
|
|
|
* The stream size in bytes.
|
|
|
|
*
|
2014-12-13 07:15:18 +01:00
|
|
|
* In case of compressed streams where the size is unknown before
|
2016-05-08 04:28:43 +02:00
|
|
|
* actually doing the decompression, the value is set to 0x7FFFFFFF.
|
2014-12-13 07:15:18 +01:00
|
|
|
* (Note that this size value can occur for normal streams also; it is
|
|
|
|
* thus just a hint.)
|
|
|
|
*
|
2005-10-27 23:28:35 +02:00
|
|
|
* pos ::
|
|
|
|
* The current position within the stream.
|
|
|
|
*
|
|
|
|
* descriptor ::
|
|
|
|
* This field is a union that can hold an integer or a pointer. It is
|
2018-09-04 10:37:44 +02:00
|
|
|
* used by stream implementations to store file descriptors or `FILE*`
|
2005-10-27 23:28:35 +02:00
|
|
|
* pointers.
|
|
|
|
*
|
|
|
|
* pathname ::
|
|
|
|
* This field is completely ignored by FreeType. However, it is often
|
|
|
|
* useful during debugging to use it to store the stream's filename
|
|
|
|
* (where available).
|
|
|
|
*
|
|
|
|
* read ::
|
|
|
|
* The stream's input function.
|
|
|
|
*
|
|
|
|
* close ::
|
2010-03-16 03:00:02 +01:00
|
|
|
* The stream's close function.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* memory ::
|
2018-08-24 18:52:30 +02:00
|
|
|
* The memory manager to use to preload frames. This is set internally
|
|
|
|
* by FreeType and shouldn't be touched by stream implementations.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* cursor ::
|
|
|
|
* This field is set and used internally by FreeType when parsing
|
2018-08-24 18:52:30 +02:00
|
|
|
* frames. In particular, the `FT_GET_XXX` macros use this instead of
|
2018-09-04 10:37:44 +02:00
|
|
|
* the `pos` field.
|
2005-10-27 23:28:35 +02:00
|
|
|
*
|
|
|
|
* limit ::
|
|
|
|
* This field is set and used internally by FreeType when parsing
|
|
|
|
* frames.
|
|
|
|
*
|
|
|
|
*/
|
2002-10-31 23:19:27 +01:00
|
|
|
typedef struct FT_StreamRec_
|
2000-07-11 08:12:20 +02:00
|
|
|
{
|
2002-02-24 06:26:57 +01:00
|
|
|
unsigned char* base;
|
|
|
|
unsigned long size;
|
|
|
|
unsigned long pos;
|
|
|
|
|
|
|
|
FT_StreamDesc descriptor;
|
|
|
|
FT_StreamDesc pathname;
|
|
|
|
FT_Stream_IoFunc read;
|
|
|
|
FT_Stream_CloseFunc close;
|
|
|
|
|
|
|
|
FT_Memory memory;
|
|
|
|
unsigned char* cursor;
|
|
|
|
unsigned char* limit;
|
2002-10-31 23:19:27 +01:00
|
|
|
|
|
|
|
} FT_StreamRec;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2001-01-10 07:53:49 +01:00
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2001-01-11 10:27:49 +01:00
|
|
|
|
2000-12-09 01:45:38 +01:00
|
|
|
FT_END_HEADER
|
2000-08-01 15:17:04 +02:00
|
|
|
|
2016-01-12 21:37:13 +01:00
|
|
|
#endif /* FTSYSTEM_H_ */
|
2000-07-11 08:12:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* END */
|