Diff for /np2/macosx/scrnmng.cpp between versions 1.1 and 1.4

version 1.1, 2003/10/16 17:59:38 version 1.4, 2003/11/12 19:06:33
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "np2.h"  #include        "np2.h"
 #include        "scrnmng.h"  #include        "scrnmng.h"
   #include        "toolwin.h"
   
   
 typedef struct {  typedef struct {
           int                             width;
           int                             height;
         BOOL                    exist;          BOOL                    exist;
         WindowPtr               hWnd;          WindowPtr               hWnd;
         GWorldPtr               gw;          GWorldPtr               gw;
         PixMapHandle    pm;          PixMapHandle    pm;
         Rect                    rect;          Rect                    rect;
           GWorldPtr               gwp;
           GDHandle                hgd;
 } _QDRAW, *QDRAW;  } _QDRAW, *QDRAW;
   
   
   #ifdef NP2GCC
   #define macosx_only
   #endif
   
 static  _QDRAW          qdraw;  static  _QDRAW          qdraw;
 static  GDHandle        hgd;  
 static  GWorldPtr       gwp;  
 static  SCRNSURF        scrnsurf;  static  SCRNSURF        scrnsurf;
   #if !defined(macosx_only)
   static  GWorldPtr       gwp;
   static  GDHandle        hgd;
   #endif
   
 #ifdef NP2GCC  static void changeclientsize(int width, int height, BYTE mode) {
 #define macosx_only  
           QDRAW           qd;
       int                 scrnwidth, scrnheight;
       BYTE                opentoolwin = np2oscfg.toolwin;
   
           qd = &qdraw;
           if (!qd->exist) {
                   return;
           }
       if (opentoolwin) {
           toolwin_close();
       }
       if (!(mode & SCRNMODE_ROTATE)) {
           scrnwidth = width;
           scrnheight = height;
       }
       else {
           scrnwidth = height;
           scrnheight = width;
       }
       if (mode & SCRNMODE_FULLSCREEN) {
           GetWindowBounds(hWndMain, kWindowContentRgn, &qd->rect);
       }
       else {
           SizeWindow(qd->hWnd, scrnwidth, scrnheight, TRUE);
           SetRect(&qd->rect, 0, 0, scrnwidth, scrnheight);
       }
       if (opentoolwin) {
           toolwin_open();
       }
   }
   
   
   #if defined(macosx_only)
   #if defined(SUPPORT_16BPP)
   UINT16 scrnmng_makepal16(RGB32 pal32) {
   //win9xのをちょこっと改造(tk800)
           RGB32   pal;
   
           pal.d = pal32.d & 0xF8F8F8;
           return((UINT16)((pal.p.g << 2) +
                                                   (pal.p.r << 7) + (pal.p.b >> 3)));
   }
   #else
   UINT16 scrnmng_makepal16(RGB32 pal32) {
       return(0);
   }
   #endif
   
   //ディスプレイの色深度を返す(tk800)
   int     scrnmng_getbpp(void) {
       return(CGDisplayBitsPerPixel(kCGDirectMainDisplay));
   }
   #else
   int     scrnmng_getbpp(void) {
       return(32);
   }
 #endif  #endif
   
 void scrnmng_initialize(void) {  void scrnmng_initialize(void) {
   
           QDRAW   qd;
   
           qd = &qdraw;
           qd->width = 640;
           qd->height = 400;
 }  }
   
 BOOL scrnmng_create(BYTE scrnmode) {  BOOL scrnmng_create(BYTE mode) {
   
         QDRAW   qd;          QDRAW   qd;
   
         qd = &qdraw;          qd = &qdraw;
         SetRect(&qd->rect, 0, 0, 640, 480);  #if defined(macosx_only)
 #if defined(macosx_only)     
 //GWorldの代わりに直接ウィンドウバッファを設定(tk800)  //GWorldの代わりに直接ウィンドウバッファを設定(tk800)
     GrafPtr             dstport;      GrafPtr             dstport;
     dstport = GetWindowPort(hWndMain);      dstport = GetWindowPort(hWndMain);
     if (dstport) {      if (dstport) {
         LockPortBits(dstport);//こうしないと描画位置がおかしくなる  
         qd->pm = GetPortPixMap(dstport);          qd->pm = GetPortPixMap(dstport);
         qd->exist = TRUE;          qd->exist = TRUE;
         qd->hWnd = hWndMain;          qd->hWnd = hWndMain;
           if (!(mode & SCRNMODE_FULLSCREEN)) {
               changeclientsize(qd->width, qd->height, mode);
           }
         return(SUCCESS);          return(SUCCESS);
     }      }
 #else          #else        
           SetRect(&qd->rect, 0, 0, 640, 480);
         if (NewGWorld(&qd->gw, 32, &qd->rect, NULL, NULL, useTempMem) == noErr) {          if (NewGWorld(&qd->gw, 32, &qd->rect, NULL, NULL, useTempMem) == noErr) {
                 qd->pm = GetGWorldPixMap(qd->gw);                  qd->pm = GetGWorldPixMap(qd->gw);
                 qd->exist = TRUE;                  qd->exist = TRUE;
Line 50  BOOL scrnmng_create(BYTE scrnmode) { Line 125  BOOL scrnmng_create(BYTE scrnmode) {
         }          }
 #endif  #endif
         else {          else {
                 (void)scrnmode;                  (void)mode;
                 return(FAILURE);                  return(FAILURE);
         }          }
 }  }
Line 62  void scrnmng_destroy(void) { Line 137  void scrnmng_destroy(void) {
         qd = &qdraw;          qd = &qdraw;
         if (qd->exist) {          if (qd->exist) {
                 qd->exist = FALSE;                  qd->exist = FALSE;
   #if defined(macosx_only)
                 DisposeGWorld(qd->gw);                  DisposeGWorld(qd->gw);
         }  
 #if defined(macosx_only)      
     UnlockPortBits(GetWindowPort(hWndMain));  
 #endif  #endif
           }
 }  }
   
 void scrnmng_setwidth(int posx, int width) {  void scrnmng_setwidth(int posx, int width) {
   
           QDRAW   qd;
   
           qd = &qdraw;
           if (qd->width != width) {
                   qd->width = width;
                   changeclientsize(width, qd->height, scrnmode);
           }
         (void)posx;          (void)posx;
         (void)width;  
 }  }
   
 void scrnmng_setextend(int extend) {  void scrnmng_setextend(int extend) {
Line 82  void scrnmng_setextend(int extend) { Line 162  void scrnmng_setextend(int extend) {
   
 void scrnmng_setheight(int posy, int height) {  void scrnmng_setheight(int posy, int height) {
   
           QDRAW   qd;
   
           qd = &qdraw;
           if (qd->height != height) {
                   qd->height = height;
                   changeclientsize(qd->width, height, scrnmode);
           }
         (void)posy;          (void)posy;
         (void)height;  
 }  }
   
 const SCRNSURF *scrnmng_surflock(void) {  const SCRNSURF *scrnmng_surflock(void) {
   
         QDRAW           qd;          QDRAW           qd;
         GDHandle        hgd;  
         GWorldPtr       gwp;  
   
 #if 0 && defined(macosx_only)      
 //色深度が32ビットじゃないときはさようなら(tk800)  
     if (CGDisplayBitsPerPixel(kCGDirectMainDisplay)!=32) {  
         return(NULL);  
     }  
 #endif  
         qd = &qdraw;          qd = &qdraw;
         if (!qd->exist) {          if (!qd->exist) {
                 return(NULL);                  return(NULL);
         }          }
   
           scrnsurf.width = qd->width;
           scrnsurf.height = qd->height;
 #if defined(macosx_only)     #if defined(macosx_only)   
 //描画位置をウィンドウバーの下に設定(tk800)   //描画位置をウィンドウバーの下に設定(tk800) 
       LockPortBits(GetWindowPort(hWndMain));//こうしないと描画位置がおかしくなる(tk800)
         LockPixels(qd->pm);          LockPixels(qd->pm);
         scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + +640*4*22;      long        rowbyte = GetPixRowBytes(qd->pm);
           scrnsurf.bpp = scrnmng_getbpp();
           if (!(scrnmode & SCRNMODE_ROTATE)) {
                   scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*22;
                   scrnsurf.xalign = scrnsurf.bpp >> 3;
                   scrnsurf.yalign = rowbyte;
           }
           else if (!(scrnmode & SCRNMODE_ROTATEDIR)) {
                   scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*22;
                   scrnsurf.ptr += (scrnsurf.width - 1) * rowbyte;
                   scrnsurf.xalign = 0 - rowbyte;
                   scrnsurf.yalign = scrnsurf.bpp >> 3;
           }
           else {
                   scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*22;
                   scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3);
                   scrnsurf.xalign = rowbyte;
                   scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3);
       }
 #else  #else
         GetGWorld(&gwp, &hgd);          GetGWorld(&gwp, &hgd);
         LockPixels(qd->pm);          LockPixels(qd->pm);
         SetGWorld(qd->gw, NULL);          SetGWorld(qd->gw, NULL);
   
         scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm);          scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm);
 #endif  
         scrnsurf.xalign = 4;          scrnsurf.xalign = 4;
         scrnsurf.yalign = ((*qd->pm)->rowBytes) & 0x3fff;          scrnsurf.yalign = ((*qd->pm)->rowBytes) & 0x3fff;
         scrnsurf.width = 640;      scrnsurf.bpp = 32;
         scrnsurf.height = 400;  #endif
         scrnsurf.extend = 0;          scrnsurf.extend = 0;
         return(&scrnsurf);          return(&scrnsurf);
 }  }
Line 134  void scrnmng_surfunlock(const SCRNSURF * Line 232  void scrnmng_surfunlock(const SCRNSURF *
         GrafPtr         dstport;          GrafPtr         dstport;
         dstport = GetWindowPort(hWndMain);          dstport = GetWindowPort(hWndMain);
         QDAddRectToDirtyRegion(dstport, &qd->rect);          QDAddRectToDirtyRegion(dstport, &qd->rect);
         QDFlushPortBuffer(dstport, NULL);  
                 UnlockPixels(qd->pm);                  UnlockPixels(qd->pm);
           UnlockPortBits(dstport);
 #else  #else
   
 #if TARGET_API_MAC_CARBON  #if TARGET_API_MAC_CARBON
Line 169  void scrnmng_surfunlock(const SCRNSURF * Line 267  void scrnmng_surfunlock(const SCRNSURF *
 #endif  #endif
         }          }
 }  }
   

Removed from v.1.1  
changed lines
  Added in v.1.4


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