links/graphics/clip.c

944 lines
13 KiB
C

/* This is a utility for making Links fonts from postscript files and
* Ghostscript fonts.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Here switch on which encoding the Ghostscript font is in. */
/* #define LATIN */
/* #define CYRILLIC */
/* #define HEBREW */
/* #define HIRAGANA */
/* #define KATAKANA */
/* #define DINGBATS */
/* #define GREEK */
/* #define ARABIC */
/* #define ARABIC2 */
/* #define GEORGIAN_MKHEDRULI */
# define STANDARD_SYMBOL
#ifdef STANDARD_SYMBOL /* (s050000l.pfb) */
int copy[]={
34,0x2200,
36,0x2203,
39,0x220d,
64,0x2245,
68,0x2206,
92,0x2234,
94,0x22a5,
163,0x2264,
165,0x221e,
164,0x2215,
177,0x00b1,
179,0x2265,
180,0x2062,
181,0x221d,
182,0x2202,
183,0x2981,
184,0x00f7,
185,0x2260,
186,0x2261,
187,0x2248,
188,0x20e8,
189,0x2223,
196,0x2297,
197,0x2295,
198,0x2205,
198,0x2300,
199,0x22c2,
200,0x22c3,
201,0x2283,
202,0x2287,
203,0x2284,
204,0x2282,
205,0x2286,
206,0x220a,
207,0x2209,
208,0x2220,
208,0x299f,
209,0x2207,
210,0x00ae,
211,0x00a9,
212,0x2122,
213,0x220f,
214,0x221a,
215,0x2219,
216,0x00ac,
217,0x2227,
217,0x22c0,
218,0x22c1,
218,0x2228,
219,0x27fa,
220,0x27f8,
221,0x21d1,
222,0x21d2,
223,0x21d3,
225,0x2329,
229,0x2211,
230,0x239b,
231,0x239c,
232,0x239d,
233,0x23a1,
234,0x23a2,
235,0x23a3,
236,0x23a7,
237,0x23a8,
238,0x23a9,
239,0x23aa,
241,0x232a,
241,0x27e9,
242,0x222b,
246,0x239e,
247,0x239f,
248,0x23a0,
249,0x23a4,
250,0x23a5,
251,0x23a6,
252,0x23ab,
253,0x23ac,
254,0x23ad,
242,0x222b
};
int merge[]={};
#endif /* #ifdef STANDARD_SYMBOL */
#ifdef GEORGIAN_MKHEDRULI /* mkhedruli.pfb */
int copy[]={
35,0x10d0,
36,0x10d1,
37,0x10d2,
38,0x10d3,
39,0x10d4,
40,0x10d5,
41,0x10d6,
42,0x10f1,
43,0x10d7,
44,0x10d8,
45,0x10d9,
46,0x10da,
47,0x10db,
48,0x10dc,
49,0x10f2,
50,0x10dd,
51,0x10de,
52,0x10df,
53,0x10e0,
54,0x10e1,
55,0x10e2,
56,0x10e3,
57,0x10f3,
58,0x10e4,
59,0x10e5,
60,0x10e6,
61,0x10e7,
62,0x10e8,
63,0x10e9,
64,0x10ea,
65,0x10eb,
66,0x10ec,
67,0x10ed,
68,0x10ee,
69,0x10f4,
70,0x10ef,
71,0x10f0,
72,0x10f5,
73,0x10f6,
};
int merge[]={};
#endif /* #ifdef GEORGIAN_MKHEDRULI */
#ifdef ARABIC2 /* irnafnt5.pfb */
int copy[]={
48,0x06f0,
49,0x06f1,
50,0x06f2,
51,0x06f3,
52,0x06f4,
53,0x06f5,
54,0x06f6,
55,0x06f7,
56,0x06f8,
57,0x06f9,
76,0x0686,
86,0x0698,
111,0x06af,
125,0x06cc,
158,0x0640,
};
int merge[]={};
#endif
#ifdef ARABIC /* ArabicNaskh.pfb */
int copy[]={
37,0x066a,
44,0x060c,
48,0x0660,
49,0x0661,
50,0x0662,
51,0x0663,
52,0x0664,
53,0x0665,
54,0x0666,
55,0x0667,
56,0x0668,
57,0x0669,
59,0x061b,
63,0x061f,
64,0x0604,
65,0x0627,
67,0x0623,
69,0x0622,
71,0x0625,
76,0x0628,
80,0x062a,
84,0x062b,
88,0x062c,
94,0x066c,
95,0x0671,
96,0x062d,
100,0x062e,
101,0x062f,
103,0x0630,
105,0x0631,
107,0x0632,
112,0x0633,
116,0x0634,
120,0x0635,
123,0x0670,
126,0x0636,
162,0x0637,
166,0x0638,
167,0x0621,
167,0x06f6,
170,0x0639,
174,0x063a,
178,0x0641,
182,0x0642,
183,0x06a9,
186,0x0643,
190,0x0644,
194,0x0645,
198,0x0646,
199,0x0647,
199,0x06be,
202,0x06d5,
203,0x0648,
205,0x068d,
208,0x064a,
212,0x0649,
213,0x0674,
215,0x06c2,
217,0x0626,
218,0x0624,
220,0x06d9,
228,0x064e,
231,0x064b,
232,0x064c,
234,0x0650,
235,0x064d,
233,0x0651,
230,0x0652,
229,0x064f,
42,0x066d,
78,0x06c3,
};
int merge[]={};
#endif
#ifdef HEBREW /* elronm.pfb - monospaced, hebrewmm.pfb - proportional */
int copy[]={ /* iso 8859-8 */
0xE0,0x05D0,
0xE1,0x05D1,
0xE2,0x05D2,
0xE3,0x05D3,
0xE4,0x05D4,
0xE5,0x05D5,
0xE6,0x05D6,
0xE7,0x05D7,
0xE8,0x05D8,
0xE9,0x05D9,
0xEA,0x05DA,
0xEB,0x05DB,
0xEC,0x05DC,
0xED,0x05DD,
0xEE,0x05DE,
0xEF,0x05DF,
0xF0,0x05E0,
0xF1,0x05E1,
0xF2,0x05E2,
0xF3,0x05E3,
0xF4,0x05E4,
0xF5,0x05E5,
0xF6,0x05E6,
0xF7,0x05E7,
0xF8,0x05E8,
0xF9,0x05E9,
0xFA,0x05EA,
};
int merge[]={};
#endif
#ifdef KATAKANA
int copy[]={
33,0x30ac,
35,0x30f7,
36,0x30b2,
37,0x30b4,
38,0x30d3,
39,0x30ef,
40,0x30d9,
41,0x30dc,
42,0x30d6,
43,0x30c3,
44,0x30e4,
45,0x30e9,
46,0x30e6,
47,0x30e8,
48,0x30ce,
49,0x30de,
50,0x30a4,
51,0x30a6,
52,0x30a8,
53,0x30aa,
54,0x30ca,
55,0x30cb,
56,0x30cc,
57,0x30cd,
58,0x30dd,
59,0x30e2,
60,0x30e3,
61,0x30ea,
62,0x30e5,
63,0x30e7,
64,0x30f8,
65,0x30b6,
66,0x30c9,
67,0x30c5,
68,0x30ba,
70,0x30bc,
71,0x30be,
72,0x30d1,
74,0x30d4,
75,0x30d7,
76,0x30da,
77,0x30a3,
78,0x30a9,
83,0x30b8,
85,0x30a7,
86,0x30c7,
88,0x30c2,
89,0x30a1,
90,0x30c0,
91,0x30eb,
92,0x30ed,
93,0x30ec,
94,0x30d0,
95,0x30fc,
97,0x30b5,
98,0x30c8,
99,0x30c4,
100,0x30b9,
101,0x30af,
102,0x30bb,
103,0x30bd,
104,0x30de,
105,0x30d5,
106,0x30df,
107,0x30e0,
108,0x30e1,
109,0x30f3,
110,0x30f2,
111,0x30d8,
112,0x30db,
113,0x30f5,
114,0x30f6,
115,0x30c4,
116,0x30b3,
117,0x30d2,
118,0x30c6,
119,0x30f0,
120,0x30c1,
121,0x30cf,
122,0x30bf,
124,0x30a5,
};
int merge[]={};
#endif
#ifdef HIRAGANA
int copy[]={
33,0x304c,
35,0x3050,
36,0x3052,
37,0x3054,
38,0x3073,
39,0x308f,
40,0x3079,
41,0x307c,
42,0x3076,
43,0x3063,
44,0x3084,
45,0x3089,
46,0x3086,
47,0x3088,
48,0x306e,
49,0x3042,
50,0x3044,
51,0x3046,
52,0x3048,
53,0x304a,
54,0x306a,
55,0x306b,
56,0x306c,
57,0x306d,
58,0x307d,
59,0x3082,
60,0x3083,
62,0x3085,
63,0x3087,
64,0x304e,
65,0x3056,
66,0x3069,
67,0x3065,
68,0x305a,
70,0x305c,
71,0x305e,
72,0x3071,
74,0x3074,
75,0x3077,
76,0x307a,
77,0x3043,
78,0x3049,
79,0x309c,
83,0x3058,
85,0x3047,
86,0x3067,
88,0x3062,
89,0x3041,
90,0x3060,
91,0x308b,
92,0x308d,
93,0x308c,
94,0x3070,
97,0x3055,
98,0x3068,
99,0x3064,
100,0x3059,
101,0x304f,
102,0x305b,
103,0x305d,
104,0x307e,
105,0x3075,
106,0x307f,
107,0x3080,
108,0x3081,
109,0x3093,
110,0x3092,
111,0x3078,
112,0x307b,
113,0x304b,
114,0x3051,
115,0x3057,
116,0x3053,
117,0x3072,
118,0x3066,
119,0x304d,
120,0x3061,
121,0x306f,
122,0x305f,
124,0x3045
};
int merge[]={};
#endif
#ifdef LATIN
/* 0xc2: acute
*/
int copy[]={
161,0xa1,
162,0xa2,
163,0xa3,
165,0xa5,
167,0xa7,
171,0xab,
172,0x2039,
173,0x203a,
174,0xfb01,
175,0xfb02,
177,0x2013,
178,0x2020,
179,0x2021,
182,0xb6,
183,0x2022,
187,0xbb,
188,0x2026,
189,0x2030,
191,0xbf,
196,0x2dc,
208,0x2014,
225,0xc6,
232,0x141,
233,0xd8,
234,0x152,
235,0x2116,
241,0xe6,
248,0x142,
249,0xf8,
250,0x153,
251,0xdf,
193,0x300,
#define GRA 193 /* ` */
194,0xb4,
#define ACU 194 /* ' */
195,0x2c6,
#define CIR 195 /* ^ */
196,0x2dc,
#define TIL 196 /* ~ */
197,0xaf,
#define MAC 197 /* - above */
198,0x306,
#define LSC 198 /* lower semicircle above */
199,0x2d9,
199,0xb7,
#define DOT 199 /* . above */
200,0xa8,
#define UML 200 /* .. above */
202,0x2da,
202,0xb0,
#define RIN 202 /* o above */
203,0xb8,
#define CED 203 /* (5 without the top stroke) under */
205,0x30b,
#define DAC 205 /* " */
206,0x2db,
#define OGO 206 /* left-right mirrored J under (ogonek) */
207,0x2c7,
#define CAR 207 /* v above */
};
int merge[]={
'+','-',0xb1,
'A',GRA,0xc0,
'A',ACU,0xc1,
'A',CIR,0xc2,
'A',TIL,0xc3,
'A',UML,0xc4,
'A',RIN,0xc5,
'C',CED,0xc7,
'E',GRA,0xc8,
'E',ACU,0xc9,
'E',CIR,0xca,
'E',UML,0xcb,
'I',GRA,0xcc,
'I',ACU,0xcd,
'I',CIR,0xce,
'I',UML,0xcf,
'D','-',0xd0,
'N',TIL,0xd1,
'O',GRA,0xd2,
'O',ACU,0xd3,
'O',CIR,0xd4,
'O',TIL,0xd5,
'O',UML,0xd6,
'U',GRA,0xd9,
'U',ACU,0xda,
'U',CIR,0xdb,
'U',UML,0xdc,
'Y',ACU,0xdd,
'a',GRA,0xe0,
'a',ACU,0xe1,
'a',CIR,0xe2,
'a',TIL,0xe3,
'a',UML,0xe4,
'a',RIN,0xe5,
'c',CED,0xe7,
'e',GRA,0xe8,
'e',ACU,0xe9,
'e',CIR,0xea,
'e',UML,0xeb,
'i',GRA,0xec,
'i',ACU,0xed,
'i',CIR,0xee,
'i',UML,0xef,
'n',TIL,0xf1,
'o',GRA,0xf2,
'o',ACU,0xf3,
'o',CIR,0xf4,
'o',TIL,0xf5,
'o',UML,0xf6,
'u',GRA,0xf9,
'u',ACU,0xfa,
'u',CIR,0xfb,
'u',UML,0xfc,
'y',ACU,0xfd,
'y',UML,0xff,
'A',MAC,0x100,
'a',MAC,0x101,
'A',LSC,0x102,
'a',LSC,0x103,
'A',OGO,0x104,
'a',OGO,0x105,
'C',ACU,0x106,
'c',ACU,0x107,
'C',CIR,0x108,
'c',CIR,0x109,
'C',DOT,0x10a,
'c',DOT,0x10b,
'C',CAR,0x10c,
'c',CAR,0x10d,
'D',CAR,0x10e,
'd',0x27,0x10f,
'D','-',0x110,
'd','-',0x111,
'E',MAC,0x112,
'e',MAC,0x113,
'E',LSC,0x114,
'e',LSC,0x115,
'E',DOT,0x116,
'e',DOT,0x117,
'E',OGO,0x118,
'e',OGO,0x119,
'E',CAR,0x11a,
'e',CAR,0x11b,
'G',CIR,0x11c,
'g',CIR,0x11d,
'G',LSC,0x11e,
'g',LSC,0x11f,
'G',DOT,0x120,
'g',DOT,0x121,
'H',CIR,0x124,
'h',CIR,0x125,
'H','-',0x126,
'h','-',0x127,
'I',TIL,0x128,
'i',TIL,0x129,
'I',MAC,0x12a,
'i',MAC,0x12b,
'I',LSC,0x12c,
'i',LSC,0x12d,
'I',OGO,0x12e,
'i',OGO,0x12f,
'I',DOT,0x130,
'I','J',0x132,
'i','j',0x133,
'J',CIR,0x134,
'j',CIR,0x135,
'L',ACU,0x139,
'l',ACU,0x13a,
'L',0x27,0x13d,
'l',0x27,0x13e,
'N',ACU,0x143,
'n',ACU,0x144,
'N',CAR,0x147,
'n',CAR,0x148,
'O',MAC,0x14c,
'o',MAC,0x14d,
'O',LSC,0x14e,
'o',LSC,0x14f,
'O',DAC,0x150,
'o',DAC,0x151,
'R',ACU,0x154,
'r',ACU,0x155,
'R',CAR,0x158,
'r',CAR,0x159,
'S',ACU,0x15a,
's',ACU,0x15b,
'S',CIR,0x15c,
's',CIR,0x15d,
'S',CED,0x15e,
's',CED,0x15f,
'S',CAR,0x160,
's',CAR,0x161,
'T',CED,0x162,
't',CED,0x163,
'T',CAR,0x164,
't',0x27,0x165,
'T','-',0x166,
't','-',0x167,
'U',TIL,0x168,
'u',TIL,0x169,
'U',MAC,0x16a,
'u',MAC,0x16b,
'U',LSC,0x16c,
'u',LSC,0x16d,
'U',RIN,0x16e,
'u',RIN,0x16f,
'U',DAC,0x170,
'u',DAC,0x171,
'U',OGO,0x172,
'u',OGO,0x173,
'W',CIR,0x174,
'w',CIR,0x175,
'Y',CIR,0x176,
'y',CIR,0x177,
'Y',UML,0x178,
'Z',ACU,0x179,
'z',ACU,0x17a,
'Z',DOT,0x17b,
'z',DOT,0x17c,
'Z',CAR,0x17d,
'z',CAR,0x17e,
'A',CAR,0x1cd,
'a',CAR,0x1ce,
'I',CAR,0x1cf,
'i',CAR,0x1d0,
'O',CAR,0x1d1,
'o',CAR,0x1d2,
'U',CAR,0x1d3,
'u',CAR,0x1d4,
'G',CAR,0x1e6,
'g',CAR,0x1e7,
'K',CAR,0x1e8,
'k',CAR,0x1e9,
'O',OGO,0x1ea,
'o',OGO,0x1eb,
'j',CAR,0x1f0,
'G',ACU,0x1f4,
'g',ACU,0x1f5,
'N',GRA,0x1f8,
'n',GRA,0x1f9,
};
#endif /* LATIN */
#ifdef DINGBATS
int merge[]={};
int copy[]={
43,0x261e,
};
#endif /* DINGBATS */
#ifdef CYRILLIC
int merge[]={};
int copy[]={
45,0x044d,
65,0x0410,
66,0x0411,
67,0x0426,
68,0x0414,
69,0x0415,
70,0x0424,
71,0x0413,
72,0x0425,
73,0x0418,
74,0x0416,
75,0x041a,
76,0x041b,
77,0x041c,
78,0x041d,
79,0x041e,
80,0x041f,
81,0x0427,
82,0x0420,
83,0x0421,
84,0x0422,
85,0x0423,
86,0x0412,
87,0x0428,
88,0x0429,
89,0x0419,
90,0x0417,
91,0x044b,
93,0x044e,
95,0x042d,
97,0x0430,
98,0x0431,
99,0x0446,
100,0x0434,
101,0x0435,
102,0x0444,
103,0x0433,
104,0x0445,
105,0x0438,
106,0x0436,
107,0x043a,
108,0x043b,
109,0x043c,
110,0x043d,
111,0x043e,
112,0x043f,
113,0x0447,
114,0x0440,
115,0x0441,
116,0x0442,
117,0x0443,
118,0x0432,
119,0x0448,
120,0x0449,
121,0x0439,
122,0x0437,
123,0x042b,
125,0x042e,
161,0x044c,
164,0x042c,
168,0x042a,
233,0x0401,
249,0x0451
};
#endif /* CYRILLIC */
#ifdef GREEK
int copy[]={
65,0x0391,
66,0x0392,
67,0x0393,
68,0x0394,
69,0x0395,
70,0x0396,
71,0x0397,
72,0x0398,
73,0x0399,
74,0x039a,
75,0x039b,
76,0x039c,
77,0x039d,
78,0x039e,
79,0x039f,
80,0x03a0,
81,0x03a1,
82,0x03a3,
83,0x03a4,
84,0x03d2,
85,0x03a6,
86,0x03a7,
87,0x03a8,
88,0x03a9,
97,0x03b1,
98,0x03b2,
99,0x03b3,
100,0x03b4,
101,0x03b5,
102,0x03b6,
103,0x03b7,
104,0x03d1,
105,0x03b8,
106,0x03ba,
107,0x03bb,
108,0x03bc,
109,0x03bd,
110,0x03be,
111,0x03bf,
112,0x03c0,
113,0x03c1,
114,0x03c3,
115,0x03c4,
116,0x03c5,
117,0x03c6,
118,0x03c7,
119,0x03c8,
120,0x03c9,
};
int merge[]={};
#endif /* #ifdef GREEK */
unsigned char string[256];
void cp(int src, int dest)
{
sprintf(string,"cp font/new/orig_%04x.png font/new/%04x.png"
"\n",src,dest);
fputs(string,stderr);
system(string);
}
void mrg(int letter, int accent, int dest)
{
sprintf(string,"convert +append font/new/orig_%04x.png spacer.png"
" font/new/orig_%04x.png font/new/%04x.png\n",
letter,accent,dest);
fputs(string,stderr);
system(string);
}
int main(int argc, char **argv)
{
int a,top_margin,bottom_margin;
float dpi;
unsigned char *txt;
FILE *f;
if (!(txt=getenv("hundred_dpi"))){
fprintf(stderr,"Can't find environment variable \"hundred_dpi\".\n");
exit(1);
}
dpi=atof(txt)/100;
if (!(txt=getenv("top_promile"))){
fprintf(stderr,"Can't find environment variable \"top_promile\".\n");
exit(1);
}
top_margin=atol(txt)*842*dpi/72000;
if (!(txt=getenv("bottom_promile"))){
fprintf(stderr,"Can't find environment variable \"bottom_promile\".\n");
exit(1);
}
bottom_margin=atol(txt)*842*dpi/72000;
f=fopen("clip_improcess_program","w");
if (!f){
fprintf(stderr,"Can't open \"clip_improcess_program\" file for"
" writing.\n");
perror(argv[0]);
exit(1);
}
fprintf(f,"detract %d\n",bottom_margin);
fprintf(f,"mirror\nflip\nmirror\nflip\n");
fprintf(f,"detract %d\n",top_margin);
fprintf(f,"mirror\nflip\nmirror\nflip\n");
fclose(f);
fprintf(stderr,"mkdir -p font/new\n");
system("mkdir -p font/new");
fprintf(stderr,"rm font/new/*\n");
system("rm font/new/*");
for (a=0;a<256;a++)
{
sprintf(string,"convert -crop 0x0 letters%d.png letters%d.png\n",a,a);
fputs(string,stderr);
system(string);
sprintf(string,"./improcess letters%d.png clip_improcess_program"
" font/new/orig_%04x.png\n",a,a);
fputs(string,stderr);
system(string);
}
sprintf(string,"rm letters*.png\n");
fputs(string,stderr);
system(string);
#ifdef LATIN
for (a=32;a<127;a++){
cp(a,a);
}
#endif /* LATIN */
for (a=0;a<sizeof(copy)/sizeof(*copy)/2;a++){
cp(copy[a*2],copy[a*2+1]);
}
for (a=0;a<sizeof(merge)/sizeof(*merge)/3;a++){
mrg(merge[a*3],merge[a*3+1],merge[a*3+2]);
}
fprintf(stderr,"rm font/new/orig_????.png\n");
system("rm font/new/orig_????.png\n");
return 0;
}