/************************************************ * Code by Suan Hsi Yong - use at your own risk! * ************************************************/ /* Output is in Roman Numerals */ #include #include #include "gifenc30.h" /** overridable 1: colors - just declare the following yourself **/ #ifndef OWNCOLORS #define OWNCOLORS #define BGINDEX 2 /* transparency index */ unsigned char colors[/* NCOLORS */] = { 255,255,255, /* shadow */ 255, 0, 0, /* outline */ 255,255, 0, /* upper left bg */ 0,128,128, /* upper left fg */ 0, 0,255, /* lower right bg */ 255, 0,255}; /* lower right fg */ #endif #define I 0 #define V 1 #define X 2 #define L 3 #define C 4 #define D 5 #define M 6 /** overridable 2: font - a bit more complicated **/ #ifndef OWNFONTS #define OWNFONTS #define HGT 20 #define IMGMAX 4801 /* size of "MMMCDDDLXXXVIII" (240*20) + 1 */ const char size[7] = {13,16,16,16,16,16,19}; #define NCOLORS 6 #define UL_CHAR 'c' #define LR_CHAR 'e' #define BG_CHAR '.' #define FG_CHAR '-' const unsigned char charset[NCOLORS] = {'a','b','c','d','e','f'}; const char * sfont[7][HGT] = { /* Big fancy font */ { ".............","..aaaaaaaaaa.","...bba--abbbb",".....a--ab...", /*I*/ ".....a--ab...",".....a--ab...",".....a--ab...",".....a--ab...", ".....a--ab...",".....a--ab...",".....a--ab...",".....a--ab...", ".....a--ab...",".....a--ab...",".....a--ab...",".....a--ab...", ".....a--ab...",".....a--ab...","..aaaaaaaaaa.","...bbbbbbbbbb"}, { "................","..aaaaaa.....aaa","...a--ab......ab", /*V*/ "...a--a.......ab","...a--a.......ab","....a--a.....ab.", "....a--a.....ab.","....a--a.....ab.",".....a--a...ab..", ".....a--a...ab..",".....a--a...ab..","......a--a.ab...", "......a--a.ab...","......a--a.ab...",".......a--ab....", ".......a--ab....",".......a--ab....","........aab.....", "........aab.....","........bbb....."}, { "................","..aaaaaa....aaa.","...a--ab.....abb", /*X*/ "...a--a......ab.","....a--a....ab..","....a--a....ab..", ".....a--a..ab...",".....a--a..ab...","......a--aab....", "......a--aab....","......aa--ab....","......aa--ab....", ".....ab.a--a....",".....ab.a--a....","....ab...a--a...", "....ab...a--a...","...ab.....a--a..","...ab.....a--a..", "..aaa....aaaaaa.","...bbb....bbbbbb"}, { "................","..aaaaaa........","...a--abb.......", /*L*/ "...a--ab........","...a--ab........","...a--ab........", "...a--ab........","...a--ab........","...a--ab........", "...a--ab........","...a--ab........","...a--ab........", "...a--ab........","...a--ab........","...a--ab........", "...a--ab.....a..","...a--ab.....a..","...a--ab....a-a.", "..aaaaaaaaaaaaaa","...bbbbbbbbbbbbb"}, { "................","......aaaaaaa...",".....a-abbbbba..", /*C*/ "....a-abb....aa.","...a-abb....a-ab","...a-ab.....aabb", "..aa-ab......bb.","..a--ab.........","..a--ab.........", "..a--ab.........","..a--ab.........","..a--ab.........", "..a--ab.........","..aa-ab.........","...a-ab.........", "...a-ab........a","....a-a.......ab",".....a-a....aabb", "......aaaaaaabb.",".......bbbbbbb.."}, { "................","..aaaaaaaaa.....","...a--abbbaa....", /*D*/ "...a--ab...aa...","...a--ab...a-a..","...a--ab....a-a.", "...a--ab....a-ab","...a--ab....a-ab","...a--ab....a-ab", "...a--ab....a-ab","...a--ab....a-ab","...a--ab....a-ab", "...a--ab....a-ab","...a--ab....a-ab","...a--ab....a-ab", "...a--ab...a-abb","...a--ab...aabb.","...a--ab...abb..", "..aaaaaaaaabb...","...bbbbbbbbb...."}, { "...................","..aaaaaa....aaaaaa.","...a--ab.....a--abb", /*M*/ "...a--a......a--ab.","...aa--a....aa--ab.","...aa--a....aa--ab.", "...aba--a..aba--ab.","...aba--a..aba--ab.","...ab.a--aab.a--ab.", "...ab.a---ab.a--ab.","...ab..a-ab..a--ab.","...ab..a-ab..a--ab.", "...ab...ab...a--ab.","...ab........a--ab.","...ab........a--ab.", "...ab........a--ab.","...ab........a--ab.","...ab........a--ab.", "..aaa.......aaaaaab","...bbb.......bbbbbb"} }; #endif void numout(long int thenum, FILE * ofstr) { char src[IMGMAX];/* maximum width = 15 * 16 * 20 + 1 */ char cset[256]; void gifhead(FILE * ofstr, struct gifinfo a); int romanconv(int, char *); void gifout(FILE *, char *, int, struct gifinfo); struct gifinfo img; int dgt,h,i,j,k,n,wid; char num[15]; if(thenum <= 0) thenum = 1; if(thenum >= 4000) thenum = 3999; n = romanconv(thenum, num); wid = 0; for(i = 0; i < n; ++i) wid+=size[num[i]]; /*count width of digits*/ img.wid= wid; img.hgt= HGT; img.usemap= 0x80; for(i = 0; i < 256; ++i) cset[i] = i; for(i = 0; i < NCOLORS; ++i){ cset[i] = charset[i]; cset[charset[i]] = i; } img.charset= cset; img.numiter= 0; /* zero means no 'loop' */ img.delay= 0; img.nbits= 4; img.ncols= NCOLORS; img.colors= colors; img.bgindex= BGINDEX; img.istrans= 1; img.sortfl= 0; gifhead(ofstr, img); for(i = 0; i < HGT; ++i){ /* fill in background slashes */ for(j = 1; j < (wid*i/HGT); ++j) src[(i+1)*wid-j] = LR_CHAR; for(; j <= wid; ++j) src[(i+1)*wid-j] = UL_CHAR; } j = 0; for(h = 0; h < n; ++h){ dgt = num[h]; j += size[dgt]; for(i = 0; i < HGT ; ++i){ /* fill in the numbers*/ for(k = 0; k < size[dgt]; ++k){ if(sfont[dgt][i][k] == FG_CHAR) src[(i+1)*wid-j+k]++; else if(sfont[dgt][i][k] == BG_CHAR); else src[(i+1)*wid-j+k] = sfont[dgt][i][k]; } } } src[wid*HGT] = 0; gifout(ofstr, src, wid*HGT, img); /* terminator */ fputc(';',ofstr); } int romanconv(int num, char * dest) { /* note that this is returned backwards */ int h,i,j; h = num; j = 0; for(i = 0; i < 4; ++i){ switch(h%10){ case 3: dest[j++] = I + 2*i; case 2: dest[j++] = I + 2*i; case 1: dest[j++] = I + 2*i; break; case 8: dest[j++] = I + 2*i; case 7: dest[j++] = I + 2*i; case 6: dest[j++] = I + 2*i; case 5: dest[j++] = V + 2*i; break; case 4: dest[j++] = V + 2*i; dest[j++] = I + 2*i; break; case 9: dest[j++] = X + 2*i; dest[j++] = I + 2*i; break; } h /= 10; } return j; }