#include <stdlib.h>
#include <string.h>
-#define UNISTART 0x3400
-#define UNISTOP 0x4DBF
-
#define MAXBUF 256
main()
{
int i;
- int digitsout; /* how many hex digits we output in a bitmap */
+ int rownum; /* number of lines we output in bitmap */
int thispoint;
char inbuf[MAXBUF];
int bbxx, bbxy, bbxxoff, bbxyoff;
- int descent=4; /* font descent wrt baseline */
+ int descent=2; /* font descent wrt baseline */
int startrow; /* row to start glyph */
+ int rowlen; /* number of digits per row */
unsigned rowout;
- while (fgets (inbuf, MAXBUF - 1, stdin) != NULL) {
- if (strncmp (inbuf, "ENCODING ", 9) != 0) continue;
+ while (fgets (inbuf, MAXBUF - 1, stdin)) {
+ if (strncmp (inbuf, "ENCODING ", 9)) continue;
sscanf (&inbuf[9], "%d", &thispoint); /* get code point */
- /*
- If we want this code point, get the BBX (bounding box) and
- BITMAP information.
- */
- if (!(
- (thispoint >= 0x2E80 && thispoint <= 0x2EFF) || // CJK Radicals Supplement
- (thispoint >= 0x2F00 && thispoint <= 0x2FDF) || // Kangxi Radicals
- (thispoint >= 0x2FF0 && thispoint <= 0x2FFF) || // Ideographic Description Characters
- (thispoint >= 0x3001 && thispoint <= 0x303F) || // CJK Symbols and Punctuation (U+3000 is a space)
- (thispoint >= 0x3100 && thispoint <= 0x312F) || // Bopomofo
- (thispoint >= 0x31A0 && thispoint <= 0x31BF) || // Bopomofo extend
- (thispoint >= 0x31C0 && thispoint <= 0x31EF) || // CJK Strokes
- (thispoint >= 0x3400 && thispoint <= 0x4DBF) || // CJK Unified Ideographs Extension A
- (thispoint >= 0x4E00 && thispoint <= 0x9FCF) || // CJK Unified Ideographs
- (thispoint >= 0xF900 && thispoint <= 0xFAFF)) // CJK Compatibility Ideographs
- ) continue;
- while (fgets (inbuf, MAXBUF - 1, stdin) != NULL &&
- strncmp (inbuf, "BBX ", 4) != 0); /* find bounding box */
+ while (fgets (inbuf, MAXBUF - 1, stdin)) {
+ if (!strncmp (inbuf, "DWIDTH ", 7)) break;
+ }
+ sscanf (&inbuf[7], "%d", &rowlen);
+ rowlen >>= 2;
+
+ /* Read bounding box values from BBX line */
+ while (fgets (inbuf, MAXBUF - 1, stdin)) {
+ if (!strncmp (inbuf, "BBX ", 4)) break;
+ }
sscanf (&inbuf[4], "%d %d %d %d", &bbxx, &bbxy, &bbxxoff, &bbxyoff);
- while (fgets (inbuf, MAXBUF - 1, stdin) != NULL &&
- strncmp (inbuf, "BITMAP", 6) != 0); /* find bitmap start */
+
+ /* Find BITMAP start */
+ while (fgets (inbuf, MAXBUF - 1, stdin)) {
+ if (!strncmp (inbuf, "BITMAP", 6)) break;
+ }
+
fprintf (stdout, "%04X:", thispoint);
- digitsout = 0;
+ rownum = 0;
/* Print initial blank rows */
startrow = descent + bbxyoff + bbxy;
/* Force everything to 16 pixels wide */
for (i = 16; i > startrow; i--) {
- fprintf (stdout,"0000");
- digitsout += 4;
+ fprintf (stdout, "%0*d", rowlen, 0);
+ rownum++;
}
- while (fgets (inbuf, MAXBUF - 1, stdin) != NULL &&
- strncmp (inbuf, "END", 3) != 0) { /* copy bitmap until END */
+ /* Copy bitmap until END */
+ while (fgets (inbuf, MAXBUF - 1, stdin)) {
+ if (!strncmp (inbuf, "END", 3)) break;
sscanf (inbuf, "%X", &rowout);
- /* Now force glyph to a 16x16 grid even if they'd fit in 8x16 */
- if (bbxx <= 8) rowout <<= 8; /* shift left for 16x16 glyph */
+ if (rowlen >= 4 && bbxx <= 8) rowout <<= 8; /* force 8x16 input to 16x16 grid */
rowout >>= bbxxoff;
- fprintf (stdout, "%04X", rowout);
- digitsout += 4;
+ fprintf (stdout, "%0*X", rowlen, rowout);
+ rownum++;
}
- /* Pad for 16x16 glyph */
- while (digitsout < 64) {
- fprintf (stdout,"0000");
- digitsout += 4;
+ /* Pad empty lines until glyph has sufficient height */
+ while (rownum < 16) {
+ fprintf (stdout, "%0*d", rowlen, 0);
+ rownum++;
}
fprintf (stdout,"\n");
}