Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  t42objs.c                                                              */
  4. /*                                                                         */
  5. /*    Type 42 objects manager (body).                                      */
  6. /*                                                                         */
  7. /*  Copyright 2002-2009, 2011, 2013                                        */
  8. /*  by Roberto Alameda.                                                    */
  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 "t42objs.h"
  20. #include "t42parse.h"
  21. #include "t42error.h"
  22. #include FT_INTERNAL_DEBUG_H
  23. #include FT_LIST_H
  24. #include FT_TRUETYPE_IDS_H
  25.  
  26.  
  27. #undef  FT_COMPONENT
  28. #define FT_COMPONENT  trace_t42
  29.  
  30.  
  31.   static FT_Error
  32.   T42_Open_Face( T42_Face  face )
  33.   {
  34.     T42_LoaderRec  loader;
  35.     T42_Parser     parser;
  36.     T1_Font        type1 = &face->type1;
  37.     FT_Memory      memory = face->root.memory;
  38.     FT_Error       error;
  39.  
  40.     PSAux_Service  psaux  = (PSAux_Service)face->psaux;
  41.  
  42.  
  43.     t42_loader_init( &loader, face );
  44.  
  45.     parser = &loader.parser;
  46.  
  47.     if ( FT_ALLOC( face->ttf_data, 12 ) )
  48.       goto Exit;
  49.  
  50.     error = t42_parser_init( parser,
  51.                              face->root.stream,
  52.                              memory,
  53.                              psaux);
  54.     if ( error )
  55.       goto Exit;
  56.  
  57.     error = t42_parse_dict( face, &loader,
  58.                             parser->base_dict, parser->base_len );
  59.     if ( error )
  60.       goto Exit;
  61.  
  62.     if ( type1->font_type != 42 )
  63.     {
  64.       FT_ERROR(( "T42_Open_Face: cannot handle FontType %d\n",
  65.                  type1->font_type ));
  66.       error = FT_THROW( Unknown_File_Format );
  67.       goto Exit;
  68.     }
  69.  
  70.     /* now, propagate the charstrings and glyphnames tables */
  71.     /* to the Type1 data                                    */
  72.     type1->num_glyphs = loader.num_glyphs;
  73.  
  74.     if ( !loader.charstrings.init )
  75.     {
  76.       FT_ERROR(( "T42_Open_Face: no charstrings array in face\n" ));
  77.       error = FT_THROW( Invalid_File_Format );
  78.     }
  79.  
  80.     loader.charstrings.init  = 0;
  81.     type1->charstrings_block = loader.charstrings.block;
  82.     type1->charstrings       = loader.charstrings.elements;
  83.     type1->charstrings_len   = loader.charstrings.lengths;
  84.  
  85.     /* we copy the glyph names `block' and `elements' fields; */
  86.     /* the `lengths' field must be released later             */
  87.     type1->glyph_names_block    = loader.glyph_names.block;
  88.     type1->glyph_names          = (FT_String**)loader.glyph_names.elements;
  89.     loader.glyph_names.block    = 0;
  90.     loader.glyph_names.elements = 0;
  91.  
  92.     /* we must now build type1.encoding when we have a custom array */
  93.     if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
  94.     {
  95.       FT_Int    charcode, idx, min_char, max_char;
  96.       FT_Byte*  glyph_name;
  97.  
  98.  
  99.       /* OK, we do the following: for each element in the encoding   */
  100.       /* table, look up the index of the glyph having the same name  */
  101.       /* as defined in the CharStrings array.                        */
  102.       /* The index is then stored in type1.encoding.char_index, and  */
  103.       /* the name in type1.encoding.char_name                        */
  104.  
  105.       min_char = 0;
  106.       max_char = 0;
  107.  
  108.       charcode = 0;
  109.       for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
  110.       {
  111.         FT_Byte*  char_name;
  112.  
  113.  
  114.         type1->encoding.char_index[charcode] = 0;
  115.         type1->encoding.char_name [charcode] = (char *)".notdef";
  116.  
  117.         char_name = loader.encoding_table.elements[charcode];
  118.         if ( char_name )
  119.           for ( idx = 0; idx < type1->num_glyphs; idx++ )
  120.           {
  121.             glyph_name = (FT_Byte*)type1->glyph_names[idx];
  122.             if ( ft_strcmp( (const char*)char_name,
  123.                             (const char*)glyph_name ) == 0 )
  124.             {
  125.               type1->encoding.char_index[charcode] = (FT_UShort)idx;
  126.               type1->encoding.char_name [charcode] = (char*)glyph_name;
  127.  
  128.               /* Change min/max encoded char only if glyph name is */
  129.               /* not /.notdef                                      */
  130.               if ( ft_strcmp( (const char*)".notdef",
  131.                               (const char*)glyph_name ) != 0 )
  132.               {
  133.                 if ( charcode < min_char )
  134.                   min_char = charcode;
  135.                 if ( charcode >= max_char )
  136.                   max_char = charcode + 1;
  137.               }
  138.               break;
  139.             }
  140.           }
  141.       }
  142.  
  143.       type1->encoding.code_first = min_char;
  144.       type1->encoding.code_last  = max_char;
  145.       type1->encoding.num_chars  = loader.num_chars;
  146.     }
  147.  
  148.   Exit:
  149.     t42_loader_done( &loader );
  150.     return error;
  151.   }
  152.  
  153.  
  154.   /***************** Driver Functions *************/
  155.  
  156.  
  157.   FT_LOCAL_DEF( FT_Error )
  158.   T42_Face_Init( FT_Stream      stream,
  159.                  FT_Face        t42face,       /* T42_Face */
  160.                  FT_Int         face_index,
  161.                  FT_Int         num_params,
  162.                  FT_Parameter*  params )
  163.   {
  164.     T42_Face            face  = (T42_Face)t42face;
  165.     FT_Error            error;
  166.     FT_Service_PsCMaps  psnames;
  167.     PSAux_Service       psaux;
  168.     FT_Face             root  = (FT_Face)&face->root;
  169.     T1_Font             type1 = &face->type1;
  170.     PS_FontInfo         info  = &type1->font_info;
  171.  
  172.     FT_UNUSED( num_params );
  173.     FT_UNUSED( params );
  174.     FT_UNUSED( face_index );
  175.     FT_UNUSED( stream );
  176.  
  177.  
  178.     face->ttf_face       = NULL;
  179.     face->root.num_faces = 1;
  180.  
  181.     FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
  182.     face->psnames = psnames;
  183.  
  184.     face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
  185.                                            "psaux" );
  186.     psaux = (PSAux_Service)face->psaux;
  187.     if ( !psaux )
  188.     {
  189.       FT_ERROR(( "T42_Face_Init: cannot access `psaux' module\n" ));
  190.       error = FT_THROW( Missing_Module );
  191.       goto Exit;
  192.     }
  193.  
  194.     FT_TRACE2(( "Type 42 driver\n" ));
  195.  
  196.     /* open the tokenizer, this will also check the font format */
  197.     error = T42_Open_Face( face );
  198.     if ( error )
  199.       goto Exit;
  200.  
  201.     /* if we just wanted to check the format, leave successfully now */
  202.     if ( face_index < 0 )
  203.       goto Exit;
  204.  
  205.     /* check the face index */
  206.     if ( face_index > 0 )
  207.     {
  208.       FT_ERROR(( "T42_Face_Init: invalid face index\n" ));
  209.       error = FT_THROW( Invalid_Argument );
  210.       goto Exit;
  211.     }
  212.  
  213.     /* Now load the font program into the face object */
  214.  
  215.     /* Init the face object fields */
  216.     /* Now set up root face fields */
  217.  
  218.     root->num_glyphs   = type1->num_glyphs;
  219.     root->num_charmaps = 0;
  220.     root->face_index   = 0;
  221.  
  222.     root->face_flags = FT_FACE_FLAG_SCALABLE    |
  223.                        FT_FACE_FLAG_HORIZONTAL  |
  224.                        FT_FACE_FLAG_GLYPH_NAMES;
  225.  
  226.     if ( info->is_fixed_pitch )
  227.       root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
  228.  
  229.     /* We only set this flag if we have the patented bytecode interpreter. */
  230.     /* There are no known `tricky' Type42 fonts that could be loaded with  */
  231.     /* the unpatented interpreter.                                         */
  232. #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  233.     root->face_flags |= FT_FACE_FLAG_HINTER;
  234. #endif
  235.  
  236.     /* XXX: TODO -- add kerning with .afm support */
  237.  
  238.     /* get style name -- be careful, some broken fonts only */
  239.     /* have a `/FontName' dictionary entry!                 */
  240.     root->family_name = info->family_name;
  241.     /* assume "Regular" style if we don't know better */
  242.     root->style_name = (char *)"Regular";
  243.     if ( root->family_name )
  244.     {
  245.       char*  full   = info->full_name;
  246.       char*  family = root->family_name;
  247.  
  248.  
  249.       if ( full )
  250.       {
  251.         while ( *full )
  252.         {
  253.           if ( *full == *family )
  254.           {
  255.             family++;
  256.             full++;
  257.           }
  258.           else
  259.           {
  260.             if ( *full == ' ' || *full == '-' )
  261.               full++;
  262.             else if ( *family == ' ' || *family == '-' )
  263.               family++;
  264.             else
  265.             {
  266.               if ( !*family )
  267.                 root->style_name = full;
  268.               break;
  269.             }
  270.           }
  271.         }
  272.       }
  273.     }
  274.     else
  275.     {
  276.       /* do we have a `/FontName'? */
  277.       if ( type1->font_name )
  278.         root->family_name = type1->font_name;
  279.     }
  280.  
  281.     /* no embedded bitmap support */
  282.     root->num_fixed_sizes = 0;
  283.     root->available_sizes = 0;
  284.  
  285.     /* Load the TTF font embedded in the T42 font */
  286.     {
  287.       FT_Open_Args  args;
  288.  
  289.  
  290.       args.flags       = FT_OPEN_MEMORY;
  291.       args.memory_base = face->ttf_data;
  292.       args.memory_size = face->ttf_size;
  293.  
  294.       if ( num_params )
  295.       {
  296.         args.flags     |= FT_OPEN_PARAMS;
  297.         args.num_params = num_params;
  298.         args.params     = params;
  299.       }
  300.  
  301.       error = FT_Open_Face( FT_FACE_LIBRARY( face ),
  302.                             &args, 0, &face->ttf_face );
  303.     }
  304.  
  305.     if ( error )
  306.       goto Exit;
  307.  
  308.     FT_Done_Size( face->ttf_face->size );
  309.  
  310.     /* Ignore info in FontInfo dictionary and use the info from the  */
  311.     /* loaded TTF font.  The PostScript interpreter also ignores it. */
  312.     root->bbox         = face->ttf_face->bbox;
  313.     root->units_per_EM = face->ttf_face->units_per_EM;
  314.  
  315.     root->ascender  = face->ttf_face->ascender;
  316.     root->descender = face->ttf_face->descender;
  317.     root->height    = face->ttf_face->height;
  318.  
  319.     root->max_advance_width  = face->ttf_face->max_advance_width;
  320.     root->max_advance_height = face->ttf_face->max_advance_height;
  321.  
  322.     root->underline_position  = (FT_Short)info->underline_position;
  323.     root->underline_thickness = (FT_Short)info->underline_thickness;
  324.  
  325.     /* compute style flags */
  326.     root->style_flags = 0;
  327.     if ( info->italic_angle )
  328.       root->style_flags |= FT_STYLE_FLAG_ITALIC;
  329.  
  330.     if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD )
  331.       root->style_flags |= FT_STYLE_FLAG_BOLD;
  332.  
  333.     if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL )
  334.       root->face_flags |= FT_FACE_FLAG_VERTICAL;
  335.  
  336.     {
  337.       if ( psnames )
  338.       {
  339.         FT_CharMapRec    charmap;
  340.         T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
  341.         FT_CMap_Class    clazz;
  342.  
  343.  
  344.         charmap.face = root;
  345.  
  346.         /* first of all, try to synthesize a Unicode charmap */
  347.         charmap.platform_id = TT_PLATFORM_MICROSOFT;
  348.         charmap.encoding_id = TT_MS_ID_UNICODE_CS;
  349.         charmap.encoding    = FT_ENCODING_UNICODE;
  350.  
  351.         error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
  352.         if ( error                                      &&
  353.              FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
  354.           goto Exit;
  355.         error = FT_Err_Ok;
  356.  
  357.         /* now, generate an Adobe Standard encoding when appropriate */
  358.         charmap.platform_id = TT_PLATFORM_ADOBE;
  359.         clazz               = NULL;
  360.  
  361.         switch ( type1->encoding_type )
  362.         {
  363.         case T1_ENCODING_TYPE_STANDARD:
  364.           charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
  365.           charmap.encoding_id = TT_ADOBE_ID_STANDARD;
  366.           clazz               = cmap_classes->standard;
  367.           break;
  368.  
  369.         case T1_ENCODING_TYPE_EXPERT:
  370.           charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
  371.           charmap.encoding_id = TT_ADOBE_ID_EXPERT;
  372.           clazz               = cmap_classes->expert;
  373.           break;
  374.  
  375.         case T1_ENCODING_TYPE_ARRAY:
  376.           charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
  377.           charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
  378.           clazz               = cmap_classes->custom;
  379.           break;
  380.  
  381.         case T1_ENCODING_TYPE_ISOLATIN1:
  382.           charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
  383.           charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
  384.           clazz               = cmap_classes->unicode;
  385.           break;
  386.  
  387.         default:
  388.           ;
  389.         }
  390.  
  391.         if ( clazz )
  392.           error = FT_CMap_New( clazz, NULL, &charmap, NULL );
  393.  
  394. #if 0
  395.         /* Select default charmap */
  396.         if ( root->num_charmaps )
  397.           root->charmap = root->charmaps[0];
  398. #endif
  399.       }
  400.     }
  401.   Exit:
  402.     return error;
  403.   }
  404.  
  405.  
  406.   FT_LOCAL_DEF( void )
  407.   T42_Face_Done( FT_Face  t42face )
  408.   {
  409.     T42_Face     face = (T42_Face)t42face;
  410.     T1_Font      type1;
  411.     PS_FontInfo  info;
  412.     FT_Memory    memory;
  413.  
  414.  
  415.     if ( !face )
  416.       return;
  417.  
  418.     type1  = &face->type1;
  419.     info   = &type1->font_info;
  420.     memory = face->root.memory;
  421.  
  422.     /* delete internal ttf face prior to freeing face->ttf_data */
  423.     if ( face->ttf_face )
  424.       FT_Done_Face( face->ttf_face );
  425.  
  426.     /* release font info strings */
  427.     FT_FREE( info->version );
  428.     FT_FREE( info->notice );
  429.     FT_FREE( info->full_name );
  430.     FT_FREE( info->family_name );
  431.     FT_FREE( info->weight );
  432.  
  433.     /* release top dictionary */
  434.     FT_FREE( type1->charstrings_len );
  435.     FT_FREE( type1->charstrings );
  436.     FT_FREE( type1->glyph_names );
  437.  
  438.     FT_FREE( type1->charstrings_block );
  439.     FT_FREE( type1->glyph_names_block );
  440.  
  441.     FT_FREE( type1->encoding.char_index );
  442.     FT_FREE( type1->encoding.char_name );
  443.     FT_FREE( type1->font_name );
  444.  
  445.     FT_FREE( face->ttf_data );
  446.  
  447. #if 0
  448.     /* release afm data if present */
  449.     if ( face->afm_data )
  450.       T1_Done_AFM( memory, (T1_AFM*)face->afm_data );
  451. #endif
  452.  
  453.     /* release unicode map, if any */
  454.     FT_FREE( face->unicode_map.maps );
  455.     face->unicode_map.num_maps = 0;
  456.  
  457.     face->root.family_name = 0;
  458.     face->root.style_name  = 0;
  459.   }
  460.  
  461.  
  462.   /*************************************************************************/
  463.   /*                                                                       */
  464.   /* <Function>                                                            */
  465.   /*    T42_Driver_Init                                                    */
  466.   /*                                                                       */
  467.   /* <Description>                                                         */
  468.   /*    Initializes a given Type 42 driver object.                         */
  469.   /*                                                                       */
  470.   /* <Input>                                                               */
  471.   /*    driver :: A handle to the target driver object.                    */
  472.   /*                                                                       */
  473.   /* <Return>                                                              */
  474.   /*    FreeType error code.  0 means success.                             */
  475.   /*                                                                       */
  476.   FT_LOCAL_DEF( FT_Error )
  477.   T42_Driver_Init( FT_Module  module )        /* T42_Driver */
  478.   {
  479.     T42_Driver  driver = (T42_Driver)module;
  480.     FT_Module   ttmodule;
  481.  
  482.  
  483.     ttmodule = FT_Get_Module( module->library, "truetype" );
  484.     if ( !ttmodule )
  485.     {
  486.       FT_ERROR(( "T42_Driver_Init: cannot access `truetype' module\n" ));
  487.       return FT_THROW( Missing_Module );
  488.     }
  489.  
  490.     driver->ttclazz = (FT_Driver_Class)ttmodule->clazz;
  491.  
  492.     return FT_Err_Ok;
  493.   }
  494.  
  495.  
  496.   FT_LOCAL_DEF( void )
  497.   T42_Driver_Done( FT_Module  module )
  498.   {
  499.     FT_UNUSED( module );
  500.   }
  501.  
  502.  
  503.   FT_LOCAL_DEF( FT_Error )
  504.   T42_Size_Init( FT_Size  size )         /* T42_Size */
  505.   {
  506.     T42_Size  t42size = (T42_Size)size;
  507.     FT_Face   face    = size->face;
  508.     T42_Face  t42face = (T42_Face)face;
  509.     FT_Size   ttsize;
  510.     FT_Error  error   = FT_Err_Ok;
  511.  
  512.  
  513.     error = FT_New_Size( t42face->ttf_face, &ttsize );
  514.     t42size->ttsize = ttsize;
  515.  
  516.     FT_Activate_Size( ttsize );
  517.  
  518.     return error;
  519.   }
  520.  
  521.  
  522.   FT_LOCAL_DEF( FT_Error )
  523.   T42_Size_Request( FT_Size          t42size,      /* T42_Size */
  524.                     FT_Size_Request  req )
  525.   {
  526.     T42_Size  size = (T42_Size)t42size;
  527.     T42_Face  face = (T42_Face)t42size->face;
  528.     FT_Error  error;
  529.  
  530.  
  531.     FT_Activate_Size( size->ttsize );
  532.  
  533.     error = FT_Request_Size( face->ttf_face, req );
  534.     if ( !error )
  535.       t42size->metrics = face->ttf_face->size->metrics;
  536.  
  537.     return error;
  538.   }
  539.  
  540.  
  541.   FT_LOCAL_DEF( FT_Error )
  542.   T42_Size_Select( FT_Size   t42size,         /* T42_Size */
  543.                    FT_ULong  strike_index )
  544.   {
  545.     T42_Size  size = (T42_Size)t42size;
  546.     T42_Face  face = (T42_Face)t42size->face;
  547.     FT_Error  error;
  548.  
  549.  
  550.     FT_Activate_Size( size->ttsize );
  551.  
  552.     error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index );
  553.     if ( !error )
  554.       t42size->metrics = face->ttf_face->size->metrics;
  555.  
  556.     return error;
  557.  
  558.   }
  559.  
  560.  
  561.   FT_LOCAL_DEF( void )
  562.   T42_Size_Done( FT_Size  t42size )             /* T42_Size */
  563.   {
  564.     T42_Size     size    = (T42_Size)t42size;
  565.     FT_Face      face    = t42size->face;
  566.     T42_Face     t42face = (T42_Face)face;
  567.     FT_ListNode  node;
  568.  
  569.  
  570.     node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize );
  571.     if ( node )
  572.     {
  573.       FT_Done_Size( size->ttsize );
  574.       size->ttsize = NULL;
  575.     }
  576.   }
  577.  
  578.  
  579.   FT_LOCAL_DEF( FT_Error )
  580.   T42_GlyphSlot_Init( FT_GlyphSlot  t42slot )        /* T42_GlyphSlot */
  581.   {
  582.     T42_GlyphSlot  slot    = (T42_GlyphSlot)t42slot;
  583.     FT_Face        face    = t42slot->face;
  584.     T42_Face       t42face = (T42_Face)face;
  585.     FT_GlyphSlot   ttslot;
  586.     FT_Error       error   = FT_Err_Ok;
  587.  
  588.  
  589.     if ( face->glyph == NULL )
  590.     {
  591.       /* First glyph slot for this face */
  592.       slot->ttslot = t42face->ttf_face->glyph;
  593.     }
  594.     else
  595.     {
  596.       error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot );
  597.       slot->ttslot = ttslot;
  598.     }
  599.  
  600.     return error;
  601.   }
  602.  
  603.  
  604.   FT_LOCAL_DEF( void )
  605.   T42_GlyphSlot_Done( FT_GlyphSlot  t42slot )       /* T42_GlyphSlot */
  606.   {
  607.     T42_GlyphSlot  slot = (T42_GlyphSlot)t42slot;
  608.  
  609.  
  610.     FT_Done_GlyphSlot( slot->ttslot );
  611.   }
  612.  
  613.  
  614.   static void
  615.   t42_glyphslot_clear( FT_GlyphSlot  slot )
  616.   {
  617.     /* free bitmap if needed */
  618.     ft_glyphslot_free_bitmap( slot );
  619.  
  620.     /* clear all public fields in the glyph slot */
  621.     FT_ZERO( &slot->metrics );
  622.     FT_ZERO( &slot->outline );
  623.     FT_ZERO( &slot->bitmap );
  624.  
  625.     slot->bitmap_left   = 0;
  626.     slot->bitmap_top    = 0;
  627.     slot->num_subglyphs = 0;
  628.     slot->subglyphs     = 0;
  629.     slot->control_data  = 0;
  630.     slot->control_len   = 0;
  631.     slot->other         = 0;
  632.     slot->format        = FT_GLYPH_FORMAT_NONE;
  633.  
  634.     slot->linearHoriAdvance = 0;
  635.     slot->linearVertAdvance = 0;
  636.   }
  637.  
  638.  
  639.   FT_LOCAL_DEF( FT_Error )
  640.   T42_GlyphSlot_Load( FT_GlyphSlot  glyph,
  641.                       FT_Size       size,
  642.                       FT_UInt       glyph_index,
  643.                       FT_Int32      load_flags )
  644.   {
  645.     FT_Error         error;
  646.     T42_GlyphSlot    t42slot = (T42_GlyphSlot)glyph;
  647.     T42_Size         t42size = (T42_Size)size;
  648.     FT_Driver_Class  ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz;
  649.  
  650.  
  651.     t42_glyphslot_clear( t42slot->ttslot );
  652.     error = ttclazz->load_glyph( t42slot->ttslot,
  653.                                  t42size->ttsize,
  654.                                  glyph_index,
  655.                                  load_flags | FT_LOAD_NO_BITMAP );
  656.  
  657.     if ( !error )
  658.     {
  659.       glyph->metrics = t42slot->ttslot->metrics;
  660.  
  661.       glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance;
  662.       glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance;
  663.  
  664.       glyph->format  = t42slot->ttslot->format;
  665.       glyph->outline = t42slot->ttslot->outline;
  666.  
  667.       glyph->bitmap      = t42slot->ttslot->bitmap;
  668.       glyph->bitmap_left = t42slot->ttslot->bitmap_left;
  669.       glyph->bitmap_top  = t42slot->ttslot->bitmap_top;
  670.  
  671.       glyph->num_subglyphs = t42slot->ttslot->num_subglyphs;
  672.       glyph->subglyphs     = t42slot->ttslot->subglyphs;
  673.  
  674.       glyph->control_data  = t42slot->ttslot->control_data;
  675.       glyph->control_len   = t42slot->ttslot->control_len;
  676.     }
  677.  
  678.     return error;
  679.   }
  680.  
  681.  
  682. /* END */
  683.