From 1fd361a1ea06e44286c213ca1f814f49306fdc43 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 19 Aug 2006 03:12:28 +0000 Subject: Create Subversion repository git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- other/ppmdmkfont.c | 705 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 705 insertions(+) create mode 100644 other/ppmdmkfont.c (limited to 'other/ppmdmkfont.c') diff --git a/other/ppmdmkfont.c b/other/ppmdmkfont.c new file mode 100644 index 00000000..7cf1256f --- /dev/null +++ b/other/ppmdmkfont.c @@ -0,0 +1,705 @@ +#include +#include + +#include "ppm.h" +#include "mallocvar.h" +#include "nstring.h" +#include "ppmdfont.h" + + +/* Stroke character definitions + + The following character definitions are derived from the (public + domain) Hershey plotter font database, using the single-stroke + Roman font. + + Each character definition begins with 3 bytes which specify the + number of X, Y plot pairs which follow, the negative of the skip + before starting to draw the characters, and the skip after the + character. The first plot pair moves the pen to that location and + subsequent pairs draw to the location given. A pair of 192, 0 + raises the pen, moves to the location given by the following pair, + and resumes drawing with the pair after that. + + The values in the definition tables are 8-bit two's complement + signed numbers. We declare the table as "unsigned char" and + manually sign-extend the values because C compilers differ as to + whether the type "char" is signed or unsigned, and some compilers + don't accept the qualifier "signed" which we would like to use for + these items. We specify negative numbers as their unsigned two's + complements to avoid complaints from compilers which don't like + initialising unsigned data with signed values. Ahhh, portability. +*/ + +static unsigned char char32[] = +{ 0, 0, 21 }; + +static unsigned char char33[] = +{ 8, 251, 5, + 0, 244, 0, 2, 192, 0, 0, 7, 255, 8, 0, 9, 1, 8, 0, 7 }; + +static unsigned char char34[] = +{ 17, 253, 15, + 2, 244, 1, 245, 0, 244, 1, 243, 2, 244, 2, 246, 1, + 248, 0, 249, 192, 0, 10, 244, 9, 245, 8, 244, 9, 243, 10, 244, + 10, 246, 9, 248, 8, 249, }; + +static unsigned char char35[] = +{ 11, 246, 11, + 1, 240, 250, 16, 192, 0, 7, 240, 0, 16, 192, 0, 250, + 253, 8, 253, 192, 0, 249, 3, 7, 3 }; + +static unsigned char char36[] = +{ 26, 246, 10, + 254, 240, 254, 13, 192, 0, 2, 240, 2, 13, 192, 0, 7, + 247, 5, 245, 2, 244, 254, 244, 251, 245, 249, 247, 249, 249, 250, + 251, 251, 252, 253, 253, 3, 255, 5, 0, 6, 1, 7, 3, 7, 6, 5, 8, 2, + 9, 254, 9, 251, 8, 249, 6 }; + +static unsigned char char37[] = +{ 31, 244, 12, + 9, 244, 247, 9, 192, 0, 252, 244, 254, 246, 254, + 248, 253, 250, 251, 251, 249, 251, 247, 249, 247, 247, 248, 245, + 250, 244, 252, 244, 254, 245, 1, 246, 4, 246, 7, 245, 9, 244, + 192, 0, 5, 2, 3, 3, 2, 5, 2, 7, 4, 9, 6, 9, 8, 8, 9, 6, 9, 4, 7, + 2, 5, 2 }; + +static unsigned char char38[] = +{ 34, 243, 13, + 10, 253, 10, 252, 9, 251, 8, 251, 7, 252, 6, 254, 4, + 3, 2, 6, 0, 8, 254, 9, 250, 9, 248, 8, 247, 7, 246, 5, 246, 3, + 247, 1, 248, 0, 255, 252, 0, 251, 1, 249, 1, 247, 0, 245, 254, + 244, 252, 245, 251, 247, 251, 249, 252, 252, 254, 255, 3, 6, 5, + 8, 7, 9, 9, 9, 10, 8, 10, 7 }; + +static unsigned char char39[] = +{ 7, 251, 5, + 0, 246, 255, 245, 0, 244, 1, 245, 1, 247, 0, 249, 255, + 250 }; + +static unsigned char char40[] = +{ 10, 249, 7, + 4, 240, 2, 242, 0, 245, 254, 249, 253, 254, 253, 2, + 254, 7, 0, 11, 2, 14, 4, 16 }; + +static unsigned char char41[] = +{ 10, 249, 7, + 252, 240, 254, 242, 0, 245, 2, 249, 3, 254, 3, 2, 2, + 7, 0, 11, 254, 14, 252, 16 }; + +static unsigned char char42[] = +{ 8, 248, 8, + 0, 250, 0, 6, 192, 0, 251, 253, 5, 3, 192, 0, 5, 253, + 251, 3 }; + +static unsigned char char43[] = +{ 5, 243, 13, + 0, 247, 0, 9, 192, 0, 247, 0, 9, 0 }; + +static unsigned char char44[] = +{ 8, 251, 5, + 1, 8, 0, 9, 255, 8, 0, 7, 1, 8, 1, 10, 0, 12, 255, 13 +}; + +static unsigned char char45[] = +{ 2, 243, 13, + 247, 0, 9, 0 }; + +static unsigned char char46[] = +{ 5, 251, 5, + 0, 7, 255, 8, 0, 9, 1, 8, 0, 7 }; + +static unsigned char char47[] = +{ 2, 245, 11, + 9, 240, 247, 16 }; + +static unsigned char char48[] = +{ 17, 246, 10, + 255, 244, 252, 245, 250, 248, 249, 253, 249, 0, 250, + 5, 252, 8, 255, 9, 1, 9, 4, 8, 6, 5, 7, 0, 7, 253, 6, 248, 4, + 245, 1, 244, 255, 244 }; + +static unsigned char char49[] = +{ 4, 246, 10, + 252, 248, 254, 247, 1, 244, 1, 9 }; + +static unsigned char char50[] = +{ 14, 246, 10, + 250, 249, 250, 248, 251, 246, 252, 245, 254, 244, 2, + 244, 4, 245, 5, 246, 6, 248, 6, 250, 5, 252, 3, 255, 249, 9, 7, 9 +}; + +static unsigned char char51[] = +{ 15, 246, 10, + 251, 244, 6, 244, 0, 252, 3, 252, 5, 253, 6, 254, 7, + 1, 7, 3, 6, 6, 4, 8, 1, 9, 254, 9, 251, 8, 250, 7, 249, 5 }; + + +static unsigned char char52[] = +{ 6, 246, 10, + 3, 244, 249, 2, 8, 2, 192, 0, 3, 244, 3, 9 }; + +static unsigned char char53[] = +{ 17, 246, 10, + 5, 244, 251, 244, 250, 253, 251, 252, 254, 251, 1, + 251, 4, 252, 6, 254, 7, 1, 7, 3, 6, 6, 4, 8, 1, 9, 254, 9, 251, + 8, 250, 7, 249, 5 }; + +static unsigned char char54[] = +{ 23, 246, 10, + 6, 247, 5, 245, 2, 244, 0, 244, 253, 245, 251, 248, + 250, 253, 250, 2, 251, 6, 253, 8, 0, 9, 1, 9, 4, 8, 6, 6, 7, 3, + 7, 2, 6, 255, 4, 253, 1, 252, 0, 252, 253, 253, 251, 255, 250, 2 +}; + +static unsigned char char55[] = +{ 5, 246, 10, + 7, 244, 253, 9, 192, 0, 249, 244, 7, 244 }; + +static unsigned char char56[] = +{ 29, 246, 10, + 254, 244, 251, 245, 250, 247, 250, 249, 251, 251, + 253, 252, 1, 253, 4, 254, 6, 0, 7, 2, 7, 5, 6, 7, 5, 8, 2, 9, + 254, 9, 251, 8, 250, 7, 249, 5, 249, 2, 250, 0, 252, 254, 255, + 253, 3, 252, 5, 251, 6, 249, 6, 247, 5, 245, 2, 244, 254, 244 }; + +static unsigned char char57[] = +{ 23, 246, 10, + 6, 251, 5, 254, 3, 0, 0, 1, 255, 1, 252, 0, 250, + 254, 249, 251, 249, 250, 250, 247, 252, 245, 255, 244, 0, 244, 3, + 245, 5, 247, 6, 251, 6, 0, 5, 5, 3, 8, 0, 9, 254, 9, 251, 8, 250, + 6 }; + +static unsigned char char58[] = +{ 11, 251, 5, + 0, 251, 255, 252, 0, 253, 1, 252, 0, 251, 192, 0, 0, + 7, 255, 8, 0, 9, 1, 8, 0, 7 }; + +static unsigned char char59[] = +{ 14, 251, 5, + 0, 251, 255, 252, 0, 253, 1, 252, 0, 251, 192, 0, 1, + 8, 0, 9, 255, 8, 0, 7, 1, 8, 1, 10, 0, 12, 255, 13 }; + +static unsigned char char60[] = +{ 3, 244, 12, + 8, 247, 248, 0, 8, 9 }; + +static unsigned char char61[] = +{ 5, 243, 13, + 247, 253, 9, 253, 192, 0, 247, 3, 9, 3 }; + +static unsigned char char62[] = +{ 3, 244, 12, + 248, 247, 8, 0, 248, 9 }; + +static unsigned char char63[] = +{ 20, 247, 9, + 250, 249, 250, 248, 251, 246, 252, 245, 254, 244, 2, + 244, 4, 245, 5, 246, 6, 248, 6, 250, 5, 252, 4, 253, 0, 255, 0, + 2, 192, 0, 0, 7, 255, 8, 0, 9, 1, 8, 0, 7 }; + +static unsigned char char64[] = +{ 55, 243, 14, + 5, 252, 4, 250, 2, 249, 255, 249, 253, 250, 252, + 251, 251, 254, 251, 1, 252, 3, 254, 4, 1, 4, 3, 3, 4, 1, 192, 0, + 255, 249, 253, 251, 252, 254, 252, 1, 253, 3, 254, 4, 192, 0, 5, + 249, 4, 1, 4, 3, 6, 4, 8, 4, 10, 2, 11, 255, 11, 253, 10, 250, 9, + 248, 7, 246, 5, 245, 2, 244, 255, 244, 252, 245, 250, 246, 248, + 248, 247, 250, 246, 253, 246, 0, 247, 3, 248, 5, 250, 7, 252, 8, + 255, 9, 2, 9, 5, 8, 7, 7, 8, 6, 192, 0, 6, 249, 5, 1, 5, 3, 6, 4 +}; + +static unsigned char char65[] = +{ 8, 247, 9, + 0, 244, 248, 9, 192, 0, 0, 244, 8, 9, 192, 0, 251, 2, + 5, 2 }; + +static unsigned char char66[] = +{ 23, 245, 10, + 249, 244, 249, 9, 192, 0, 249, 244, 2, 244, 5, 245, + 6, 246, 7, 248, 7, 250, 6, 252, 5, 253, 2, 254, 192, 0, 249, 254, + 2, 254, 5, 255, 6, 0, 7, 2, 7, 5, 6, 7, 5, 8, 2, 9, 249, 9 }; + +static unsigned char char67[] = +{ 18, 246, 11, + 8, 249, 7, 247, 5, 245, 3, 244, 255, 244, 253, 245, + 251, 247, 250, 249, 249, 252, 249, 1, 250, 4, 251, 6, 253, 8, + 255, 9, 3, 9, 5, 8, 7, 6, 8, 4 }; + +static unsigned char char68[] = +{ 15, 245, 10, + 249, 244, 249, 9, 192, 0, 249, 244, 0, 244, 3, 245, + 5, 247, 6, 249, 7, 252, 7, 1, 6, 4, 5, 6, 3, 8, 0, 9, 249, 9 }; + +static unsigned char char69[] = +{ 11, 246, 9, + 250, 244, 250, 9, 192, 0, 250, 244, 7, 244, 192, 0, + 250, 254, 2, 254, 192, 0, 250, 9, 7, 9 }; + +static unsigned char char70[] = +{ 8, 246, 8, + 250, 244, 250, 9, 192, 0, 250, 244, 7, 244, 192, 0, + 250, 254, 2, 254 }; + +static unsigned char char71[] = +{ 22, 246, 11, + 8, 249, 7, 247, 5, 245, 3, 244, 255, 244, 253, 245, + 251, 247, 250, 249, 249, 252, 249, 1, 250, 4, 251, 6, 253, 8, + 255, 9, 3, 9, 5, 8, 7, 6, 8, 4, 8, 1, 192, 0, 3, 1, 8, 1 }; + +static unsigned char char72[] = +{ 8, 245, 11, + 249, 244, 249, 9, 192, 0, 7, 244, 7, 9, 192, 0, 249, + 254, 7, 254 }; + +static unsigned char char73[] = +{ 2, 252, 4, + 0, 244, 0, 9 }; + +static unsigned char char74[] = +{ 10, 248, 8, + 4, 244, 4, 4, 3, 7, 2, 8, 0, 9, 254, 9, 252, 8, 251, + 7, 250, 4, 250, 2 }; + +static unsigned char char75[] = +{ 8, 245, 10, + 249, 244, 249, 9, 192, 0, 7, 244, 249, 2, 192, 0, + 254, 253, 7, 9 }; + +static unsigned char char76[] = +{ 3, 246, 7, + 250, 244, 250, 9, 6, 9 }; + +static unsigned char char77[] = +{ 11, 244, 12, + 248, 244, 248, 9, 192, 0, 248, 244, 0, 9, 192, 0, 8, + 244, 0, 9, 192, 0, 8, 244, 8, 9 }; + +static unsigned char char78[] = +{ 8, 245, 11, + 249, 244, 249, 9, 192, 0, 249, 244, 7, 9, 192, 0, 7, + 244, 7, 9 }; + +static unsigned char char79[] = +{ 21, 245, 11, + 254, 244, 252, 245, 250, 247, 249, 249, 248, 252, + 248, 1, 249, 4, 250, 6, 252, 8, 254, 9, 2, 9, 4, 8, 6, 6, 7, 4, + 8, 1, 8, 252, 7, 249, 6, 247, 4, 245, 2, 244, 254, 244 }; + +static unsigned char char80[] = +{ 13, 245, 10, + 249, 244, 249, 9, 192, 0, 249, 244, 2, 244, 5, 245, + 6, 246, 7, 248, 7, 251, 6, 253, 5, 254, 2, 255, 249, 255 }; + +static unsigned char char81[] = +{ 24, 245, 11, + 254, 244, 252, 245, 250, 247, 249, 249, 248, 252, + 248, 1, 249, 4, 250, 6, 252, 8, 254, 9, 2, 9, 4, 8, 6, 6, 7, 4, + 8, 1, 8, 252, 7, 249, 6, 247, 4, 245, 2, 244, 254, 244, 192, 0, + 1, 5, 7, 11 }; + +static unsigned char char82[] = +{ 16, 245, 10, + 249, 244, 249, 9, 192, 0, 249, 244, 2, 244, 5, 245, + 6, 246, 7, 248, 7, 250, 6, 252, 5, 253, 2, 254, 249, 254, 192, 0, + 0, 254, 7, 9 }; + +static unsigned char char83[] = +{ 20, 246, 10, + 7, 247, 5, 245, 2, 244, 254, 244, 251, 245, 249, + 247, 249, 249, 250, 251, 251, 252, 253, 253, 3, 255, 5, 0, 6, 1, + 7, 3, 7, 6, 5, 8, 2, 9, 254, 9, 251, 8, 249, 6 }; + +static unsigned char char84[] = +{ 5, 248, 8, + 0, 244, 0, 9, 192, 0, 249, 244, 7, 244 }; + +static unsigned char char85[] = +{ 10, 245, 11, + 249, 244, 249, 3, 250, 6, 252, 8, 255, 9, 1, 9, 4, + 8, 6, 6, 7, 3, 7, 244 }; + +static unsigned char char86[] = +{ 5, 247, 9, + 248, 244, 0, 9, 192, 0, 8, 244, 0, 9 }; + +static unsigned char char87[] = +{ 11, 244, 12, + 246, 244, 251, 9, 192, 0, 0, 244, 251, 9, 192, 0, 0, + 244, 5, 9, 192, 0, 10, 244, 5, 9 }; + +static unsigned char char88[] = +{ 5, 246, 10, + 249, 244, 7, 9, 192, 0, 7, 244, 249, 9 }; + +static unsigned char char89[] = +{ 6, 247, 9, + 248, 244, 0, 254, 0, 9, 192, 0, 8, 244, 0, 254 }; + +static unsigned char char90[] = +{ 8, 246, 10, + 7, 244, 249, 9, 192, 0, 249, 244, 7, 244, 192, 0, + 249, 9, 7, 9 }; + +static unsigned char char91[] = +{ 11, 249, 7, + 253, 240, 253, 16, 192, 0, 254, 240, 254, 16, 192, 0, + 253, 240, 4, 240, 192, 0, 253, 16, 4, 16 }; + +static unsigned char char92[] = +{ 2, 245, 11, + 9, 16, 247, 240 }; + +static unsigned char char93[] = +{ 11, 249, 7, + 2, 240, 2, 16, 192, 0, 3, 240, 3, 16, 192, 0, 252, + 240, 3, 240, 192, 0, 252, 16, 3, 16 }; + +static unsigned char char94[] = +{ 7, 245, 11, + 248, 2, 0, 253, 8, 2, 192, 0, 248, 2, 0, 254, 8, 2 }; + +static unsigned char char95[] = +{ 2, 253, 22, + 0, 9, 20, 9 }; + +static unsigned char char96[] = +{ 7, 251, 5, + 1, 244, 0, 245, 255, 247, 255, 249, 0, 250, 1, 249, 0, 248 }; + +static unsigned char char97[] = +{ 17, 247, 10, + 6, 251, 6, 9, 192, 0, 6, 254, 4, 252, 2, 251, 255, + 251, 253, 252, 251, 254, 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, + 2, 9, 4, 8, 6, 6 }; + +static unsigned char char98[] = +{ 17, 246, 9, + 250, 244, 250, 9, 192, 0, 250, 254, 252, 252, 254, + 251, 1, 251, 3, 252, 5, 254, 6, 1, 6, 3, 5, 6, 3, 8, 1, 9, 254, + 9, 252, 8, 250, 6 }; + +static unsigned char char99[] = +{ 14, 247, 9, + 6, 254, 4, 252, 2, 251, 255, 251, 253, 252, 251, 254, + 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, 2, 9, 4, 8, 6, 6 }; + +static unsigned char char100[] = +{ 17, 247, 10, + 6, 244, 6, 9, 192, 0, 6, 254, 4, 252, 2, 251, 255, + 251, 253, 252, 251, 254, 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, + 2, 9, 4, 8, 6, 6 }; + +static unsigned char char101[] = +{ 17, 247, 9, + 250, 1, 6, 1, 6, 255, 5, 253, 4, 252, 2, 251, 255, + 251, 253, 252, 251, 254, 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, + 2, 9, 4, 8, 6, 6 }; + +static unsigned char char102[] = +{ 8, 251, 7, + 5, 244, 3, 244, 1, 245, 0, 248, 0, 9, 192, 0, 253, + 251, 4, 251 }; + +static unsigned char char103[] = +{ 22, 247, 10, + 6, 251, 6, 11, 5, 14, 4, 15, 2, 16, 255, 16, 253, + 15, 192, 0, 6, 254, 4, 252, 2, 251, 255, 251, 253, 252, 251, + 254, 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, 2, 9, 4, 8, 6, 6 }; + +static unsigned char char104[] = +{ 10, 247, 10, + 251, 244, 251, 9, 192, 0, 251, 255, 254, 252, 0, + 251, 3, 251, 5, 252, 6, 255, 6, 9 }; + +static unsigned char char105[] = +{ 8, 252, 4, + 255, 244, 0, 245, 1, 244, 0, 243, 255, 244, 192, 0, + 0, 251, 0, 9 }; + +static unsigned char char106[] = +{ 11, 251, 5, + 0, 244, 1, 245, 2, 244, 1, 243, 0, 244, 192, 0, 1, + 251, 1, 12, 0, 15, 254, 16, 252, 16 }; + +static unsigned char char107[] = +{ 8, 247, 8, + 251, 244, 251, 9, 192, 0, 5, 251, 251, 5, 192, 0, 255, 1, 6, 9 }; + +static unsigned char char108[] = +{ 2, 252, 4, + 0, 244, 0, 9 }; + +static unsigned char char109[] = +{ 18, 241, 15, + 245, 251, 245, 9, 192, 0, 245, 255, 248, 252, 250, + 251, 253, 251, 255, 252, 0, 255, 0, 9, 192, 0, 0, 255, 3, 252, + 5, 251, 8, 251, 10, 252, 11, 255, 11, 9 }; + +static unsigned char char110[] = +{ 10, 247, 10, + 251, 251, 251, 9, 192, 0, 251, 255, 254, 252, 0, + 251, 3, 251, 5, 252, 6, 255, 6, 9 }; + +static unsigned char char111[] = +{ 17, 247, 10, + 255, 251, 253, 252, 251, 254, 250, 1, 250, 3, 251, + 6, 253, 8, 255, 9, 2, 9, 4, 8, 6, 6, 7, 3, 7, 1, 6, 254, 4, 252, + 2, 251, 255, 251 }; + +static unsigned char char112[] = +{ 17, 246, 9, + 250, 251, 250, 16, 192, 0, 250, 254, 252, 252, 254, + 251, 1, 251, 3, 252, 5, 254, 6, 1, 6, 3, 5, 6, 3, 8, 1, 9, 254, + 9, 252, 8, 250, 6 }; + +static unsigned char char113[] = +{ 17, 247, 10, + 6, 251, 6, 16, 192, 0, 6, 254, 4, 252, 2, 251, 255, + 251, 253, 252, 251, 254, 250, 1, 250, 3, 251, 6, 253, 8, 255, 9, + 2, 9, 4, 8, 6, 6 }; + +static unsigned char char114[] = +{ 8, 249, 6, + 253, 251, 253, 9, 192, 0, 253, 1, 254, 254, 0, 252, + 2, 251, 5, 251 }; + +static unsigned char char115[] = +{ 17, 248, 9, + 6, 254, 5, 252, 2, 251, 255, 251, 252, 252, 251, + 254, 252, 0, 254, 1, 3, 2, 5, 3, 6, 5, 6, 6, 5, 8, 2, 9, 255, 9, + 252, 8, 251, 6 }; + +static unsigned char char116[] = +{ 8, 251, 7, + 0, 244, 0, 5, 1, 8, 3, 9, 5, 9, 192, 0, 253, 251, 4, 251 }; + +static unsigned char char117[] = +{ 10, 247, 10, + 251, 251, 251, 5, 252, 8, 254, 9, 1, 9, 3, 8, 6, 5, + 192, 0, 6, 251, 6, 9 }; + +static unsigned char char118[] = +{ 5, 248, 8, + 250, 251, 0, 9, 192, 0, 6, 251, 0, 9 }; + +static unsigned char char119[] = +{ 11, 245, 11, + 248, 251, 252, 9, 192, 0, 0, 251, 252, 9, 192, 0, + 0, 251, 4, 9, 192, 0, 8, 251, 4, 9 }; + +static unsigned char char120[] = +{ 5, 248, 9, + 251, 251, 6, 9, 192, 0, 6, 251, 251, 9 }; + +static unsigned char char121[] = +{ 9, 248, 8, + 250, 251, 0, 9, 192, 0, 6, 251, 0, 9, 254, 13, 252, + 15, 250, 16, 249, 16 }; + +static unsigned char char122[] = +{ 8, 248, 9, + 6, 251, 251, 9, 192, 0, 251, 251, 6, 251, 192, 0, + 251, 9, 6, 9 }; + +static unsigned char char123[] = +{ 39, 249, 7, + 2, 240, 0, 241, 255, 242, 254, 244, 254, 246, 255, + 248, 0, 249, 1, 251, 1, 253, 255, 255, 192, 0, 0, 241, 255, 243, + 255, 245, 0, 247, 1, 248, 2, 250, 2, 252, 1, 254, 253, 0, 1, 2, + 2, 4, 2, 6, 1, 8, 0, 9, 255, 11, 255, 13, 0, 15, 192, 0, 255, 1, + 1, 3, 1, 5, 0, 7, 255, 8, 254, 10, 254, 12, 255, 14, 0, 15, 2, 16 }; + +static unsigned char char124[] = +{ 2, 252, 4, + 0, 240, 0, 16 }; + +static unsigned char char125[] = +{ 39, 249, 7, + 254, 240, 0, 241, 1, 242, 2, 244, 2, 246, 1, 248, 0, + 249, 255, 251, 255, 253, 1, 255, 192, 0, 0, 241, 1, 243, 1, 245, + 0, 247, 255, 248, 254, 250, 254, 252, 255, 254, 3, 0, 255, 2, + 254, 4, 254, 6, 255, 8, 0, 9, 1, 11, 1, 13, 0, 15, 192, 0, 1, 1, + 255, 3, 255, 5, 0, 7, 1, 8, 2, 10, 2, 12, 1, 14, 0, 15, 254, 16 }; + +static unsigned char char126[] = +{ 23, 255, 21, + 2, 1, 0, 255, 1, 253, 3, 251, 5, 251, 7, 252, + 11, 255, 13, 0, 15, 0, 17, 255, 18, 254, 192, 0, 2, 0, 1, + 254, 3, 253, 5, 253, 7, 254, 11, 1, 13, 2, 15, 2, 17, 1, 18, + 255, 18, 252 }; + +/* Pointers to character definition tables. */ + +static unsigned char * fontData[] = { + char32, char33, char34, char35, char36, char37, char38, char39, char40, + char41, char42, char43, char44, char45, char46, char47, char48, char49, + char50, char51, char52, char53, char54, char55, char56, char57, char58, + char59, char60, char61, char62, char63, char64, char65, char66, char67, + char68, char69, char70, char71, char72, char73, char74, char75, char76, + char77, char78, char79, char80, char81, char82, char83, char84, char85, + char86, char87, char88, char89, char90, char91, char92, char93, char94, + char95, char96, char97, char98, char99, char100, char101, char102, + char103, char104, char105, char106, char107, char108, char109, char110, + char111, char112, char113, char114, char115, char116, char117, char118, + char119, char120, char121, char122, char123, char124, char125, char126 +}; + + + +static void +writeGlyphCommand(FILE * const ofP, + struct ppmd_glyphCommand const glyphCommand) { + + fputc(glyphCommand.verb, ofP); + fputc(glyphCommand.x, ofP); + fputc(glyphCommand.y, ofP); +} + + + +static void +writeMovePen(FILE * const ofP, + const unsigned char * const glyphData) { + + struct ppmd_glyphCommand glyphCommand; + + glyphCommand.verb = CMD_MOVEPEN; + glyphCommand.x = glyphData[0]; + glyphCommand.y = glyphData[1]; + + writeGlyphCommand(ofP, glyphCommand); +} + + + +static void +writeMovePenNoop(FILE * const ofP, + const unsigned char * const glyphData) { + + struct ppmd_glyphCommand glyphCommand; + + glyphCommand.verb = CMD_MOVEPEN; + glyphCommand.x = glyphData[0]; + glyphCommand.y = glyphData[1]; + + writeGlyphCommand(ofP, glyphCommand); + + glyphCommand.verb = CMD_NOOP; + glyphCommand.x = 0; + glyphCommand.y = 0; + + writeGlyphCommand(ofP, glyphCommand); +} + + + +static void +writeDrawLine(FILE * const ofP, + const unsigned char * const glyphData) { + + struct ppmd_glyphCommand glyphCommand; + + glyphCommand.verb = CMD_DRAWLINE; + glyphCommand.x = glyphData[0]; + glyphCommand.y = glyphData[1]; + + writeGlyphCommand(ofP, glyphCommand); +} + + + +static void +writeGlyphHeader(FILE * const ofP, + struct ppmd_glyphHeader const glyphHeader) { + + fputc(glyphHeader.commandCount, ofP); + fputc(glyphHeader.skipBefore, ofP); + fputc(glyphHeader.skipAfter, ofP); +} + + + +static void +writeBuiltinCharacter(FILE * const ofP, + unsigned int const relativeCodePoint) { + + const unsigned char * const glyphData = fontData[relativeCodePoint]; + + struct ppmd_glyphHeader glyphHeader; + unsigned int commandNum; + + glyphHeader.commandCount = glyphData[0]; + glyphHeader.skipBefore = glyphData[1]; + glyphHeader.skipAfter = glyphData[2]; + + writeGlyphHeader(ofP, glyphHeader); + + commandNum = 0; + + while (commandNum < glyphHeader.commandCount) { + + if (commandNum == 0) { + writeMovePen(ofP, &glyphData[3 + commandNum * 2]); + commandNum += 1; + } else if (glyphData[3 + commandNum*2] == 192) { + + assert(commandNum + 1 < glyphHeader.commandCount); + + writeMovePenNoop(ofP, &glyphData[3 + (commandNum + 1) * 2]); + + commandNum += 2; + } else { + writeDrawLine(ofP, &glyphData[3 + commandNum * 2]); + commandNum += 1; + } + } +} + + + +static void +writeFontHeader(FILE * const ofP, + struct ppmd_fontHeader const fontHeader) { + + fwrite(fontHeader.signature, 1, sizeof(fontHeader.signature), ofP); + fputc(fontHeader.format, ofP); + fputc(fontHeader.characterCount, ofP); + fputc(fontHeader.firstCodePoint, ofP); +} + + + +static void +writeBuiltinFont(FILE * const ofP) { + + unsigned int relativeCodePoint; + + struct ppmd_fontHeader fontHeader; + + memcpy(fontHeader.signature, "ppmdfont", sizeof(fontHeader.signature)); + fontHeader.format = 0x01; + fontHeader.characterCount = 95; + fontHeader.firstCodePoint = 32; + + writeFontHeader(ofP, fontHeader); + + for (relativeCodePoint = 0; + relativeCodePoint < fontHeader.characterCount; + ++relativeCodePoint) { + + writeBuiltinCharacter(ofP,relativeCodePoint); + } +} + + + +int +main(int argc, char **argv) { + + ppm_init(&argc, argv); + + writeBuiltinFont(stdout); + + return 0; +} -- cgit 1.4.1