--- np2/wince/scrnmng.cpp 2003/11/21 06:51:15 1.2 +++ np2/wince/scrnmng.cpp 2004/07/17 20:43:02 1.10 @@ -6,6 +6,13 @@ #include "vramhdl.h" #include "menubase.h" #include "nekop2.res" +#include "cmndraw.h" +#include "softkbd.h" + + +#if defined(GX_DLL) +#pragma comment(lib, "gx.lib") +#endif typedef struct { @@ -18,6 +25,11 @@ typedef struct { long start; long xalign; long yalign; +#if defined(SUPPORT_SOFTKBD) + int kbdposy; + int kbdheight; + int allflash; +#endif } SCRNMNG; typedef struct { @@ -32,6 +44,7 @@ static SCRNSTAT scrnstat; static SCRNSURF scrnsurf; static BYTE gx_disable = 1; +extern GXKeyList gx_keylist; static const TCHAR errmsg[] = STRLITERAL("Error"); @@ -45,6 +58,69 @@ typedef struct { int dstpos; } DRAWRECT; + +// ---- GX DLL¤Č¤« + +#if !defined(WIN32_PLATFORM_PSPC) || !defined(SIZE_VGA) + +#define GXGETDISPLAYPROPERTIES() GXGetDisplayProperties() +#define GXBEGINDRAW() GXBeginDraw() +#define GXENDDRAW() GXEndDraw() + +#else // PocketPC2003SE VGA + +typedef struct { + WORD wFormat; + WORD wBPP; + VOID *pFramePointer; + int cxStride; + int cyStride; + int cxPixels; + int cyPixels; +} RAWFRAMEBUFFERINFO; + +#define GETRAWFRAMEBUFFER 0x00020001 + +enum { + RFBIFMT_565 = 1, + RFBIFMT_555 = 2, + RFBIFMT_OTHER = 3 +}; + +static RAWFRAMEBUFFERINFO rfbi; + +static GXDisplayProperties GXGETDISPLAYPROPERTIES(void) { + + HDC hdc; + GXDisplayProperties ret; + + hdc = GetDC(NULL); + ExtEscape(hdc, GETRAWFRAMEBUFFER, 0, NULL, sizeof(rfbi), (char *)&rfbi); + ReleaseDC(NULL, hdc); + ret.cxWidth = rfbi.cxPixels; + ret.cyHeight = rfbi.cyPixels; + ret.cbxPitch = rfbi.cxStride; + ret.cbyPitch = rfbi.cyStride; + ret.cBPP = rfbi.wBPP; + ret.ffFormat = 0; + switch(rfbi.wBPP) { + case RFBIFMT_565: + ret.ffFormat |= kfDirect565; + break; + + case RFBIFMT_555: + ret.ffFormat |= kfDirect555; + break; + } + return(ret); +} +#define GXBEGINDRAW() (rfbi.pFramePointer) +#define GXENDDRAW() +#endif + + +// ---- + static BOOL calcdrawrect(DRAWRECT *dr, VRAMHDL s, const RECT_T *rt) { int pos; @@ -72,19 +148,33 @@ static BOOL calcdrawrect(DRAWRECT *dr, V return(SUCCESS); } -void scrnmng_keybinds(struct GXKeyList *gxkey) { +static void palcnv(CMNPAL *dst, const RGB32 *src, UINT pals, UINT bpp) { - short tmp; + UINT i; - if (scrnmng.rotate) { - tmp = gxkey->vkLeft; - gxkey->vkLeft = gxkey->vkDown; - gxkey->vkDown = gxkey->vkRight; - gxkey->vkRight = gxkey->vkUp; - gxkey->vkUp = tmp; + if (bpp == 16) { + for (i=0; i> 3); + } } } +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); +} + // ---- @@ -97,16 +187,19 @@ 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); } if (GXOpenDisplay(hWnd, GX_FULLSCREEN) == 0) { - MessageBox(hWnd, STRLITERAL("Couldn't GameX Object"), + MessageBox(hWnd, STRLITERAL("Couldn't GAPI Object"), errmsg, MB_OK | MB_ICONSTOP); return(FAILURE); } - gx_dp = GXGetDisplayProperties(); + gx_dp = GXGETDISPLAYPROPERTIES(); if (gx_dp.cBPP != 16) { MessageBox(hWnd, STRLITERAL("Only 16bit color support..."), errmsg, MB_OK | MB_ICONSTOP); @@ -154,6 +247,15 @@ BOOL scrnmng_create(HWND hWnd, LONG widt } gx_disable = 0; scrnmng_clear(TRUE); +#if defined(SUPPORT_SOFTKBD) + softkbd_initialize(); + if (softkbd_getsize(NULL, &kbdheight) != SUCCESS) { + kbdheight = 0; + } + kbdheight = min(kbdheight, height); + scrnmng.kbdposy = height - kbdheight; + scrnmng.kbdheight = kbdheight; +#endif return(SUCCESS); } @@ -161,14 +263,28 @@ void scrnmng_destroy(void) { gx_disable = 1; GXCloseDisplay(); +#if defined(SUPPORT_SOFTKBD) + softkbd_deinitialize(); +#endif } +#if defined(SUPPORT_SOFTKBD) +void scrnmng_allflash(void) { + + scrnmng.allflash = 1; +} +#endif + RGB16 scrnmng_makepal16(RGB32 pal32) { RGB16 ret; ret = (pal32.p.r & 0xf8) << 8; +#if defined(SIZE_QVGA) && !defined(SIZE_VGATEST) ret += (pal32.p.g & 0xfc) << (3 + 16); +#else + ret += (pal32.p.g & 0xfc) << 3; +#endif ret += pal32.p.b >> 3; return(ret); } @@ -189,7 +305,7 @@ const SCRNSURF *scrnmng_surflock(void) { return(NULL); } if (scrnmng.vram == NULL) { - scrnsurf.ptr = (BYTE *)GXBeginDraw() + scrnmng.start; + scrnsurf.ptr = (BYTE *)GXBEGINDRAW() + scrnmng.start; scrnsurf.xalign = scrnmng.xalign; scrnsurf.yalign = scrnmng.yalign; } @@ -198,8 +314,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); @@ -218,17 +339,28 @@ const BYTE *a; rt.left = 0; rt.top = 0; - rt.right = min(scrnstat.width, 640); - rt.bottom = min(scrnstat.height, 400); +#if defined(SUPPORT_SOFTKBD) + if (!scrnmng.allflash) { +#endif + rt.right = min(scrnstat.width, 640); + rt.bottom = min(scrnstat.height, 400); #if defined(SIZE_QVGA) - rt.right >>= 1; - rt.bottom >>= 1; + rt.right >>= 1; + rt.bottom >>= 1; +#endif +#if defined(SUPPORT_SOFTKBD) + } + else { + scrnmng.allflash = 0; + rt.right = scrnmng.width; + rt.bottom = scrnmng.height; + } #endif if (calcdrawrect(&dr, menuvram, &rt) != SUCCESS) { return; } p = scrnmng.vram->ptr + (dr.srcpos * 2); - q = (BYTE *)GXBeginDraw() + dr.dstpos; + q = (BYTE *)GXBEGINDRAW() + dr.dstpos; a = menuvram->alpha + dr.srcpos; salign = menuvram->width - dr.width; dalign = dr.yalign - (dr.width * dr.xalign); @@ -246,14 +378,30 @@ const BYTE *a; q += dalign; a += salign; } while(--dr.height); - GXEndDraw(); + GXENDDRAW(); } void scrnmng_surfunlock(const SCRNSURF *surf) { +#if defined(SUPPORT_SOFTKBD) + CMNVRAM vram; +#endif + if (surf) { if (scrnmng.vram == NULL) { - GXEndDraw(); +#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); + } +#endif + GXENDDRAW(); } else { if (menuvram) { @@ -263,9 +411,6 @@ void scrnmng_surfunlock(const SCRNSURF * } } -void scrnmng_update(void) { -} - // ---- for wince @@ -299,20 +444,83 @@ BOOL scrnmng_mousepos(LPARAM *lp) { return(SUCCESS); } +void scrnmng_clear(BOOL logo) { + + void *bmp; + BYTE *p; + BYTE *q; + int y; + int x; + long yalign; + + if (gx_disable) { + return; + } + bmp = NULL; + if (logo) { + bmp = (void *)bmpdata_solvedata(nekop2_bmp); + } + p = (BYTE *)GXBEGINDRAW(); + q = p; + y = gx_dp.cyHeight; + yalign = gx_dp.cbyPitch - (gx_dp.cbxPitch * gx_dp.cxWidth); + do { + x = gx_dp.cxWidth; + do { + *(UINT16 *)q = 0; + q += gx_dp.cbxPitch; + } while(--x); + q += yalign; + } while(--y); + bmp16draw(bmp, p + scrnmng.start, scrnmng.width, scrnmng.height, + scrnmng.xalign, scrnmng.yalign); GXENDDRAW(); + if (bmp) { + _MFREE(bmp); + } +} + +void scrnmng_keybinds(void) { + + short tmp; + + if (scrnmng.rotate) { + tmp = gx_keylist.vkLeft; + gx_keylist.vkLeft = gx_keylist.vkDown; + gx_keylist.vkDown = gx_keylist.vkRight; + gx_keylist.vkRight = gx_keylist.vkUp; + gx_keylist.vkUp = tmp; + } +} + // ---- for menubase 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) + 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; smenu->bpp = 16; @@ -346,7 +554,7 @@ const BYTE *q; } p = scrnmng.vram->ptr + (dr.srcpos * 2); q = menuvram->ptr + (dr.srcpos * 2); - r = (BYTE *)GXBeginDraw() + dr.dstpos; + r = (BYTE *)GXBEGINDRAW() + dr.dstpos; a = menuvram->alpha + dr.srcpos; salign = menuvram->width; dalign = dr.yalign - (dr.width * dr.xalign); @@ -369,113 +577,32 @@ const BYTE *q; r += dalign; a += salign; } while(--dr.height); - GXEndDraw(); + GXENDDRAW(); } -// ---- clear - -static void np2open_draw(BYTE *dst, BMPFILE *bf) { +// ---- -const BMPINFO *bi; -const BYTE *pal; - BMPDATA inf; - BYTE *src; - int bmpalign; - long yalign; - UINT pals; - UINT16 paltbl[16]; - UINT c; - int x; - int y; +#if defined(SUPPORT_SOFTKBD) +BOOL scrnmng_kbdpos(LPARAM *lp) { - if (bf == NULL) { - goto nod_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 nod_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 ((scrnmng.width < inf.width) || (scrnmng.height < inf.height)) { - goto nod_err; - } - dst += scrnmng.start; - dst += ((scrnmng.width - inf.width) / 2) * scrnmng.xalign; - dst += ((scrnmng.height - inf.height) / 2) * scrnmng.yalign; - yalign = scrnmng.yalign - (inf.width * scrnmng.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 += scrnmng.xalign; - } - src += bmpalign; - dst += yalign; - } + UINT x; + UINT y; -nod_err: - return; + x = LOWORD(*lp); + y = HIWORD(*lp) - scrnmng.kbdposy; + *lp = (x & 0xffff) | ((y << 16) & 0xffff0000); + return(SUCCESS); } -void scrnmng_clear(BOOL logo) { - - BMPFILE *bf; - BYTE *p; - BYTE *q; - int y; - int x; - long yalign; +BOOL scrnmng_ismenu(LPARAM lp) { - if (gx_disable) { - return; + if ((LOWORD(lp) < 32) && (HIWORD(lp) >= (scrnmng.height - 32))) { + return(TRUE); } - bf = NULL; - if (logo) { - bf = (BMPFILE *)bmpdata_solvedata(nekop2_bmp); - } - p = (BYTE *)GXBeginDraw(); - q = p; - y = gx_dp.cyHeight; - yalign = gx_dp.cbyPitch - (gx_dp.cbxPitch * gx_dp.cxWidth); - do { - x = gx_dp.cxWidth; - do { - *(UINT16 *)q = 0; - q += gx_dp.cbxPitch; - } while(--x); - q += yalign; - } while(--y); - if (bf) { - np2open_draw(p, bf); - } - GXEndDraw(); - if (bf) { - _MFREE(bf); + else { + return(FALSE); } } +#endif