1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* afcjk.h */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Auto-fitter hinting routines for CJK script (specification). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/* Copyright 2006, 2007, 2011, 2012 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" 23c3ee10bfa1f76a18500b487de9c85757375b48f3David '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 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the CJK-specific script class */ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang AF_DECLARE_SCRIPT_CLASS( af_cjk_script_class ) 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* CJK (global) metrics management */ 34c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 35c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* 36c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner * CJK glyphs tend to fill the square. So we have both vertical and 37c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner * horizontal blue zones. But some glyphs have flat bounding strokes that 38c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner * leave some space between neighbour glyphs. 39c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner */ 40c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner enum 41c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 42c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_TOP, 43c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_BOTTOM, 44c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_LEFT, 45c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_RIGHT, 46c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 47c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_MAX 48c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }; 49c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 50c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 51c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#define AF_CJK_MAX_WIDTHS 16 52c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#define AF_CJK_MAX_BLUES AF_CJK_BLUE_MAX 53c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 54c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 55c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner enum 56c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 57c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_ACTIVE = 1 << 0, 58c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_IS_TOP = 1 << 1, 59c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_IS_RIGHT = 1 << 2, 60c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_ADJUSTMENT = 1 << 3, /* used for scale adjustment */ 61c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* optimization */ 62c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJK_BLUE_FLAG_MAX 63c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner }; 64c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 65c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 66c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner typedef struct AF_CJKBlueRec_ 67c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 68c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_WidthRec ref; 69c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_WidthRec shoot; /* undershoot */ 70c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt flags; 71c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 72c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } AF_CJKBlueRec, *AF_CJKBlue; 73c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 74c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 75c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner typedef struct AF_CJKAxisRec_ 76c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 77c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Fixed scale; 78c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Pos delta; 79c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 80c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt width_count; 81c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; 82c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Pos edge_distance_threshold; 83c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Pos standard_width; 84c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool extra_light; 85c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 86c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner /* used for horizontal metrics too for CJK */ 87c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Bool control_overshoot; 88c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt blue_count; 89c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJKBlueRec blues[AF_CJK_BLUE_MAX]; 90c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 91c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Fixed org_scale; 92c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Pos org_delta; 93c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 94c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } AF_CJKAxisRec, *AF_CJKAxis; 95c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 96c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 97c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner typedef struct AF_CJKMetricsRec_ 98c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner { 99c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_ScriptMetricsRec root; 100c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_UInt units_per_em; 101c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJKAxisRec axis[AF_DIMENSION_MAX]; 102c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 103c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner } AF_CJKMetricsRec, *AF_CJKMetrics; 104c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifdef AF_CONFIG_OPTION_CJK 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 108c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_metrics_init( AF_CJKMetrics metrics, 109c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Face face ); 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( void ) 112c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_metrics_scale( AF_CJKMetrics metrics, 113c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_Scaler scaler ); 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 116c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_hints_init( AF_GlyphHints hints, 117c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJKMetrics metrics ); 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 120c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_hints_apply( AF_GlyphHints hints, 121c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Outline* outline, 122c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner AF_CJKMetrics metrics ); 123c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 124a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang /* shared; called from afindic.c */ 125c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_LOCAL( void ) 126c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_metrics_check_digits( AF_CJKMetrics metrics, 127c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_Face face ); 128c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 129c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner FT_LOCAL( void ) 130c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner af_cjk_metrics_init_widths( AF_CJKMetrics metrics, 131a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang FT_Face face ); 132a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif /* AF_CONFIG_OPTION_CJK */ 133c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __AFCJK_H__ */ 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 143