1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* afcjk.h */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 59c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/* Auto-fitter hinting routines for CJK writing system (specification). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/* Copyright 2006, 2007, 2011-2014 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef __AFCJK_H__ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __AFCJK_H__ 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afhints.h" 23aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#include "aflatin.h" 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_BEGIN_HEADER 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* the CJK-specific writing system */ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*************************************************************************/ 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*************************************************************************/ 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /***** *****/ 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /***** C J K G L O B A L M E T R I C S *****/ 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /***** *****/ 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*************************************************************************/ 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /*************************************************************************/ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 42aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 43aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* 44aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner * CJK glyphs tend to fill the square. So we have both vertical and 45aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner * horizontal blue zones. But some glyphs have flat bounding strokes that 46aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner * leave some space between neighbour glyphs. 47aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner */ 48aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_TOP_BLUE( b ) \ 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_HORIZ_BLUE( b ) \ 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE 54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#define AF_CJK_MAX_WIDTHS 16 56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner enum 59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_CJK_BLUE_ACTIVE = 1 << 0, /* set if zone height is <= 3/4px */ 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_CJK_BLUE_TOP = 1 << 1, /* result of AF_CJK_IS_TOP_BLUE */ 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_CJK_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* optimization */ 64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_CJK_BLUE_FLAG_MAX 65aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner }; 66aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 67aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 68aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner typedef struct AF_CJKBlueRec_ 69aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 70aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_WidthRec ref; 71aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_WidthRec shoot; /* undershoot */ 72aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UInt flags; 73aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 74aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } AF_CJKBlueRec, *AF_CJKBlue; 75aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 76aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 77aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner typedef struct AF_CJKAxisRec_ 78aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 79aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Fixed scale; 80aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Pos delta; 81aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UInt width_count; /* number of used widths */ 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Pos edge_distance_threshold; /* used for creating edges */ 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Pos standard_width; /* the default stem thickness */ 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Bool extra_light; /* is standard width very light? */ 87aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 88aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* used for horizontal metrics too for CJK */ 89aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Bool control_overshoot; 90aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UInt blue_count; 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; 92aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 93aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Fixed org_scale; 94aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Pos org_delta; 95aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 96aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } AF_CJKAxisRec, *AF_CJKAxis; 97aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 98aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 99aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner typedef struct AF_CJKMetricsRec_ 100aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 1019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod AF_StyleMetricsRec root; 1029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod FT_UInt units_per_em; 1039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod AF_CJKAxisRec axis[AF_DIMENSION_MAX]; 104aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 105aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } AF_CJKMetricsRec, *AF_CJKMetrics; 106aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef AF_CONFIG_OPTION_CJK 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 110aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_metrics_init( AF_CJKMetrics metrics, 111aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Face face ); 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( void ) 114aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_metrics_scale( AF_CJKMetrics metrics, 115aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_Scaler scaler ); 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 118aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_hints_init( AF_GlyphHints hints, 119aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_CJKMetrics metrics ); 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 122aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_hints_apply( AF_GlyphHints hints, 123aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Outline* outline, 124aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner AF_CJKMetrics metrics ); 125aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* shared; called from afindic.c */ 127aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_LOCAL( void ) 128aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_metrics_check_digits( AF_CJKMetrics metrics, 129aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Face face ); 130aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 131aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_LOCAL( void ) 132aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner af_cjk_metrics_init_widths( AF_CJKMetrics metrics, 133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Face face ); 134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* AF_CONFIG_OPTION_CJK */ 135aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __AFCJK_H__ */ 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 145