| version 1.5, 2004/03/25 08:51:23 | version 1.10, 2004/04/09 10:52:20 | 
| Line 7 | Line 7 | 
 | #include        "minifont.res" | #include        "minifont.res" | 
 |  |  | 
 |  |  | 
 | void cmndraw_getpals(CMNPALFN *fn, CMNPALS *pal, UINT pals) { |  | 
 |  |  | 
 | UINT    i; |  | 
 |  |  | 
 | if (fn == NULL) { |  | 
 | return; |  | 
 | } |  | 
 | if (fn->get8) { |  | 
 | for (i=0; i<pals; i++) { |  | 
 | pal[i].pal8 = (*fn->get8)(fn, i); |  | 
 | } |  | 
 | } |  | 
 | if (fn->get32) { |  | 
 | for (i=0; i<pals; i++) { |  | 
 | pal[i].pal32.d = (*fn->get32)(fn, i); |  | 
 | } |  | 
 | if (fn->cnv16) { |  | 
 | for (i=0; i<pals; i++) { |  | 
 | pal[i].pal16 = (*fn->cnv16)(fn, pal[i].pal32); |  | 
 | } |  | 
 | } |  | 
 | } |  | 
 | } |  | 
 |  |  | 
 | void cmndraw_makegrad(RGB32 *pal, int pals, RGB32 bg, RGB32 fg) { | void cmndraw_makegrad(RGB32 *pal, int pals, RGB32 bg, RGB32 fg) { | 
 |  |  | 
 | int             i; | int             i; | 
| Line 48  void cmndraw_makegrad(RGB32 *pal, int pa | Line 24  void cmndraw_makegrad(RGB32 *pal, int pa | 
 | pal[i].d = fg.d; | pal[i].d = fg.d; | 
 | } | } | 
 |  |  | 
 | #if defined(SUPPORT_8BPP) |  | 
 | void cmndraw8_fill(const CMNVRAM *vram, int x, int y, |  | 
 | int cx, int cy, BYTE fg) { |  | 
 |  |  | 
 | BYTE    *p; |  | 
 | int             dalign; |  | 
 | int             r; |  | 
 |  |  | 
 | p = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
 | dalign = vram->yalign - (vram->xalign * cx); |  | 
 | do { |  | 
 | r = cx; |  | 
 | do { |  | 
 | *p = fg; |  | 
 | p += vram->xalign; |  | 
 | } while(--r); |  | 
 | p += dalign; |  | 
 | } while(--cy); |  | 
 | } |  | 
 |  |  | 
 | void cmndraw8_setfg(const CMNVRAM *vram, const BYTE *src, |  | 
 | int x, int y, BYTE fg) { |  | 
 |  |  | 
 | const BYTE      *p; |  | 
 | BYTE    *q; |  | 
 | BYTE    cy; |  | 
 | int             dalign; |  | 
 | BYTE    c; |  | 
 | BYTE    bit; |  | 
 | BYTE    cx; |  | 
 |  |  | 
 | p = src + 2; |  | 
 | q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
 | dalign = vram->yalign - (vram->xalign * src[0]); |  | 
 | cy = src[1]; |  | 
 | do { |  | 
 | cx = src[0]; |  | 
 | bit = 0; |  | 
 | c = 0; |  | 
 | do { |  | 
 | if (!bit) { |  | 
 | bit = 0x80; |  | 
 | c = *p++; |  | 
 | } |  | 
 | if (c & bit) { |  | 
 | *q = fg; |  | 
 | } |  | 
 | bit >>= 1; |  | 
 | q += vram->xalign; |  | 
 | } while(--cx); |  | 
 | q += dalign; |  | 
 | } while(--cy); |  | 
 | } |  | 
 |  |  | 
| void cmndraw8_setpat(const CMNVRAM *vram, const BYTE *src, | // ---- | 
| int x, int y, BYTE bg, BYTE fg) { |  | 
|  |  | 
| const BYTE      *p; |  | 
| BYTE    *q; |  | 
| BYTE    cy; |  | 
| int             dalign; |  | 
| BYTE    c; |  | 
| BYTE    bit; |  | 
| BYTE    cx; |  | 
|  |  | 
| p = src + 2; |  | 
| q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
| dalign = vram->yalign - (vram->xalign * src[0]); |  | 
| cy = src[1]; |  | 
| do { |  | 
| cx = src[0]; |  | 
| bit = 0; |  | 
| c = 0; |  | 
| do { |  | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| *q = fg; |  | 
| } |  | 
| else { |  | 
| *q = bg; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
| #endif |  | 
 |  |  | 
| #if defined(SUPPORT_16BPP) | void cmndraw_fill(const CMNVRAM *vram, int x, int y, | 
| void cmndraw16_fill(const CMNVRAM *vram, int x, int y, | int cx, int cy, CMNPAL fg) { | 
| int cx, int cy, UINT16 fg) { |  | 
 |  |  | 
 | BYTE    *p; | BYTE    *p; | 
 | int             dalign; | int             dalign; | 
 | int             r; | int             r; | 
 |  |  | 
 |  | if (vram == NULL) { | 
 |  | return; | 
 |  | } | 
 | p = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | p = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | 
 | dalign = vram->yalign - (vram->xalign * cx); | dalign = vram->yalign - (vram->xalign * cx); | 
| do { | switch(vram->bpp) { | 
| r = cx; | #if defined(SUPPORT_8BPP) | 
| do { | case 8: | 
| *(UINT16 *)p = fg; | do { | 
| p += vram->xalign; | r = cx; | 
| } while(--r); | do { | 
| p += dalign; | *p = fg.pal8; | 
| } while(--cy); | p += vram->xalign; | 
| } | } while(--r); | 
|  | p += dalign; | 
| void cmndraw16_setfg(const CMNVRAM *vram, const BYTE *src, | } while(--cy); | 
| int x, int y, UINT16 fg) { | break; | 
|  | #endif | 
| const BYTE      *p; | #if defined(SUPPORT_16BPP) | 
| BYTE    *q; | case 16: | 
| BYTE    cy; | do { | 
| int             dalign; | r = cx; | 
| BYTE    c; | do { | 
| BYTE    bit; | *(UINT16 *)p = fg.pal16; | 
| BYTE    cx; | p += vram->xalign; | 
|  | } while(--r); | 
| p = src + 2; | p += dalign; | 
| q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | } while(--cy); | 
| dalign = vram->yalign - (vram->xalign * src[0]); | break; | 
| cy = src[1]; |  | 
| do { |  | 
| cx = src[0]; |  | 
| bit = 0; |  | 
| c = 0; |  | 
| do { |  | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| *(UINT16 *)q = fg; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
|  |  | 
| void cmndraw16_setpat(const CMNVRAM *vram, const BYTE *src, |  | 
| int x, int y, UINT16 bg, UINT16 fg) { |  | 
|  |  | 
| const BYTE      *p; |  | 
| BYTE    *q; |  | 
| BYTE    cy; |  | 
| int             dalign; |  | 
| BYTE    c; |  | 
| BYTE    bit; |  | 
| BYTE    cx; |  | 
|  |  | 
| p = src + 2; |  | 
| q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
| dalign = vram->yalign - (vram->xalign * src[0]); |  | 
| cy = src[1]; |  | 
| do { |  | 
| cx = src[0]; |  | 
| bit = 0; |  | 
| c = 0; |  | 
| do { |  | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| *(UINT16 *)q = fg; |  | 
| } |  | 
| else { |  | 
| *(UINT16 *)q = bg; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
 | #endif | #endif | 
 |  |  | 
 | #if defined(SUPPORT_24BPP) | #if defined(SUPPORT_24BPP) | 
| void cmndraw24_fill(const CMNVRAM *vram, int x, int y, | case 24: | 
| int cx, int cy, RGB32 fg) { | do { | 
|  | r = cx; | 
| BYTE    *p; | do { | 
| int             dalign; | p[RGB24_R] = fg.pal32.p.r; | 
| int             r; | p[RGB24_G] = fg.pal32.p.g; | 
|  | p[RGB24_B] = fg.pal32.p.b; | 
| p = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | p += vram->xalign; | 
| dalign = vram->yalign - (vram->xalign * cx); | } while(--r); | 
| do { | p += dalign; | 
| r = cx; | } while(--cy); | 
| do { | break; | 
| p[RGB24_R] = fg.p.r; |  | 
| p[RGB24_G] = fg.p.g; |  | 
| p[RGB24_B] = fg.p.b; |  | 
| p += vram->xalign; |  | 
| } while(--r); |  | 
| p += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
|  |  | 
| void cmndraw24_setfg(const CMNVRAM *vram, const BYTE *src, |  | 
| int x, int y, RGB32 fg) { |  | 
|  |  | 
| const BYTE      *p; |  | 
| BYTE    *q; |  | 
| BYTE    cy; |  | 
| int             dalign; |  | 
| BYTE    c; |  | 
| BYTE    bit; |  | 
| BYTE    cx; |  | 
|  |  | 
| p = src + 2; |  | 
| q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
| dalign = vram->yalign - (vram->xalign * src[0]); |  | 
| cy = src[1]; |  | 
| do { |  | 
| cx = src[0]; |  | 
| bit = 0; |  | 
| c = 0; |  | 
| do { |  | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| q[RGB24_R] = fg.p.r; |  | 
| q[RGB24_G] = fg.p.g; |  | 
| q[RGB24_B] = fg.p.b; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
|  |  | 
| void cmndraw24_setpat(const CMNVRAM *vram, const BYTE *src, |  | 
| int x, int y, RGB32 bg, RGB32 fg) { |  | 
|  |  | 
| const BYTE      *p; |  | 
| BYTE    *q; |  | 
| BYTE    cy; |  | 
| int             dalign; |  | 
| BYTE    c; |  | 
| BYTE    bit; |  | 
| BYTE    cx; |  | 
|  |  | 
| p = src + 2; |  | 
| q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); |  | 
| dalign = vram->yalign - (vram->xalign * src[0]); |  | 
| cy = src[1]; |  | 
| do { |  | 
| cx = src[0]; |  | 
| bit = 0; |  | 
| c = 0; |  | 
| do { |  | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| q[RGB24_R] = fg.p.r; |  | 
| q[RGB24_G] = fg.p.g; |  | 
| q[RGB24_B] = fg.p.b; |  | 
| } |  | 
| else { |  | 
| q[RGB24_R] = bg.p.r; |  | 
| q[RGB24_G] = bg.p.g; |  | 
| q[RGB24_B] = bg.p.b; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
 | #endif | #endif | 
 |  |  | 
 | #if defined(SUPPORT_32BPP) | #if defined(SUPPORT_32BPP) | 
| void cmndraw32_fill(const CMNVRAM *vram, int x, int y, | case 32: | 
| int cx, int cy, RGB32 fg) { | do { | 
|  | r = cx; | 
| BYTE    *p; | do { | 
| int             dalign; | *(UINT32 *)p = fg.pal32.d; | 
| int             r; | p += vram->xalign; | 
|  | } while(--r); | 
| p = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | p += dalign; | 
| dalign = vram->yalign - (vram->xalign * cx); | } while(--cy); | 
| do { | break; | 
| r = cx; | #endif | 
| do { | } | 
| *(UINT32 *)p = fg.d; |  | 
| p += vram->xalign; |  | 
| } while(--r); |  | 
| p += dalign; |  | 
| } while(--cy); |  | 
 | } | } | 
 |  |  | 
| void cmndraw32_setfg(const CMNVRAM *vram, const BYTE *src, | void cmndraw_setfg(const CMNVRAM *vram, const BYTE *src, | 
| int x, int y, RGB32 fg) { | int x, int y, CMNPAL fg) { | 
 |  |  | 
 | const BYTE      *p; | const BYTE      *p; | 
 | BYTE    *q; | BYTE    *q; | 
| Line 363  const BYTE *p; | Line 104  const BYTE *p; | 
 | BYTE    bit; | BYTE    bit; | 
 | BYTE    cx; | BYTE    cx; | 
 |  |  | 
 |  | if (vram == NULL) { | 
 |  | return; | 
 |  | } | 
 | p = src + 2; | p = src + 2; | 
 | q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | q = vram->ptr + (x * vram->xalign) + (y * vram->yalign); | 
 | dalign = vram->yalign - (vram->xalign * src[0]); | dalign = vram->yalign - (vram->xalign * src[0]); | 
| Line 371  const BYTE *p; | Line 115  const BYTE *p; | 
 | cx = src[0]; | cx = src[0]; | 
 | bit = 0; | bit = 0; | 
 | c = 0; | c = 0; | 
| do { | switch(vram->bpp) { | 
| if (!bit) { | #if defined(SUPPORT_8BPP) | 
| bit = 0x80; | case 8: | 
| c = *p++; | do { | 
| } | if (!bit) { | 
| if (c & bit) { | bit = 0x80; | 
| *(UINT32 *)q = fg.d; | c = *p++; | 
| } | } | 
| bit >>= 1; | if (c & bit) { | 
| q += vram->xalign; | *q = fg.pal8; | 
| } while(--cx); | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
|  | #endif | 
|  | #if defined(SUPPORT_16BPP) | 
|  | case 16: | 
|  | do { | 
|  | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | *(UINT16 *)q = fg.pal16; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
|  | #endif | 
|  | #if defined(SUPPORT_24BPP) | 
|  | case 24: | 
|  | do { | 
|  | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | q[RGB24_R] = fg.pal32.p.r; | 
|  | q[RGB24_G] = fg.pal32.p.g; | 
|  | q[RGB24_B] = fg.pal32.p.b; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
|  | #endif | 
|  | #if defined(SUPPORT_32BPP) | 
|  | case 32: | 
|  | do { | 
|  | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | *(UINT32 *)q = fg.pal32.d; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
|  | #endif | 
|  | } | 
 | q += dalign; | q += dalign; | 
 | } while(--cy); | } while(--cy); | 
 | } | } | 
 |  |  | 
| void cmndraw32_setpat(const CMNVRAM *vram, const BYTE *src, | void cmndraw_setpat(const CMNVRAM *vram, const BYTE *src, | 
| int x, int y, RGB32 bg, RGB32 fg) { | int x, int y, CMNPAL bg, CMNPAL fg) { | 
 |  |  | 
 | const BYTE      *p; | const BYTE      *p; | 
 | BYTE    *q; | BYTE    *q; | 
| Line 405  const BYTE *p; | Line 202  const BYTE *p; | 
 | cx = src[0]; | cx = src[0]; | 
 | bit = 0; | bit = 0; | 
 | c = 0; | c = 0; | 
| do { | switch(vram->bpp) { | 
| if (!bit) { |  | 
| bit = 0x80; |  | 
| c = *p++; |  | 
| } |  | 
| if (c & bit) { |  | 
| *(UINT32 *)q = fg.d; |  | 
| } |  | 
| else { |  | 
| *(UINT32 *)q = bg.d; |  | 
| } |  | 
| bit >>= 1; |  | 
| q += vram->xalign; |  | 
| } while(--cx); |  | 
| q += dalign; |  | 
| } while(--cy); |  | 
| } |  | 
| #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) | #if defined(SUPPORT_8BPP) | 
| case 8: | case 8: | 
| cmndraw8_fill(vram, x, y, cx, cy, pal->pal8); | do { | 
| break; | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | *q = fg.pal8; | 
|  | } | 
|  | else { | 
|  | *q = bg.pal8; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
 | #endif | #endif | 
 | #if defined(SUPPORT_16BPP) | #if defined(SUPPORT_16BPP) | 
| case 16: | case 16: | 
| cmndraw16_fill(vram, x, y, cx, cy, pal->pal16); | do { | 
| break; | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | *(UINT16 *)q = fg.pal16; | 
|  | } | 
|  | else { | 
|  | *(UINT16 *)q = bg.pal16; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
 | #endif | #endif | 
 | #if defined(SUPPORT_24BPP) | #if defined(SUPPORT_24BPP) | 
| case 24: | case 24: | 
| cmndraw24_fill(vram, x, y, cx, cy, pal->pal32); | do { | 
| break; | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | q[RGB24_R] = fg.pal32.p.r; | 
|  | q[RGB24_G] = fg.pal32.p.g; | 
|  | q[RGB24_B] = fg.pal32.p.b; | 
|  | } | 
|  | else { | 
|  | q[RGB24_R] = bg.pal32.p.r; | 
|  | q[RGB24_G] = bg.pal32.p.g; | 
|  | q[RGB24_B] = bg.pal32.p.b; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
 | #endif | #endif | 
 | #if defined(SUPPORT_32BPP) | #if defined(SUPPORT_32BPP) | 
| case 32: | case 32: | 
| cmndraw32_fill(vram, x, y, cx, cy, pal->pal32); | do { | 
| break; | if (!bit) { | 
|  | bit = 0x80; | 
|  | c = *p++; | 
|  | } | 
|  | if (c & bit) { | 
|  | *(UINT32 *)q = fg.pal32.d; | 
|  | } | 
|  | else { | 
|  | *(UINT32 *)q = bg.pal32.d; | 
|  | } | 
|  | bit >>= 1; | 
|  | q += vram->xalign; | 
|  | } while(--cx); | 
|  | break; | 
 | #endif | #endif | 
| } | } | 
|  | q += dalign; | 
|  | } while(--cy); | 
 | } | } | 
 |  |  | 
| void cmddraw_text8(CMNVRAM *vram, int x, int y, const char *str, CMNPALS *pal) { |  | 
|  | // ---- | 
|  |  | 
|  | void cmddraw_text8(CMNVRAM *vram, int x, int y, const char *str, CMNPAL fg) { | 
 |  |  | 
 | UINT    s; | UINT    s; | 
 | const BYTE      *ptr; | const BYTE      *ptr; | 
 | BYTE    src[10]; | BYTE    src[10]; | 
 |  |  | 
| if ((vram == NULL) || (str == NULL) || (pal == NULL)) { | if ((vram == NULL) || (str == NULL)) { | 
 | return; | return; | 
 | } | } | 
 | src[0] = 0; | src[0] = 0; | 
| Line 482  const BYTE *ptr; | Line 312  const BYTE *ptr; | 
 | } | } | 
 | src[0] = ptr[0]; | src[0] = ptr[0]; | 
 | CopyMemory(src + 2, ptr + 1, 7); | CopyMemory(src + 2, ptr + 1, 7); | 
| switch(vram->bpp) { | cmndraw_setfg(vram, src, x, y, fg); | 
| #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; | x += ptr[0] + 1; | 
 | } | } | 
 | } | } | 
| Line 511  const BYTE *ptr; | Line 320  const BYTE *ptr; | 
 |  |  | 
 | // ---- bmp | // ---- bmp | 
 |  |  | 
| void cmddraw_bmp16(CMNVRAM *vram, const void *bmp, CMNPALCNV cnv) { | BOOL cmndraw_bmp4inf(CMNBMP *bmp, const void *ptr) { | 
 |  |  | 
 | const BMPFILE   *bf; | const BMPFILE   *bf; | 
 | const BMPINFO   *bi; | const BMPINFO   *bi; | 
| Line 521  const BYTE  *palptr; | Line 330  const BYTE  *palptr; | 
 | int                     bmpalign; | int                     bmpalign; | 
 | UINT            pals; | UINT            pals; | 
 | UINT            c; | UINT            c; | 
 | RGB32           paltbl[16]; |  | 
 | CMNPAL          pal[16]; |  | 
 | BYTE            *dst; |  | 
 | int                     yalign; |  | 
 | int                     x; |  | 
 | int                     y; |  | 
 |  |  | 
| if ((vram == NULL) || (bmp == NULL) || (cnv == NULL)) { | if ((bmp == NULL) || (ptr == NULL)) { | 
| return; | return(FAILURE); | 
 | } | } | 
| bf = (BMPFILE *)bmp; | bf = (BMPFILE *)ptr; | 
 | bi = (BMPINFO *)(bf + 1); | bi = (BMPINFO *)(bf + 1); | 
 | palptr = (BYTE *)(bi + 1); | palptr = (BYTE *)(bi + 1); | 
 | if (((bf->bfType[0] != 'B') && (bf->bfType[1] != 'M')) || | if (((bf->bfType[0] != 'B') && (bf->bfType[1] != 'M')) || | 
 | (bmpdata_getinfo(bi, &inf) != SUCCESS) || (inf.bpp != 4)) { | (bmpdata_getinfo(bi, &inf) != SUCCESS) || (inf.bpp != 4)) { | 
| return; | return(FAILURE); | 
 | } | } | 
 |  | pals = min(LOADINTELDWORD(bi->biClrUsed), 16); | 
 |  |  | 
 | src = (BYTE *)bf + (LOADINTELDWORD(bf->bfOffBits)); | src = (BYTE *)bf + (LOADINTELDWORD(bf->bfOffBits)); | 
 | bmpalign = bmpdata_getalign(bi); | bmpalign = bmpdata_getalign(bi); | 
 | if (inf.height > 0) { | if (inf.height > 0) { | 
| src += (inf.height - 1) * bmpalign; | bmp->ptr = src + ((inf.height - 1) * bmpalign); | 
| bmpalign *= -1; | bmp->width = inf.width; | 
|  | bmp->height = inf.height; | 
|  | bmp->align = bmpalign * -1; | 
 | } | } | 
 | else { | else { | 
| inf.height *= -1; | bmp->ptr = src; | 
|  | bmp->width = inf.width; | 
|  | bmp->height = inf.height * -1; | 
|  | bmp->align = bmpalign; | 
 | } | } | 
| if ((vram->width < inf.width) || (vram->height < inf.height)) { | bmp->pals = pals; | 
| return; | ZeroMemory(bmp->paltbl, sizeof(bmp->paltbl)); | 
| } |  | 
| pals = LOADINTELDWORD(bi->biClrUsed); |  | 
| pals = min(pals, 16); |  | 
| ZeroMemory(paltbl, sizeof(paltbl)); |  | 
 | for (c=0; c<pals; c++) { | for (c=0; c<pals; c++) { | 
| paltbl[c].p.b = palptr[c*4+0]; | bmp->paltbl[c].p.b = palptr[c*4+0]; | 
| paltbl[c].p.g = palptr[c*4+1]; | bmp->paltbl[c].p.g = palptr[c*4+1]; | 
| paltbl[c].p.r = palptr[c*4+2]; | bmp->paltbl[c].p.r = palptr[c*4+2]; | 
|  | } | 
|  | return(SUCCESS); | 
|  | } | 
|  |  | 
|  | void cmndraw_bmp16(CMNVRAM *vram, const void *ptr, CMNPALCNV cnv, UINT flag) { | 
|  |  | 
|  | CMNBMP  bmp; | 
|  | CMNPAL  pal[16]; | 
|  | BYTE    *src; | 
|  | BYTE    *dst; | 
|  | int             yalign; | 
|  | int             x; | 
|  | int             y; | 
|  | UINT    c; | 
|  |  | 
|  | if ((vram == NULL) || (cnv == NULL) || | 
|  | (cmndraw_bmp4inf(&bmp, ptr) != SUCCESS) || | 
|  | (vram->width < bmp.width) || (vram->height < bmp.height)) { | 
|  | return; | 
 | } | } | 
| (*cnv)(pal, paltbl, pals, vram->bpp); | (*cnv)(pal, bmp.paltbl, bmp.pals, vram->bpp); | 
|  | src = bmp.ptr; | 
 | dst = vram->ptr; | dst = vram->ptr; | 
| #if 0 | switch(flag & 0x03) { | 
| dst += ((vram->width - inf.width) / 2) * vram->xalign; | case CMNBMP_CENTER: | 
| dst += ((vram->height - inf.height) / 2) * vram->yalign; | dst += ((vram->width - bmp.width) / 2) * vram->xalign; | 
|  | break; | 
|  |  | 
|  | case CMNBMP_RIGHT: | 
|  | dst += (vram->width - bmp.width) * vram->xalign; | 
|  | break; | 
|  | } | 
|  | switch(flag & 0x0c) { | 
|  | case CMNBMP_MIDDLE: | 
|  | dst += ((vram->height - bmp.height) / 2) * vram->yalign; | 
|  | break; | 
|  |  | 
|  | case CMNBMP_BOTTOM: | 
|  | dst += (vram->height - bmp.height) * vram->yalign; | 
|  | break; | 
|  | } | 
|  | yalign = vram->yalign - (bmp.width * vram->xalign); | 
|  | for (y=0; y<bmp.height; y++) { | 
|  | switch(vram->bpp) { | 
|  | #if defined(SUPPORT_8BPP) | 
|  | case 8: | 
|  | for (x=0; x<bmp.width; x++) { | 
|  | if (!(x & 1)) { | 
|  | c = src[x >> 1] >> 4; | 
|  | } | 
|  | else { | 
|  | c = src[x >> 1] & 15; | 
|  | } | 
|  | *dst = pal[c].pal8; | 
|  | dst += vram->xalign; | 
|  | } | 
|  | break; | 
 | #endif | #endif | 
 | yalign = vram->yalign - (inf.width * vram->xalign); |  | 
 | switch(vram->bpp) { |  | 
 | #if defined(SUPPORT_16BPP) | #if defined(SUPPORT_16BPP) | 
| case 16: | case 16: | 
| for (y=0; y<inf.height; y++) { | for (x=0; x<bmp.width; x++) { | 
| for (x=0; x<inf.width; x++) { |  | 
 | if (!(x & 1)) { | if (!(x & 1)) { | 
 | c = src[x >> 1] >> 4; | c = src[x >> 1] >> 4; | 
 | } | } | 
| Line 579  const BYTE  *palptr; | Line 433  const BYTE  *palptr; | 
 | *(UINT16 *)dst = pal[c].pal16; | *(UINT16 *)dst = pal[c].pal16; | 
 | dst += vram->xalign; | dst += vram->xalign; | 
 | } | } | 
| src += bmpalign; | break; | 
| dst += yalign; | #endif | 
| } | #if defined(SUPPORT_24BPP) | 
| break; | case 24: | 
|  | for (x=0; x<bmp.width; x++) { | 
|  | if (!(x & 1)) { | 
|  | c = src[x >> 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; | 
|  | } | 
|  | break; | 
 | #endif | #endif | 
 | #if defined(SUPPORT_32BPP) | #if defined(SUPPORT_32BPP) | 
| case 32: | case 32: | 
| for (y=0; y<inf.height; y++) { | for (x=0; x<bmp.width; x++) { | 
| for (x=0; x<inf.width; x++) { |  | 
 | if (!(x & 1)) { | if (!(x & 1)) { | 
 | c = src[x >> 1] >> 4; | c = src[x >> 1] >> 4; | 
 | } | } | 
| Line 597  const BYTE  *palptr; | Line 463  const BYTE  *palptr; | 
 | *(UINT32 *)dst = pal[c].pal32.d; | *(UINT32 *)dst = pal[c].pal32.d; | 
 | dst += vram->xalign; | dst += vram->xalign; | 
 | } | } | 
| src += bmpalign; | break; | 
| dst += yalign; |  | 
| } |  | 
| break; |  | 
 | #endif | #endif | 
 |  | } | 
 |  | src += bmp.align; | 
 |  | dst += yalign; | 
 | } | } | 
 | } | } | 
 |  |  |