1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
|
/* $Xorg: speedo.h,v 1.3 2000/08/17 19:46:27 cpqbld Exp $ */
/*
Copyright 1989-1991, Bitstream Inc., Cambridge, MA.
You are hereby granted permission under all Bitstream propriety rights to
use, copy, modify, sublicense, sell, and redistribute the Bitstream Speedo
software and the Bitstream Charter outline font for any purpose and without
restrictions; provided, that this notice is left intact on all copies of such
software or font and that Bitstream's trademark is acknowledged as shown below
on all unmodified copies of such font.
BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
BITSTREAM INC. DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. BITSTREAM SHALL NOT BE LIABLE FOR ANY DIRECT OR INDIRECT
DAMAGES, INCLUDING BUT NOT LIMITED TO LOST PROFITS, LOST DATA, OR ANY OTHER
INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN ANY WAY CONNECTED
WITH THE SPEEDO SOFTWARE OR THE BITSTREAM CHARTER OUTLINE FONT.
*/
/* $XFree86: xc/lib/font/Speedo/speedo.h,v 3.6 2001/07/25 15:04:55 dawes Exp $ */
#ifndef _SPEEDO_H_
#define _SPEEDO_H_
#include <X11/Xmd.h>
/***************************** S P E E D O . H *******************************
****************************************************************************/
/***** USER OPTIONS OVERRIDE DEFAULTS ******/
#include "useropt.h"
/***** CONFIGURATION DEFINITIONS *****/
#ifndef INCL_CLIPPING
#define INCL_CLIPPING 0 /* 0 indicates CLIPPING code is not compiled in*/
#endif
#ifndef INCL_SQUEEZING
#define INCL_SQUEEZING 0 /* 0 indicates SQUEEZE code is not compiled in*/
#endif
#ifndef INCL_EXT
#define INCL_EXT 1 /* 1 to include extended font support */
#endif /* 0 to omit extended font support */
#ifndef INCL_RULES
#define INCL_RULES 1 /* 1 to include intelligent scaling support */
#endif /* 0 to omit intelligent scaling support */
#ifndef INCL_BLACK
#define INCL_BLACK 1 /* 1 to include blackwriter output support */
#endif /* 0 to omit output mode 0 support */
#ifndef INCL_SCREEN
#define INCL_SCREEN 0 /* 1 to include screen writeroutput support */
#endif /* 0 to omit support */
#ifndef INCL_OUTLINE
#define INCL_OUTLINE 0 /* 1 to include outline output support */
#endif /* 0 to omit output mode 2 support */
#ifndef INCL_2D
#define INCL_2D 0 /* 1 to include 2d blackwriter output support */
#endif /* 0 to omit output mode 3 support */
#ifndef INCL_USEROUT
#define INCL_USEROUT 0 /* 1 to include user defined output module support */
#endif /* 0 to omit user defined output module support */
#ifndef INCL_LCD
#define INCL_LCD 1 /* 1 to include load char data support*/
#endif /* 0 to omit load char data support */
#ifndef INCL_ISW
#define INCL_ISW 0 /* 1 to include imported width support */
#endif /* 0 to omit imported width support */
#ifndef INCL_METRICS
#define INCL_METRICS 1 /* 1 to include metrics support */
#endif /* 0 to omit metrics support */
#ifndef INCL_KEYS
#define INCL_KEYS 0 /* 1 to include multi key support */
#endif /* 0 to omit multi key support */
#ifndef INCL_MULTIDEV
#define INCL_MULTIDEV 0 /* 1 to include multiple output device support */
#endif /* 0 to omit multi device support */
#ifndef SHORT_LISTS
#define SHORT_LISTS 1 /* 1 to allocate small intercept lists */
#endif
#ifndef INCL_PLAID_OUT
#define INCL_PLAID_OUT 0 /* 1 to include plaid data monitoring */
#endif /* 0 to omit plaid data monitoring */
#ifndef FONTFAR /* if Intel mixed memory model implementation */
#define FONTFAR /* pointer type modifier for font buffer */
#endif
#ifndef STACKFAR /* if Intel mixed memory model implementation */
#define STACKFAR /* pointer type modifier for font buffer */
#endif
#ifndef GLOBALFAR
#define GLOBALFAR
#endif
#define MODE_BLACK 0
#define MODE_SCREEN MODE_BLACK + INCL_BLACK
#define MODE_OUTLINE MODE_SCREEN + INCL_SCREEN
#define MODE_2D MODE_OUTLINE + INCL_OUTLINE
#ifdef DYNAMIC_ALLOC
#if DYNAMIC_ALLOC
#define STATIC_ALLOC 0
#endif
#endif
#ifdef REENTRANT_ALLOC
#if REENTRANT_ALLOC
#define STATIC_ALLOC 0
#endif
#endif
#ifndef STATIC_ALLOC
#define STATIC_ALLOC 1
#endif
#ifndef DYNAMIC_ALLOC
#define DYNAMIC_ALLOC 0
#endif
#ifndef REENTRANT_ALLOC
#define REENTRANT_ALLOC 0
#endif
/***** TYPE DEFINITIONS *****/
#ifndef STDEF
#ifndef SPD_BMAP
typedef INT8 fix7;
typedef double real;
typedef CARD8 ufix8;
#ifndef VFONT
typedef CARD8 boolean;
#endif
#endif
typedef INT16 fix15;
typedef CARD16 ufix16;
typedef INT32 fix31;
typedef CARD32 ufix32;
#endif
/***** GENERAL CONSTANTS *****/
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
#ifndef NULL
#include <stddef.h>
#endif
#define FUNCTION
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#if INCL_EXT /* Extended fonts supported? */
#define MAX_CONSTR 750 /* Max constraints (incl 4 dummies) */
#define MAX_CTRL_ZONES 256 /* Max number of controlled orus */
#define MAX_INT_ZONES 256 /* Max number of interpolation zones */
#else /* Compact fonts only supported */
#define MAX_CONSTR 512 /* Max constraints (incl 4 dummies) */
#define MAX_CTRL_ZONES 64 /* Max number of controlled orus */
#define MAX_INT_ZONES 64 /* Max number of interpolation zones */
#endif
#define SCALE_SHIFT 12 /* Binary point positiion for scale values */
#define SCALE_RND 2048 /* Rounding bit for scaling transformation */
#define ONE_SCALE 4096 /* Unity scale value */
#ifdef INCL_SCREEN /* constants used by Screenwriter module */
#define LEFT_INT 1 /* left intercept */
#define END_INT 2 /* last intercept */
#define FRACTION 0xFC /* fractional portion of intercept type list */
#endif
#if INCL_SQUEEZING || INCL_CLIPPING /* constants used by SQUEEZEing code */
#define EM_TOP 764
#define EM_BOT -236
#endif
/***** STRUCTURE DEFINITIONS *****/
#if REENTRANT_ALLOC
#define PROTO_DECL1 struct speedo_global_data GLOBALFAR *sp_global_ptr
#define PROTO_DECL2 PROTO_DECL1 ,
#else
#define PROTO_DECL1 void
#define PROTO_DECL2
#endif
typedef
struct buff_tag
{
ufix8 FONTFAR *org; /* Pointer to start of buffer */
ufix32 no_bytes; /* Size of buffer in bytes */
}
buff_t; /* Buffer descriptor */
typedef struct constr_tag
{
ufix8 FONTFAR *org; /* Pointer to first byte in constr data */
ufix16 font_id; /* Font id for calculated data */
fix15 xppo; /* X pixels per oru for calculated data */
fix15 yppo; /* Y pixels per oru for calculated data */
boolean font_id_valid; /* TRUE if font id valid */
boolean data_valid; /* TRUE if calculated data valid */
boolean active; /* TRUE if constraints enabled */
}
constr_t; /* Constraint data state */
typedef struct kern_tag
{
ufix8 FONTFAR *tkorg; /* First byte of track kerning data */
ufix8 FONTFAR *pkorg; /* First byte of pair kerning data */
fix15 no_tracks; /* Number of kerning tracks */
fix15 no_pairs; /* Number of kerning pairs */
}
kern_t; /* Kerning control block */
typedef struct specs_tag
{
buff_t STACKFAR *pfont; /* Pointer to font data */
fix31 xxmult; /* Coeff of X orus to compute X pix */
fix31 xymult; /* Coeff of Y orus to compute X pix */
fix31 xoffset; /* Constant to compute X pix */
fix31 yxmult; /* Coeff of X orus to compute Y pix */
fix31 yymult; /* Coeff of Y orus to compute Y pix */
fix31 yoffset; /* Constant to compute Y pix */
ufix32 flags; /* Mode flags: */
/* Bit 0 - 2: Output module selector: */
/* Bit 3: Send curves to output module*/
/* Bit 4: Use linear scaling if set */
/* Bit 5: Inhibit constraint table */
/* Bit 6: Import set width if set */
/* Bit 7: not used */
/* Bit 8: Squeeze left if set */
/* Bit 9: Squeeze right if set */
/* Bit 10: Squeeze top if set */
/* Bit 11: Squeeze bottom if set */
/* Bit 12: Clip left if set */
/* Bit 13: Clip right if set */
/* Bit 14: Clip top if set */
/* Bit 15: Clip bottom if set */
/* Bits 16-31 not used */
void *out_info; /* information for output module */
}
specs_t; /* Specs structure for fw_set_specs */
typedef struct tcb_tag
{
fix15 xxmult; /* Linear coeff of Xorus to compute Xpix */
fix15 xymult; /* Linear coeff of Yorus to compute Xpix */
fix31 xoffset; /* Linear constant to compute Xpix */
fix15 yxmult; /* Linear coeff of Xorus to compute Ypix */
fix15 yymult; /* Linear coeff of Yorus to compute Ypix */
fix31 yoffset; /* Linear constant to compute Ypix */
fix15 xppo; /* Pixels per oru in X dimension of char */
fix15 yppo; /* Pixels per oru in Y dimension of char */
fix15 xpos; /* Origin in X dimension of character */
fix15 ypos; /* Origin in Y dimension of character */
ufix16 xtype; /* Transformation type for X oru coords */
ufix16 ytype; /* Transformation type for Y oru coords */
ufix16 xmode; /* Transformation mode for X oru coords */
ufix16 ymode; /* Transformation mode for Y oru coords */
fix15 mirror; /* Transformation creates mirror image */
}
tcb_t; /* Transformation control block */
typedef struct point_tag
{
fix15 x; /* X coord of point (shifted pixels) */
fix15 y; /* Y coord of point (shifted pixels) */
}
point_t; /* Point in device space */
typedef struct band_tag
{
fix15 band_max;
fix15 band_min;
fix15 band_array_offset;
fix15 band_floor;
fix15 band_ceiling;
} band_t;
typedef struct bbox_tag
{
fix31 xmin;
fix31 xmax;
fix31 ymin;
fix31 ymax;
} bbox_t;
#if SHORT_LISTS
#define MAX_INTERCEPTS 256 /* Max storage for intercepts */
typedef ufix8 cdr_t; /* 8 bit links in intercept chains */
#else
#define MAX_INTERCEPTS 1000 /* Max storage for intercepts */
typedef ufix16 cdr_t; /* 16 bit links in intercept chains */
#endif
#if REENTRANT_ALLOC
typedef struct intercepts_tag
{
fix15 car[MAX_INTERCEPTS];
fix15 cdr[MAX_INTERCEPTS];
#if INCL_SCREEN
ufix8 inttype[MAX_INTERCEPTS];
ufix8 leftedge;
ufix16 fracpix;
#endif
} intercepts_t;
typedef struct plaid_tag
{
fix15 orus[MAX_CTRL_ZONES]; /* Controlled coordinate table (orus) */
#if INCL_RULES
fix15 pix[MAX_CTRL_ZONES]; /* Controlled coordinate table (sub-pixels) */
fix15 mult[MAX_INT_ZONES]; /* Interpolation multiplier table */
fix31 offset[MAX_INT_ZONES]; /* Interpolation offset table */
#endif
} plaid_t;
#endif
#if INCL_MULTIDEV
typedef struct bitmap_tag
{
void (*p_open_bitmap)(PROTO_DECL2 fix31 x_set_width, fix31 y_set_width, fix31 xorg, fix31 yorg, fix15 xsize,fix15 ysize);
void (*p_set_bits)(PROTO_DECL2 fix15 y, fix15 xbit1, fix15 xbit2);
void (*p_close_bitmap)(PROTO_DECL1);
} bitmap_t;
typedef struct outline_tag
{
void (*p_open_outline)(PROTO_DECL2 fix31 x_set_width, fix31 y_set_width, fix31 xmin, fix31 xmax, fix31 ymin,fix31 ymax);
void (*p_start_char)(PROTO_DECL1);
void (*p_start_contour)(PROTO_DECL2 fix31 x,fix31 y,boolean outside);
void (*p_curve)(PROTO_DECL2 fix31 x1, fix31 y1, fix31 x2, fix31 y2, fix31 x3, fix31 y3);
void (*p_line)(PROTO_DECL2 fix31 x, fix31 y);
void (*p_close_contour)(PROTO_DECL1);
void (*p_close_outline)(PROTO_DECL1);
} outline_t;
#endif
/* ---------------------------------------------------*/
/**** MAIN GLOBAL DATA STRUCTURE, SPEEDO_GLOBALS *****/
typedef struct speedo_global_data
{
/* do_char.c data definitions */
#if INCL_METRICS /* Metrics functions supported? */
kern_t kern; /* Kerning control block */
#endif /* endif incl_metrics */
point_t Psw; /* End of escapement vector (1/65536 pixel units) */
#if INCL_LCD /* Dynamic load character data supported? */
fix15 cb_offset; /* Offset to sub-char data in char buffer */
#endif /* endif incl_lcd */
/* do_trns.c data definitions */
point_t P0; /* Current point (sub-pixels) */
fix15 x_orus; /* Current X argument (orus) */
fix15 y_orus; /* Current Y argument (orus) */
fix15 x_pix; /* Current X argument (sub-pixels) */
fix15 y_pix; /* Current Y argument (sub-pixels) */
ufix8 x_int; /* Current X interpolation zone */
ufix8 y_int; /* Current Y interpolation zone */
#if INCL_MULTIDEV && INCL_OUTLINE
outline_t outline_device;
boolean outline_device_set;
#endif
#if INCL_BLACK || INCL_SCREEN || INCL_2D
#if INCL_MULTIDEV
bitmap_t bitmap_device;
boolean bitmap_device_set;
#endif
band_t y_band; /* Y current band(whole pixels) */
struct set_width_tag
{
fix31 x;
fix31 y;
} set_width; /* Character escapement vector */
boolean first_pass; /* TRUE during first pass thru outline data */
boolean extents_running; /* T if extent accumulation for each vector */
fix15 x0_spxl; /* X coord of current point (sub pixels) */
fix15 y0_spxl; /* Y coord of current point (sub pixels) */
fix15 y_pxl; /* Y coord of current point (whole pixels) */
#if REENTRANT_ALLOC
intercepts_t STACKFAR *intercepts;
#else /* else if not reentrant */
fix15 car[MAX_INTERCEPTS]; /* Data field of intercept storage */
cdr_t cdr[MAX_INTERCEPTS]; /* Link field of intercept storage */
#if INCL_SCREEN
ufix8 inttype[MAX_INTERCEPTS];
ufix8 leftedge;
ufix16 fracpix;
#endif /* endif incl_screen */
#endif /* endif reentrant */
fix15 bmap_xmin; /* Min X value (sub-pixel units) */
fix15 bmap_xmax; /* Max X value (sub-pixel units) */
fix15 bmap_ymin; /* Min Y value (sub-pixel units) */
fix15 bmap_ymax; /* Max Y value (sub-pixel units) */
fix15 no_y_lists; /* Number of active intercept lists */
fix15 first_offset; /* Index of first active list cell */
fix15 next_offset; /* Index of next free list cell */
boolean intercept_oflo; /* TRUE if intercepts data lost */
#endif /* endif incl_black, incl_screen, incl_2d */
/* bounding box now used by all output modules, including outline */
fix15 xmin; /* Min X value in whole character */
fix15 xmax; /* Max X value in whole character */
fix15 ymin; /* Min Y value in whole character */
fix15 ymax; /* Max Y value in whole character */
#if INCL_2D
fix15 no_x_lists; /* Number of active x intercept lists */
band_t x_band; /* X current band(whole pixels) */
boolean x_scan_active; /* X scan flag during scan conversion */
#endif
/* reset.c data definitions */
ufix16 key32; /* Decryption keys 3,2 combined */
ufix8 key4; /* Decryption key 4 */
ufix8 key6; /* Decryption key 6 */
ufix8 key7; /* Decryption key 7 */
ufix8 key8; /* Decryption key 8 */
/* set_spcs.c data definitions */
buff_t font;
buff_t GLOBALFAR *pfont; /* Pointer to font buffer structure */
fix31 font_buff_size; /* Number of bytes loaded in font buffer */
ufix8 FONTFAR *pchar_dir; /* Pointer to character directory */
fix15 first_char_idx; /* Index to first character in font */
fix15 no_chars_avail; /* Total characters in font layout */
fix15 orus_per_em; /* Outline resolution */
fix15 metric_resolution; /* metric resolution for setwidths, kerning pairs
(defaults to orus_per_em) */
tcb_t tcb0; /* Top level transformation control block */
boolean specs_valid; /* TRUE if fw_set_specs() successful */
fix15 depth_adj; /* Curve splitting depth adjustment */
boolean curves_out; /* Allow curves to output module */
fix15 output_mode; /* Output module selector */
fix15 thresh; /* Scan conversion threshold (sub-pixels) */
boolean normal; /* TRUE if 0 obl and mult of 90 deg rot */
fix15 multshift; /* Fixed point shift for multipliers */
fix15 pixshift; /* Fixed point shift for sub-pixels */
fix15 poshift; /* Left shift from pixel to output format */
fix15 mpshift; /* Fixed point shift for mult to sub-pixels */
fix31 multrnd; /* 0.5 in multiplier units */
fix15 pixrnd; /* 0.5 in sub-pixel units */
fix31 mprnd; /* 0.5 sub-pixels in multiplier units */
fix15 pixfix; /* Mask to remove fractional pixels */
fix15 onepix; /* 1.0 pixels in sub-pixel units */
boolean (*init_out)(PROTO_DECL2 specs_t GLOBALFAR *specsarg);
boolean (*begin_char)(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void (*begin_sub_char)(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void (*begin_contour)(PROTO_DECL2 point_t P1,boolean outside);
void (*curve)(PROTO_DECL2 point_t P1, point_t P2, point_t P3, fix15 depth);
void (*line)(PROTO_DECL2 point_t P1);
void (*end_contour)(PROTO_DECL1);
void (*end_sub_char)(PROTO_DECL1);
boolean (*end_char)(PROTO_DECL1);
specs_t GLOBALFAR *pspecs; /* Pointer to specifications bundle */
specs_t specs; /* copy specs onto stack */
ufix8 FONTFAR *font_org; /* Pointer to start of font data */
ufix8 FONTFAR *hdr2_org; /* Pointer to start of private header data */
/* set_trns.c data definitions */
tcb_t tcb; /* Current transformation control block */
ufix8 Y_edge_org; /* Index to first Y controlled coordinate */
ufix8 Y_int_org; /* Index to first Y interpolation zone */
fix31 rnd_xmin; /* rounded out value of xmin for int-char spac. fix */
#if REENTRANT_ALLOC
plaid_t STACKFAR *plaid;
#else /* if not reentrant */
fix15 orus[MAX_CTRL_ZONES]; /* Controlled coordinate table (orus) */
#if INCL_RULES
fix15 pix[MAX_CTRL_ZONES]; /* Controlled coordinate table (sub-pixels) */
fix15 mult[MAX_INT_ZONES]; /* Interpolation multiplier table */
fix31 offset[MAX_INT_ZONES]; /* Interpolation offset table */
#endif /* endif incl_rules */
#endif /* endif not reentrant */
fix15 no_X_orus; /* Number of X controlled coordinates */
fix15 no_Y_orus; /* Number of Y controlled coordinates */
ufix16 Y_constr_org; /* Origin of constraint table in font data */
#if INCL_RULES
constr_t constr; /* Constraint data state */
boolean c_act[MAX_CONSTR]; /* TRUE if constraint currently active */
fix15 c_pix[MAX_CONSTR]; /* Size of constrained zone if active */
#endif
#if INCL_ISW
boolean import_setwidth_act; /* boolean to indicate imported setwidth */
boolean isw_modified_constants;
ufix32 imported_width; /* value of imported setwidth */
fix15 isw_xmax; /* maximum oru value for constants*/
#endif
#if INCL_SQUEEZING || INCL_ISW
fix15 setwidth_orus; /* setwidth value in orus */
/* bounding box in orus for squeezing */
fix15 bbox_xmin_orus; /* X minimum in orus */
fix15 bbox_xmax_orus; /* X maximum in orus */
fix15 bbox_ymin_orus; /* Y minimum in orus */
fix15 bbox_ymax_orus; /* Y maximum in orus */
#endif
#ifdef INCL_SQUEEZING
boolean squeezing_compound; /* flag to indicate a compound character*/
#endif
#ifdef INCL_CLIPPING
fix31 clip_xmax;
fix31 clip_ymax;
fix31 clip_xmin;
fix31 clip_ymin;
#endif
} SPEEDO_GLOBALS;
/***********************************************************************************
*
* Speedo global data structure allocation
*
***********************************************************************************/
#ifdef SET_SPCS
#define EXTERN
#else
#define EXTERN extern
#endif
#if STATIC_ALLOC
EXTERN SPEEDO_GLOBALS GLOBALFAR sp_globals;
#define sp_intercepts sp_globals
#define sp_plaid sp_globals
#else
#if DYNAMIC_ALLOC
EXTERN SPEEDO_GLOBALS GLOBALFAR *sp_global_ptr;
#define sp_globals (*sp_global_ptr)
#define sp_intercepts (*sp_global_ptr)
#define sp_plaid (*sp_global_ptr)
#else
#if REENTRANT_ALLOC
#define sp_globals (*sp_global_ptr)
#define sp_intercepts (*(*sp_global_ptr).intercepts)
#define sp_plaid (*(*sp_global_ptr).plaid)
#endif
#endif
#endif
#ifdef EXTERN
#undef EXTERN
#endif
/***** PUBLIC FONT HEADER OFFSET CONSTANTS *****/
#define FH_FMVER 0 /* U D4.0 CR LF NULL NULL 8 bytes */
#define FH_FNTSZ 8 /* U Font size (bytes) 4 bytes */
#define FH_FBFSZ 12 /* U Min font buffer size (bytes) 4 bytes */
#define FH_CBFSZ 16 /* U Min char buffer size (bytes) 2 bytes */
#define FH_HEDSZ 18 /* U Header size (bytes) 2 bytes */
#define FH_FNTID 20 /* U Source Font ID 2 bytes */
#define FH_SFVNR 22 /* U Source Font Version Number 2 bytes */
#define FH_FNTNM 24 /* U Source Font Name 70 bytes */
#define FH_MDATE 94 /* U Manufacturing Date 10 bytes */
#define FH_LAYNM 104 /* U Layout Name 70 bytes */
#define FH_CPYRT 174 /* U Copyright Notice 78 bytes */
#define FH_NCHRL 252 /* U Number of Chars in Layout 2 bytes */
#define FH_NCHRF 254 /* U Total Number of Chars in Font 2 bytes */
#define FH_FCHRF 256 /* U Index of first char in Font 2 bytes */
#define FH_NKTKS 258 /* U Number of kerning tracks in font 2 bytes */
#define FH_NKPRS 260 /* U Number of kerning pairs in font 2 bytes */
#define FH_FLAGS 262 /* U Font flags 1 byte: */
/* Bit 0: Extended font */
/* Bit 1: not used */
/* Bit 2: not used */
/* Bit 3: not used */
/* Bit 4: not used */
/* Bit 5: not used */
/* Bit 6: not used */
/* Bit 7: not used */
#define FH_CLFGS 263 /* U Classification flags 1 byte: */
/* Bit 0: Italic */
/* Bit 1: Monospace */
/* Bit 2: Serif */
/* Bit 3: Display */
/* Bit 4: not used */
/* Bit 5: not used */
/* Bit 6: not used */
/* Bit 7: not used */
#define FH_FAMCL 264 /* U Family Classification 1 byte: */
/* 0: Don't care */
/* 1: Serif */
/* 2: Sans serif */
/* 3: Monospace */
/* 4: Script or calligraphic */
/* 5: Decorative */
/* 6-255: not used */
#define FH_FRMCL 265 /* U Font form Classification 1 byte: */
/* Bits 0-3 (width type): */
/* 0-3: not used */
/* 4: Condensed */
/* 5: not used */
/* 6: Semi-condensed */
/* 7: not used */
/* 8: Normal */
/* 9: not used */
/* 10: Semi-expanded */
/* 11: not used */
/* 12: Expanded */
/* 13-15: not used */
/* Bits 4-7 (Weight): */
/* 0: not used */
/* 1: Thin */
/* 2: Ultralight */
/* 3: Extralight */
/* 4: Light */
/* 5: Book */
/* 6: Normal */
/* 7: Medium */
/* 8: Semibold */
/* 9: Demibold */
/* 10: Bold */
/* 11: Extrabold */
/* 12: Ultrabold */
/* 13: Heavy */
/* 14: Black */
/* 15-16: not used */
#define FH_SFNTN 266 /* U Short Font Name 32 bytes */
#define FH_SFACN 298 /* U Short Face Name 16 bytes */
#define FH_FNTFM 314 /* U Font form 14 bytes */
#define FH_ITANG 328 /* U Italic angle 2 bytes (1/256th deg) */
#define FH_ORUPM 330 /* U Number of ORUs per em 2 bytes */
#define FH_WDWTH 332 /* U Width of Wordspace 2 bytes */
#define FH_EMWTH 334 /* U Width of Emspace 2 bytes */
#define FH_ENWTH 336 /* U Width of Enspace 2 bytes */
#define FH_TNWTH 338 /* U Width of Thinspace 2 bytes */
#define FH_FGWTH 340 /* U Width of Figspace 2 bytes */
#define FH_FXMIN 342 /* U Font-wide min X value 2 bytes */
#define FH_FYMIN 344 /* U Font-wide min Y value 2 bytes */
#define FH_FXMAX 346 /* U Font-wide max X value 2 bytes */
#define FH_FYMAX 348 /* U Font-wide max Y value 2 bytes */
#define FH_ULPOS 350 /* U Underline position 2 bytes */
#define FH_ULTHK 352 /* U Underline thickness 2 bytes */
#define FH_SMCTR 354 /* U Small caps transformation 6 bytes */
#define FH_DPSTR 360 /* U Display sups transformation 6 bytes */
#define FH_FNSTR 366 /* U Footnote sups transformation 6 bytes */
#define FH_ALSTR 372 /* U Alpha sups transformation 6 bytes */
#define FH_CMITR 378 /* U Chemical infs transformation 6 bytes */
#define FH_SNMTR 384 /* U Small nums transformation 6 bytes */
#define FH_SDNTR 390 /* U Small denoms transformation 6 bytes */
#define FH_MNMTR 396 /* U Medium nums transformation 6 bytes */
#define FH_MDNTR 402 /* U Medium denoms transformation 6 bytes */
#define FH_LNMTR 408 /* U Large nums transformation 6 bytes */
#define FH_LDNTR 414 /* U Large denoms transformation 6 bytes */
/* Transformation data format: */
/* Y position 2 bytes */
/* X scale 2 bytes (1/4096ths) */
/* Y scale 2 bytes (1/4096ths) */
#define SIZE_FW FH_LDNTR + 6 /* size of nominal font header */
#define EXP_FH_METRES SIZE_FW /* offset to expansion field metric resolution (optional) */
/***** MODE FLAGS CONSTANTS *****/
#define CURVES_OUT 0X0008 /* Output module accepts curves */
#define BOGUS_MODE 0X0010 /* Linear scaling mode */
#define CONSTR_OFF 0X0020 /* Inhibit constraint table */
#define IMPORT_WIDTHS 0X0040 /* Imported width mode */
#define SQUEEZE_LEFT 0X0100 /* Squeeze left mode */
#define SQUEEZE_RIGHT 0X0200 /* Squeeze right mode */
#define SQUEEZE_TOP 0X0400 /* Squeeze top mode */
#define SQUEEZE_BOTTOM 0X0800 /* Squeeze bottom mode */
#define CLIP_LEFT 0X1000 /* Clip left mode */
#define CLIP_RIGHT 0X2000 /* Clip right mode */
#define CLIP_TOP 0X4000 /* Clip top mode */
#define CLIP_BOTTOM 0X8000 /* Clip bottom mode */
/***********************************************************************************
*
* Speedo function declarations - use prototypes if available
*
***********************************************************************************/
/* do_char.c functions */
ufix16 sp_get_char_id(PROTO_DECL2 ufix16 char_index);
boolean sp_make_char(PROTO_DECL2 ufix16 char_index);
#if INCL_ISW
fix31 sp_compute_isw_scale(PROTO_DECL2);
static boolean sp_do_make_char(PROTO_DECL2 ufix16 char_index);
boolean sp_make_char_isw(PROTO_DECL2 ufix16 char_index, ufix32 imported_width);
static boolean sp_reset_xmax(PROTO_DECL2 fix31 xmax);
#endif
#if INCL_ISW || INCL_SQUEEZING
static void sp_preview_bounding_box(PROTO_DECL2 ufix8 FONTFAR *pointer,ufix8 format);
#endif
#if INCL_METRICS /* Metrics functions supported? */
fix31 sp_get_char_width(PROTO_DECL2 ufix16 char_index);
fix15 sp_get_track_kern(PROTO_DECL2 fix15 track,fix15 point_size);
fix31 sp_get_pair_kern(PROTO_DECL2 ufix16 char_index1,ufix16 char_index2);
boolean sp_get_char_bbox(PROTO_DECL2 ufix16 char_index, bbox_t *bbox);
#endif
/* do_trns.c functions */
ufix8 FONTFAR *sp_read_bbox(PROTO_DECL2 ufix8 FONTFAR *pointer,point_t STACKFAR *pPmin,point_t STACKFAR *pPmax,boolean set_flag);
void sp_proc_outl_data(PROTO_DECL2 ufix8 FONTFAR *pointer);
/* out_blk.c functions */
#if INCL_BLACK
boolean sp_init_black(PROTO_DECL2 specs_t GLOBALFAR *specsarg);
boolean sp_begin_char_black(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void sp_begin_contour_black(PROTO_DECL2 point_t P1,boolean outside);
void sp_line_black(PROTO_DECL2 point_t P1);
boolean sp_end_char_black(PROTO_DECL1);
#endif
/* out_scrn.c functions */
#if INCL_SCREEN
boolean sp_init_screen(PROTO_DECL2 specs_t GLOBALFAR *specsarg);
boolean sp_begin_char_screen(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void sp_begin_contour_screen(PROTO_DECL2 point_t P1,boolean outside);
void sp_curve_screen(PROTO_DECL2 point_t P1,point_t P2,point_t P3, fix15 depth);
void sp_scan_curve_screen(PROTO_DECL2 fix31 X0,fix31 Y0,fix31 X1,fix31 Y1,fix31 X2,fix31 Y2,fix31 X3,fix31 Y3);
void sp_vert_line_screen(PROTO_DECL2 fix31 x, fix15 y1, fix15 y2);
void sp_line_screen(PROTO_DECL2 point_t P1);
void sp_end_contour_screen(PROTO_DECL1);
boolean sp_end_char_screen(PROTO_DECL1);
#endif
/* out_outl.c functions */
#if INCL_OUTLINE
#if INCL_MULTIDEV
boolean sp_set_outline_device(PROTO_DECL2 outline_t *ofuncs, ufix16 size);
#endif
boolean sp_init_outline(PROTO_DECL2 specs_t GLOBALFAR *specsarg);
boolean sp_begin_char_outline(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void sp_begin_sub_char_outline(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void sp_begin_contour_outline(PROTO_DECL2 point_t P1,boolean outside);
void sp_curve_outline(PROTO_DECL2 point_t P1,point_t P2,point_t P3, fix15 depth);
void sp_line_outline(PROTO_DECL2 point_t P1);
void sp_end_contour_outline(PROTO_DECL1);
void sp_end_sub_char_outline(PROTO_DECL1);
boolean sp_end_char_outline(PROTO_DECL1);
#endif
/* out_bl2d.c functions */
#if INCL_2D
boolean sp_init_2d(PROTO_DECL2 specs_t GLOBALFAR *specsarg);
boolean sp_begin_char_2d(PROTO_DECL2 point_t Psw,point_t Pmin,point_t Pmax);
void sp_begin_contour_2d(PROTO_DECL2 point_t P1,boolean outside);
void sp_line_2d(PROTO_DECL2 point_t P1);
boolean sp_end_char_2d(PROTO_DECL1);
#endif
/* out_util.c functions */
#if INCL_BLACK || INCL_SCREEN || INCL_2D
#if INCL_MULTIDEV
boolean sp_set_bitmap_device(PROTO_DECL2 bitmap_t *bfuncs, ufix16 size);
#endif
void sp_init_char_out(PROTO_DECL2 point_t Psw, point_t Pmin, point_t Pmax);
void sp_begin_sub_char_out(PROTO_DECL2 point_t Psw, point_t Pmin, point_t Pmax);
void sp_curve_out(PROTO_DECL2 point_t P1, point_t P2, point_t P3, fix15 depth);
void sp_end_contour_out(PROTO_DECL1);
void sp_end_sub_char_out(PROTO_DECL1);
void sp_init_intercepts_out(PROTO_DECL1);
void sp_restart_intercepts_out(PROTO_DECL1);
void sp_set_first_band_out(PROTO_DECL2 point_t Pmin, point_t Pmax);
void sp_reduce_band_size_out(PROTO_DECL1);
boolean sp_next_band_out(PROTO_DECL1);
#endif
#if INCL_USEROUT
boolean sp_init_userout(specs_t *specsarg);
#endif
/* reset.c functions */
void sp_reset(PROTO_DECL1);
#if INCL_KEYS
void sp_set_key(PROTO_DECL2 ufix8 key[]);
#endif
ufix16 sp_get_cust_no(PROTO_DECL2 buff_t font_buff);
/* set_spcs.c functions */
boolean sp_set_specs(PROTO_DECL2 specs_t STACKFAR *specsarg);
void sp_type_tcb(PROTO_DECL2 tcb_t GLOBALFAR *ptcb);
fix31 sp_read_long(PROTO_DECL2 ufix8 FONTFAR *pointer);
fix15 sp_read_word_u(PROTO_DECL2 ufix8 FONTFAR *pointer);
/* set_trns.c functions */
void sp_init_tcb(PROTO_DECL1);
void sp_scale_tcb(PROTO_DECL2 tcb_t GLOBALFAR *ptcb,fix15 x_pos,fix15 y_pos,fix15 x_scale,fix15 y_scale);
ufix8 FONTFAR *sp_plaid_tcb(PROTO_DECL2 ufix8 FONTFAR *pointer,ufix8 format);
ufix8 FONTFAR *sp_skip_interpolation_table(PROTO_DECL2 ufix8 FONTFAR *pointer, ufix8 format);
ufix8 FONTFAR *sp_skip_control_zone(PROTO_DECL2 ufix8 FONTFAR *pointer, ufix8 format);
ufix8 FONTFAR *sp_read_oru_table(PROTO_DECL2 ufix8 FONTFAR *pointer);
#if INCL_SQUEEZING || INCL_ISW
static void sp_calculate_x_pix(PROTO_DECL2 ufix8 start_edge,ufix8 end_edge,ufix16 constr_nr,fix31 x_scale,fix31 x_offset,fix31 ppo,fix15 setwidth_pix);
#endif
#if INCL_SQUEEZING
static void sp_calculate_y_pix(PROTO_DECL2 ufix8 start_edge,ufix8 end_edge,ufix16 constr_nr,fix31 top_scale,fix31 bottom_scale,fix31 ppo,fix15 emtop_pix,fix15 embot_pix);
boolean sp_calculate_x_scale(PROTO_DECL2 fix31 *x_factor,fix31 *x_offset,fix15 no_x_ctrl_zones);
boolean sp_calculate_y_scale(PROTO_DECL2 fix31 *top_scale,fix31 *bottom_scale,fix15 first_y_zone, fix15 no_Y_ctrl_zones);
#endif
/* user defined functions */
void sp_report_error(PROTO_DECL2 fix15 n);
#if INCL_BLACK || INCL_SCREEN || INCL_2D
void sp_open_bitmap(PROTO_DECL2 fix31 x_set_width, fix31 y_set_width, fix31 xorg, fix31 yorg, fix15 xsize,fix15 ysize);
void sp_set_bitmap_bits(PROTO_DECL2 fix15 y, fix15 xbit1, fix15 xbit2);
void sp_close_bitmap(PROTO_DECL1);
#endif
#if INCL_OUTLINE
void sp_open_outline(PROTO_DECL2 fix31 x_set_width, fix31 y_set_width, fix31 xmin, fix31 xmax, fix31 ymin,fix31 ymax);
void sp_start_new_char(PROTO_DECL1);
void sp_start_contour(PROTO_DECL2 fix31 x,fix31 y,boolean outside);
void sp_curve_to(PROTO_DECL2 fix31 x1, fix31 y1, fix31 x2, fix31 y2, fix31 x3, fix31 y3);
void sp_line_to(PROTO_DECL2 fix31 x, fix31 y);
void sp_close_contour(PROTO_DECL1);
void sp_close_outline(PROTO_DECL1);
#endif
#if INCL_LCD /* Dynamic load character data supported? */
buff_t *sp_load_char_data(PROTO_DECL2 fix31 file_offset,fix15 no_bytes,fix15 cb_offset); /* Load character data from font file */
#endif
#if INCL_PLAID_OUT /* Plaid data monitoring included? */
void sp_record_xint(PROTO_DECL2 fix15 int_num); /* Record xint data */
void sp_record_yint(PROTO_DECL2 fix15 int_num); /* Record yint data */
void sp_begin_plaid_data(PROTO_DECL1); /* Signal start of plaid data */
void sp_begin_ctrl_zones(PROTO_DECL2 fix15, no_X_zones, fix15 no_Y_zones); /* Signal start of control zones */
void sp_record_ctrl_zone(PROTO_DECL2 fix31 start, fix31 end, fix15 constr); /* Record control zone data */
void sp_begin_int_zones(PROTO_DECL2 fix15 no_X_int_zones, fix15 no_Y_int_zones); /* Signal start of interpolation zones */
void sp_record_int_zone(PROTO_DECL2 fix31 start, fix31 end); /* Record interpolation zone data */
void sp_end_plaid_data(PROTO_DECL1); /* Signal end of plaid data */
#endif
#endif /* _SPEEDO_H_ */
|