aflatin.h revision 81e5ff53a89b454a3984a7181516dfb4cb22187a
1f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/ 2f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 3f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* aflatin.h */ 4f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 5459306220771533750ddc5b3fcbf2cc92b445c71Werner Lemberg/* Auto-fitter hinting routines for latin writing system */ 6459306220771533750ddc5b3fcbf2cc92b445c71Werner Lemberg/* (specification). */ 7f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 8f57fc59e016217687362b6fbbc4842fab932175cWerner Lemberg/* Copyright 2003-2015 by */ 9f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 10f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 11f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* This file is part of the FreeType project, and may only be used, */ 12f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* modified, and distributed under the terms of the FreeType project */ 13f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 14f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* this file you indicate that you have read the license and */ 15f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* understand and accept it fully. */ 16f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/* */ 17f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/ 18f13516c8321b386227414be01e707563e852fc0dWerner Lemberg 19f13516c8321b386227414be01e707563e852fc0dWerner Lemberg 20d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#ifndef __AFLATIN_H__ 21d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#define __AFLATIN_H__ 22d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 23d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#include "afhints.h" 24d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 25b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 26d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_BEGIN_HEADER 278ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 2872f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg /* the `latin' writing system */ 29b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 3072f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) 31b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 3272f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg 336cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg /* constants are given with units_per_em == 2048 in mind */ 346cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg#define AF_LATIN_CONSTANT( metrics, c ) \ 35d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) 36d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg 37f9a69132a73bea7a7c1e7726789841acd8235a4bWu, Chia-I (吳佳一) 38b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 39b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 40b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 41b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** L A T I N G L O B A L M E T R I C S *****/ 42b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 43b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 44b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 45b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 46b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 47b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* 48b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg * The following declarations could be embedded in the file `aflatin.c'; 49974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg * they have been made semi-public to allow alternate writing system 50974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg * hinters to re-use some of them. 51b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg */ 52b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 53b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 540975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_TOP_BLUE( b ) \ 550975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) 56ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ 57ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) 5875efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ 5975efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) 603f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \ 613f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) 62ff9d2415a7a192520ea198187dbdb6408625e210David Turner 63b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS 16 64b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 65ff9d2415a7a192520ea198187dbdb6408625e210David Turner 6681e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ 6781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ 6881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_NEUTRAL ( 1U << 2 ) /* we have neutral blue zone */ 6981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 3 ) /* used for scale adjustment */ 7081e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg /* optimization */ 71ff9d2415a7a192520ea198187dbdb6408625e210David Turner 72ff9d2415a7a192520ea198187dbdb6408625e210David Turner 73b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinBlueRec_ 74ff9d2415a7a192520ea198187dbdb6408625e210David Turner { 75b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec ref; 76b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec shoot; 77b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg FT_UInt flags; 788ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 79ff9d2415a7a192520ea198187dbdb6408625e210David Turner } AF_LatinBlueRec, *AF_LatinBlue; 80ff9d2415a7a192520ea198187dbdb6408625e210David Turner 81d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 82b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinAxisRec_ 83d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 84ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Fixed scale; 85ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Pos delta; 868ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 876cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_UInt width_count; /* number of used widths */ 886cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ 896cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos edge_distance_threshold; /* used for creating edges */ 906cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos standard_width; /* the default stem thickness */ 916cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Bool extra_light; /* is standard width very light? */ 928ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 93b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* ignored for horizontal metrics */ 94ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_UInt blue_count; 950975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; 96ff9d2415a7a192520ea198187dbdb6408625e210David Turner 97f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Fixed org_scale; 98f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Pos org_delta; 99f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner 100d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinAxisRec, *AF_LatinAxis; 101ff9d2415a7a192520ea198187dbdb6408625e210David Turner 102ff9d2415a7a192520ea198187dbdb6408625e210David Turner 103b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinMetricsRec_ 104d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 1053f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg AF_StyleMetricsRec root; 1063f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg FT_UInt units_per_em; 1073f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg AF_LatinAxisRec axis[AF_DIMENSION_MAX]; 1088ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 109d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinMetricsRec, *AF_LatinMetrics; 110d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 111d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 112d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( FT_Error ) 113d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_init( AF_LatinMetrics metrics, 114d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_Face face ); 115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 116d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 117d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_scale( AF_LatinMetrics metrics, 118d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner AF_Scaler scaler ); 119d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1204cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) FT_LOCAL( void ) 1214cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) af_latin_metrics_init_widths( AF_LatinMetrics metrics, 122553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg FT_Face face ); 123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1248b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_LOCAL( void ) 1258b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg af_latin_metrics_check_digits( AF_LatinMetrics metrics, 1268b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_Face face ); 1278b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg 128d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 129b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 130b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 131b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 132b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** L A T I N G L Y P H A N A L Y S I S *****/ 133b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 134b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 135b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 136d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 13781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ 13881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ 13981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ 14081e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg /* adjustment */ 14181e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ 142cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 143cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 144b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ 145b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) 146cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 147b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ 148b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) 149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 150b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ 151b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) 152cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 153b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h ) \ 154b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) 155d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 156b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 157b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* 1585a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg * The next functions shouldn't normally be exported. However, other 159974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg * writing systems might like to use these functions as-is. 160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg */ 161b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 162ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_segments( AF_GlyphHints hints, 163ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 164d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 165d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 166ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_link_segments( AF_GlyphHints hints, 16771f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg FT_UInt width_count, 16871f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg AF_WidthRec* widths, 169ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 171b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 172ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_edges( AF_GlyphHints hints, 173ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 174d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 175b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 176ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_detect_features( AF_GlyphHints hints, 17771f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg FT_UInt width_count, 17871f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg AF_WidthRec* widths, 179ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 181d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */ 182d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 183d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER 184d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 185d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#endif /* __AFLATIN_H__ */ 186b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 187b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 188b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */ 189