ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ftadvanc.c
Go to the documentation of this file.
00001 /***************************************************************************/
00002 /*                                                                         */
00003 /*  ftadvanc.c                                                             */
00004 /*                                                                         */
00005 /*    Quick computation of advance widths (body).                          */
00006 /*                                                                         */
00007 /*  Copyright 2008, 2009 by                                                */
00008 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
00009 /*                                                                         */
00010 /*  This file is part of the FreeType project, and may only be used,       */
00011 /*  modified, and distributed under the terms of the FreeType project      */
00012 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
00013 /*  this file you indicate that you have read the license and              */
00014 /*  understand and accept it fully.                                        */
00015 /*                                                                         */
00016 /***************************************************************************/
00017 
00018 
00019 #include <ft2build.h>
00020 #include FT_ADVANCES_H
00021 #include FT_INTERNAL_OBJECTS_H
00022 
00023 
00024   static FT_Error
00025   _ft_face_scale_advances( FT_Face    face,
00026                            FT_Fixed*  advances,
00027                            FT_UInt    count,
00028                            FT_Int32   flags )
00029   {
00030     FT_Fixed  scale;
00031     FT_UInt   nn;
00032 
00033 
00034     if ( flags & FT_LOAD_NO_SCALE )
00035       return FT_Err_Ok;
00036 
00037     if ( face->size == NULL )
00038       return FT_Err_Invalid_Size_Handle;
00039 
00040     if ( flags & FT_LOAD_VERTICAL_LAYOUT )
00041       scale = face->size->metrics.y_scale;
00042     else
00043       scale = face->size->metrics.x_scale;
00044 
00045     /* this must be the same scaling as to get linear{Hori,Vert}Advance */
00046     /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */
00047 
00048     for ( nn = 0; nn < count; nn++ )
00049       advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
00050 
00051     return FT_Err_Ok;
00052   }
00053 
00054 
00055    /* at the moment, we can perform fast advance retrieval only in */
00056    /* the following cases:                                         */
00057    /*                                                              */
00058    /*  - unscaled load                                             */
00059    /*  - unhinted load                                             */
00060    /*  - light-hinted load                                         */
00061 
00062 #define LOAD_ADVANCE_FAST_CHECK( flags )                            \
00063           ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \
00064             FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
00065 
00066 
00067   /* documentation is in ftadvanc.h */
00068 
00069   FT_EXPORT_DEF( FT_Error )
00070   FT_Get_Advance( FT_Face    face,
00071                   FT_UInt    gindex,
00072                   FT_Int32   flags,
00073                   FT_Fixed  *padvance )
00074   {
00075     FT_Face_GetAdvancesFunc  func;
00076 
00077 
00078     if ( !face )
00079       return FT_Err_Invalid_Face_Handle;
00080 
00081     if ( gindex >= (FT_UInt)face->num_glyphs )
00082       return FT_Err_Invalid_Glyph_Index;
00083 
00084     func = face->driver->clazz->get_advances;
00085     if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
00086     {
00087       FT_Error  error;
00088 
00089 
00090       error = func( face, gindex, 1, flags, padvance );
00091       if ( !error )
00092         return _ft_face_scale_advances( face, padvance, 1, flags );
00093 
00094       if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) )
00095         return error;
00096     }
00097 
00098     return FT_Get_Advances( face, gindex, 1, flags, padvance );
00099   }
00100 
00101 
00102   /* documentation is in ftadvanc.h */
00103 
00104   FT_EXPORT_DEF( FT_Error )
00105   FT_Get_Advances( FT_Face    face,
00106                    FT_UInt    start,
00107                    FT_UInt    count,
00108                    FT_Int32   flags,
00109                    FT_Fixed  *padvances )
00110   {
00111     FT_Face_GetAdvancesFunc  func;
00112     FT_UInt                  num, end, nn;
00113     FT_Error                 error = FT_Err_Ok;
00114 
00115 
00116     if ( !face )
00117       return FT_Err_Invalid_Face_Handle;
00118 
00119     num = (FT_UInt)face->num_glyphs;
00120     end = start + count;
00121     if ( start >= num || end < start || end > num )
00122       return FT_Err_Invalid_Glyph_Index;
00123 
00124     if ( count == 0 )
00125       return FT_Err_Ok;
00126 
00127     func = face->driver->clazz->get_advances;
00128     if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
00129     {
00130       error = func( face, start, count, flags, padvances );
00131       if ( !error )
00132         goto Exit;
00133 
00134       if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) )
00135         return error;
00136     }
00137 
00138     error = FT_Err_Ok;
00139 
00140     if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
00141       return FT_Err_Unimplemented_Feature;
00142 
00143     flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
00144     for ( nn = 0; nn < count; nn++ )
00145     {
00146       error = FT_Load_Glyph( face, start + nn, flags );
00147       if ( error )
00148         break;
00149 
00150       padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
00151                       ? face->glyph->advance.y
00152                       : face->glyph->advance.x;
00153     }
00154 
00155     if ( error )
00156       return error;
00157 
00158   Exit:
00159     return _ft_face_scale_advances( face, padvances, count, flags );
00160   }
00161 
00162 
00163 /* END */

Generated on Sun May 27 2012 04:33:34 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.