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

📄 winfnt.c

📁 a very goog book
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  winfnt.c                                                               *//*                                                                         *//*    FreeType font driver for Windows FNT/FON files                       *//*                                                                         *//*  Copyright 1996-2001, 2002 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 <ft2build.h>#include FT_INTERNAL_DEBUG_H#include FT_INTERNAL_STREAM_H#include FT_INTERNAL_OBJECTS_H#include FT_INTERNAL_FNT_TYPES_H#include "winfnt.h"#include "fnterrs.h"  /*************************************************************************/  /*                                                                       */  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */  /* messages during execution.                                            */  /*                                                                       */#undef  FT_COMPONENT#define FT_COMPONENT  trace_winfnt  static  const FT_Frame_Field  winmz_header_fields[] =  {#undef  FT_STRUCTURE#define FT_STRUCTURE  WinMZ_HeaderRec    FT_FRAME_START( 64 ),      FT_FRAME_USHORT_LE ( magic ),      FT_FRAME_SKIP_BYTES( 29 * 2 ),      FT_FRAME_ULONG_LE  ( lfanew ),    FT_FRAME_END  };  static  const FT_Frame_Field  winne_header_fields[] =  {#undef  FT_STRUCTURE#define FT_STRUCTURE  WinNE_HeaderRec    FT_FRAME_START( 40 ),      FT_FRAME_USHORT_LE ( magic ),      FT_FRAME_SKIP_BYTES( 34 ),      FT_FRAME_USHORT_LE ( resource_tab_offset ),      FT_FRAME_USHORT_LE ( rname_tab_offset ),    FT_FRAME_END  };  static  const FT_Frame_Field  winfnt_header_fields[] =  {#undef  FT_STRUCTURE#define FT_STRUCTURE  WinFNT_HeaderRec    FT_FRAME_START( 134 ),      FT_FRAME_USHORT_LE( version ),      FT_FRAME_ULONG_LE ( file_size ),      FT_FRAME_BYTES    ( copyright, 60 ),      FT_FRAME_USHORT_LE( file_type ),      FT_FRAME_USHORT_LE( nominal_point_size ),      FT_FRAME_USHORT_LE( vertical_resolution ),      FT_FRAME_USHORT_LE( horizontal_resolution ),      FT_FRAME_USHORT_LE( ascent ),      FT_FRAME_USHORT_LE( internal_leading ),      FT_FRAME_USHORT_LE( external_leading ),      FT_FRAME_BYTE     ( italic ),      FT_FRAME_BYTE     ( underline ),      FT_FRAME_BYTE     ( strike_out ),      FT_FRAME_USHORT_LE( weight ),      FT_FRAME_BYTE     ( charset ),      FT_FRAME_USHORT_LE( pixel_width ),      FT_FRAME_USHORT_LE( pixel_height ),      FT_FRAME_BYTE     ( pitch_and_family ),      FT_FRAME_USHORT_LE( avg_width ),      FT_FRAME_USHORT_LE( max_width ),      FT_FRAME_BYTE     ( first_char ),      FT_FRAME_BYTE     ( last_char ),      FT_FRAME_BYTE     ( default_char ),      FT_FRAME_BYTE     ( break_char ),      FT_FRAME_USHORT_LE( bytes_per_row ),      FT_FRAME_ULONG_LE ( device_offset ),      FT_FRAME_ULONG_LE ( face_name_offset ),      FT_FRAME_ULONG_LE ( bits_pointer ),      FT_FRAME_ULONG_LE ( bits_offset ),      FT_FRAME_BYTE     ( reserved ),      FT_FRAME_ULONG_LE ( flags ),      FT_FRAME_USHORT_LE( A_space ),      FT_FRAME_USHORT_LE( B_space ),      FT_FRAME_USHORT_LE( C_space ),      FT_FRAME_USHORT_LE( color_table_offset ),      FT_FRAME_BYTES    ( reserved, 4 ),    FT_FRAME_END  };  static void  fnt_font_done( FNT_Font   font,                 FT_Stream  stream )  {    if ( font->fnt_frame )      FT_FRAME_RELEASE( font->fnt_frame );    font->fnt_size  = 0;    font->fnt_frame = 0;  }  static FT_Error  fnt_font_load( FNT_Font   font,                 FT_Stream  stream )  {    FT_Error       error;    WinFNT_Header  header = &font->header;    /* first of all, read the FNT header */    if ( FT_STREAM_SEEK( font->offset )                   ||         FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) )      goto Exit;    /* check header */    if ( header->version != 0x200 &&         header->version != 0x300 )    {      FT_TRACE2(( "[not a valid FNT file]\n" ));      error = FNT_Err_Unknown_File_Format;      goto Exit;    }    if ( header->file_type & 1 )    {      FT_TRACE2(( "[can't handle vector FNT fonts]\n" ));      error = FNT_Err_Unknown_File_Format;      goto Exit;    }    /* small fixup -- some fonts have the `pixel_width' field set to 0 */    if ( header->pixel_width == 0 )      header->pixel_width = header->pixel_height;    /* this is a FNT file/table, we now extract its frame */    if ( FT_STREAM_SEEK( font->offset )                         ||         FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) )      goto Exit;  Exit:    return error;  }  static void  fnt_face_done_fonts( FNT_Face  face )  {    FT_Memory  memory = FT_FACE( face )->memory;    FT_Stream  stream = FT_FACE( face )->stream;    FNT_Font   cur    = face->fonts;    FNT_Font   limit  = cur + face->num_fonts;    for ( ; cur < limit; cur++ )      fnt_font_done( cur, stream );    FT_FREE( face->fonts );    face->num_fonts = 0;  }  static FT_Error  fnt_face_get_dll_fonts( FNT_Face  face )  {    FT_Error         error;    FT_Stream        stream = FT_FACE( face )->stream;    FT_Memory        memory = FT_FACE( face )->memory;    WinMZ_HeaderRec  mz_header;    face->fonts     = 0;    face->num_fonts = 0;    /* does it begin with a MZ header? */    if ( FT_STREAM_SEEK( 0 )                                 ||         FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) )      goto Exit;    error = FNT_Err_Unknown_File_Format;    if ( mz_header.magic == WINFNT_MZ_MAGIC )    {      /* yes, now look for a NE header in the file */      WinNE_HeaderRec  ne_header;      if ( FT_STREAM_SEEK( mz_header.lfanew )                  ||           FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) )        goto Exit;      error = FNT_Err_Unknown_File_Format;      if ( ne_header.magic == WINFNT_NE_MAGIC )      {        /* good, now look in the resource table for each FNT resource */        FT_ULong   res_offset = mz_header.lfanew +                                ne_header.resource_tab_offset;        FT_UShort  size_shift;        FT_UShort  font_count  = 0;        FT_ULong   font_offset = 0;        if ( FT_STREAM_SEEK( res_offset ) ||             FT_FRAME_ENTER( ne_header.rname_tab_offset -                             ne_header.resource_tab_offset ) )          goto Exit;        size_shift = FT_GET_USHORT_LE();        for (;;)        {          FT_UShort  type_id, count;          type_id = FT_GET_USHORT_LE();          if ( !type_id )            break;          count = FT_GET_USHORT_LE();          if ( type_id == 0x8008 )          {            font_count  = count;            font_offset = (FT_ULong)( FT_STREAM_POS() + 4 +                                      ( stream->cursor - stream->limit ) );            break;          }          stream->cursor += 4 + count * 12;        }        FT_FRAME_EXIT();        if ( !font_count || !font_offset )        {          FT_TRACE2(( "this file doesn't contain any FNT resources!\n" ));          error = FNT_Err_Unknown_File_Format;          goto Exit;        }        if ( FT_STREAM_SEEK( font_offset )           ||             FT_NEW_ARRAY( face->fonts, font_count ) )          goto Exit;        face->num_fonts = font_count;        if ( FT_FRAME_ENTER( (FT_Long)font_count * 12 ) )          goto Exit;        /* now read the offset and position of each FNT font */        {          FNT_Font  cur   = face->fonts;          FNT_Font  limit = cur + font_count;          for ( ; cur < limit; cur++ )          {            cur->offset     = (FT_ULong)FT_GET_USHORT_LE() << size_shift;            cur->fnt_size   = (FT_ULong)FT_GET_USHORT_LE() << size_shift;            cur->size_shift = size_shift;            stream->cursor += 8;          }        }        FT_FRAME_EXIT();        /* finally, try to load each font there */        {          FNT_Font  cur   = face->fonts;          FNT_Font  limit = cur + font_count;          for ( ; cur < limit; cur++ )          {            error = fnt_font_load( cur, stream );            if ( error )              goto Fail;          }        }      }    }  Fail:    if ( error )      fnt_face_done_fonts( face );  Exit:    return error;  }#ifdef FT_CONFIG_OPTION_USE_CMAPS  typedef struct  FNT_CMapRec_  {    FT_CMapRec  cmap;    FT_UInt32   first;    FT_UInt32   count;  } FNT_CMapRec, *FNT_CMap;  static FT_Error  fnt_cmap_init( FNT_CMap  cmap )  {    FNT_Face  face = (FNT_Face)FT_CMAP_FACE( cmap );    FNT_Font  font = face->fonts;    cmap->first = (FT_UInt32)  font->header.first_char;    cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 );    return 0;  }  static FT_UInt  fnt_cmap_char_index( FNT_CMap   cmap,                       FT_UInt32  char_code )  {    FT_UInt  gindex = 0;    char_code -= cmap->first;    if ( char_code < cmap->count )      gindex = char_code + 1;    return gindex;  }  static FT_UInt  fnt_cmap_char_next( FNT_CMap    cmap,                      FT_UInt32  *pchar_code )  {    FT_UInt    gindex = 0;    FT_UInt32  result = 0;    FT_UInt32  char_code = *pchar_code + 1;    if ( char_code <= cmap->first )    {      result = cmap->first;      gindex = 1;    }    else    {      char_code -= cmap->first;      if ( char_code < cmap->count )      {        result = cmap->first + char_code;        gindex = char_code + 1;      }    }    *pchar_code = result;    return gindex;  }  static FT_CMap_ClassRec  fnt_cmap_class_rec =  {    sizeof ( FNT_CMapRec ),    (FT_CMap_InitFunc)     fnt_cmap_init,    (FT_CMap_DoneFunc)     NULL,    (FT_CMap_CharIndexFunc)fnt_cmap_char_index,

⌨️ 快捷键说明

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