⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftsystem.c

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 C
字号:
/************************************************************************** * *  ftsystem.h                                                        1.0 * *    Unix-specific FreeType low-level system interface * *    This file contains the definition of interface used by FreeType *    to access low-level, i.e. memory management, i/o access as well *    as thread synchronisation.               * * *  Copyright 1996-1999 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.                                           *                                                                            **************************************************************************/#include <ftsystem.h>#include <fterrors.h>#include <ftconfig.h>#include <ftdebug.h>/* Memory-mapping includes and definitions..                            *//*                                                                      */#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <sys/mman.h>#ifndef MAP_FILE#define MAP_FILE  0x00#endif/* * The prototype for munmap() is not provided on SunOS.  This needs to * have a check added later to see if the GNU C library is being used. * If so, then this prototype is not needed. */#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)  extern int  munmap( caddr_t  addr, int  len );#endif#include <sys/stat.h>#ifdef HAVE_FCNTL_H#include <fcntl.h>#endif#include <stdio.h>#include <stdlib.h>#include <string.h>  /*********************************************************************/  /*                                                                   */  /*                       MEMORY MANAGEMENT INTERFACE                 */  /*                                                                   *//************************************************************************ * * <FuncType> *    FT_Alloc_Func * * <Description> *    The memory allocator function type * * <Input> *    system    :: pointer to the system object *    size      :: requested size in bytes * * <Output> *    block     :: address of newly allocated block * * <Return>   *    Error code. 0 means success. * * <Note> *    If your allocation routine ALWAYS zeroes the new block, you *    should set the flag FT_SYSTEM_FLAG_ALLOC_ZEROES in your system *    object 'flags' field. * *    If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in *    your system's "system_flags" field, this function should update *    the "current_alloc" field of the system object. * ************************************************************************/  static  void*  ft_alloc( FT_Memory  memory,                   long       size )  {    (void)memory;    return malloc(size);  }/************************************************************************ * * <FuncType> *    FT_Realloc_Func * * <Description> *    The memory reallocator function type * * <Input> *    system   :: pointer to the system object *    new_size :: new requested size in bytes * * <InOut> *    block    :: address of block in memory * * <Return> *    Error code. 0 means success. * * <Note> *    This function is _never_ called when the system flag  *    FT_SYSTEM_FLAG_NO_REALLOC is set. Instead, the engine will emulate *    realloc through "alloc" and "free". * *    Note that this is possible due to the fact that FreeType's *    "FT_Realloc" always requests the _current_ size of the reallocated *    block as a parameter, thus avoiding memory leaks. * *    If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in *    your system's "system_flags" field, this function should update *    the "current_alloc" field of the system object. * ************************************************************************/  static  void*  ft_realloc( FT_Memory  memory,                     long       cur_size,                     long       new_size,                     void*      block )  {    (void)memory;    (void)cur_size;    return realloc( block, new_size );  }/************************************************************************ * * <FuncType> *    FT_Free_Func * * <Description> *    The memory release function type * * <Input> *    system  :: pointer to the system object *    block   :: address of block in memory * * <Note> *    If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in *    your system's "system_flags" field, this function should update *    the "current_alloc" field of the system object. * ************************************************************************/  static  void  ft_free( FT_Memory  memory,                 void*      block )  {    (void)memory;    free( block );  }  /*********************************************************************/  /*                                                                   */  /*                     RESOURCE MANAGEMENT INTERFACE                 */  /*                                                                   *//* We use the macro STREAM_File as a convenience to extract the      *//* system-specific stream handle from a given FreeType stream object */#define STREAM_File(stream)  ((void*)stream->descriptor.pointer)#undef  FT_COMPONENT#define FT_COMPONENT  trace_io  static  void  ft_close_stream( FT_Stream  stream )  {    munmap ( stream->descriptor.pointer, stream->size );            stream->descriptor.pointer = NULL;    stream->size               = 0;    stream->base               = 0;  }  extern  int  FT_New_Stream( const char*  filepathname,                      FT_Stream    stream )  {    int          file;    struct stat  stat_buf;    /* open the file */    file = open( filepathname, O_RDONLY );    if (file < 0)    {      FT_ERROR(( "FT.Unix.Open:" ));      FT_ERROR(( " could not open '%s'\n", filepathname ));      return FT_Err_Cannot_Open_Stream;    }    if (fstat( file, &stat_buf ) < 0)    {      FT_ERROR(( "FT.Unix.Open:" ));      FT_ERROR(( " could not 'fstat' file '%s'\n", filepathname ));      goto Fail_Map;    }          stream->size     = stat_buf.st_size;    stream->pos      = 0;    stream->base     = mmap( NULL,                             stream->size,                             PROT_READ,                             MAP_FILE | MAP_PRIVATE,                             file,                             0 );    if ( (long)stream->base == -1 )    {      FT_ERROR(( "FT.Unix.Open:" ));      FT_ERROR(( " Could not map file '%s'\n", filepathname ));      goto Fail_Map;    }    close(file);    stream->descriptor.pointer = stream->base;    stream->pathname.pointer   = (char*)filepathname;        stream->close = ft_close_stream;    stream->read  = 0;        FT_TRACE1(( "FT.Unix.Open:" ));    FT_TRACE1(( " opened '%s' (%d bytes) succesfully\n",                filepathname, stream->size ));    return FT_Err_Ok;      Fail_Map:    close(file);    stream->base      = NULL;    stream->size      = 0;    stream->pos       = 0;        return FT_Err_Cannot_Open_Stream;  }  extern  FT_Memory  FT_New_Memory( void )  {    FT_Memory  memory;        memory = (FT_Memory)malloc( sizeof(*memory) );    if (memory)    {      memory->user    = 0;      memory->alloc   = ft_alloc;      memory->realloc = ft_realloc;      memory->free    = ft_free;    }    return memory;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -