Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  cffcmap.c                                                              */
  4. /*                                                                         */
  5. /*    CFF character mapping table (cmap) support (body).                   */
  6. /*                                                                         */
  7. /*  Copyright 2002-2007, 2010, 2013 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. #include <ft2build.h>
  20. #include FT_INTERNAL_DEBUG_H
  21. #include "cffcmap.h"
  22. #include "cffload.h"
  23.  
  24. #include "cfferrs.h"
  25.  
  26.  
  27.   /*************************************************************************/
  28.   /*************************************************************************/
  29.   /*****                                                               *****/
  30.   /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
  31.   /*****                                                               *****/
  32.   /*************************************************************************/
  33.   /*************************************************************************/
  34.  
  35.   FT_CALLBACK_DEF( FT_Error )
  36.   cff_cmap_encoding_init( CFF_CMapStd  cmap )
  37.   {
  38.     TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
  39.     CFF_Font      cff      = (CFF_Font)face->extra.data;
  40.     CFF_Encoding  encoding = &cff->encoding;
  41.  
  42.  
  43.     cmap->gids  = encoding->codes;
  44.  
  45.     return 0;
  46.   }
  47.  
  48.  
  49.   FT_CALLBACK_DEF( void )
  50.   cff_cmap_encoding_done( CFF_CMapStd  cmap )
  51.   {
  52.     cmap->gids  = NULL;
  53.   }
  54.  
  55.  
  56.   FT_CALLBACK_DEF( FT_UInt )
  57.   cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
  58.                                 FT_UInt32    char_code )
  59.   {
  60.     FT_UInt  result = 0;
  61.  
  62.  
  63.     if ( char_code < 256 )
  64.       result = cmap->gids[char_code];
  65.  
  66.     return result;
  67.   }
  68.  
  69.  
  70.   FT_CALLBACK_DEF( FT_UInt32 )
  71.   cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
  72.                                FT_UInt32    *pchar_code )
  73.   {
  74.     FT_UInt    result    = 0;
  75.     FT_UInt32  char_code = *pchar_code;
  76.  
  77.  
  78.     *pchar_code = 0;
  79.  
  80.     if ( char_code < 255 )
  81.     {
  82.       FT_UInt  code = (FT_UInt)(char_code + 1);
  83.  
  84.  
  85.       for (;;)
  86.       {
  87.         if ( code >= 256 )
  88.           break;
  89.  
  90.         result = cmap->gids[code];
  91.         if ( result != 0 )
  92.         {
  93.           *pchar_code = code;
  94.           break;
  95.         }
  96.  
  97.         code++;
  98.       }
  99.     }
  100.     return result;
  101.   }
  102.  
  103.  
  104.   FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
  105.     sizeof ( CFF_CMapStdRec ),
  106.  
  107.     (FT_CMap_InitFunc)     cff_cmap_encoding_init,
  108.     (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
  109.     (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
  110.     (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
  111.  
  112.     NULL, NULL, NULL, NULL, NULL
  113.   )
  114.  
  115.  
  116.   /*************************************************************************/
  117.   /*************************************************************************/
  118.   /*****                                                               *****/
  119.   /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
  120.   /*****                                                               *****/
  121.   /*************************************************************************/
  122.   /*************************************************************************/
  123.  
  124.   FT_CALLBACK_DEF( const char* )
  125.   cff_sid_to_glyph_name( TT_Face  face,
  126.                          FT_UInt  idx )
  127.   {
  128.     CFF_Font     cff     = (CFF_Font)face->extra.data;
  129.     CFF_Charset  charset = &cff->charset;
  130.     FT_UInt      sid     = charset->sids[idx];
  131.  
  132.  
  133.     return cff_index_get_sid_string( cff, sid );
  134.   }
  135.  
  136.  
  137.   FT_CALLBACK_DEF( FT_Error )
  138.   cff_cmap_unicode_init( PS_Unicodes  unicodes )
  139.   {
  140.     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
  141.     FT_Memory           memory  = FT_FACE_MEMORY( face );
  142.     CFF_Font            cff     = (CFF_Font)face->extra.data;
  143.     CFF_Charset         charset = &cff->charset;
  144.     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
  145.  
  146.  
  147.     /* can't build Unicode map for CID-keyed font */
  148.     /* because we don't know glyph names.         */
  149.     if ( !charset->sids )
  150.       return FT_THROW( No_Unicode_Glyph_Name );
  151.  
  152.     return psnames->unicodes_init( memory,
  153.                                    unicodes,
  154.                                    cff->num_glyphs,
  155.                                    (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
  156.                                    (PS_FreeGlyphNameFunc)NULL,
  157.                                    (FT_Pointer)face );
  158.   }
  159.  
  160.  
  161.   FT_CALLBACK_DEF( void )
  162.   cff_cmap_unicode_done( PS_Unicodes  unicodes )
  163.   {
  164.     FT_Face    face   = FT_CMAP_FACE( unicodes );
  165.     FT_Memory  memory = FT_FACE_MEMORY( face );
  166.  
  167.  
  168.     FT_FREE( unicodes->maps );
  169.     unicodes->num_maps = 0;
  170.   }
  171.  
  172.  
  173.   FT_CALLBACK_DEF( FT_UInt )
  174.   cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
  175.                                FT_UInt32    char_code )
  176.   {
  177.     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
  178.     CFF_Font            cff     = (CFF_Font)face->extra.data;
  179.     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
  180.  
  181.  
  182.     return psnames->unicodes_char_index( unicodes, char_code );
  183.   }
  184.  
  185.  
  186.   FT_CALLBACK_DEF( FT_UInt32 )
  187.   cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
  188.                               FT_UInt32   *pchar_code )
  189.   {
  190.     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
  191.     CFF_Font            cff     = (CFF_Font)face->extra.data;
  192.     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
  193.  
  194.  
  195.     return psnames->unicodes_char_next( unicodes, pchar_code );
  196.   }
  197.  
  198.  
  199.   FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
  200.     sizeof ( PS_UnicodesRec ),
  201.  
  202.     (FT_CMap_InitFunc)     cff_cmap_unicode_init,
  203.     (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
  204.     (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
  205.     (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
  206.  
  207.     NULL, NULL, NULL, NULL, NULL
  208.   )
  209.  
  210. /* END */
  211.