--- np2/generic/cmndraw.c 2003/11/21 06:51:11 1.1 +++ np2/generic/cmndraw.c 2004/03/25 10:41:13 1.6 @@ -1,8 +1,36 @@ #include "compiler.h" +#include "bmpdata.h" #include "scrnmng.h" +#include "cpucore.h" +#include "font.h" #include "cmndraw.h" +#include "minifont.res" +void cmndraw_getpals(CMNPALFN *fn, CMNPALS *pal, UINT pals) { + + UINT i; + + if (fn == NULL) { + return; + } + if (fn->get8) { + for (i=0; iget8)(fn, i); + } + } + if (fn->get32) { + for (i=0; iget32)(fn, i); + } + if (fn->cnv16) { + for (i=0; icnv16)(fn, pal[i].pal32); + } + } + } +} + void cmndraw_makegrad(RGB32 *pal, int pals, RGB32 bg, RGB32 fg) { int i; @@ -396,3 +424,236 @@ const BYTE *p; } #endif + + +// ---- + +void cmddraw_fill(CMNVRAM *vram, int x, int y, int cx, int cy, CMNPALS *pal) { + + if ((vram == NULL) || (pal == NULL)) { + return; + } + switch(vram->bpp) { +#if defined(SUPPORT_8BPP) + case 8: + cmndraw8_fill(vram, x, y, cx, cy, pal->pal8); + break; +#endif +#if defined(SUPPORT_16BPP) + case 16: + cmndraw16_fill(vram, x, y, cx, cy, pal->pal16); + break; +#endif +#if defined(SUPPORT_24BPP) + case 24: + cmndraw24_fill(vram, x, y, cx, cy, pal->pal32); + break; +#endif +#if defined(SUPPORT_32BPP) + case 32: + cmndraw32_fill(vram, x, y, cx, cy, pal->pal32); + break; +#endif + } +} + +void cmddraw_text8(CMNVRAM *vram, int x, int y, const char *str, CMNPALS *pal) { + + UINT s; +const BYTE *ptr; + BYTE src[10]; + + if ((vram == NULL) || (str == NULL) || (pal == NULL)) { + return; + } + src[0] = 0; + src[1] = 7; + while(*str) { + s = (UINT)(*str++); + ptr = NULL; + if ((s >= 0x20) && (s < 0x80)) { + ptr = minifont + (s - 0x20) * 8; + } + else if ((s >= 0xa0) && (s < 0xe0)) { + ptr = minifont + (s - 0xa0 + 0x60) * 8; + } + if (ptr == NULL) { + continue; + } + src[0] = ptr[0]; + CopyMemory(src + 2, ptr + 1, 7); + switch(vram->bpp) { +#if defined(SUPPORT_8BPP) + case 8: + cmndraw8_setfg(vram, src, x, y, pal->pal8); + break; +#endif +#if defined(SUPPORT_16BPP) + case 16: + cmndraw16_setfg(vram, src, x, y, pal->pal16); + break; +#endif +#if defined(SUPPORT_24BPP) + case 24: + cmndraw24_setfg(vram, src, x, y, pal->pal32); + break; +#endif +#if defined(SUPPORT_32BPP) + case 32: + cmndraw32_setfg(vram, src, x, y, pal->pal32); + break; +#endif + } + x += ptr[0] + 1; + } +} + + +// ---- bmp + +void cmddraw_bmp16(CMNVRAM *vram, const void *bmp, CMNPALCNV cnv, UINT flag) { + +const BMPFILE *bf; +const BMPINFO *bi; +const BYTE *palptr; + BMPDATA inf; + BYTE *src; + int bmpalign; + UINT pals; + UINT c; + RGB32 paltbl[16]; + CMNPAL pal[16]; + BYTE *dst; + int yalign; + int x; + int y; + + if ((vram == NULL) || (bmp == NULL) || (cnv == NULL)) { + return; + } + bf = (BMPFILE *)bmp; + bi = (BMPINFO *)(bf + 1); + palptr = (BYTE *)(bi + 1); + if (((bf->bfType[0] != 'B') && (bf->bfType[1] != 'M')) || + (bmpdata_getinfo(bi, &inf) != SUCCESS) || (inf.bpp != 4)) { + return; + } + src = (BYTE *)bf + (LOADINTELDWORD(bf->bfOffBits)); + bmpalign = bmpdata_getalign(bi); + if (inf.height > 0) { + src += (inf.height - 1) * bmpalign; + bmpalign *= -1; + } + else { + inf.height *= -1; + } + if ((vram->width < inf.width) || (vram->height < inf.height)) { + return; + } + pals = LOADINTELDWORD(bi->biClrUsed); + pals = min(pals, 16); + ZeroMemory(paltbl, sizeof(paltbl)); + for (c=0; cbpp); + dst = vram->ptr; + switch(flag & 0x03) { + case CMNBMP_CENTER: + dst += ((vram->width - inf.width) / 2) * vram->xalign; + break; + + case CMNBMP_RIGHT: + dst += (vram->width - inf.width) * vram->xalign; + break; + } + switch(flag & 0x0c) { + case CMNBMP_MIDDLE: + dst += ((vram->height - inf.height) / 2) * vram->yalign; + break; + + case CMNBMP_BOTTOM: + dst += (vram->height - inf.height) * vram->yalign; + break; + } + yalign = vram->yalign - (inf.width * vram->xalign); + switch(vram->bpp) { +#if defined(SUPPORT_8BPP) + case 8: + for (y=0; y> 1] >> 4; + } + else { + c = src[x >> 1] & 15; + } + *dst = pal[c].pal8; + dst += vram->xalign; + } + src += bmpalign; + dst += yalign; + } + break; +#endif +#if defined(SUPPORT_16BPP) + case 16: + for (y=0; y> 1] >> 4; + } + else { + c = src[x >> 1] & 15; + } + *(UINT16 *)dst = pal[c].pal16; + dst += vram->xalign; + } + src += bmpalign; + dst += yalign; + } + break; +#endif +#if defined(SUPPORT_24BPP) + case 24: + for (y=0; y> 1] >> 4; + } + else { + c = src[x >> 1] & 15; + } + dst[RGB24_R] = pal[c].pal32.p.r; + dst[RGB24_G] = pal[c].pal32.p.g; + dst[RGB24_B] = pal[c].pal32.p.b; + dst += vram->xalign; + } + src += bmpalign; + dst += yalign; + } + break; +#endif +#if defined(SUPPORT_32BPP) + case 32: + for (y=0; y> 1] >> 4; + } + else { + c = src[x >> 1] & 15; + } + *(UINT32 *)dst = pal[c].pal32.d; + dst += vram->xalign; + } + src += bmpalign; + dst += yalign; + } + break; +#endif + } +} +