/* unibdf2hex - program to convert a BDF file into a unifont.hex file. Author: Paul Hardy, January 2008 Note: currently this has hard-coded code points for glyphs extracted from Wen Quan Yi to create the Unifont source file "wqy.hex". Copyright (C) 2008, 2013 Paul Hardy LICENSE: This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #define UNISTART 0x3400 #define UNISTOP 0x4DBF #define MAXBUF 256 int main() { int i; int digitsout; /* how many hex digits we output in a bitmap */ int thispoint; char inbuf[MAXBUF]; int bbxx, bbxy, bbxxoff, bbxyoff; int descent=4; /* font descent wrt baseline */ int startrow; /* row to start glyph */ 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"); } } } exit (0); }