1 /**************************************************************************** 2 Copyright (C) 1987-2015 by Jeffery P. Hansen 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License along 15 with this program; if not, write to the Free Software Foundation, Inc., 16 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17 18 Last edit by hansen on Sun May 1 15:58:51 2005 19 ****************************************************************************/ 20 #include <stdio.h> 21 #include <ctype.h> 22 #include <sys/time.h> 23 #include <stdarg.h> 24 #include "tkgate.h" 25 26 static short fontmetrics_Helvetica[]; 27 static short fontmetrics_HelveticaBold[]; 28 static short fontmetrics_HelveticaOblique[]; 29 static short fontmetrics_HelveticaBoldOblique[]; 30 static short fontmetrics_TimesRoman[]; 31 static short fontmetrics_TimesBold[]; 32 static short fontmetrics_TimesItalic[]; 33 static short fontmetrics_TimesBoldItalic[]; 34 static short fontmetrics_Symbol[]; 35 short fontmetrics_Courier = 600; 36 short fontmetrics_Kanji = 1200; 37 38 char *psFontNameTable[FF_MAX][FP_MAX] = { 39 {"Courier", "Courier-Bold", "Courier-Italic", "Courier-BoldItalic"}, 40 {"Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique"}, 41 {"Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic"}, 42 {"Symbol", "Symbol", "Symbol", "Symbol"}, 43 {"Ryumin-Light-H", "Ryumin-Light-H", "Ryumin-Light-H", "Ryumin-Light-H"} 44 }; 45 46 47 short *psFontWidthTable[FF_MAX][FP_MAX] = { 48 {0,0,0,0}, 49 {fontmetrics_Helvetica,fontmetrics_HelveticaBold,fontmetrics_HelveticaOblique,fontmetrics_HelveticaBoldOblique}, 50 {fontmetrics_TimesRoman,fontmetrics_TimesBold,fontmetrics_TimesItalic,fontmetrics_TimesBoldItalic}, 51 {fontmetrics_Symbol,fontmetrics_Symbol,fontmetrics_Symbol,fontmetrics_Symbol}, 52 {0,0,0,0}, 53 }; 54 55 /*****************************************************************************/ 56 /* Font Metric Data **********************************************************/ 57 /*****************************************************************************/ 58 59 static short fontmetrics_Helvetica[] = { 60 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 61 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 62 278, 278, 278, 278, 278, 278, 355, 556, 556, 889, 667, 221, 333, 333, 63 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 64 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 65 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 66 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 67 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 68 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 69 584, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 70 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 71 278, 278, 278, 278, 278, 278, 278, 333, 556, 556, 167, 556, 556, 556, 72 556, 191, 333, 556, 333, 333, 500, 500, 278, 556, 556, 556, 278, 278, 73 537, 350, 222, 333, 333, 556, 1000, 1000, 278, 611, 278, 333, 333, 74 333, 333, 333, 333, 333, 333, 278, 333, 333, 278, 333, 333, 333, 1000, 75 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 76 278, 278, 1000, 278, 370, 278, 278, 278, 278, 556, 778, 1000, 365, 77 278, 278, 278, 278, 278, 889, 278, 278, 278, 278, 278, 278, 222, 611, 78 944, 611, 278, 278, 278, 278, 79 }; 80 81 static short fontmetrics_HelveticaBold[] = { 82 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 83 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 84 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 85 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 86 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 87 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 88 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 89 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 278, 90 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 91 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 92 278, 333, 556, 556, 167, 556, 556, 556, 556, 238, 500, 556, 333, 333, 611, 611, 93 278, 556, 556, 556, 278, 278, 556, 350, 278, 500, 500, 556,1000,1000, 278, 611, 94 278, 333, 333, 333, 333, 333, 333, 333, 333, 278, 333, 333, 278, 333, 333, 333, 95 1000,278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 96 278,1000, 278, 370, 278, 278, 278, 278, 611, 778,1000, 365, 278, 278, 278, 278, 97 278, 889, 278, 278, 278, 278, 278, 278, 278, 611, 944, 611, 278, 278, 278, 278, 98 }; 99 100 static short fontmetrics_HelveticaOblique[] = { 101 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 102 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 103 278, 278, 278, 278, 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 104 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 105 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 106 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 107 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 108 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 109 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 110 584, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 111 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 112 278, 278, 278, 278, 278, 278, 278, 333, 556, 556, 167, 556, 556, 556, 113 556, 191, 333, 556, 333, 333, 500, 500, 278, 556, 556, 556, 278, 278, 114 537, 350, 222, 333, 333, 556, 1000, 1000, 278, 611, 278, 333, 333, 115 333, 333, 333, 333, 333, 333, 278, 333, 333, 278, 333, 333, 333, 1000, 116 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 117 278, 278, 1000, 278, 370, 278, 278, 278, 278, 556, 778, 1000, 365, 118 278, 278, 278, 278, 278, 889, 278, 278, 278, 278, 278, 278, 222, 611, 119 944, 611, 278, 278, 278, 278, 120 }; 121 122 static short fontmetrics_HelveticaBoldOblique[] = { 123 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 124 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 125 278, 278, 278, 278, 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 126 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 127 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 128 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 129 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 130 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 131 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 132 584, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 133 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 134 278, 278, 278, 278, 278, 278, 278, 333, 556, 556, 167, 556, 556, 556, 135 556, 238, 500, 556, 333, 333, 611, 611, 278, 556, 556, 556, 278, 278, 136 556, 350, 278, 500, 500, 556, 1000, 1000, 278, 611, 278, 333, 333, 137 333, 333, 333, 333, 333, 333, 278, 333, 333, 278, 333, 333, 333, 1000, 138 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 139 278, 278, 1000, 278, 370, 278, 278, 278, 278, 611, 778, 1000, 365, 140 278, 278, 278, 278, 278, 889, 278, 278, 278, 278, 278, 278, 278, 611, 141 944, 611, 278, 278, 278, 278, 142 }; 143 144 static short fontmetrics_TimesRoman[] = { 145 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 146 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 147 250, 250, 250, 250, 250, 333, 408, 500, 500, 833, 778, 333, 333, 333, 148 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 149 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 150 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 151 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 152 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 153 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 154 541, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 155 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 156 250, 250, 250, 250, 250, 250, 250, 333, 500, 500, 167, 500, 500, 500, 157 500, 180, 444, 500, 333, 333, 556, 556, 250, 500, 500, 500, 250, 250, 158 453, 350, 333, 444, 444, 500, 1000, 1000, 250, 444, 250, 333, 333, 159 333, 333, 333, 333, 333, 333, 250, 333, 333, 250, 333, 333, 333, 1000, 160 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 161 250, 250, 889, 250, 276, 250, 250, 250, 250, 611, 722, 889, 310, 250, 162 250, 250, 250, 250, 667, 250, 250, 250, 278, 250, 250, 278, 500, 722, 163 500, 250, 250, 250, 250, 164 }; 165 166 static short fontmetrics_TimesBold[] = { 167 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 168 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 169 250, 250, 250, 250, 250, 333, 555, 500, 500, 1000, 833, 333, 333, 333, 170 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 171 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 172 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 173 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 174 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 175 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 176 520, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 177 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 178 250, 250, 250, 250, 250, 250, 250, 333, 500, 500, 167, 500, 500, 500, 179 500, 278, 500, 500, 333, 333, 556, 556, 250, 500, 500, 500, 250, 250, 180 540, 350, 333, 500, 500, 500, 1000, 1000, 250, 500, 250, 333, 333, 181 333, 333, 333, 333, 333, 333, 250, 333, 333, 250, 333, 333, 333, 1000, 182 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 183 250, 250, 1000, 250, 300, 250, 250, 250, 250, 667, 778, 1000, 330, 184 250, 250, 250, 250, 250, 722, 250, 250, 250, 278, 250, 250, 278, 500, 185 722, 556, 250, 250, 250, 250, 186 }; 187 188 static short fontmetrics_TimesItalic[] = { 189 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 190 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 191 250, 250, 250, 250, 250, 333, 420, 500, 500, 833, 778, 333, 333, 333, 192 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 193 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 194 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 195 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 196 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 197 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 198 541, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 199 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 200 250, 250, 250, 250, 250, 250, 250, 389, 500, 500, 167, 500, 500, 500, 201 500, 214, 556, 500, 333, 333, 500, 500, 250, 500, 500, 500, 250, 250, 202 523, 350, 333, 556, 556, 500, 889, 1000, 250, 500, 250, 333, 333, 333, 203 333, 333, 333, 333, 333, 250, 333, 333, 250, 333, 333, 333, 889, 250, 204 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 205 250, 889, 250, 276, 250, 250, 250, 250, 556, 722, 944, 310, 250, 250, 206 250, 250, 250, 667, 250, 250, 250, 278, 250, 250, 278, 500, 667, 500, 207 250, 250, 250, 250, 208 }; 209 210 static short fontmetrics_TimesBoldItalic[] = { 211 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 212 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 213 250, 250, 250, 250, 250, 389, 555, 500, 500, 833, 778, 333, 333, 333, 214 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 215 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 216 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 217 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 218 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 219 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 220 570, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 221 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 222 250, 250, 250, 250, 250, 250, 250, 389, 500, 500, 167, 500, 500, 500, 223 500, 278, 500, 500, 333, 333, 556, 556, 250, 500, 500, 500, 250, 250, 224 500, 350, 333, 500, 500, 500, 1000, 1000, 250, 500, 250, 333, 333, 225 333, 333, 333, 333, 333, 333, 250, 333, 333, 250, 333, 333, 333, 1000, 226 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 227 250, 250, 944, 250, 266, 250, 250, 250, 250, 611, 722, 944, 300, 250, 228 250, 250, 250, 250, 722, 250, 250, 250, 278, 250, 250, 278, 500, 722, 229 500, 250, 250, 250, 250, 230 }; 231 232 static short fontmetrics_Symbol[] = { 233 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 234 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 235 250, 250, 250, 250, 250, 333, 713, 500, 549, 833, 778, 439, 333, 333, 236 500, 549, 250, 549, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 237 500, 500, 278, 278, 549, 549, 549, 444, 549, 722, 667, 722, 612, 611, 238 763, 603, 722, 333, 631, 722, 686, 889, 722, 722, 768, 741, 556, 592, 239 611, 690, 439, 768, 645, 795, 611, 333, 863, 333, 658, 500, 500, 631, 240 549, 549, 494, 439, 521, 411, 603, 329, 603, 549, 549, 576, 521, 549, 241 549, 521, 549, 603, 439, 576, 713, 686, 493, 686, 494, 480, 200, 480, 242 549, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 243 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 244 250, 250, 250, 250, 250, 250, 762, 620, 247, 549, 167, 713, 500, 753, 245 753, 753, 753, 1042, 987, 603, 987, 603, 400, 549, 411, 549, 549, 713, 246 494, 460, 549, 549, 549, 549, 1000, 603, 1000, 658, 823, 686, 795, 247 987, 768, 768, 823, 768, 768, 713, 713, 713, 713, 713, 713, 713, 768, 248 713, 790, 790, 890, 823, 549, 250, 713, 603, 603, 1042, 987, 603, 987, 249 603, 494, 329, 790, 790, 786, 713, 384, 384, 384, 384, 384, 384, 494, 250 494, 494, 494, 250, 329, 274, 686, 686, 686, 384, 384, 384, 384, 384, 251 384, 494, 494, 494, 250, 252 }; 253 254