aflatin.h revision 3f542498b2c3d480238bd14fad76e1c3ef83f1b4
1f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/ 2f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 3f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* aflatin.h */ 4f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 5f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* Auto-fitter hinting routines for latin script (specification). */ 6f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg/* Copyright 2003-2007, 2009, 2011-2013 by */ 8f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 10f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* This file is part of the FreeType project, and may only be used, */ 11f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* modified, and distributed under the terms of the FreeType project */ 12f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* this file you indicate that you have read the license and */ 14f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* understand and accept it fully. */ 15f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 16f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/ 17f13516c8321b386227414be01e707563e852fc0dWerner Lemberg 18f13516c8321b386227414be01e707563e852fc0dWerner Lemberg 19d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#ifndef __AFLATIN_H__ 20d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#define __AFLATIN_H__ 21d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 22d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#include "afhints.h" 23d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 24b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 25d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_BEGIN_HEADER 268ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 2772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg /* the `latin' writing system */ 28b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 2972f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) 30b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 3172f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg 3272f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg /* the latin-specific script classes */ 3372f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg 3472f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_SCRIPT_CLASS( af_latn_script_class ) /* XXX */ 35371f5c3b9d49fe82b05d763198a7606f9c9c689dWerner Lemberg AF_DECLARE_SCRIPT_CLASS( af_hebr_script_class ) 3672f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg#if 0 3772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_SCRIPT_CLASS( af_armn_script_class ) 3872f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_SCRIPT_CLASS( af_cyrl_script_class ) 3972f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_SCRIPT_CLASS( af_grek_script_class ) 4072f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg#endif 41b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 42b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 436cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg /* constants are given with units_per_em == 2048 in mind */ 446cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg#define AF_LATIN_CONSTANT( metrics, c ) \ 45d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) 46d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg 47f9a69132a73bea7a7c1e7726789841acd8235a4bWu, Chia-I (吳佳一) 48b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 49b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 50b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 51b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** L A T I N G L O B A L M E T R I C S *****/ 52b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 53b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 54b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 55b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 56b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 57b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* 58b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg * The following declarations could be embedded in the file `aflatin.c'; 59b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg * they have been made semi-public to allow alternate script hinters to 60b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg * re-use some of them. 61b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg */ 62b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 63b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 640975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_TOP_BLUE( b ) \ 650975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) 660975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_SMALL_TOP_BLUE( b ) \ 670975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SMALL_TOP ) 683f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \ 693f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) 70ff9d2415a7a192520ea198187dbdb6408625e210David Turner 71b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS 16 72b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 73ff9d2415a7a192520ea198187dbdb6408625e210David Turner 74ff9d2415a7a192520ea198187dbdb6408625e210David Turner enum 75ff9d2415a7a192520ea198187dbdb6408625e210David Turner { 766cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_LATIN_BLUE_ACTIVE = 1 << 0, /* set if zone height is <= 3/4px */ 776cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_LATIN_BLUE_TOP = 1 << 1, /* result of AF_LATIN_IS_TOP_BLUE */ 786cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_LATIN_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ 796cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg /* optimization */ 80cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner AF_LATIN_BLUE_FLAG_MAX 81ff9d2415a7a192520ea198187dbdb6408625e210David Turner }; 82ff9d2415a7a192520ea198187dbdb6408625e210David Turner 83ff9d2415a7a192520ea198187dbdb6408625e210David Turner 84b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinBlueRec_ 85ff9d2415a7a192520ea198187dbdb6408625e210David Turner { 86b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec ref; 87b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec shoot; 88b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg FT_UInt flags; 898ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 90ff9d2415a7a192520ea198187dbdb6408625e210David Turner } AF_LatinBlueRec, *AF_LatinBlue; 91ff9d2415a7a192520ea198187dbdb6408625e210David Turner 92d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 93b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinAxisRec_ 94d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 95ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Fixed scale; 96ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Pos delta; 978ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 986cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_UInt width_count; /* number of used widths */ 996cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ 1006cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos edge_distance_threshold; /* used for creating edges */ 1016cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos standard_width; /* the default stem thickness */ 1026cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Bool extra_light; /* is standard width very light? */ 1038ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 104b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* ignored for horizontal metrics */ 105ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_UInt blue_count; 1060975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; 107ff9d2415a7a192520ea198187dbdb6408625e210David Turner 108f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Fixed org_scale; 109f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Pos org_delta; 110f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner 111d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinAxisRec, *AF_LatinAxis; 112ff9d2415a7a192520ea198187dbdb6408625e210David Turner 113ff9d2415a7a192520ea198187dbdb6408625e210David Turner 114b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinMetricsRec_ 115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 116b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_ScriptMetricsRec root; 117b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg FT_UInt units_per_em; 118b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_LatinAxisRec axis[AF_DIMENSION_MAX]; 1198ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 120d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinMetricsRec, *AF_LatinMetrics; 121d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 122d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( FT_Error ) 124d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_init( AF_LatinMetrics metrics, 125d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_Face face ); 126d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 127d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 128d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_scale( AF_LatinMetrics metrics, 129d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner AF_Scaler scaler ); 130d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1314cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) FT_LOCAL( void ) 1324cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) af_latin_metrics_init_widths( AF_LatinMetrics metrics, 133553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg FT_Face face ); 134d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1358b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_LOCAL( void ) 1368b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg af_latin_metrics_check_digits( AF_LatinMetrics metrics, 1378b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_Face face ); 1388b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg 139d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 140b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 141b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 142b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 143b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** L A T I N G L Y P H A N A L Y S I S *****/ 144b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 145b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 146b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 147d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 148cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner enum 149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner { 150f13516c8321b386227414be01e707563e852fc0dWerner Lemberg AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ 151f13516c8321b386227414be01e707563e852fc0dWerner Lemberg AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ 152f13516c8321b386227414be01e707563e852fc0dWerner Lemberg AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ 153f13516c8321b386227414be01e707563e852fc0dWerner Lemberg /* adjustment */ 154f13516c8321b386227414be01e707563e852fc0dWerner Lemberg AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ 155f13516c8321b386227414be01e707563e852fc0dWerner Lemberg /* rendering */ 156cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner }; 157cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 158cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 159b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ 160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) 161cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 162b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ 163b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) 164cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 165b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ 166b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) 167cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 168b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h ) \ 169b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) 170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 171b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 172b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* 1735a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg * The next functions shouldn't normally be exported. However, other 1745a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg * scripts might like to use these functions as-is. 175b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg */ 176b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 177ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_segments( AF_GlyphHints hints, 178ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 179d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 181ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_link_segments( AF_GlyphHints hints, 182ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 183d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 184b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 185ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_edges( AF_GlyphHints hints, 186ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 187d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 188b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 189ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_detect_features( AF_GlyphHints hints, 190ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 191d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 192d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */ 193d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 194d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER 195d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 196d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#endif /* __AFLATIN_H__ */ 197b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 198b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 199b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */ 200