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