10a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/***************************************************************************/ 20a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* */ 30a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* ftadvanc.c */ 40a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* */ 50a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* Quick computation of advance widths (body). */ 60a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* */ 741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/* Copyright 2008, 2009, 2011 by */ 80a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 90a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* */ 100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* this file you indicate that you have read the license and */ 140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* understand and accept it fully. */ 150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* */ 160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/***************************************************************************/ 170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ADVANCES_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _ft_face_scale_advances( FT_Face face, 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed* advances, 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Int32 flags ) 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed scale; 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt nn; 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( flags & FT_LOAD_NO_SCALE ) 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->size == NULL ) 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Size_Handle; 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( flags & FT_LOAD_VERTICAL_LAYOUT ) 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project scale = face->size->metrics.y_scale; 420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project else 430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project scale = face->size->metrics.x_scale; 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* this must be the same scaling as to get linear{Hori,Vert}Advance */ 460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ 470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project for ( nn = 0; nn < count; nn++ ) 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return FT_Err_Ok; 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* at the moment, we can perform fast advance retrieval only in */ 560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* the following cases: */ 570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* */ 580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* - unscaled load */ 590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* - unhinted load */ 600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* - light-hinted load */ 610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#define LOAD_ADVANCE_FAST_CHECK( flags ) \ 630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ 640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* documentation is in ftadvanc.h */ 680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Get_Advance( FT_Face face, 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt gindex, 720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Int32 flags, 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed *padvance ) 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face_GetAdvancesFunc func; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !face ) 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Face_Handle; 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( gindex >= (FT_UInt)face->num_glyphs ) 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Glyph_Index; 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project func = face->driver->clazz->get_advances; 850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func( face, gindex, 1, flags, padvance ); 910a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !error ) 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return _ft_face_scale_advances( face, padvance, 1, flags ); 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 940a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Get_Advances( face, gindex, 1, flags, padvance ); 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* documentation is in ftadvanc.h */ 1030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Get_Advances( FT_Face face, 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt start, 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 1080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Int32 flags, 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed *padvances ) 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face_GetAdvancesFunc func; 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt num, end, nn; 1130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Error error = FT_Err_Ok; 1140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !face ) 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Face_Handle; 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project num = (FT_UInt)face->num_glyphs; 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end = start + count; 1210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( start >= num || end < start || end > num ) 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Glyph_Index; 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( count == 0 ) 1250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return FT_Err_Ok; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project func = face->driver->clazz->get_advances; 1280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = func( face, start, count, flags, padvances ); 1310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !error ) 13241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier return _ft_face_scale_advances( face, padvances, count, flags ); 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project error = FT_Err_Ok; 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Unimplemented_Feature; 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 143295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; 1440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project for ( nn = 0; nn < count; nn++ ) 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project error = FT_Load_Glyph( face, start + nn, flags ); 1470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( error ) 1480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project break; 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 15041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* scale from 26.6 to 16.16 */ 1510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) 15241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier ? face->glyph->advance.y << 10 15341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier : face->glyph->advance.x << 10; 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 15641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier return error; 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 1600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project/* END */ 161