David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 1 | /***************************************************************************/ |
| 2 | /* */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 3 | /* ahoptim.h */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 4 | /* */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 5 | /* FreeType auto hinting outline optimization (declaration). */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 6 | /* */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 7 | /* Copyright 2000 Catharon Productions Inc. */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 8 | /* Author: David Turner */ |
| 9 | /* */ |
| 10 | /* This file is part of the Catharon Typography Project and shall only */ |
| 11 | /* be used, modified, and distributed under the terms of the Catharon */ |
| 12 | /* Open Source License that should come with this file under the name */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 13 | /* `CatharonLicense.txt'. By continuing to use, modify, or distribute */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 14 | /* this file you indicate that you have read the license and */ |
| 15 | /* understand and accept it fully. */ |
| 16 | /* */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 17 | /* Note that this license is compatible with the FreeType license. */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 18 | /* */ |
| 19 | /***************************************************************************/ |
| 20 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 21 | |
Werner Lemberg | 90d9964 | 2000-12-09 00:45:38 +0000 | [diff] [blame^] | 22 | #ifndef __AHOPTIM_H__ |
| 23 | #define __AHOPTIM_H__ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 24 | |
Werner Lemberg | cc069be | 2000-12-08 16:17:16 +0000 | [diff] [blame] | 25 | |
| 26 | #include <ft2build.h> |
| 27 | #include FT_SOURCE_FILE(autohint,ahtypes.h) |
| 28 | |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 29 | |
David Turner | 19ed8af | 2000-12-08 02:42:29 +0000 | [diff] [blame] | 30 | FT_BEGIN_HEADER |
Werner Lemberg | c713d92 | 2000-08-01 13:17:04 +0000 | [diff] [blame] | 31 | |
| 32 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 33 | /* the maximal number of stem configurations to record */ |
| 34 | /* during optimization */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 35 | #define AH_MAX_CONFIGS 8 |
| 36 | |
| 37 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 38 | typedef struct AH_Stem_ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 39 | { |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 40 | FT_Pos pos; /* current position */ |
| 41 | FT_Pos velocity; /* current velocity */ |
| 42 | FT_Pos force; /* sum of current forces */ |
| 43 | FT_Pos width; /* normalized width */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 44 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 45 | FT_Pos min_pos; /* minimum grid position */ |
| 46 | FT_Pos max_pos; /* maximum grid position */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 47 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 48 | AH_Edge* edge1; /* left/bottom edge */ |
| 49 | AH_Edge* edge2; /* right/top edge */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 50 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 51 | FT_Pos opos; /* original position */ |
| 52 | FT_Pos owidth; /* original width */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 53 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 54 | FT_Pos min_coord; /* minimum coordinate */ |
| 55 | FT_Pos max_coord; /* maximum coordinate */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 56 | |
| 57 | } AH_Stem; |
| 58 | |
| 59 | |
| 60 | /* A spring between two stems */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 61 | typedef struct AH_Spring_ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 62 | { |
| 63 | AH_Stem* stem1; |
| 64 | AH_Stem* stem2; |
| 65 | FT_Pos owidth; /* original width */ |
| 66 | FT_Pos tension; /* current tension */ |
| 67 | |
| 68 | } AH_Spring; |
| 69 | |
| 70 | |
| 71 | /* A configuration records the position of each stem at a given time */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 72 | /* as well as the associated distortion */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 73 | typedef struct AH_Configuration_ |
| 74 | { |
| 75 | FT_Pos* positions; |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 76 | FT_Long distortion; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 77 | |
| 78 | } AH_Configuration; |
| 79 | |
| 80 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 81 | typedef struct AH_Optimizer_ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 82 | { |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 83 | FT_Memory memory; |
| 84 | AH_Outline* outline; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 85 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 86 | FT_Int num_hstems; |
| 87 | AH_Stem* horz_stems; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 88 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 89 | FT_Int num_vstems; |
| 90 | AH_Stem* vert_stems; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 91 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 92 | FT_Int num_hsprings; |
| 93 | FT_Int num_vsprings; |
| 94 | AH_Spring* horz_springs; |
| 95 | AH_Spring* vert_springs; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 96 | |
| 97 | FT_Int num_configs; |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 98 | AH_Configuration configs[AH_MAX_CONFIGS]; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 99 | FT_Pos* positions; |
| 100 | |
| 101 | /* during each pass, use these instead */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 102 | FT_Int num_stems; |
| 103 | AH_Stem* stems; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 104 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 105 | FT_Int num_springs; |
| 106 | AH_Spring* springs; |
| 107 | FT_Bool vertical; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 108 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 109 | FT_Fixed tension_scale; |
| 110 | FT_Pos tension_threshold; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 111 | |
| 112 | } AH_Optimizer; |
| 113 | |
| 114 | |
| 115 | /* loads the outline into the optimizer */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 116 | int AH_Optimizer_Init( AH_Optimizer* optimizer, |
| 117 | AH_Outline* outline, |
| 118 | FT_Memory memory ); |
| 119 | |
| 120 | |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 121 | /* compute optimal outline */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 122 | void AH_Optimizer_Compute( AH_Optimizer* optimizer ); |
| 123 | |
| 124 | |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 125 | /* release the optimization data */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 126 | void AH_Optimizer_Done( AH_Optimizer* optimizer ); |
| 127 | |
| 128 | |
David Turner | 19ed8af | 2000-12-08 02:42:29 +0000 | [diff] [blame] | 129 | FT_END_HEADER |
Werner Lemberg | c713d92 | 2000-08-01 13:17:04 +0000 | [diff] [blame] | 130 | |
Werner Lemberg | 90d9964 | 2000-12-09 00:45:38 +0000 | [diff] [blame^] | 131 | #endif /* __AHOPTIM_H__ */ |
Werner Lemberg | c3dd151 | 2000-07-26 14:11:15 +0000 | [diff] [blame] | 132 | |
| 133 | |
| 134 | /* END */ |