Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  pfrdrivr.c                                                             */
  4. /*                                                                         */
  5. /*    FreeType PFR driver interface (body).                                */
  6. /*                                                                         */
  7. /*  Copyright 2002-2004, 2006, 2008, 2010, 2011, 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 FT_INTERNAL_STREAM_H
  22. #include FT_SERVICE_PFR_H
  23. #include FT_SERVICE_XFREE86_NAME_H
  24. #include "pfrdrivr.h"
  25. #include "pfrobjs.h"
  26.  
  27. #include "pfrerror.h"
  28.  
  29.  
  30.   FT_CALLBACK_DEF( FT_Error )
  31.   pfr_get_kerning( FT_Face     pfrface,     /* PFR_Face */
  32.                    FT_UInt     left,
  33.                    FT_UInt     right,
  34.                    FT_Vector  *avector )
  35.   {
  36.     PFR_Face     face = (PFR_Face)pfrface;
  37.     PFR_PhyFont  phys = &face->phy_font;
  38.  
  39.  
  40.     pfr_face_get_kerning( pfrface, left, right, avector );
  41.  
  42.     /* convert from metrics to outline units when necessary */
  43.     if ( phys->outline_resolution != phys->metrics_resolution )
  44.     {
  45.       if ( avector->x != 0 )
  46.         avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
  47.                                             phys->metrics_resolution );
  48.  
  49.       if ( avector->y != 0 )
  50.         avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
  51.                                             phys->metrics_resolution );
  52.     }
  53.  
  54.     return FT_Err_Ok;
  55.   }
  56.  
  57.  
  58.  /*
  59.   *  PFR METRICS SERVICE
  60.   *
  61.   */
  62.  
  63.   FT_CALLBACK_DEF( FT_Error )
  64.   pfr_get_advance( FT_Face   pfrface,       /* PFR_Face */
  65.                    FT_UInt   gindex,
  66.                    FT_Pos   *anadvance )
  67.   {
  68.     PFR_Face  face  = (PFR_Face)pfrface;
  69.     FT_Error  error = FT_ERR( Invalid_Argument );
  70.  
  71.  
  72.     *anadvance = 0;
  73.  
  74.     if ( !gindex )
  75.       goto Exit;
  76.  
  77.     gindex--;
  78.  
  79.     if ( face )
  80.     {
  81.       PFR_PhyFont  phys = &face->phy_font;
  82.  
  83.  
  84.       if ( gindex < phys->num_chars )
  85.       {
  86.         *anadvance = phys->chars[gindex].advance;
  87.         error      = FT_Err_Ok;
  88.       }
  89.     }
  90.  
  91.   Exit:
  92.     return error;
  93.   }
  94.  
  95.  
  96.   FT_CALLBACK_DEF( FT_Error )
  97.   pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */
  98.                    FT_UInt   *anoutline_resolution,
  99.                    FT_UInt   *ametrics_resolution,
  100.                    FT_Fixed  *ametrics_x_scale,
  101.                    FT_Fixed  *ametrics_y_scale )
  102.   {
  103.     PFR_Face     face = (PFR_Face)pfrface;
  104.     PFR_PhyFont  phys = &face->phy_font;
  105.     FT_Fixed     x_scale, y_scale;
  106.     FT_Size      size = face->root.size;
  107.  
  108.  
  109.     if ( anoutline_resolution )
  110.       *anoutline_resolution = phys->outline_resolution;
  111.  
  112.     if ( ametrics_resolution )
  113.       *ametrics_resolution = phys->metrics_resolution;
  114.  
  115.     x_scale = 0x10000L;
  116.     y_scale = 0x10000L;
  117.  
  118.     if ( size )
  119.     {
  120.       x_scale = FT_DivFix( size->metrics.x_ppem << 6,
  121.                            phys->metrics_resolution );
  122.  
  123.       y_scale = FT_DivFix( size->metrics.y_ppem << 6,
  124.                            phys->metrics_resolution );
  125.     }
  126.  
  127.     if ( ametrics_x_scale )
  128.       *ametrics_x_scale = x_scale;
  129.  
  130.     if ( ametrics_y_scale )
  131.       *ametrics_y_scale = y_scale;
  132.  
  133.     return FT_Err_Ok;
  134.   }
  135.  
  136.  
  137.   FT_CALLBACK_TABLE_DEF
  138.   const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
  139.   {
  140.     pfr_get_metrics,
  141.     pfr_face_get_kerning,
  142.     pfr_get_advance
  143.   };
  144.  
  145.  
  146.  /*
  147.   *  SERVICE LIST
  148.   *
  149.   */
  150.  
  151.   static const FT_ServiceDescRec  pfr_services[] =
  152.   {
  153.     { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
  154.     { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
  155.     { NULL, NULL }
  156.   };
  157.  
  158.  
  159.   FT_CALLBACK_DEF( FT_Module_Interface )
  160.   pfr_get_service( FT_Module         module,
  161.                    const FT_String*  service_id )
  162.   {
  163.     FT_UNUSED( module );
  164.  
  165.     return ft_service_list_lookup( pfr_services, service_id );
  166.   }
  167.  
  168.  
  169.   FT_CALLBACK_TABLE_DEF
  170.   const FT_Driver_ClassRec  pfr_driver_class =
  171.   {
  172.     {
  173.       FT_MODULE_FONT_DRIVER     |
  174.       FT_MODULE_DRIVER_SCALABLE,
  175.  
  176.       sizeof ( FT_DriverRec ),
  177.  
  178.       "pfr",
  179.       0x10000L,
  180.       0x20000L,
  181.  
  182.       NULL,
  183.  
  184.       0,                /* FT_Module_Constructor */
  185.       0,                /* FT_Module_Destructor  */
  186.       pfr_get_service
  187.     },
  188.  
  189.     sizeof ( PFR_FaceRec ),
  190.     sizeof ( PFR_SizeRec ),
  191.     sizeof ( PFR_SlotRec ),
  192.  
  193.     pfr_face_init,
  194.     pfr_face_done,
  195.     0,                  /* FT_Size_InitFunc */
  196.     0,                  /* FT_Size_DoneFunc */
  197.     pfr_slot_init,
  198.     pfr_slot_done,
  199.  
  200.     pfr_slot_load,
  201.  
  202.     pfr_get_kerning,
  203.     0,                  /* FT_Face_AttachFunc      */
  204.     0,                  /* FT_Face_GetAdvancesFunc */
  205.     0,                  /* FT_Size_RequestFunc     */
  206.     0,                  /* FT_Size_SelectFunc      */
  207.   };
  208.  
  209.  
  210. /* END */
  211.