--- np2/wince/scrnmng.cpp 2003/12/05 19:42:04 1.6 +++ np2/wince/scrnmng.cpp 2004/07/15 13:48:40 1.9 @@ -6,9 +6,8 @@ #include "vramhdl.h" #include "menubase.h" #include "nekop2.res" -#if defined(SUPPORT_SOFTKBD) -#include "softkbd.res" -#endif +#include "cmndraw.h" +#include "softkbd.h" #if defined(GX_DLL) @@ -27,8 +26,9 @@ typedef struct { long xalign; long yalign; #if defined(SUPPORT_SOFTKBD) + int kbdposy; + int kbdheight; int allflash; - BMPFILE *kbd; #endif } SCRNMNG; @@ -85,70 +85,31 @@ static BOOL calcdrawrect(DRAWRECT *dr, V return(SUCCESS); } -static void bmp16draw(BMPFILE *bf, BYTE *dst, int width, int height, - int xalign, int yalign) { +static void palcnv(CMNPAL *dst, const RGB32 *src, UINT pals, UINT bpp) { -const BMPINFO *bi; -const BYTE *pal; - BMPDATA inf; - BYTE *src; - int bmpalign; - UINT pals; - UINT16 paltbl[16]; - UINT c; - int x; - int y; + UINT i; - if (bf == NULL) { - goto b16d_err; - } - bi = (BMPINFO *)(bf + 1); - pal = (BYTE *)(bi + 1); - if (((bf->bfType[0] != 'B') && (bf->bfType[1] != 'M')) || - (bmpdata_getinfo(bi, &inf) != SUCCESS) || (inf.bpp != 4)) { - goto b16d_err; - } - 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 ((width < inf.width) || (height < inf.height)) { - goto b16d_err; - } - dst += ((width - inf.width) / 2) * xalign; - dst += ((height - inf.height) / 2) * yalign; - yalign -= (inf.width * xalign); - - pals = LOADINTELDWORD(bi->biClrUsed); - pals = min(pals, 16); - ZeroMemory(paltbl, sizeof(paltbl)); - for (c=0; c> 3); - } - - for (y=0; y> 1] >> 4; - } - else { - c = src[x >> 1] & 15; - } - *(UINT16 *)dst = paltbl[c]; - dst += xalign; + if (bpp == 16) { + for (i=0; i> 3); } - src += bmpalign; - dst += yalign; } +} -b16d_err: - return; +static void bmp16draw(void *bmp, BYTE *dst, int width, int height, + int xalign, int yalign) { + + CMNVRAM vram; + + vram.ptr = dst; + vram.width = width; + vram.height = height; + vram.xalign = xalign; + vram.yalign = yalign; + vram.bpp = 16; + cmndraw_bmp16(&vram, bmp, palcnv, CMNBMP_CENTER | CMNBMP_MIDDLE); } @@ -163,6 +124,9 @@ void scrnmng_initialize(void) { BOOL scrnmng_create(HWND hWnd, LONG width, LONG height) { TCHAR msg[32]; +#if defined(SUPPORT_SOFTKBD) + int kbdheight; +#endif if ((width <= 0) || (height <= 0)) { return(FAILURE); @@ -221,7 +185,13 @@ BOOL scrnmng_create(HWND hWnd, LONG widt gx_disable = 0; scrnmng_clear(TRUE); #if defined(SUPPORT_SOFTKBD) - scrnmng.kbd = (BMPFILE *)bmpdata_solvedata(np2kbd_bmp); + softkbd_initialize(); + if (softkbd_getsize(NULL, &kbdheight) != SUCCESS) { + kbdheight = 0; + } + kbdheight = min(kbdheight, height); + scrnmng.kbdposy = height - kbdheight; + scrnmng.kbdheight = kbdheight; #endif return(SUCCESS); } @@ -231,10 +201,7 @@ void scrnmng_destroy(void) { gx_disable = 1; GXCloseDisplay(); #if defined(SUPPORT_SOFTKBD) - if (scrnmng.kbd) { - _MFREE(scrnmng.kbd); - scrnmng.kbd = NULL; - } + softkbd_deinitialize(); #endif } @@ -250,7 +217,7 @@ RGB16 scrnmng_makepal16(RGB32 pal32) { RGB16 ret; ret = (pal32.p.r & 0xf8) << 8; -#if defined(SIZE_QVGA) +#if defined(SIZE_QVGA) && !defined(SIZE_VGATEST) ret += (pal32.p.g & 0xfc) << (3 + 16); #else ret += (pal32.p.g & 0xfc) << 3; @@ -284,8 +251,13 @@ const SCRNSURF *scrnmng_surflock(void) { scrnsurf.xalign = 2; scrnsurf.yalign = scrnmng.vram->yalign; } +#if !defined(SIZE_VGATEST) scrnsurf.width = min(scrnstat.width, 640); scrnsurf.height = min(scrnstat.height, 400); +#else + scrnsurf.width = min(scrnstat.width, 320); + scrnsurf.height = min(scrnstat.height, 200); +#endif scrnsurf.bpp = 16; scrnsurf.extend = 0; return(&scrnsurf); @@ -348,14 +320,23 @@ const BYTE *a; void scrnmng_surfunlock(const SCRNSURF *surf) { +#if defined(SUPPORT_SOFTKBD) + CMNVRAM vram; +#endif + if (surf) { if (scrnmng.vram == NULL) { #if defined(SUPPORT_SOFTKBD) if (scrnmng.allflash) { scrnmng.allflash = 0; + vram.ptr = surf->ptr + (scrnmng.kbdposy * surf->yalign); + vram.width = scrnmng.width; + vram.height = scrnmng.kbdheight; + vram.xalign = surf->xalign; + vram.yalign = surf->yalign; + vram.bpp = 16; + softkbd_paint(&vram, palcnv, TRUE); } - bmp16draw(scrnmng.kbd, surf->ptr + (surf->yalign * 200), 320, 40, - surf->xalign, surf->yalign); #endif GXEndDraw(); } @@ -402,7 +383,7 @@ BOOL scrnmng_mousepos(LPARAM *lp) { void scrnmng_clear(BOOL logo) { - BMPFILE *bf; + void *bmp; BYTE *p; BYTE *q; int y; @@ -412,9 +393,9 @@ void scrnmng_clear(BOOL logo) { if (gx_disable) { return; } - bf = NULL; + bmp = NULL; if (logo) { - bf = (BMPFILE *)bmpdata_solvedata(nekop2_bmp); + bmp = (void *)bmpdata_solvedata(nekop2_bmp); } p = (BYTE *)GXBeginDraw(); q = p; @@ -428,11 +409,10 @@ void scrnmng_clear(BOOL logo) { } while(--x); q += yalign; } while(--y); - bmp16draw(bf, p + scrnmng.start, scrnmng.width, scrnmng.height, - scrnmng.xalign, scrnmng.yalign); - GXEndDraw(); - if (bf) { - _MFREE(bf); + bmp16draw(bmp, p + scrnmng.start, scrnmng.width, scrnmng.height, + scrnmng.xalign, scrnmng.yalign); GXEndDraw(); + if (bmp) { + _MFREE(bmp); } } @@ -454,17 +434,29 @@ void scrnmng_keybinds(void) { BOOL scrnmng_entermenu(SCRNMENU *smenu) { + VRAMHDL vram; +#if defined(SUPPORT_SOFTKBD) + CMNVRAM kbdvram; +#endif + if (smenu == NULL) { goto smem_err; } vram_destroy(scrnmng.vram); - scrnmng.vram = vram_create(scrnmng.width, scrnmng.height, FALSE, 16); - if (scrnmng.vram == NULL) { + vram = vram_create(scrnmng.width, scrnmng.height, FALSE, 16); + scrnmng.vram = vram; + if (vram == NULL) { goto smem_err; } scrndraw_redraw(); #if defined(SUPPORT_SOFTKBD) - bmp16draw(scrnmng.kbd, scrnmng.vram->ptr + (640 * 200), 320, 40, 2, 640); + kbdvram.ptr = vram->ptr + (vram->yalign * scrnmng.kbdposy); + kbdvram.width = vram->width; + kbdvram.height = scrnmng.kbdheight; + kbdvram.xalign = vram->xalign; + kbdvram.yalign = vram->yalign; + kbdvram.bpp = vram->bpp; + softkbd_paint(&kbdvram, palcnv, TRUE); #endif smenu->width = scrnmng.width; smenu->height = scrnmng.height; @@ -525,3 +517,29 @@ const BYTE *q; GXEndDraw(); } + +// ---- + +#if defined(SUPPORT_SOFTKBD) +BOOL scrnmng_kbdpos(LPARAM *lp) { + + UINT x; + UINT y; + + x = LOWORD(*lp); + y = HIWORD(*lp) - scrnmng.kbdposy; + *lp = (x & 0xffff) | ((y << 16) & 0xffff0000); + return(SUCCESS); +} + +BOOL scrnmng_ismenu(LPARAM lp) { + + if ((LOWORD(lp) < 32) && (HIWORD(lp) >= (scrnmng.height - 32))) { + return(TRUE); + } + else { + return(FALSE); + } +} +#endif +