From 218eb6fcb174e4048652ee7840148cbf50cfcb1a Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 15 Jan 2025 09:00:28 -0800 Subject: [PATCH] Fix bugs and add bitmap/pixmap options for font conversion --- src/dhgr.tk/makefile | 6 +- src/dhgr.tk/utils/ddfonconv.c | 272 +++++++++++++++++++++++ src/dhgr.tk/utils/fonts/Shaston320.ttf | Bin 0 -> 50732 bytes src/dhgr.tk/utils/fonts/Shaston640.ttf | Bin 0 -> 50728 bytes src/dhgr.tk/utils/fonts/ShastonHi320.ttf | Bin 0 -> 73276 bytes src/dhgr.tk/utils/fonts/ShastonHi640.ttf | Bin 0 -> 73276 bytes src/dhgr.tk/utils/gsfonconv.c | 82 +++---- src/dhgr.tk/utils/ttfconv.c | 89 +++++--- 8 files changed, 381 insertions(+), 68 deletions(-) create mode 100644 src/dhgr.tk/utils/ddfonconv.c create mode 100644 src/dhgr.tk/utils/fonts/Shaston320.ttf create mode 100644 src/dhgr.tk/utils/fonts/Shaston640.ttf create mode 100644 src/dhgr.tk/utils/fonts/ShastonHi320.ttf create mode 100644 src/dhgr.tk/utils/fonts/ShastonHi640.ttf diff --git a/src/dhgr.tk/makefile b/src/dhgr.tk/makefile index 37f7d0c..5efc73d 100644 --- a/src/dhgr.tk/makefile +++ b/src/dhgr.tk/makefile @@ -12,6 +12,7 @@ DHGRSHOW = dhgr.tk/utils/DHGRSHOW.REL DLGRCONV = dhgr.tk/utils/DLGRCONV.REL TTFCONV = dhgr.tk/utils/ttfconv IIGSCONV = dhgr.tk/utils/gsfonconv +DDCONV = dhgr.tk/utils/ddfonconv PENGUINS = dhgr.tk/demos/penguins/PENGUINS.REL @@ -40,7 +41,7 @@ demos: $(PENGUINS) cp $(PENGUINS) prodos/dhgr.tk/demos/penguins/ cp dhgr.tk/demos/penguins/*.BIN prodos/dhgr.tk/demos/penguins/ -fontconv: $(TTFCONV) $(IIGSCONV) +fontconv: $(TTFCONV) $(IIGSCONV) $(DDCONV) all: libs test utils demos @@ -56,6 +57,9 @@ $(TTFCONV): dhgr.tk/utils/ttfconv.c $(IIGSCONV): dhgr.tk/utils/gsfonconv.c cc dhgr.tk/utils/gsfonconv.c -o dhgr.tk/utils/gsfonconv +$(DDCONV): dhgr.tk/utils/ddfonconv.c + cc dhgr.tk/utils/ddfonconv.c -o dhgr.tk/utils/ddfonconv + $(DHGRLIB): dhgr.tk/libs/dhgrlib.pla dhgr.tk/inc/dhgrlib.plh ./xplasm -AMOW dhgr.tk/libs/dhgrlib.pla acme --setpc 4094 -o $(DHGRLIB) dhgr.tk/libs/dhgrlib.a diff --git a/src/dhgr.tk/utils/ddfonconv.c b/src/dhgr.tk/utils/ddfonconv.c new file mode 100644 index 0000000..ac27638 --- /dev/null +++ b/src/dhgr.tk/utils/ddfonconv.c @@ -0,0 +1,272 @@ +/* + * GS font converter + */ + +#include +#include +#include +//#include +#include + +#define FONT_WIDTH 32 +#define FONT_HEIGHT 12 +#define GLYPH_FIRST 32 +#define GLYPH_LAST 127 +#define GLYPH_COUNT (GLYPH_LAST-GLYPH_FIRST+1) +struct macfont { + uint16_t fontType; + uint16_t firstChar; + uint16_t lastChar; + uint16_t widMax; + uint16_t kernMax; + uint16_t nDescent; + uint16_t rectWidth; + uint16_t rectHeight; + uint16_t owTLoc; + uint16_t ascent; + uint16_t descent; + uint16_t leading; + uint16_t rowWords; + uint16_t bitImage; // [rowWords * rectHeight] (fonstStrike) + //uint16_t rlocTable; // lastChar - firstChar + 3 : pixel offset of glyph in bitImage + //uint16_t owTable; lastChar - firstChar + 3 : offset/width table +}; +struct gsfont *gsf; +struct macfont *macf; +int16_t *locTable; +uint16_t *owTable; +/* + * Bit reversals + */ +unsigned char bitReverse[256]; +unsigned char clrSwap[256]; +unsigned char clrRot[] = {0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E, + 0x01,0x03,0x05,0x07,0x09,0x0B,0x0D,0x0F}; +void write_glyph(FILE *fp, int c) +{ + uint8_t glyphdef[5], *swapbuf, *glyphBits; + uint32_t rowbits; + int pixOffset, pixWidth, byteWidth, byteOffset, bitShift, bitWidth, glyphSpan, i; + int left, top, width, height; + + if (c < macf->firstChar || c > macf->lastChar) + { + memset(glyphdef, 0, 5); + fwrite(&glyphdef, 1, 5, fp); + return; + } + c -= macf->firstChar; + glyphBits = (uint8_t *)&(macf->bitImage), + glyphSpan = macf->rowWords * 2; + height = macf->rectHeight; + width = owTable[c] & 0xFF; + left = owTable[c] >> 8; + top = macf->ascent; + + glyphdef[0] = left; + glyphdef[1] = -top; +#if PIXFONT + glyphdef[2] = (width + 3) / 4; +#else + glyphdef[2] = width; +#endif + glyphdef[3] = height; + glyphdef[4] = width + left; + fwrite(&glyphdef, 1, 5, fp); + + pixOffset = locTable[c]; + pixWidth = locTable[c+1] - locTable[c]; + byteOffset = pixOffset / 8; + bitShift = pixOffset & 7; + bitWidth = bitShift + pixWidth; + byteWidth = (width + 7) / 8; + rowbits = 0; + while (height--) + { + if (pixWidth > 0) + { + rowbits = bitReverse[glyphBits[byteOffset]]; + if (bitWidth > 8) + { + rowbits |= bitReverse[glyphBits[byteOffset + 1]] << 8; + if (bitWidth > 16) + { + rowbits |= bitReverse[glyphBits[byteOffset + 2]] << 16; + if (bitWidth > 24) + rowbits |= bitReverse[glyphBits[byteOffset + 3]] << 24; + } + } + rowbits >>= bitShift; + rowbits &= 0xFFFFFFFF >> (32 - pixWidth); + } +#if PIXFONT + glyphdef[0] = clrSwap[rowbits & 0xFF]; + glyphdef[1] = clrSwap[(rowbits >> 8) & 0xFF]; + glyphdef[2] = clrSwap[(rowbits >> 16) & 0xFF]; + glyphdef[3] = clrSwap[(rowbits >> 24) & 0xFF]; +#else + glyphdef[0] = rowbits; + glyphdef[1] = rowbits >> 8; + glyphdef[2] = rowbits >> 16; + glyphdef[3] = rowbits >> 24; +#endif + fwrite(&glyphdef, 1, byteWidth, fp); + glyphBits += glyphSpan; + } +} +void write_font_file(char *filename, char *fontfile) +{ + FILE *fp; + unsigned char ch; + char *fontname, *scanname, font_header[16]; + int glyph_width, glyph_height, c; + + if ((fp = fopen(filename, "wb"))) + { + fontname = scanname = fontfile; + while (*scanname) // Strip leading directory names + { + if (*scanname == '/') + fontname = scanname + 1; + scanname++; + } + while (scanname > fontfile) + { + if (*scanname == '.') + { + *scanname = '\0'; + } + scanname--; + } + memset(font_header, 0, 16); + strncpy(&font_header[1], fontname, 15); + ch = strlen(fontname); + font_header[0] = ch < 16 ? ch : 15; +#if PIXFONT + font_header[0] |= 0x80 | 0x40; // FONT_PROP | FONT_PIXMAP +#else + font_header[0] |= 0x80; // FONT_PROP +#endif + fwrite(font_header, 1, 16, fp); + glyph_width = macf->rectWidth; + glyph_height = macf->rectHeight; + ch = GLYPH_FIRST; + fwrite(&ch, 1, 1, fp); + ch = GLYPH_LAST; + fwrite(&ch, 1, 1, fp); +#if PIXFONT + ch = (glyph_width + 3) / 4; +#else + ch = glyph_width; +#endif + fwrite(&ch, 1, 1, fp); + ch = glyph_height; + fwrite(&ch, 1, 1, fp); + for (c = GLYPH_FIRST; c <= GLYPH_LAST; c++) + write_glyph(fp, c); + fclose(fp); + } +} +void die(char *str) +{ + fprintf(stderr,"error: %s\n", str); + exit(-1); +} +void dispGlyph(uint8_t *glyphBits, int glyphSpan, int width, int height) +{ + uint32_t rowbits; + int byteOffset, bitShift, bitWidth, i; + + while (height--) + { + rowbits = glyphBits[0]; + if (width > 8) + { + rowbits |= glyphBits[1] << 8; + if (width > 16) + { + rowbits |= glyphBits[2] << 16; + if (width > 24) + rowbits |= glyphBits[3] << 24; + } + } + for (i = 0; i < width; i++) + { + putchar(rowbits & 1 ? '*' : ' '); + rowbits >>= 1; + } + puts(""); + glyphBits += glyphSpan; + } +} +void load_dazzledraw_file(char *filename) +{ + FILE *fp; + uint8_t *fontdef; + int fontdefsize, c, i, s; + char msg[] = "Hello, world"; + + if ((fp = fopen(filename, "rb"))) + { + fontdef = malloc(65536); + fontdefsize = fread(fontdef, 1, 65536, fp); + fclose(fp); + } + else + die("Unable to open DazzleDraw font file"); + locTable = (int16_t *)fontdef; + for (c = 32; c < 127; c++) + { + i = locTable[c] - 0x1000 + 0x100; + printf("%c[%3d]: $%04X - $%04X (%d)\n", c, c, i, locTable[c + 1] - 1, locTable[c + 1] - locTable[c]); + printf("\t$%02X, %d, %d [%d]\n", fontdef[i], fontdef[i + 1], fontdef[i + 2], (fontdef[i] & 0x0F) * fontdef[i + 1] + 3); + dispGlyph(fontdef + i + 4, fontdef[i + 1], fontdef[i + 2], fontdef[i] & 0x0F); + } +} +int main(int argc, char **argv) +{ + char *dd_file, *font_file; + int glyph_width, glyph_height; + int i; + + font_file = NULL; + if (argc > 1) + { + dd_file = argv[1]; + if (argc > 2) + font_file = argv[2]; + if (argc > 3) + glyph_width = atoi(argv[3]); + else + glyph_width = FONT_WIDTH; + if (argc > 4) + glyph_height = atoi(argv[4]); + else + glyph_height = FONT_HEIGHT; + } + else + die( "Missing font file"); + /* + * Bit/color reversal + */ + for (i = 0; i < 256; i++) + { + bitReverse[i] = ((i & 0x01) << 7) + | ((i & 0x02) << 5) + | ((i & 0x04) << 3) + | ((i & 0x08) << 1) + | ((i & 0x10) >> 1) + | ((i & 0x20) >> 3) + | ((i & 0x40) >> 5) + | ((i & 0x80) >> 7); + clrSwap[i] = clrRot[i & 0x0F] + | (clrRot[i >> 4] << 4); + } + /* + * Load IIGS font file header. + */ + load_dazzledraw_file(dd_file); + //write_font_file(font_file, "DazzleDraw"); + return 0; +} + diff --git a/src/dhgr.tk/utils/fonts/Shaston320.ttf b/src/dhgr.tk/utils/fonts/Shaston320.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4328fed5fa8487633f5b9dfc53a4fc4d7d5bbd0 GIT binary patch literal 50732 zcmeHw3zS~fb>6-+qY;t@gAE33ussN{h*8jkm%um%Azns2%)^##Y%^#EX^b?Ir4cV< zjE&;pgxHFWV@z;D5}c5hG;Zs*ZmYC3aU8{Qo3vG1ue^{Ox1}xZB8}3}2Bd!9xA#8x z+<*QV3EVVZs~N4MbMHC(?EUS>+4tOY@BjbSnAt+R-v({;+8dUwJmu&$*O)b@qxF{c zo5!|3y79h8&5k$%ZEH7dy8E_2dBg9WWOmfI&7ORIf66HzJnF(fv%$epwAgRm@r@6( z^})yH9Xqfa=j6!|`hQ^e!N<(z{Q*zs9UJXD(O>g8Tk!u{8&ShRbhOpr;L*)~n`bsS zN~z7RtZlrJ^d!CC>{qU{$G@59SFN79j>ms7-!TB&_^8?E*w*Y9Qk?S7wIOe_fpxYA z=i_WEWv7j^ogAXDZydNtH;!>huXDD|RY=dVQB+bq) zZ|KAE)HkuhD&;uaR9E;Bt5ax)s$h)47PND>q+brlPf1(VLtmN2Czb5V zhaJDA9*SKXyc6$?FfX)*Mp;e6{e=lb!eaTZ%*{-E7+9&;b! zE%IC~w_}gUAMzJu(~in1Y|qk9KHEapo@S~0S!0nWVFR0Ym*)rOh~P^ME(c?2r(Ro8 zr_ig=Rb!YR>h@Zva@^tJ{>?F7htKJ66z0P5LC+T@7YG+)0vMskIIe_>4;|y&pf1WF z%CY#L*Ue*XsKIsD-eDKvy0;KV_cb4DK09#Uz;6!x_P`$w{?g#nqf16tj9xJMw$U}C zPn~@H$)hJPK6%OFfyMI|zk2Z-7oV~C%Ec3>oN&r%r~T$>-&}IcpU->Ym=_NI#r%T@ z!O3jY9v81~419Co+v0Wf=+n8x$nAtS3k4;nXS)E zJ~Q^rP0yVF%qf5L;Xj)A{onZgU;n+2Ed0!Z2ab4T_>tZffiQmW|4oBMmM3wH^+&T6 zral#>J{IL$D9>T7gB8NiR}oG(z8U7l|3uf~Xf%8!xu^a_ah&7Qd zSc~$zSj3%;vJnMi7cE7(1!bSv$c-q^njHz=M?P-$D!_Qv8kC(VyRnu7mZKo!s3%aq zYj*TB%424)9zofJ^0e7&aQvFBD0|J00l#B*qI?}8aw^J$X0JU0WgW^M6yQ4!w8uf# z@k1z}IsRr8oZVk#;P@Xq?J@CCA?I(iQi5H=O?}?Co(y=JFpge^F zx;I>hf-!G+*6fW}prHLtOHsgo)KI2T9yU7}d`^a3m0hSYb}{-+IU3~&ly75+x(Nm2 zPTgmA+Sw@J`DXOLc{$2MDB!&WJeORD0=gyWKm7z0j640SD0@-%oBhC2lwD?Tfj(~m z-!ss^^dyuAQC>9r!L2ASn4S5s*|HH7&@My!a?maRU9%Nuqo8jEXjTIA%BRiFLfcu7 zpn&dd^qqro=j_BX8}+%sf8I$bkD09+MM3*2U^^dU&&SvcF!ln-e(MP+_oD1GyKo)K zcg^0m7GN283RfX`K^uR`Bi^sR+%R|DVGsINhN z%|m9_8p^|F*MY}%kDI-71O*u037OX~M|sTb2JpK9GH-a%?8c2KUo*SuR21-e*HV-x z%-+2U<*R1v)}ege>^*BxcALHT3KZ1u1F!di?&cvB$bCQLy#E%Ir_4TZDhe=s;JaoY zya)xyAN&?>hj4t$*UiSjdknm91^uo2%+_Cr0$l4~FdGNo@w-s=noZz%ViU^O%x*K3 zbtvGo0lIB?0%gD1M$m4AoJsJWgie#sn|dMtRO`YAXu( zZ-Fjb9yZ$wep??m`|v0V>TNjR_N3YNRVb*Z&qjF~1w3|aL;;37u0sLsou{HaWp>w6 zl>1T8clR2UubSP1@%Mbq>?0SVpuYDA6pXv~S+kFV_P!w$jQ!Xs$`fYygV+6!n0bK_&k8~ohP6`pPl!j>_ypc_QPvYFz%CvvI*rOl&4U>h4P%) zkBp!!MY#p#VU(|2Z{=n|_5{L7&Gg|#Tpn*AbpJ_%k=KF=%p z!N&%6W9=|#$Jp_>MxfxzvzzT+4uBJnb@kta<5jpiEoB>zY|p{R21m_a+=ulJdP$Wd zbqpFGO==wtkgnM!ne!oWK37W4E9!9{F|h6ctb?@}R~=Z-1x_EcpIi>EIsjdGM8rhu z*mN|26RfJxbE3Toa^5t6RiR@@ELmqe>(nCagO7om#<|wcp);Z$6%w*vwve5Otz+*~ zc+ps}g!)O}J!MQ-s-R1|rUh$xvI0>b*y~mU7jKImAxQsmWFic%JkOG}!O3wgKtJpY zJ1(-L5G8LiB0s~H*;&AUR)xRtc5gbDI)2pNBVWFXHjYSsiGkANIFRxzi`My)Tl7an zV#o}w5Gj(CHqv<8|ag^vV2IZ zIS6^*(bOh5M1RZ?v`Q=VH`p`S74ym#4CbsF*iD(hI%pU(u&(&g795i_1xv^PPaZ|w zqE2br`ACTewqiy}tCybix~~kzH#sFvaON@Rb|+G2kwNL?&MYIG*j?jp24oK^9*@WT zwgo4qUxAhLBnl;XkvwqH8RbVjkb9P5hiKzDtcSCMkHJ=|@CDd1bqsqQ}hrevWQJmq*+rh&%5H+->oq0?u zj)dRvf8Bz1=^8mnwkIxHBP}eP?c4wd#(L4U9k1B&J=egic`aUnFGm&s7H;I3qq0uw zQinbBoOBibh+XiZ$4Q$}RHV2Jj^|ifPCP)1Hviv8l5=1d8gfFLIClG5{gK@lERd~3 zwmgI5W-0Sq+BAIDjyne9j!93d_ADa=GjWm^i|`N=N^d?zTN^7}kAwu`PfHi=!#a`M zAeGz?>}{6TT%}joEhSgBe>Eh$I&+x%>4UH!Yf59k=a%9b+C1$Z)aXNgjW{2~N~+`6 zGDltS^dRUdmE$}*)AneQH;To=lcX$?1A#bX^tATll{!5H&vfO4{edGTp(bx4fgM?M z1aoGLgf#U)MW=#o2Q4#KiCm(CE*cMQf)B?q*J+Gr%U$5?T7gE|GAdSO7SC)==|TXu z=qtIHYlDewvQF$!AvBTKvJ+PazgYn_D`_SWB+-G1O zSeM*X1AC34?kipvsuBljjS6ecfyW&#Z9Fh0vAXAspv}5DH+jgKfhx3#t8$GXsnctD zPRaNiCI;o^L9C#TL>#`(-T>Js_yfYU6OUhdl4l3DHcKhnIe|~{9Og4(kf_7Xic^gl zNli&DeAG)>0G!aKLQ6%=mNhJ{L5VrB6wON{Qy!@(C9@#n6Z~25SI_rqwzbyH(W!xr zA8LN{n(kJVHTG1ws?6rJ4S9*SvS`slRx0)(1uU3&aujg2@iE_5F}2ph9rM($kZj>- zMm{<6yqcHQI!Jy%uc-EdN_*wPr}555TDJ2#u0^RucP#UI+NT=F`;ylpx?W3aVxwf% zhp-Rh19q9~YN7s-$_JHxLXa_r+9M+|vL=p~*2q5Sk9D`NRVWwUOMfs1ff%jC&6>KD z^Y)q>^3g|$wT?u>CrygfJL2GC;D=wsI^TB);Y3Y zjs8|2tmGHW^DIh@G#BM#&9@e}GS}R>vz9LmnyEyS^OE*9m*i8f9_jaDhYnda{OG1~LP@B*QD}X>G{W$+3KG9!8YyR$$i9;IX5i_=NobV&dvWFrC&j?-7x#&?tN^}P zW5vF&?>*v<1{tH*FS6c&twOBbA0qP1B?Q@;`pfT6w5%)~s z%dxb9&qc|`tYuG@(BJn}d0$AZu@=qjD^8q^;OzMMe{c}$y9iZo1a}NC*sB#{+{K$i|dTw6q6-8K+{E`>i z*&3M2b<%ZR2hB5|>WL$s0Rm6P1bK#SVBb7qtEgH#mmJucsq_lCrEHD!D4@5i!k*rO z{+yrd`s7$zt{8mBlddP|#X_M{z% zBCQD;atxG2s$SZm+a7B~*t@I|5d+Cx8g?;)1OGrlA4xW;ToPLqrLvB$9+2JY9_xDH zaqIbvOY35M!Iy2}JB$fSOaExiM0E{ff>a>bFnaq1yn!k^rv6>wm_ zhrCL=MB|9r5A?-Wtp`TL_!N59ty~bXU^yr&9A>S-O#CopXMRe(FABq2SB+*4A zJC$-(SXtB+MRMWjvImY_%e`QX(|Su-;l%;1{jfF-JFEXl$0Qk`QAVbB1C8Y2l;=EF z0bR<19Z4A@9QWX8QY9DEcvqm=uRW4{MnwyP6AS5>(d1q7LTNqWT=Hphiv>JE7kc`t zJb1F5eEnL8cxsfYvZpH(`iXmaK0nNJVBm98-cJ&Tzn`(&In&FDhDh{> zF$c8c%hh;r%qN49A=>qyaJGnIHBBe(Yq)ej7e87h z3TZ_L{@#|FBt@x%TlTYV3v^6rh@&!Jx^WbU@(DlnlP=OD_Ta;|h_#%xK$#st835zVNXlPH{`;8{Lzkh7Yb3OJy%+u`p6D`jR!3( z3A#DoF~Iy_KYW;L{@t#dw1JM~oN~dB2zg&d6oG~_xr(oe19b|YVQK0U3R{| z68opgl~IsV*v1k$I-*jo@@c-g<}yhKJLKva6k2f#IVdmi+kKww%{na9^7ECro^IEEPfo}X!819q78l3^E_|M-+8@%oMU>PN zJ4Y2h`U$can_O1f5Let_sj}MK6PgAR`u`i<- zrImgC04?OJj4SFI*3kOGkx+`us(e)TbJ&{_G|$Vsj8$A=U7}dY_u#k}wa$Gj?&u{3 zQh|psi7(pP{FGAIL*6bI5l6f7ehz=JPG5p-g@QlyMZa5#@z~Q=^A(ytG>p7Y)m3ve+ul z9`Rrdp+_;~D?+`g;8ftvQIrv*g>zNv=6#?=FWYhs<~iGlHdhz&C%GM3X37iM#N#r+ zGqrqqGKYvtdM;{L;1L1jj^4yijbs7N6d`CMfI5LTHIB?LO%V|}8?wKwJ3q9Eji zR7QsMsN1q$47w2dd4Xq;X^bxVeNY1lF#2C`G0+nCm!6WuqV?>2fvd9Vg)HY{3+Ct0Ji07i* z?{(ddS?Br0_uYLr1Gw6lc3fq4l6Tk;uhQvNAis zmvhUK-9kpWN2k=j+-Z^Yg4VHV(OOE$gQV6oucAXdZ>6r%a5gQ%7l+g$EhRf?J;*$i z?+GHhs0k%yEI})bQL9H4)`fmv+G($n%S&(g;&5c7%!n#TD_l}`$Y6WvqqUU7i;NP- znom8NfV$R$e4OGir4`w=%*sD~Wd;UVu}4{S&VbzSAw1ir~ zC1Z(FGm?b>BlxFda8zC6%J=)R8u0g8Ae&<(snUdPIX?QOEoGNC0*XZHfxB2ghnB&u zvIqAkayK+~ukh}kXU^cy(Z!M>pPZDD*(dAFE+4f0 zO{prVibdFlj}fz7@j$zm6~Q5q`1NG=h+y2!fk>W$#R{54mL64{YA#gqkWrqo#h6PD z(I)%0Gmmm+ydRD>_d}xaGn#|f$M}3lJa2G4s0*o*Qc@XHQFxw6f=)=ePLPmgJH$g-qv}>tIJ8@p5E@+}6IYKt?;WOV;Sm zc53#rY!{zYsiHOVXlm+twO%Qx$JaaDkK>G0o^*VSQc{SD8byJGw4vg-%@d*^?#hq2 zdH_e^!``^A$32YphBEhux5*bW{E4uRuzJZjAg|1kTD5y5wsV~CCB*yU8JCGjGcTT% z@QraGlMaC}^a-8iEg?s{tib06(k}U>*M(^vshkc}ZA|i6b6Fud0_TzzmS;v%hWcn> ztcWDN#KnQVl&8p`FLIqn-_4LQgQq{?pg&#X-1A!6<6tUsA5$#dWgi4B5UTS?({{Pg_;@m9i?Ls%u4Rsp8V{zp$Xy zz23D!c{-iCB0fc*@yRpxd1fTHoaN5X@vx1Q2SzfMajxrUT&H~f(9xJPp`X>shkd!~ zEqCi-^~{$u;ztNvU)RAgxzC5zLW@Doq?3^sPELJk*Mc6Fq}6gBNO$?&V}o=;tX*fE z;d;msI?_l*OC4|2r7D_H8bkZ42dw?R6NpMQ$~M7=h>|ZyWF)99qu-_XNKU=P0eu_| zx$Ru$J+(gjNUu?Aj;OUS*x?V1l*in{%!G-G{Dmx{fX6Pg?$PlplnqJZ2_C|5II^h= zWfn`fvbmLE_DIqJ7Q%=gPvN&{Q5C4Rqz9(Ja?-gpUM@AuyBI1zuyu4%UN{5K{o_Y@6 z#UjPl#WsO9?*>adHIOfLpG)55^DdbS6FD`Ngw{6hu^IQcGo_G+WY)6cDPKP;r6!2C z9vSJ0&f9_&@3_Z^xmYq&*$M2-NX38aUFat}xt|mvk;RB2CG$A(m7_L4bB)pF0>5*m z#iAslcDK`aplm#^MiC_$EhR^}T=$&+UqwkfAN~HS{xn`+-F?(YA_481*y zC`D1=z9q-xS}f9CgX9V%v!JBSjivHF(2;+7AIEcgA@SrD9hgFA*BsosHmdGOXa!lL zpM`=?JL5bK+jlQ1hixv8M`;h$o=5V#6Urz4cs<}wcZXK%o>mjTYUo@srDv4ooiSWb zsbNH^>)_YV;$`<&*da1|$BTtBbRd_sVC?I1tz6|+dZAp)s(45ov385>?zZY(l|x2* z4>dP$`n;MI;@87FC_p7k)%OvdygdVXpfAYNZ@&8Mks=f+qkP_>n(Ln5@Y!}|vOcop zg(`{=-?Sq!dq&Nxo4iU%h}U?Z$e&xycweh0);hN8iL9clztNmgN1U=+d*>E9V%|j$ zYI2S^!x?-hT>f1k{XSENb*CZ;v^+j6%9E6FZ_BCidI zU)fbsh!T7m)5S6vMha+6OraZkgCDy!Myrn!*X#v1P_?x zOUNpUz(zlFguG8Ftqj+_vM8|?)LJ#VjI=2Fz{zb)j>)^aFY37yJS6tiykJcEtWy$? zX;H;Gb&2mma?27`jB2m{>DO}qK_rTN%z~h%pXfcjYv?V#*?-nMQJ9gI;GafjjFxw% z)Jt1o-tm}JD)eKC@U$O$I0INyXaA(Jv@h`w-FdB@!&`04ainZS1ey`_mh%^~HXp{W zV`dQ|piNk(4yrvqeO`Jjx>j5}6zzDN^6K{F)~>0+oqMmohA8*YisU&EBp>kx3eEaC z5%i)+4zShBl&_Itg~N~!%9K?w5OLV``#^ph1J&B3p9e||r^TsT9Ro$H^gXp~HO<`( z`24R{W_yS1Gw@|b8Z3)q$RcG}+&;mHZSfJ(k?bH?7}i*T&Z( z#9zLf(y?GXM)uPrIRXbLxQa_@DYLG1T@#&9A_A-XGUmN@{y~e5Pqh9C-t->0pv0;R z$7-oZP_C%LPl-b~gG1WFDM67dm)e&-*LnG{k53QzCdkY7r4SQo#Lry5%%|&&2Wjnl zzW(kHRw-)ElX>3GO`@;XjYBi+fp53$e%`6a7PKVo?XoD3F`#)O$v9(O z+a&WTRt>HzX;=WP$nQHZsI>|uaz0QOTpPuwMUgTiu9H&K5dq1GZNS#f3+|-r8`ip7 zlTHP^#V=})2x*U&^k$*1MzKv&fwL0{`7{P-HLjfxWp$_w9{Q!Muvn`*?GaY-`|XSY zTF7nCyQf{e)=%a-$3vPdk{Q-jTP?G^9oCiW^VH>&W04u3&wy_2eNpnJpDVd#H2cf9 zES2jTs2N|3YR;paTgBq-6$qaJ;`LB6{WB-@%50LtWBw+XIL|5}EbO04$aSKxdt%3) zK2JpH5$PqJT|>kVu*7aTZQEvnj%6_3vEl#Z>2+AD#nE{_L(6n{&+61CQf@@w@pvoAmDKpc!`*(s%or)vmLRo9-@zw}A$ zzjf@AG1K8&^P`N;^-OzDyc_fH0_h(yi7c;*kSQ#K&mvFcw-fZvoWPP}l=CD#?OM2E zWO|0)WIH1y_aWJ*qHB=uXFGW#$5N8(M;%+9LJ$_A7nP$WMQ7m7+?Z&{Eit#&M=#p( zf1m4s{2%k1-Vi5dBNmQ|Xeu(|EuV58+V?&!^2h)W=^c9o`5e1^X3)7)X03n0;HV{` zz8Vl0Y{dT)F^)q=a*8*V{F#SrJ}*B(<{FVUHPpCj&QQA0hXq6%^y*_j3Vf~Tmt?(b zm%U{K5yF?mo<7aKq|Lfo8^u0u=>ZoVQ(BD)$2CppL8SEv97{edHJfa5$$J*WL+te@ z?-{n3TP{#CrYhSMl!YVZX$~qb=6SvsI`C#(!&)gNY#goN)f)-o1?u=tB7FxI5J2xv zcH#P^%QLK$a#?2-$|5+&U%O_F?;E0K?3YIaueXo`(Q)o$9AZM4@@f|HWQEX*$BmUfbMq6x{pmIAuqHiyN60zLp2eTJ%io{PS&-C~6oh%q8ZqfV4*lSBsG zt$+F5#`xxRWC-%Wc-cqzX>Vd+4l9=9SmGK*OS=}Bfvd>sg9jRbgXFbqLiwRaPntYe zHkJR`qByAh3_ro20LHc7ED=^XQ76Y#Axl|V7mKxaiuaPWD_rJ`=mV#?^4$aKhRBhA zojX8kp&s;-ik_rhOB)d3uay~o#}$iMsd1E&pprIAneHo zi9JSDdX)SGPE~Hz)pSkprwkP0sP&S3z~S{*dtGIP(dy$P^IT}lI|IT9M6_4YrGAd= zpYrhE&WN}W9X-PmxU{ZL4M8V8&?BvmMR7`-!n>z6pZ0G zdc6BqMdr)!PP>5KzMS{(z{}?(aZ!Tsu{HPW+*av}PR=5-M92K;9J1A~6iMZT zhx|j|`llchQ)rlfq{gC!U43-aygG{;YPUH#vW4g>t!r*PE_rIN(+38BrWc>9 z$rV&RHhE`GVPERjyC3+{8rrHFjdeg=t7DHY_ii0;Ql^Hj4zxcdiXUSRr69<2Xq{SB z6fV=ho64qHb;N=kZ*$^_%Xd(sRry#ZHcgQ4;*x)k1Q`Q}~X@(w-baREZ2n z+6z(sDDMH$qBW&Pggm049a9qNgs!Y7lYiDiNu+%WXkM;-pwHDLB}hJ_>U)4j50e zL(I}zZs8Q1!%l%Rt(H`U3*(`}!uBkn4Lq2?)fR0nCEq_kyL3i}GDwT02*sYu9@D z#t&L@+`86(X}$jXyLCka-mn8u*OcL>67h9E^lxnzt8QGAh%rj~ATi+AJV%@ZBU`?V z2v0dFyNtkPiGAAtjqec9l{sP}qcd#o`I>z|psSE;m3h3yYxje#I`Z zE3c23r@B}5sF9WtJv>ei<$9*#4@5-<5vASeCtU%`SjKo<2~wx5WzEzLDBoX->pJb&q6Fa5*dFC)*t?GaDiL3wL;>hPP z<#{u4l$CvjA$ds}P=TBCEPDifUYM{FY$bA zrdLvrzA_O*(o4}%qG6`Ic70gB7os!MJF)25qv!&gQ3i1M{Kz}0;vsLZW;S(2AqR1B z?O#SLhNPH*SoP*-62RDTDgHa!=ha3tsg@p}{;$@^yo)%T`A9vevwpQ&+HjUiyF<;# z#93^hQ56R6D;;Vs9!h>k|Kfd&avSx?&g)m?+1me^ZOaH~-TiGa=jhrqpJL}a_<>LE z>-#LMGOR|4mu4PjVa>;9BfniX_96U}_VEU#-zl^l6j5n^@XT*^W}c##N3i4|Es6}@_GVDxjfiUst`3c%G_9?ex{n}P}XTL6NG@GqrzZh{v zkKvmOh)o_&YoN|^Vs(CrsjNTv9eKX~*ewp>7iNyco%+-BRO z*x%j*`))?^ITQj}5NP?^;I3Pa6nAj$m7eEGSJ@z~epoh$ISeJbzNcKH6mg*rLFNQYVHBbh19NG&sNo4TkO#yel@za zP%Ah2swMm?zWEy>{^=unUbacBX{o%zI>(MSkV)=U?$@(AwWT(wb7mz6au#a zU;fZ0r7@bc*V*NdR__s}G9z=&GDiZv@aG!~w9}#I0l2zug*G&W9bXC0L@9j==ClKN z@;U^GF<+&3>h6}VP)mdC6=&b+A=b3mOq|Gei9)(ymVigw#^}n?Y~^2vBjYx&m&yUk z8sr&8alw(~ABBA$2b`5f2GK{6h3S#9mkqvo9}O#K!O)JH#vQnjctm(lu=8)cv;+V(-U?Chr1*yt;%1ia{ z(12sRawj%jMM5WX(#$2#xE`{Fd?l6k<{O%_TWG0k6OY|4^dsNOPd(8idU{9l7Lu~O zzk3RPTjmT~W@p)X_Evj4?#SLg_-t4h(n5w12zMZrzw(%t?x7VP%0*wv*f@8b-5O)X zDQmyxx^05eC6%jiPhY#92VEitO|gvA$DH7Oqxiv+&KHA7kp-t%bK#5jjzz3;?~67{ z`&?p|+f}gARkV`)9X!$k@f^^(RaO!A>O9BFJB)*{4(aM+=J>h|y&Ws2)w0IeL=-yl z9OV^S&sQeFqu2-;EuPdIwpBG>km2)pVHuCGN3pu2lKuRHvn#a^vZH$w8?w~K|<0wb>!Dw)D&Co8_Sec1QiT?B zfRvb5`AUQw(jVgNHqkzPvrGAv89a842X~4FTpUf&hMH9x`)Za_oHAu|l=5%dNPgEf z!L?Bi%u(`??t8vx9AT?hfFq*>*Q1EJznpuE9{zP~rROuo^4uf1+;>37nj)i))X0AA ze&As4&QS(!-CjXD<1q*6)1ZLIFxSBgZPm579?@?`DJl>Is^Lr6koU=c2V35#WP4t5 z6rGS8V<1aok@?xf=uy1z8-p2Ldx$_|bjEQ#@885T^iCL<)I4tSZmZ*ZLjO!Y@|i(w4SInaR7lvN@vEi)YTWuguhqbrx9#Zme|D z+bxIE3UU}(AyHg#JiC^4L`gQ|8-H5kS8vhwc)ij_qxghf(d*CjFmEuE*i&p9aUyE8 zXI*AWT$6F0v%o)t%HK&$9D3jAP)PDKu#Sr}->s0@`A~?`W{5A~#2L{#CjYSdZ$jZWB5~~ZIAwR1y^MU#H_jaXRg&|Y z(o%x2k3f-YAZ9wqO6@X=6DzpYxjc8ecLzRnQyUdZ2QTM`8XBvJztb1*#=ed}k817F zauBE5W^TJg&Fh!jBksG!1N4$WL`1{!IF?RCgMA9`DcS|z#9gpc=i1)fONY*pN!_p7 zgL~=8%=A9nTN%8kWQN8#eNLtAH%!sf~TWC)7Y6dqp@ZXr+UX;>avv{h=Z+ zV+8Mk4D5EyiM*?WX0`Zad??z$8|TiSIfr`iIvUS=GS+0{z!4Zq)N+h$zn?Zp4eC14 zw{>|UP|M`{0Z$=Fr5OuYg-cjavcgUoagH8O6}4BKBU)LN^>XAe+T349>AT3w6)yEn z-sDzf*0F~6%vYeH1R0(D}< zy8kl%8L!M(xnE-omX#gRloHx=Y^`6xkQpcHoF|z_l1?sbP`J7q1C$*Pkhpo8$e$kP0qk7AJ~orYO@1p)_O+1y#gli?g#9!Z^~^ zG1SF+82DVG%MnIu9MUr@$~iLYozM5 zLLjSrns`XZEbd%+ZB5>ig$_}MOq|NE<@3>gmxXVS(n#>v=#Z1XDIB!o&XooB4D~*Z zjl*(6TRy4etB_a;QM0tMU#-LsBSObgtNpL9k?wg}rL|jYEqSPlv7T$>_t*6rx@fOU z*K2-vr_eLbvhcbZu|REgRYJ6~EzdnSGVU0WS?8#XqTZ;&xpIYKJ$G=ybuP)u9iV}X zkUy6+_DQPSy!zeNDoe(kO0=0jT!OTnLsDj*;740YCp`l>8LL*!+r&z4l?Fbq(#~1; zvA1)t?N~JH!8V6AWCP)f@1x6gex>nYBg(z77Fk*%bxkB$r+q6efL-1Ro9UXN&ruCN zn|9A!tn3?eN*wxG3%T9jqti+`xM$SmOyy`|O+O?qNo;+027Gr0Et8T(mvJviF&DsZ zE|lHu8rOnqjp#F}MnS}f(tv15R~PW;gTG+Qxe$0MQJ&|O2i#J>l%AZ~p8b;Qv}~>X zQCl}hBqyEELYsP!MmnF+yct;dJh!pq@V_4q*oe;9K4`0KakLMi^}TUC5693^V~6cn z`(zv+Vehg><9LzXV$Xv!{~BA=To=a!Hr%`~jtA|eW-N|}K=aW!o`>TH<9OH>HlK^* zBkYXkOL4r&mN$Htq#0U(mgAZi;u!b`UKPi{Kk)iE2L6HT;~4k{HpVgV58M~Wz(4TW zI0pWKXYB^tXk)hBrfrK&*(jc|uC(QLwN1c^leWV)+iKL)pt#1a!_j(CUjWMPNFT>` zj$eU)-TvhKE^yukZj&Kzg`EldE^T5M1BMB3yi*7^;wZ5!0oElIo>9Bi?neJr;5`9^ z(-?7w#@+xqx8eLww6bp_j;G<<3-G*s8Cv=8OuM~j-0c{(4OC}B-z~7gG9d2qSq6!2 zmnqPtU6$RjacukamZ{ORRxZDKVtjJP=GBwa+poE9a{bu$3r3?8eHVjt#^-JwQXW-dh(8m(HpkhHht&Vwuz0? z(_1fCw(QP3?>zJN=(~N(wykHb-?Dkx_MlmIE4WN;C6;A97EkZ|wclT%-;o1!f2mA{ z{4?{fc^qvGs0ML2F%LVi^X&+HJJ3QrpB%xPs;|N>^wD@T?={#JI~Myz$6>GG1Uwgc zJ$4*U!d}c9vF|X7?|xm3-G@{0U0`oU{GV<=U~j>jBTMZE5vj{G?^a?4pKa&Zxp`xV=O{Q492Z*8yr8_e7PYX8kXWgo&^yB#xf6EeW#n3EsI z>|;LJfmwYA=JJ2ByX+q1f{)lo?Oywu{j7b=?z8*tfGz;t{ zJJ2j_7BwTyk#?}L=2gv6&CyNMyt;W!b4+t=^V;UP=J@7>=5@{Mn-iOp>;?N@%^R9G zHg9T1o0FTx%_+^P&1ub>nwnw7Yksgfvsuvk`X!E1?Mf-B|W6eX&kK1SM zG5f{l)ApI>Gq{`l347Q+-+Z?DT=Q`AdHaXWPc~m@9%;VVJlgzJ^H}qx=BJyV!Hjv@ z{#o<0&CfMI-#pQLd3fX9TQ^Qjy=v>kw#hBy>nEnBC$>$D&%b!{*!pc-rsj`%J$&)4 z+a~Uq7#>qK|KcqhwoFajK7Y*XMVG9f+_rwl=G!(++_h+Zd%W&bNC`f@nD zX8jmg5087b26D!x=U*BECqm$*E^tEC!b{8Og%jm){-pt9!t3Eno#TY6MVGfg7Hw#c z7hYZ%EZk5IM=nQF-#q4EM>bR^i>_$LF51{04_$HV*tVgK_;2{i>B&vw6T_3L=3g0_ zOok>`x+arux+??oq}KyizGGnWLyO+g@?G?y_ITu~3dqRqos$jQCMKpfjZKYDt{+}I zwtmO-#PB9nBWr8AP1VWpS~t)pRYPl`{m>@-H++qcpYrk7R6|Cls*~YseEgIfcxr6x zmhIEqwjh26FP+*jI5D+h{S7t?vXpD#<7rEzXf^W)=fu#c*ho|h&#}PJmFj}^Lpi3 zQJ)?4IZ+GA%H?ORSTJ$d`b}e-!N+^fT64s0@c1-VX+xLp*tSKjD^@uDij|IT#Y#V4 zxjgDXy>i8B(XU)_Nz`k+KKuMd6Cd6&dB@nMiK+Dy-gfTFs2$^3D_p;`RyxLWE;(2I z=Un14&RZe6%g$Ra45(!x)Z&9W`=u++#pkkBE4+VIj9+z`Y;)P_;Ilf$tzPcqR>!#2 K%OxLl=lvffBTcRV literal 0 HcmV?d00001 diff --git a/src/dhgr.tk/utils/fonts/Shaston640.ttf b/src/dhgr.tk/utils/fonts/Shaston640.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14109fb58b1972a938065b374ceb0d5e265c08db GIT binary patch literal 50728 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�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 literal 0 HcmV?d00001 diff --git a/src/dhgr.tk/utils/fonts/ShastonHi320.ttf b/src/dhgr.tk/utils/fonts/ShastonHi320.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fd77defaa6b63ae0930411699f496410b3bd9de2 GIT binary patch literal 73276 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 //#include #include +#include #define FONT_WIDTH 32 #define FONT_HEIGHT 12 #define GLYPH_FIRST 32 #define GLYPH_LAST 127 #define GLYPH_COUNT (GLYPH_LAST-GLYPH_FIRST+1) +#define FONT_BITMAP 0 +#define FONT_PIXMAP 1 +int fontFormat = FONT_BITMAP; struct gsfont { uint16_t offsetMacFont; uint16_t family; @@ -73,11 +77,7 @@ void write_glyph(FILE *fp, int c) glyphdef[0] = left; glyphdef[1] = -top; -#if PIXFONT - glyphdef[2] = (width + 3) / 4; -#else - glyphdef[2] = width; -#endif + glyphdef[2] = fontFormat == FONT_PIXMAP ? (width + 3) / 4 : width; glyphdef[3] = height; glyphdef[4] = width + left; fwrite(&glyphdef, 1, 5, fp); @@ -107,17 +107,20 @@ void write_glyph(FILE *fp, int c) rowbits >>= bitShift; rowbits &= 0xFFFFFFFF >> (32 - pixWidth); } -#if PIXFONT - glyphdef[0] = clrSwap[rowbits & 0xFF]; - glyphdef[1] = clrSwap[(rowbits >> 8) & 0xFF]; - glyphdef[2] = clrSwap[(rowbits >> 16) & 0xFF]; - glyphdef[3] = clrSwap[(rowbits >> 24) & 0xFF]; -#else - glyphdef[0] = rowbits; - glyphdef[1] = rowbits >> 8; - glyphdef[2] = rowbits >> 16; - glyphdef[3] = rowbits >> 24; -#endif + if (fontFormat == FONT_PIXMAP) + { + glyphdef[0] = clrSwap[rowbits & 0xFF]; + glyphdef[1] = clrSwap[(rowbits >> 8) & 0xFF]; + glyphdef[2] = clrSwap[(rowbits >> 16) & 0xFF]; + glyphdef[3] = clrSwap[(rowbits >> 24) & 0xFF]; + } + else + { + glyphdef[0] = rowbits; + glyphdef[1] = rowbits >> 8; + glyphdef[2] = rowbits >> 16; + glyphdef[3] = rowbits >> 24; + } fwrite(&glyphdef, 1, byteWidth, fp); glyphBits += glyphSpan; } @@ -150,11 +153,7 @@ void write_font_file(char *filename, char *fontfile) strncpy(&font_header[1], fontname, 15); ch = strlen(fontname); font_header[0] = ch < 16 ? ch : 15; -#if PIXFONT - font_header[0] |= 0x80 | 0x40; // FONT_PROP | FONT_PIXMAP -#else - font_header[0] |= 0x80; // FONT_PROP -#endif + font_header[0] |= fontFormat == FONT_PIXMAP ? 0x80 | 0x40 : 0x80; // FONT_PROP fwrite(font_header, 1, 16, fp); glyph_width = macf->rectWidth; glyph_height = macf->rectHeight; @@ -162,11 +161,7 @@ void write_font_file(char *filename, char *fontfile) fwrite(&ch, 1, 1, fp); ch = GLYPH_LAST; fwrite(&ch, 1, 1, fp); -#if PIXFONT - ch = (glyph_width + 3) / 4; -#else - ch = glyph_width; -#endif + ch = fontFormat == FONT_PIXMAP ? (glyph_width + 3) / 4 : glyph_width; fwrite(&ch, 1, 1, fp); ch = glyph_height; fwrite(&ch, 1, 1, fp); @@ -261,22 +256,33 @@ int main(int argc, char **argv) int glyph_width, glyph_height; int i; + iigs_file = NULL; font_file = NULL; - if (argc > 1) + while (*++argv) { - iigs_file = argv[1]; - if (argc > 2) - font_file = argv[2]; - if (argc > 3) - glyph_width = atoi(argv[3]); + if (argv[0][0] == '-') + { + switch (toupper(argv[0][1])) + { + case 'B': + fontFormat = FONT_BITMAP; + break; + case 'P': + fontFormat = FONT_PIXMAP; + break; + } + } else - glyph_width = FONT_WIDTH; - if (argc > 4) - glyph_height = atoi(argv[4]); - else - glyph_height = FONT_HEIGHT; + { + if (!iigs_file) + iigs_file = *argv; + else if (!font_file) + font_file = *argv; + else + fprintf(stderr, "? %s\n", *argv); + } } - else + if (!iigs_file || !font_file) die( "Missing font file"); /* * Bit/color reversal diff --git a/src/dhgr.tk/utils/ttfconv.c b/src/dhgr.tk/utils/ttfconv.c index 4b3091d..368efa1 100644 --- a/src/dhgr.tk/utils/ttfconv.c +++ b/src/dhgr.tk/utils/ttfconv.c @@ -5,6 +5,7 @@ #include #include #include +#include #include //#include FT_FREETYPE2_H @@ -15,9 +16,13 @@ #define GLYPH_FIRST 32 #define GLYPH_LAST 127 #define GLYPH_COUNT (GLYPH_LAST-GLYPH_FIRST+1) +#define FONT_BITMAP 0 +#define FONT_PIXMAP 1 +int fontFormat = FONT_PIXMAP; /* * Bit reversals */ +unsigned char bitReverse[256]; unsigned char clrSwap[256]; unsigned char clrRot[] = {0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E, 0x01,0x03,0x05,0x07,0x09,0x0B,0x0D,0x0F}; @@ -28,13 +33,21 @@ void write_glyph(FILE *fp, int left, int top, int width, int height, int advance glyphdef[0] = left; glyphdef[1] = -top; - glyphdef[2] = (width + 3) / 4; + glyphdef[2] = fontFormat == FONT_PIXMAP ? (width + 3) / 4 : width; glyphdef[3] = height; glyphdef[4] = advance; fwrite(&glyphdef, 1, 5, fp); swapbuf = malloc(pitch * height); - for (i = 0; i < pitch * height; i++) - swapbuf[i] = clrSwap[buf[i]]; + if (fontFormat == FONT_PIXMAP) + { + for (i = 0; i < pitch * height; i++) + swapbuf[i] = clrSwap[buf[i]]; + } + else + { + for (i = 0; i < pitch * height; i++) + swapbuf[i] = bitReverse[buf[i]]; + } buf = swapbuf; while (height--) { @@ -71,13 +84,13 @@ void write_font_file(char *filename, char *fontfile, FT_Face face, int glyph_wid strncpy(&font_header[1], fontname, 15); ch = strlen(fontname); font_header[0] = ch < 16 ? ch : 15; - font_header[0] |= 0x80 | 0x40; // FONT_PROP | FONT_PIXMAP + font_header[0] |= fontFormat == FONT_PIXMAP ? 0x80 | 0x40 : 0x80; // FONT_PROP fwrite(font_header, 1, 16, fp); ch = GLYPH_FIRST; fwrite(&ch, 1, 1, fp); ch = GLYPH_LAST; fwrite(&ch, 1, 1, fp); - ch = (glyph_width + 3) / 4; + ch = fontFormat == FONT_PIXMAP ? (glyph_width + 3) / 4 : glyph_width; fwrite(&ch, 1, 1, fp); ch = glyph_height; fwrite(&ch, 1, 1, fp); @@ -89,7 +102,7 @@ void write_font_file(char *filename, char *fontfile, FT_Face face, int glyph_wid face->glyph->bitmap_top, face->glyph->bitmap.width, face->glyph->bitmap.rows, - (face->glyph->advance.x + 0x40) >> 6, + face->glyph->advance.x >> 6, face->glyph->bitmap.buffer, face->glyph->bitmap.pitch); } @@ -174,41 +187,59 @@ int main(int argc, char **argv) FT_Face face; unsigned char *font_buf; int glyph_width, glyph_height, font_pitch; - unsigned char bitReverse; int i; + glyph_width = FONT_WIDTH; + glyph_height = FONT_HEIGHT; + ttf_file = NULL; font_file = NULL; - if (argc > 1) + while (*++argv) { - ttf_file = argv[1]; - if (argc > 2) - font_file = argv[2]; - if (argc > 3) - glyph_width = atoi(argv[3]); + if (argv[0][0] == '-') + { + switch (toupper(argv[0][1])) + { + case 'B': + fontFormat = FONT_BITMAP; + break; + case 'P': + fontFormat = FONT_PIXMAP; + break; + case 'W': + glyph_width = atoi(&argv[0][2]); + break; + case 'H': + glyph_height = atoi(&argv[0][2]); + break; + } + } else - glyph_width = FONT_WIDTH; - if (argc > 4) - glyph_height = atoi(argv[4]); - else - glyph_height = FONT_HEIGHT; + { + if (!ttf_file) + ttf_file = *argv; + else if (!font_file) + font_file = *argv; + else + fprintf(stderr, "? %s\n", *argv); + } } - else + if (!ttf_file || !font_file) die( "Missing font file"); /* * Bit/color reversal */ for (i = 0; i < 256; i++) { - bitReverse = ((i & 0x01) << 7) - | ((i & 0x02) << 5) - | ((i & 0x04) << 3) - | ((i & 0x08) << 1) - | ((i & 0x10) >> 1) - | ((i & 0x20) >> 3) - | ((i & 0x40) >> 5) - | ((i & 0x80) >> 7); - clrSwap[i] = clrRot[bitReverse & 0x0F] - | (clrRot[bitReverse >> 4] << 4); + bitReverse[i] = ((i & 0x01) << 7) + | ((i & 0x02) << 5) + | ((i & 0x04) << 3) + | ((i & 0x08) << 1) + | ((i & 0x10) >> 1) + | ((i & 0x20) >> 3) + | ((i & 0x40) >> 5) + | ((i & 0x80) >> 7); + clrSwap[i] = clrRot[bitReverse[i] & 0x0F] + | (clrRot[bitReverse[i] >> 4] << 4); } /* * Init FreeType library.