--- np2/wince/scrnmng.cpp 2004/04/05 09:45:07 1.8 +++ np2/wince/scrnmng.cpp 2004/07/19 14:24:05 1.11 @@ -26,6 +26,8 @@ typedef struct { long xalign; long yalign; #if defined(SUPPORT_SOFTKBD) + int kbdposy; + int kbdheight; int allflash; #endif } SCRNMNG; @@ -56,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.wFormat) { + 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; @@ -122,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); @@ -181,6 +249,12 @@ BOOL scrnmng_create(HWND hWnd, LONG widt 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); } @@ -231,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; } @@ -286,7 +360,7 @@ const BYTE *a; 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); @@ -304,7 +378,7 @@ const BYTE *a; q += dalign; a += salign; } while(--dr.height); - GXEndDraw(); + GXENDDRAW(); } void scrnmng_surfunlock(const SCRNSURF *surf) { @@ -318,16 +392,16 @@ void scrnmng_surfunlock(const SCRNSURF * #if defined(SUPPORT_SOFTKBD) if (scrnmng.allflash) { scrnmng.allflash = 0; - vram.ptr = surf->ptr + (surf->yalign * 200); - vram.width = 320; - vram.height = 40; + 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(); + GXENDDRAW(); } else { if (menuvram) { @@ -386,7 +460,7 @@ void scrnmng_clear(BOOL logo) { if (logo) { bmp = (void *)bmpdata_solvedata(nekop2_bmp); } - p = (BYTE *)GXBeginDraw(); + p = (BYTE *)GXBEGINDRAW(); q = p; y = gx_dp.cyHeight; yalign = gx_dp.cbyPitch - (gx_dp.cbxPitch * gx_dp.cxWidth); @@ -399,7 +473,7 @@ void scrnmng_clear(BOOL logo) { q += yalign; } while(--y); bmp16draw(bmp, p + scrnmng.start, scrnmng.width, scrnmng.height, - scrnmng.xalign, scrnmng.yalign); GXEndDraw(); + scrnmng.xalign, scrnmng.yalign); GXENDDRAW(); if (bmp) { _MFREE(bmp); } @@ -423,27 +497,29 @@ void scrnmng_keybinds(void) { BOOL scrnmng_entermenu(SCRNMENU *smenu) { + VRAMHDL vram; #if defined(SUPPORT_SOFTKBD) - CMNVRAM vram; + 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) - vram.ptr = scrnmng.vram->ptr + (640 * 200); - vram.width = 320; - vram.height = 40; - vram.xalign = 2; - vram.yalign = 640; - vram.bpp = 16; - softkbd_paint(&vram, palcnv, TRUE); + 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; @@ -478,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); @@ -501,6 +577,32 @@ const BYTE *q; r += dalign; a += salign; } while(--dr.height); - GXEndDraw(); + 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 +