Diff for /np2/wince/scrnmng.cpp between versions 1.7 and 1.11

version 1.7, 2004/02/18 02:03:37 version 1.11, 2004/07/19 14:24:05
Line 6 Line 6
 #include        "vramhdl.h"  #include        "vramhdl.h"
 #include        "menubase.h"  #include        "menubase.h"
 #include        "nekop2.res"  #include        "nekop2.res"
 #if defined(SUPPORT_SOFTKBD)  #include        "cmndraw.h"
 #include        "softkbd.res"  #include        "softkbd.h"
 #endif  
   
   
 #if defined(GX_DLL)  #if defined(GX_DLL)
Line 27  typedef struct { Line 26  typedef struct {
         long    xalign;          long    xalign;
         long    yalign;          long    yalign;
 #if defined(SUPPORT_SOFTKBD)  #if defined(SUPPORT_SOFTKBD)
           int             kbdposy;
           int             kbdheight;
         int             allflash;          int             allflash;
         BMPFILE *kbd;  
 #endif  #endif
 } SCRNMNG;  } SCRNMNG;
   
Line 58  typedef struct { Line 58  typedef struct {
         int             dstpos;          int             dstpos;
 } DRAWRECT;  } 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) {  static BOOL calcdrawrect(DRAWRECT *dr, VRAMHDL s, const RECT_T *rt) {
   
         int             pos;          int             pos;
Line 85  static BOOL calcdrawrect(DRAWRECT *dr, V Line 148  static BOOL calcdrawrect(DRAWRECT *dr, V
         return(SUCCESS);          return(SUCCESS);
 }  }
   
 static void bmp16draw(BMPFILE *bf, BYTE *dst, int width, int height,  static void palcnv(CMNPAL *dst, const RGB32 *src, UINT pals, UINT bpp) {
                                                                                                 int xalign, int yalign) {  
   
 const BMPINFO   *bi;          UINT    i;
 const BYTE              *pal;  
         BMPDATA         inf;  
         BYTE            *src;  
         int                     bmpalign;  
         UINT            pals;  
         UINT16          paltbl[16];  
         UINT            c;  
         int                     x;  
         int                     y;  
   
         if (bf == NULL) {          if (bpp == 16) {
                 goto b16d_err;                  for (i=0; i<pals; i++) {
         }                          dst[i].pal16 = ((src[i].p.r & 0xf8) << 8) |
         bi = (BMPINFO *)(bf + 1);                                                          ((src[i].p.g & 0xfc) << 3) |
         pal = (BYTE *)(bi + 1);                                                          (src[i].p.b >> 3);
         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<pals; c++) {  
                 paltbl[c] = ((pal[c*4+2] & 0xf8) << 8) +  
                                         ((pal[c*4+1] & 0xfc) << 3) + (pal[c*4+0] >> 3);  
         }  
   
         for (y=0; y<inf.height; y++) {  
                 for (x=0; x<inf.width; x++) {  
                         if (!(x & 1)) {  
                                 c = src[x >> 1] >> 4;  
                         }  
                         else {  
                                 c = src[x >> 1] & 15;  
                         }  
                         *(UINT16 *)dst = paltbl[c];  
                         dst += xalign;  
                 }                  }
                 src += bmpalign;  
                 dst += yalign;  
         }          }
   }
   
 b16d_err:  static void bmp16draw(void *bmp, BYTE *dst, int width, int height,
         return;                                                                                                  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);
 }  }
   
   
Line 163  void scrnmng_initialize(void) { Line 187  void scrnmng_initialize(void) {
 BOOL scrnmng_create(HWND hWnd, LONG width, LONG height) {  BOOL scrnmng_create(HWND hWnd, LONG width, LONG height) {
   
         TCHAR   msg[32];          TCHAR   msg[32];
   #if defined(SUPPORT_SOFTKBD)
           int             kbdheight;
   #endif
   
         if ((width <= 0) || (height <= 0)) {          if ((width <= 0) || (height <= 0)) {
                 return(FAILURE);                  return(FAILURE);
         }          }
         if (GXOpenDisplay(hWnd, GX_FULLSCREEN) == 0) {          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);                                                                                          errmsg, MB_OK | MB_ICONSTOP);
                 return(FAILURE);                  return(FAILURE);
         }          }
         gx_dp = GXGetDisplayProperties();          gx_dp = GXGETDISPLAYPROPERTIES();
         if (gx_dp.cBPP != 16) {          if (gx_dp.cBPP != 16) {
                 MessageBox(hWnd, STRLITERAL("Only 16bit color support..."),                  MessageBox(hWnd, STRLITERAL("Only 16bit color support..."),
                                                                                         errmsg, MB_OK | MB_ICONSTOP);                                                                                          errmsg, MB_OK | MB_ICONSTOP);
Line 221  BOOL scrnmng_create(HWND hWnd, LONG widt Line 248  BOOL scrnmng_create(HWND hWnd, LONG widt
         gx_disable = 0;          gx_disable = 0;
         scrnmng_clear(TRUE);          scrnmng_clear(TRUE);
 #if defined(SUPPORT_SOFTKBD)  #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  #endif
         return(SUCCESS);          return(SUCCESS);
 }  }
Line 231  void scrnmng_destroy(void) { Line 264  void scrnmng_destroy(void) {
         gx_disable = 1;          gx_disable = 1;
         GXCloseDisplay();          GXCloseDisplay();
 #if defined(SUPPORT_SOFTKBD)  #if defined(SUPPORT_SOFTKBD)
         if (scrnmng.kbd) {          softkbd_deinitialize();
                 _MFREE(scrnmng.kbd);  
                 scrnmng.kbd = NULL;  
         }  
 #endif  #endif
 }  }
   
Line 275  const SCRNSURF *scrnmng_surflock(void) { Line 305  const SCRNSURF *scrnmng_surflock(void) {
                 return(NULL);                  return(NULL);
         }          }
         if (scrnmng.vram == NULL) {          if (scrnmng.vram == NULL) {
                 scrnsurf.ptr = (BYTE *)GXBeginDraw() + scrnmng.start;                  scrnsurf.ptr = (BYTE *)GXBEGINDRAW() + scrnmng.start;
                 scrnsurf.xalign = scrnmng.xalign;                  scrnsurf.xalign = scrnmng.xalign;
                 scrnsurf.yalign = scrnmng.yalign;                  scrnsurf.yalign = scrnmng.yalign;
         }          }
Line 330  const BYTE  *a; Line 360  const BYTE  *a;
                 return;                  return;
         }          }
         p = scrnmng.vram->ptr + (dr.srcpos * 2);          p = scrnmng.vram->ptr + (dr.srcpos * 2);
         q = (BYTE *)GXBeginDraw() + dr.dstpos;          q = (BYTE *)GXBEGINDRAW() + dr.dstpos;
         a = menuvram->alpha + dr.srcpos;          a = menuvram->alpha + dr.srcpos;
         salign = menuvram->width - dr.width;          salign = menuvram->width - dr.width;
         dalign = dr.yalign - (dr.width * dr.xalign);          dalign = dr.yalign - (dr.width * dr.xalign);
Line 348  const BYTE  *a; Line 378  const BYTE  *a;
                 q += dalign;                  q += dalign;
                 a += salign;                  a += salign;
         } while(--dr.height);          } while(--dr.height);
         GXEndDraw();          GXENDDRAW();
 }  }
   
 void scrnmng_surfunlock(const SCRNSURF *surf) {  void scrnmng_surfunlock(const SCRNSURF *surf) {
   
   #if defined(SUPPORT_SOFTKBD)
           CMNVRAM vram;
   #endif
   
         if (surf) {          if (surf) {
                 if (scrnmng.vram == NULL) {                  if (scrnmng.vram == NULL) {
 #if defined(SUPPORT_SOFTKBD)  #if defined(SUPPORT_SOFTKBD)
                         if (scrnmng.allflash) {                          if (scrnmng.allflash) {
                                 scrnmng.allflash = 0;                                  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  #endif
                         GXEndDraw();                          GXENDDRAW();
                 }                  }
                 else {                  else {
                         if (menuvram) {                          if (menuvram) {
Line 407  BOOL scrnmng_mousepos(LPARAM *lp) { Line 446  BOOL scrnmng_mousepos(LPARAM *lp) {
   
 void scrnmng_clear(BOOL logo) {  void scrnmng_clear(BOOL logo) {
   
         BMPFILE *bf;          void    *bmp;
         BYTE    *p;          BYTE    *p;
         BYTE    *q;          BYTE    *q;
         int             y;          int             y;
Line 417  void scrnmng_clear(BOOL logo) { Line 456  void scrnmng_clear(BOOL logo) {
         if (gx_disable) {          if (gx_disable) {
                 return;                  return;
         }          }
         bf = NULL;          bmp = NULL;
         if (logo) {          if (logo) {
                 bf = (BMPFILE *)bmpdata_solvedata(nekop2_bmp);                  bmp = (void *)bmpdata_solvedata(nekop2_bmp);
         }          }
         p = (BYTE *)GXBeginDraw();          p = (BYTE *)GXBEGINDRAW();
         q = p;          q = p;
         y = gx_dp.cyHeight;          y = gx_dp.cyHeight;
         yalign = gx_dp.cbyPitch - (gx_dp.cbxPitch * gx_dp.cxWidth);          yalign = gx_dp.cbyPitch - (gx_dp.cbxPitch * gx_dp.cxWidth);
Line 433  void scrnmng_clear(BOOL logo) { Line 472  void scrnmng_clear(BOOL logo) {
                 } while(--x);                  } while(--x);
                 q += yalign;                  q += yalign;
         } while(--y);          } while(--y);
         bmp16draw(bf, p + scrnmng.start, scrnmng.width, scrnmng.height,          bmp16draw(bmp, p + scrnmng.start, scrnmng.width, scrnmng.height,
                                                                                         scrnmng.xalign, scrnmng.yalign);                                                                                                  scrnmng.xalign, scrnmng.yalign);        GXENDDRAW();
         GXEndDraw();          if (bmp) {
         if (bf) {                  _MFREE(bmp);
                 _MFREE(bf);  
         }          }
 }  }
   
Line 459  void scrnmng_keybinds(void) { Line 497  void scrnmng_keybinds(void) {
   
 BOOL scrnmng_entermenu(SCRNMENU *smenu) {  BOOL scrnmng_entermenu(SCRNMENU *smenu) {
   
           VRAMHDL vram;
   #if defined(SUPPORT_SOFTKBD)
           CMNVRAM kbdvram;
   #endif
   
         if (smenu == NULL) {          if (smenu == NULL) {
                 goto smem_err;                  goto smem_err;
         }          }
         vram_destroy(scrnmng.vram);          vram_destroy(scrnmng.vram);
         scrnmng.vram = vram_create(scrnmng.width, scrnmng.height, FALSE, 16);          vram = vram_create(scrnmng.width, scrnmng.height, FALSE, 16);
         if (scrnmng.vram == NULL) {          scrnmng.vram = vram;
           if (vram == NULL) {
                 goto smem_err;                  goto smem_err;
         }          }
         scrndraw_redraw();          scrndraw_redraw();
 #if defined(SUPPORT_SOFTKBD)  #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  #endif
         smenu->width = scrnmng.width;          smenu->width = scrnmng.width;
         smenu->height = scrnmng.height;          smenu->height = scrnmng.height;
Line 504  const BYTE  *q; Line 554  const BYTE  *q;
         }          }
         p = scrnmng.vram->ptr + (dr.srcpos * 2);          p = scrnmng.vram->ptr + (dr.srcpos * 2);
         q = menuvram->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;          a = menuvram->alpha + dr.srcpos;
         salign = menuvram->width;          salign = menuvram->width;
         dalign = dr.yalign - (dr.width * dr.xalign);          dalign = dr.yalign - (dr.width * dr.xalign);
Line 527  const BYTE  *q; Line 577  const BYTE  *q;
                 r += dalign;                  r += dalign;
                 a += salign;                  a += salign;
         } while(--dr.height);          } 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
   

Removed from v.1.7  
changed lines
  Added in v.1.11


RetroPC.NET-CVS <cvs@retropc.net>