--- mkfont32/accessories/mkres.c 2004/06/06 15:33:09 1.1 +++ mkfont32/accessories/mkres.c 2004/06/10 03:11:46 1.3 @@ -120,119 +120,112 @@ static void dump(const char *dstfile, co // ---- -static void font8x8(const char *dstfile, const char *sym, - const char *srcname, UINT sx, UINT sy) { - - BMPRES *res; - UINT size; - BYTE *ptr; - BYTE *p; - UINT x; - UINT y; - UINT i; - - res = bmpload(srcname); - if (res == NULL) { - goto f_err1; - } - if ((res->width < (int)(sx * 8)) || (res->height < (int)(sy * 8))) { - goto f_err2; - } - size = sx * sy * 8; - ptr = (BYTE *)_MALLOC(size, srcname); - if (ptr == NULL) { - goto f_err2; - } - p = ptr; - for (y=0; yptr[x + (((y * 8) + i) * res->align)]; - } +enum { + MKRES_SUCCESS = 0, + MKRES_ERRWIDTH = 1, + MKRES_ERRHEIGHT = 2, + MKRES_ERRBMP = 3, + MKRES_ERRMEMORY = 4, + + MKRES_ERROR = 255 +}; + +static char *getval(const char *ptr, int *pval) { + + int val; + int s; + int c; + + val = 0; + s = 1; + + c = *ptr; + if (c == '+') { + ptr++; + } + else if (c == '-') { + ptr++; + s = -1; + } + while(1) { + c = *ptr; + c -= '0'; + if ((unsigned)c < 10) { + val *= 10; + val += c; + ptr++; + } + else { + break; } } - dump(dstfile, sym, ptr, size); - - _MFREE(ptr); - -f_err2: - _MFREE(res); - -f_err1: - return; + if (pval) { + *pval = val * s; + } + return((char *)ptr); } -static void font8x16(const char *dstfile, const char *sym, - const char *srcname, UINT sx, UINT sy) { +static int mkres(const char *dstfile, const char *sym, + const char *srcname, UINT cx, UINT cy) { + int ret; BMPRES *res; + UINT sx; + UINT sy; UINT size; BYTE *ptr; BYTE *p; + BYTE *q; UINT x; UINT y; UINT i; + UINT j; - res = bmpload(srcname); - if (res == NULL) { + ret = MKRES_ERROR; + + if ((cx == 0) || ((cx & 7) != 0)) { + ret = MKRES_ERRWIDTH; goto f_err1; } - if ((res->width < (int)(sx * 8)) || (res->height < (int)(sy * 16))) { - goto f_err2; - } - size = sx * sy * 16; - ptr = (BYTE *)_MALLOC(size, srcname); - if (ptr == NULL) { - goto f_err2; - } - p = ptr; - for (y=0; yptr[x + (((y * 16) + i) * res->align)]; - } - } + if (cy == 0) { + ret = MKRES_ERRHEIGHT; + goto f_err1; } - dump(dstfile, sym, ptr, size); - - _MFREE(ptr); - -f_err2: - _MFREE(res); - -f_err1: - return; -} - -static void font16x16(const char *dstfile, const char *sym, - const char *srcname, UINT sx, UINT sy) { - - BMPRES *res; - UINT size; - BYTE *ptr; - BYTE *p; - UINT x; - UINT y; - UINT i; res = bmpload(srcname); if (res == NULL) { + ret = MKRES_ERRBMP; goto f_err1; } - if ((res->width < (int)(sx * 16)) || (res->height < (int)(sy * 16))) { + + sx = res->width / cx; + if ((int)(sx * cx) != res->width) { + ret = MKRES_ERRWIDTH; + goto f_err2; + } + sy = res->height / cy; + if ((int)(sy * cy) != res->height) { + ret = MKRES_ERRHEIGHT; goto f_err2; } - size = sx * 2 * sy * 16; + cx >>= 3; + + size = sx * cx * sy * cy; ptr = (BYTE *)_MALLOC(size, srcname); if (ptr == NULL) { + ret = MKRES_ERRMEMORY; goto f_err2; } - p = ptr; + q = ptr; for (y=0; yptr[(x * 2) + 0 + (((y * 16) + i) * res->align)]; - *p++ = res->ptr[(x * 2) + 1 + (((y * 16) + i) * res->align)]; + p = res->ptr + (x * cx) + (y * cy * res->align); + for (i=0; ialign; + q += j; } } } @@ -240,23 +233,30 @@ static void font16x16(const char *dstfil _MFREE(ptr); + ret = MKRES_SUCCESS; + f_err2: _MFREE(res); f_err1: - return; + return(ret); } int main(int argc, char **argv) { - font8x8("..\\cmn_8.res", "cmn_8", "cmn_8.bmp", 0x20, 5); - font8x8("..\\pc98_8.res", "pc98_8", "pc98_8.bmp", 0x20, 3); - font8x16("..\\pc98_16.res", "pc98_16", "pc98_16.bmp", 0x20, 3); - font16x16("..\\jis28xx.res", "jis28xx", "jis28xx.bmp", 0x20, 1); - font8x16("..\\jis29xx.res", "jis29xx", "jis29xx.bmp", 0x5e, 1); - font8x16("..\\jis2axx.res", "jis2axx", "jis2axx.bmp", 0x5e, 1); - font8x16("..\\jis2bxx.res", "jis2bxx", "jis2bxx.bmp", 0x5e, 1); - font16x16("..\\jis2cxx.res", "jis2cxx", "jis2cxx.bmp", 0x4c, 1); - return(0); + char *p; + int cx; + int cy; + + if (argc < 5) { + puts("usage: mkres resfile symbol bmpfile width.height"); + return(255); + } + p = getval(argv[4], &cx); + if (p[0]) { + p++; + } + p = getval(p, &cy); + return(mkres(argv[1], argv[2], argv[3], cx, cy)); }