unibdf2hex: preserve line width
[unifont.git] / src / unibdf2hex.c
index e8c65f502e06846ee1e9c42bc800ca2bb50bf8d7..17fd83ddc3317a7313e19919f750da472ff660cc 100644 (file)
@@ -28,9 +28,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define UNISTART 0x3400
-#define UNISTOP 0x4DBF
-
 #define MAXBUF 256
 
 
@@ -38,67 +35,63 @@ int
 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) {
-         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
-            {
-            while (fgets (inbuf, MAXBUF - 1, stdin) != NULL &&
-                   strncmp (inbuf, "BBX ", 4) != 0); /* find bounding box */
-
-            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 */
-            fprintf (stdout, "%04X:", thispoint);
-            digitsout = 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;
-            }
-            while (fgets (inbuf, MAXBUF - 1, stdin) != NULL &&
-                   strncmp (inbuf, "END", 3) != 0) { /* copy bitmap until END */
-               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 */
-               rowout >>= bbxxoff;
-               fprintf (stdout, "%04X", rowout);
-               digitsout += 4;
-            }
-
-            /* Pad for 16x16 glyph */
-            while (digitsout < 64) {
-               fprintf (stdout,"0000");
-               digitsout += 4;
-            }
-            fprintf (stdout,"\n");
-         }
+   while (fgets (inbuf, MAXBUF - 1, stdin)) {
+      if (strncmp (inbuf, "ENCODING ", 9)) continue;
+      sscanf (&inbuf[9], "%d", &thispoint); /* get code point */
+
+      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);
+
+      /* Find BITMAP start */
+      while (fgets (inbuf, MAXBUF - 1, stdin)) {
+        if (!strncmp (inbuf, "BITMAP", 6)) break;
+      }
+
+      fprintf (stdout, "%04X:", thispoint);
+      rownum = 0;
+      /* Print initial blank rows */
+      startrow = descent + bbxyoff + bbxy;
+
+      /* Force everything to 16 pixels wide */
+      for (i = 16; i > startrow; i--) {
+         fprintf (stdout, "%0*d", rowlen, 0);
+         rownum++;
+      }
+      /* Copy bitmap until END */
+      while (fgets (inbuf, MAXBUF - 1, stdin)) {
+         if (!strncmp (inbuf, "END", 3)) break;
+         sscanf (inbuf, "%X", &rowout);
+         if (rowlen >= 4 && bbxx <= 8) rowout <<= 8;  /* force 8x16 input to 16x16 grid */
+         rowout >>= bbxxoff;
+         fprintf (stdout, "%0*X", rowlen, rowout);
+         rownum++;
+      }
+
+      /* Pad empty lines until glyph has sufficient height */
+      while (rownum < 16) {
+         fprintf (stdout, "%0*d", rowlen, 0);
+         rownum++;
       }
+      fprintf (stdout,"\n");
    }
    exit (0);
 }