#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; }