2
* drv_comic.c - A font driver for font composing like japanese comics.
3
* by Hirotsugu Kakugawa
5
* 24 Feb 1997 First version.
6
* 26 Feb 1997 Added 'query_font_type'.
7
* 6 Aug 1997 VFlib 3.3 Changed API.
8
* 3 Feb 1998 VFlib 3.4 Changed API.
9
* 1 Sep 1998 Added capabilities symbol-font, alpha-numeric-font,
10
* hirakana-font, katakana-font, greek-font, cyrillic-font,
12
* 24 Nov 1998 Added get_fontbbx1() and get_fontbbx2().
13
* 9 Dec 1999 Fixed a bug in debug_on().
17
* Copyright (C) 1997-1998 Hirotsugu Kakugawa.
18
* All rights reserved.
20
* This file is part of the VFlib Library. This library is free
21
* software; you can redistribute it and/or modify it under the terms of
22
* the GNU Library General Public License as published by the Free
23
* Software Foundation; either version 2 of the License, or (at your
24
* option) any later version. This library is distributed in the hope
25
* that it will be useful, but WITHOUT ANY WARRANTY; without even the
26
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
27
* PURPOSE. See the GNU Library General Public License for more details.
28
* You should have received a copy of the GNU Library General Public
29
* License along with this library; if not, write to the Free Software
30
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
34
* "kanji-font" cabability:
35
* a font entry name for Kanji font.
36
* "kana-font" cabability:
37
* a font entry name for Kana, Alphabets, Numerals font.
39
* This driver assumes character set is JIS X-0208 1990, and
40
* encoding is JIS style. A glyph for a character whose code point
41
* is CODE_POINT is determinted by the code point value:
42
* (1) Case (CODE_POINT < 0x3021):
43
* --- A glyph for a character of CODE_POINT of a font
44
* given by "kana-font" capability.
46
* --- A glyph for a character of CODE_POINT of a font
47
* given by "kanji-font" capability.
48
* Note that character set and encoding of font entries given
49
* by "kanji-font" and "kana-font" capabilties must be JIS X 0208
60
#include "VFlib-3_6.h"
90
typedef struct s_font_comic *FONT_COMIC;
93
Private SEXP_STRING default_point_size;
94
Private double v_default_point_size;
95
Private SEXP_STRING default_pixel_size;
96
Private double v_default_pixel_size;
97
Private SEXP_STRING default_dpi;
98
Private double v_default_dpi_x, v_default_dpi_y;
99
Private SEXP_ALIST default_properties;
100
Private SEXP_ALIST default_variables;
101
Private SEXP_STRING default_debug_mode;
104
Private int comic_create(VF_FONT,char*,char*,int,SEXP);
105
Private int comic_close(VF_FONT);
106
Private int comic_get_metric1(VF_FONT,long,VF_METRIC1,
108
Private int comic_get_metric2(VF_FONT,long,VF_METRIC2,
110
Private int comic_get_fontbbx1(VF_FONT,double,double,
111
double*,double*,double*,double*);
112
Private int comic_get_fontbbx2(VF_FONT,double,double,
113
int*,int*,int*,int*);
114
Private VF_BITMAP comic_get_bitmap1(VF_FONT,long,double,double);
115
Private VF_BITMAP comic_get_bitmap2(VF_FONT,long,double,double);
116
Private VF_OUTLINE comic_get_outline(VF_FONT,long,double,double);
117
Private char* comic_get_font_prop(VF_FONT,char*);
118
Private int comic_query_font_type(VF_FONT,long);
119
Private void release_mem(FONT_COMIC);
120
Private int font_mapping(FONT_COMIC,long);
121
Private int debug_on(char type);
125
VF_Init_Driver_Comic(void)
127
struct s_capability_table ct[10];
131
/* VF_CAPE_POINT_SIZE */
132
ct[z].cap = VF_CAPE_POINT_SIZE; ct[z].type = CAPABILITY_STRING;
133
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_point_size;
134
/* VF_CAPE_PIXEL_SIZE */
135
ct[z].cap = VF_CAPE_PIXEL_SIZE; ct[z].type = CAPABILITY_STRING;
136
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_pixel_size;
138
ct[z].cap = VF_CAPE_DPI; ct[z].type = CAPABILITY_STRING;
139
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_dpi;
140
/* VF_CAPE_PROPERTIES */
141
ct[z].cap = VF_CAPE_PROPERTIES; ct[z].type = CAPABILITY_ALIST;
142
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_properties;
143
/* VF_CAPE_VARIABLE_VALUES */
144
ct[z].cap = VF_CAPE_VARIABLE_VALUES; ct[z].type = CAPABILITY_ALIST;
145
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_variables;
147
ct[z].cap = VF_CAPE_DEBUG; ct[z].type = CAPABILITY_STRING;
148
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &default_debug_mode;
150
ct[z].cap = NULL; ct[z].type = 0; ct[z].ess = 0; ct[z++].val = NULL;
153
if (vf_cap_GetParsedClassDefault(FONTCLASS_NAME_COMIC, ct, NULL, NULL)
154
== VFLIBCAP_PARSED_ERROR)
157
v_default_point_size = -1;
158
if (default_point_size != NULL)
159
v_default_point_size = atof(vf_sexp_get_cstring(default_point_size));
161
v_default_pixel_size = -1;
162
if (default_pixel_size != NULL)
163
v_default_pixel_size = atof(vf_sexp_get_cstring(default_pixel_size));
165
v_default_dpi_x = -1;
166
v_default_dpi_y = -1;
167
if (default_dpi != NULL)
168
v_default_dpi_x = v_default_dpi_y = atof(vf_sexp_get_cstring(default_dpi));
170
VF_InstallFontDriver(FONTCLASS_NAME_COMIC,
171
(DRIVER_FUNC_TYPE)comic_create);
178
comic_create(VF_FONT font, char *font_class,
179
char *font_name, int implicit, SEXP entry)
181
FONT_COMIC font_comic;
183
SEXP cap_point, cap_pixel;
184
SEXP cap_mag, cap_dpi, cap_props;
186
struct s_capability_table ct[20];
190
/* VF_CAPE_FONT_CLASS */
191
ct[z].cap = VF_CAPE_FONT_CLASS; ct[z].type = CAPABILITY_STRING;
192
ct[z].ess = CAPABILITY_ESSENTIAL; ct[z++].val = NULL;
193
/* VF_CAPE_COMIC_KANJI_FONT */
194
ct[z].cap = VF_CAPE_COMIC_KANJI_FONT; ct[z].type = CAPABILITY_STRING;
195
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_KANJI];
196
/* VF_CAPE_COMIC_KANA_FONT */
197
ct[z].cap = VF_CAPE_COMIC_KANA_FONT; ct[z].type = CAPABILITY_STRING;
198
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_KANA];
199
/* VF_CAPE_COMIC_SYMBOL_FONT */
200
ct[z].cap = VF_CAPE_COMIC_SYMBOL_FONT; ct[z].type = CAPABILITY_STRING;
201
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_SYMBOL];
202
/* VF_CAPE_COMIC_ALNUM_FONT */
203
ct[z].cap = VF_CAPE_COMIC_ALNUM_FONT; ct[z].type = CAPABILITY_STRING;
204
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_ALNUM];
205
/* VF_CAPE_COMIC_HIRAKANA_FONT */
206
ct[z].cap = VF_CAPE_COMIC_HIRAKANA_FONT; ct[z].type = CAPABILITY_STRING;
207
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_HIRAKANA];
208
/* VF_CAPE_COMIC_KATAKANA_FONT */
209
ct[z].cap = VF_CAPE_COMIC_KATAKANA_FONT; ct[z].type = CAPABILITY_STRING;
210
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_KATAKANA];
211
/* VF_CAPE_COMIC_GREEK_FONT */
212
ct[z].cap = VF_CAPE_COMIC_GREEK_FONT; ct[z].type = CAPABILITY_STRING;
213
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_GREEK];
214
/* VF_CAPE_COMIC_CYRILLIC_FONT */
215
ct[z].cap = VF_CAPE_COMIC_CYRILLIC_FONT; ct[z].type = CAPABILITY_STRING;
216
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_CYRILLIC];
217
/* VF_CAPE_COMIC_KEISEN_FONT */
218
ct[z].cap = VF_CAPE_COMIC_KEISEN_FONT; ct[z].type = CAPABILITY_STRING;
219
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_ch[I_KEISEN];
220
/* VF_CAPE_POINT_SIZE */
221
ct[z].cap = VF_CAPE_POINT_SIZE; ct[z].type = CAPABILITY_STRING;
222
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_point;
223
/* VF_CAPE_PIXEL_SIZE */
224
ct[z].cap = VF_CAPE_PIXEL_SIZE; ct[z].type = CAPABILITY_STRING;
225
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_pixel;
227
ct[z].cap = VF_CAPE_DPI; ct[z].type = CAPABILITY_STRING;
228
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_dpi;
230
ct[z].cap = VF_CAPE_MAG; ct[z].type = CAPABILITY_STRING;
231
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_mag;
232
/* VF_CAPE_PROPERTIES */
233
ct[z].cap = VF_CAPE_PROPERTIES; ct[z].type = CAPABILITY_ALIST;
234
ct[z].ess = CAPABILITY_OPTIONAL; ct[z++].val = &cap_props;
236
ct[z].cap = NULL; ct[z].type = 0; ct[z].ess = 0; ct[z++].val = NULL;
239
/* No support for implicit fonts */
243
/* Only supports explicit fonts */
244
if (vf_cap_GetParsedFontEntry(entry, font_name, ct, default_variables, NULL)
245
== VFLIBCAP_PARSED_ERROR)
248
font->font_type = -1; /* Use comic_query_font_type() */
249
font->get_metric1 = comic_get_metric1;
250
font->get_metric2 = comic_get_metric2;
251
font->get_fontbbx1 = comic_get_fontbbx1;
252
font->get_fontbbx2 = comic_get_fontbbx2;
253
font->get_bitmap1 = comic_get_bitmap1;
254
font->get_bitmap2 = comic_get_bitmap2;
255
font->get_outline = comic_get_outline;
256
font->get_font_prop = comic_get_font_prop;
257
font->query_font_type = comic_query_font_type;
258
font->close = comic_close;
260
ALLOC_IF_ERR(font_comic, struct s_font_comic){
261
vf_error = VF_ERR_NO_MEMORY;
264
if ((font_comic->font_name = vf_strdup(font_name)) == NULL){
265
vf_error = VF_ERR_NO_MEMORY;
270
font_comic->point_size = v_default_point_size;
271
font_comic->pixel_size = v_default_pixel_size;
272
font_comic->dpi_x = v_default_dpi_x;
273
font_comic->dpi_y = v_default_dpi_y;
274
font_comic->mag = 1.0;
275
for (i = 0; i < I_N; i++)
276
font_comic->sub_fid[i] = -1;
277
font_comic->props = NULL;
280
if (cap_point != NULL)
281
font_comic->point_size = atof(vf_sexp_get_cstring(cap_point));
282
if (cap_pixel != NULL)
283
font_comic->pixel_size = atof(vf_sexp_get_cstring(cap_pixel));
284
if (cap_dpi != NULL){
285
font_comic->dpi_x = atof(vf_sexp_get_cstring(cap_dpi));
286
font_comic->dpi_y = atof(vf_sexp_get_cstring(cap_dpi));
288
if (cap_props != NULL)
289
font_comic->props = cap_props;
292
if (font->mode == 1){
293
for (i = 0; i < I_N; i++){
294
if ((cap_ch[i] != NULL)
295
&& ((font_comic->sub_fid[i]
296
= VF_OpenFont1(vf_sexp_get_cstring(cap_ch[i]),
297
font_comic->dpi_x, font_comic->dpi_y,
298
font_comic->point_size,
299
font->mag_x * font_comic->mag,
300
font->mag_y * font_comic->mag)) < 0)){
304
} else if (font->mode == 2){
305
for (i = 0; i < I_N; i++){
306
if ((cap_ch[i] != NULL)
307
&& ((font_comic->sub_fid[i]
308
= VF_OpenFont2(vf_sexp_get_cstring(cap_ch[i]),
309
font_comic->pixel_size,
310
font->mag_x * font_comic->mag,
311
font->mag_y * font_comic->mag)) < 0)){
316
fprintf(stderr, "VFlib: internal error in comic_create()\n");
320
font->private = font_comic;
321
for (i = 0; i < I_N; i++){
322
if (cap_ch[i] != NULL)
323
vf_sexp_free(&cap_ch[i]);
325
vf_sexp_free4(&cap_point, &cap_pixel, &cap_mag, &cap_dpi);
330
for (i = 0; i < I_N; i++){
331
if (cap_ch[i] != NULL)
332
vf_sexp_free(&cap_ch[i]);
334
vf_sexp_free4(&cap_point, &cap_pixel, &cap_mag, &cap_dpi);
335
vf_error = VF_ERR_NO_FONT_ENTRY;
336
release_mem(font_comic);
342
comic_close(VF_FONT font)
344
release_mem((FONT_COMIC)(font->private));
351
release_mem(FONT_COMIC font_comic)
355
if (font_comic != NULL){
356
vf_free(font_comic->font_name);
357
vf_sexp_free1(&font_comic->props);
358
for (i = 0; i < I_N; i++){
359
if (font_comic->sub_fid[i] >= 0)
360
VF_CloseFont(font_comic->sub_fid[i]);
368
comic_get_metric1(VF_FONT font, long code_point, VF_METRIC1 metric,
369
double mag_x, double mag_y)
371
FONT_COMIC font_comic;
375
fprintf(stderr, "VFlib internal error: in comic_get_metric1()\n");
379
if ((font_comic = (FONT_COMIC)font->private) == NULL){
380
fprintf(stderr, "VFlib internal error in comic class.\n");
383
if ((fid = font_mapping(font_comic, code_point)) < 0)
386
VF_GetMetric1(fid, code_point, metric, mag_x, mag_y);
393
comic_get_fontbbx1(VF_FONT font, double mag_x, double mag_y,
394
double *w_p, double *h_p, double *xoff_p, double *yoff_p)
396
FONT_COMIC font_comic;
398
double w, h, xoff, yoff;
400
if ((font_comic = (FONT_COMIC)font->private) == NULL){
401
fprintf(stderr, "VFlib internal error in comic class.\n");
405
*w_p = *h_p = *xoff_p = *yoff_p = 0;
406
w = h = xoff = yoff = 0;
407
for (i = 0; i < I_N; i++){
408
if (font_comic->sub_fid[i] < 0)
410
if (VF_GetFontBoundingBox1(font_comic->sub_fid[i],
411
mag_x, mag_y, &w, &h, &xoff, &yoff) < 0)
427
comic_get_bitmap1(VF_FONT font, long code_point,
428
double mag_x, double mag_y)
430
FONT_COMIC font_comic;
433
if ((font_comic = (FONT_COMIC)font->private) == NULL){
434
fprintf(stderr, "VFlib internal error in comic class.\n");
437
if ((fid = font_mapping(font_comic, code_point)) < 0)
440
return VF_GetBitmap1(fid, code_point, mag_x, mag_y);
445
comic_get_outline(VF_FONT font, long code_point,
446
double mag_x, double mag_y)
448
FONT_COMIC font_comic;
451
if ((font_comic = (FONT_COMIC)font->private) == NULL){
452
fprintf(stderr, "VFlib internal error in comic class.\n");
455
if ((fid = font_mapping(font_comic, code_point)) < 0)
458
return VF_GetOutline(fid, code_point, mag_x, mag_y);
463
comic_get_metric2(VF_FONT font, long code_point, VF_METRIC2 metric,
464
double mag_x, double mag_y)
466
FONT_COMIC font_comic;
469
if ((font_comic = (FONT_COMIC)font->private) == NULL){
470
fprintf(stderr, "VFlib internal error in comic class.\n");
473
if ((fid = font_mapping(font_comic, code_point)) < 0)
476
VF_GetMetric2(fid, code_point, metric, mag_x, mag_y);
482
comic_get_fontbbx2(VF_FONT font, double mag_x, double mag_y,
483
int*w_p, int *h_p, int *xoff_p, int *yoff_p)
485
FONT_COMIC font_comic;
486
int w, h, xoff, yoff;
489
if ((font_comic = (FONT_COMIC)font->private) == NULL){
490
fprintf(stderr, "VFlib internal error in comic class.\n");
494
*w_p = *h_p = *xoff_p = *yoff_p = 0;
495
w = h = xoff = yoff = 0;
496
for (i = 0; i < I_N; i++){
497
if (font_comic->sub_fid[i] < 0)
499
if (VF_GetFontBoundingBox2(font_comic->sub_fid[i],
500
mag_x, mag_y, &w, &h, &xoff, &yoff) < 0)
517
comic_get_bitmap2(VF_FONT font, long code_point,
518
double mag_x, double mag_y)
520
FONT_COMIC font_comic;
523
if ((font_comic = (FONT_COMIC)font->private) == NULL){
524
fprintf(stderr, "VFlib internal error in comic class.\n");
527
if ((fid = font_mapping(font_comic, code_point)) < 0)
530
return VF_GetBitmap2(fid, code_point, mag_x, mag_y);
535
comic_get_font_prop(VF_FONT font, char *prop_name)
537
FONT_COMIC font_comic;
540
if ((font_comic = (FONT_COMIC)font->private) == NULL){
541
fprintf(stderr, "VFlib internal error in comic class.\n");
544
/* Get prop for Kanji font, not Kana font */
545
if ((fid = font_mapping(font_comic, (long)0x3021)) < 0)
548
return VF_GetFontProp(fid, prop_name);
553
comic_query_font_type(VF_FONT font, long code_point)
555
FONT_COMIC font_comic;
558
if ((font_comic = (FONT_COMIC)font->private) == NULL){
559
fprintf(stderr, "VFlib internal error in comic class.\n");
562
if ((fid = font_mapping(font_comic, code_point)) < 0)
565
return VF_QueryFontType(fid, code_point);
570
font_mapping(FONT_COMIC font_comic, long code_point)
575
code_hi = code_point / 0x100;
577
if ((code_hi < 0x21) || (0x78 < code_hi)){
578
vf_error = VF_ERR_ILL_CODE_POINT;
584
fid = font_comic->sub_fid[I_KANJI]; break;
587
alt = font_comic->sub_fid[I_KANA];
588
fid = font_comic->sub_fid[I_SYMBOL]; break;
590
alt = font_comic->sub_fid[I_KANA];
591
fid = font_comic->sub_fid[I_ALNUM]; break;
593
alt = font_comic->sub_fid[I_KANA];
594
fid = font_comic->sub_fid[I_HIRAKANA]; break;
596
alt = font_comic->sub_fid[I_KANA];
597
fid = font_comic->sub_fid[I_KATAKANA]; break;
599
alt = font_comic->sub_fid[I_KANA];
600
fid = font_comic->sub_fid[I_GREEK]; break;
602
alt = font_comic->sub_fid[I_KANA];
603
fid = font_comic->sub_fid[I_CYRILLIC]; break;
605
alt = font_comic->sub_fid[I_KANA];
606
fid = font_comic->sub_fid[I_KEISEN]; break;
613
printf("VFlib Japanese Comic: Code Point: 0x%lx, FID: %d\n",
625
if (default_debug_mode == NULL)
627
if ((p = vf_sexp_get_cstring(default_debug_mode)) == NULL)