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/* */ 80a0c22569deab933df21127e75db5c81f724f292Werner Lemberg/* Copyright 2003-2018 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 2037412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#ifndef AFLATIN_H_ 2137412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#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 ) 560164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \ 570164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP ) 58ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ 59ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) 6075efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ 6175efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) 623f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \ 633f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) 64ff9d2415a7a192520ea198187dbdb6408625e210David Turner 65b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS 16 66b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 67ff9d2415a7a192520ea198187dbdb6408625e210David Turner 6881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ 6981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ 700164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */ 710164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg /* blue zone */ 720164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */ 730164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */ 7481e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg /* optimization */ 75ff9d2415a7a192520ea198187dbdb6408625e210David Turner 76ff9d2415a7a192520ea198187dbdb6408625e210David Turner 77b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinBlueRec_ 78ff9d2415a7a192520ea198187dbdb6408625e210David Turner { 79b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec ref; 80b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_WidthRec shoot; 81be32b168ac42e670e1a8c5c614cce4c3f8232829Philipp Knechtges FT_Pos ascender; 82be32b168ac42e670e1a8c5c614cce4c3f8232829Philipp Knechtges FT_Pos descender; 83b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg FT_UInt flags; 848ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 85ff9d2415a7a192520ea198187dbdb6408625e210David Turner } AF_LatinBlueRec, *AF_LatinBlue; 86ff9d2415a7a192520ea198187dbdb6408625e210David Turner 87d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 88b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinAxisRec_ 89d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 90ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Fixed scale; 91ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_Pos delta; 928ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 936cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_UInt width_count; /* number of used widths */ 946cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ 956cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos edge_distance_threshold; /* used for creating edges */ 966cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Pos standard_width; /* the default stem thickness */ 976cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg FT_Bool extra_light; /* is standard width very light? */ 988ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 99b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* ignored for horizontal metrics */ 100ff9d2415a7a192520ea198187dbdb6408625e210David Turner FT_UInt blue_count; 1010975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; 102ff9d2415a7a192520ea198187dbdb6408625e210David Turner 103f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Fixed org_scale; 104f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner FT_Pos org_delta; 105f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner 106d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinAxisRec, *AF_LatinAxis; 107ff9d2415a7a192520ea198187dbdb6408625e210David Turner 108ff9d2415a7a192520ea198187dbdb6408625e210David Turner 109b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg typedef struct AF_LatinMetricsRec_ 110d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner { 1113f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg AF_StyleMetricsRec root; 1123f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg FT_UInt units_per_em; 1133f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg AF_LatinAxisRec axis[AF_DIMENSION_MAX]; 1148ccb4552a965821f2e5e9913b9c600322667483cDavid Turner 115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner } AF_LatinMetricsRec, *AF_LatinMetrics; 116d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 117d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 118d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( FT_Error ) 119d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_init( AF_LatinMetrics metrics, 120d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_Face face ); 121d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 122d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner af_latin_metrics_scale( AF_LatinMetrics metrics, 124d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner AF_Scaler scaler ); 125d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1264cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) FT_LOCAL( void ) 1274cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一) af_latin_metrics_init_widths( AF_LatinMetrics metrics, 128553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg FT_Face face ); 129d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 1308b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_LOCAL( void ) 1318b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg af_latin_metrics_check_digits( AF_LatinMetrics metrics, 1328b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg FT_Face face ); 1338b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg 134d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 135b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 136b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 137b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 138b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** L A T I N G L Y P H A N A L Y S I S *****/ 139b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /***** *****/ 140b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 141b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /*************************************************************************/ 142d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 14381e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ 14481e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ 14581e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ 14681e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg /* adjustment */ 14781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ 148cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 150b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ 151b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) 152cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 153b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ 154b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) 155cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 156b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ 157b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) 158cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner 159b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h ) \ 160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) 161d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 162b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 163b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg /* 1645a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg * The next functions shouldn't normally be exported. However, other 165974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg * writing systems might like to use these functions as-is. 166b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg */ 167b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 168ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_segments( AF_GlyphHints hints, 169ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 171d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner FT_LOCAL( void ) 172ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_link_segments( AF_GlyphHints hints, 17371f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg FT_UInt width_count, 17471f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg AF_WidthRec* widths, 175ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 176d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 177b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 178ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_compute_edges( AF_GlyphHints hints, 179ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 181b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner FT_LOCAL( FT_Error ) 182ff9d2415a7a192520ea198187dbdb6408625e210David Turner af_latin_hints_detect_features( AF_GlyphHints hints, 18371f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg FT_UInt width_count, 18471f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg AF_WidthRec* widths, 185ff9d2415a7a192520ea198187dbdb6408625e210David Turner AF_Dimension dim ); 186d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 187d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */ 188d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 189d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER 190d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner 19137412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#endif /* AFLATIN_H_ */ 192b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 193b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg 194b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */ 195