Home | History | Annotate | Download | only in base
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  ftmm.c                                                                 */
      4 /*                                                                         */
      5 /*    Multiple Master font support (body).                                 */
      6 /*                                                                         */
      7 /*  Copyright 1996-2001, 2003, 2004, 2009 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_MULTIPLE_MASTERS_H
     21 #include FT_INTERNAL_OBJECTS_H
     22 #include FT_SERVICE_MULTIPLE_MASTERS_H
     23 
     24 
     25   /*************************************************************************/
     26   /*                                                                       */
     27   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
     28   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
     29   /* messages during execution.                                            */
     30   /*                                                                       */
     31 #undef  FT_COMPONENT
     32 #define FT_COMPONENT  trace_mm
     33 
     34 
     35   static FT_Error
     36   ft_face_get_mm_service( FT_Face                   face,
     37                           FT_Service_MultiMasters  *aservice )
     38   {
     39     FT_Error  error;
     40 
     41 
     42     *aservice = NULL;
     43 
     44     if ( !face )
     45       return FT_Err_Invalid_Face_Handle;
     46 
     47     error = FT_Err_Invalid_Argument;
     48 
     49     if ( FT_HAS_MULTIPLE_MASTERS( face ) )
     50     {
     51       FT_FACE_LOOKUP_SERVICE( face,
     52                               *aservice,
     53                               MULTI_MASTERS );
     54 
     55       if ( *aservice )
     56         error = FT_Err_Ok;
     57     }
     58 
     59     return error;
     60   }
     61 
     62 
     63   /* documentation is in ftmm.h */
     64 
     65   FT_EXPORT_DEF( FT_Error )
     66   FT_Get_Multi_Master( FT_Face           face,
     67                        FT_Multi_Master  *amaster )
     68   {
     69     FT_Error                 error;
     70     FT_Service_MultiMasters  service;
     71 
     72 
     73     error = ft_face_get_mm_service( face, &service );
     74     if ( !error )
     75     {
     76       error = FT_Err_Invalid_Argument;
     77       if ( service->get_mm )
     78         error = service->get_mm( face, amaster );
     79     }
     80 
     81     return error;
     82   }
     83 
     84 
     85   /* documentation is in ftmm.h */
     86 
     87   FT_EXPORT_DEF( FT_Error )
     88   FT_Get_MM_Var( FT_Face      face,
     89                  FT_MM_Var*  *amaster )
     90   {
     91     FT_Error                 error;
     92     FT_Service_MultiMasters  service;
     93 
     94 
     95     error = ft_face_get_mm_service( face, &service );
     96     if ( !error )
     97     {
     98       error = FT_Err_Invalid_Argument;
     99       if ( service->get_mm_var )
    100         error = service->get_mm_var( face, amaster );
    101     }
    102 
    103     return error;
    104   }
    105 
    106 
    107   /* documentation is in ftmm.h */
    108 
    109   FT_EXPORT_DEF( FT_Error )
    110   FT_Set_MM_Design_Coordinates( FT_Face   face,
    111                                 FT_UInt   num_coords,
    112                                 FT_Long*  coords )
    113   {
    114     FT_Error                 error;
    115     FT_Service_MultiMasters  service;
    116 
    117 
    118     error = ft_face_get_mm_service( face, &service );
    119     if ( !error )
    120     {
    121       error = FT_Err_Invalid_Argument;
    122       if ( service->set_mm_design )
    123         error = service->set_mm_design( face, num_coords, coords );
    124     }
    125 
    126     return error;
    127   }
    128 
    129 
    130   /* documentation is in ftmm.h */
    131 
    132   FT_EXPORT_DEF( FT_Error )
    133   FT_Set_Var_Design_Coordinates( FT_Face    face,
    134                                  FT_UInt    num_coords,
    135                                  FT_Fixed*  coords )
    136   {
    137     FT_Error                 error;
    138     FT_Service_MultiMasters  service;
    139 
    140 
    141     error = ft_face_get_mm_service( face, &service );
    142     if ( !error )
    143     {
    144       error = FT_Err_Invalid_Argument;
    145       if ( service->set_var_design )
    146         error = service->set_var_design( face, num_coords, coords );
    147     }
    148 
    149     return error;
    150   }
    151 
    152 
    153   /* documentation is in ftmm.h */
    154 
    155   FT_EXPORT_DEF( FT_Error )
    156   FT_Set_MM_Blend_Coordinates( FT_Face    face,
    157                                FT_UInt    num_coords,
    158                                FT_Fixed*  coords )
    159   {
    160     FT_Error                 error;
    161     FT_Service_MultiMasters  service;
    162 
    163 
    164     error = ft_face_get_mm_service( face, &service );
    165     if ( !error )
    166     {
    167       error = FT_Err_Invalid_Argument;
    168       if ( service->set_mm_blend )
    169          error = service->set_mm_blend( face, num_coords, coords );
    170     }
    171 
    172     return error;
    173   }
    174 
    175 
    176   /* documentation is in ftmm.h */
    177 
    178   /* This is exactly the same as the previous function.  It exists for */
    179   /* orthogonality.                                                    */
    180 
    181   FT_EXPORT_DEF( FT_Error )
    182   FT_Set_Var_Blend_Coordinates( FT_Face    face,
    183                                 FT_UInt    num_coords,
    184                                 FT_Fixed*  coords )
    185   {
    186     FT_Error                 error;
    187     FT_Service_MultiMasters  service;
    188 
    189 
    190     error = ft_face_get_mm_service( face, &service );
    191     if ( !error )
    192     {
    193       error = FT_Err_Invalid_Argument;
    194       if ( service->set_mm_blend )
    195          error = service->set_mm_blend( face, num_coords, coords );
    196     }
    197 
    198     return error;
    199   }
    200 
    201 
    202 /* END */
    203