Diff for /np2/x11/gtk2/gtk_screen.c between versions 1.4 and 1.5

version 1.4, 2005/03/12 12:36:57 version 1.5, 2007/01/12 19:09:58
Line 27 Line 27
   
 #include "compiler.h"  #include "compiler.h"
   
   #include <math.h>
   
 #include "np2.h"  #include "np2.h"
 #include "palettes.h"  #include "palettes.h"
 #include "scrndraw.h"  #include "scrndraw.h"
Line 35 Line 37
   
 #include "gtk2/xnp2.h"  #include "gtk2/xnp2.h"
 #include "gtk2/gtk_drawmng.h"  #include "gtk2/gtk_drawmng.h"
   #include "gtk2/gtk_menu.h"
   
   
 typedef struct {  typedef struct {
         UINT8           scrnmode;          UINT8           scrnmode;
         UINT8           drawing;          volatile int    drawing;
         int             width;          int             width;          /* drawarea の width */
         int             height;          int             height;         /* drawarea の height */
         int             extend;          int             extend;
         int             clipping;          int             clipping;
   
         PAL16MASK       pal16mask;          PAL16MASK       pal16mask;
   
         RECT_T          scrn;          RECT_T          scrn;           /* drawarea 内の描画領域位置 */
         RECT_T          rect;          RECT_T          rect;           /* drawarea に描画するサイズ */
   
         int             lpitch;  
         int             scrw;  
         int             scrh;  
   
         /* toolkit depend */          /* toolkit depend */
         GdkImage        *surface;          GdkPixbuf       *backsurf;
         GdkPixmap       *backsurf;          GdkPixbuf       *surface;
           double          ratio_w, ratio_h;
           int             interp;
   
         unsigned long   pixel[24];      /* pallete */          GdkColor        pal[24];
 } DRAWMNG;  } DRAWMNG;
   
 typedef struct {  typedef struct {
         int     width;          int     width;
         int     height;          int     height;
         int     extend;          int     extend;
           int     multiple;
 } SCRNSTAT;  } SCRNSTAT;
   
 typedef struct {  
         SCRNSURF        ss;  
   
         UINT8           renewal[SURFACE_HEIGHT];  
 } X11SCRNSURF;  
   
 static SCRNMNG scrnmng;  static SCRNMNG scrnmng;
 static DRAWMNG drawmng;  static DRAWMNG drawmng;
 static SCRNSTAT scrnstat;  static SCRNSTAT scrnstat;
 static X11SCRNSURF scrnsurf;  static SCRNSURF scrnsurf;
   static int real_fullscreen;
   
 SCRNMNG *scrnmngp = &scrnmng;  SCRNMNG *scrnmngp = &scrnmng;
   
 GtkWidget *main_window;  GtkWidget *main_window;
 GtkWidget *drawarea;  GtkWidget *drawarea;
   
   #define BITS_PER_PIXEL  24
   #define BYTES_PER_PIXEL 3
   
   /*
    * drawarea のアスペクト比を 4:3 (640x480) にする。
    */
 static void  static void
 set_window_size(int width, int height)  adapt_aspect(int width, int height, int scrnwidth, int scrnheight)
 {  {
           double ratio;
           int w, h;
   
           ratio = (double)scrnwidth / width;
           h = floor((height * ratio) + 0.5);
           if (h < scrnheight) {
                   drawmng.rect.right = scrnwidth;
                   drawmng.rect.bottom = h;
           } else {
                   ratio = (double)scrnheight / height;
                   w = floor((width * ratio) + 0.5);
                   if (w < scrnwidth) {
                           drawmng.rect.right = w;
                           drawmng.rect.bottom = scrnheight;
                   }
           }
   }
   
         drawmng.scrw = width + np2oscfg.paddingx * 2;  static void
         drawmng.scrh = height + np2oscfg.paddingy * 2;  set_window_size(int width, int height)
   {
   
         gtk_widget_set_size_request(drawarea, drawmng.scrw, drawmng.scrh);          gtk_widget_set_size_request(drawarea,
               width + np2oscfg.paddingx * 2, height + np2oscfg.paddingy * 2);
 }  }
   
 static void  static void
Line 102  renewal_client_size(void) Line 123  renewal_client_size(void)
         int extend;          int extend;
         int scrnwidth;          int scrnwidth;
         int scrnheight;          int scrnheight;
           int multiple;
   
         width = min(scrnstat.width, drawmng.width);          width = min(scrnstat.width, drawmng.width);
         height = min(scrnstat.height, drawmng.height);          height = min(scrnstat.height, drawmng.height);
         extend = 0;          extend = 0;
   
 #if notyet  
         if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) {          if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) {
         } else                  scrnwidth = drawmng.width;
 #endif                  scrnheight = drawmng.height;
         {  
                   drawmng.rect.right = width;
                   drawmng.rect.bottom = height;
                   if (!real_fullscreen) {
                           adapt_aspect(width, height, scrnwidth, scrnheight);
                   }
   
                   drawmng.ratio_w = (double)drawmng.rect.right / width;
                   drawmng.ratio_h = (double)drawmng.rect.bottom / height;
   
                   drawmng.scrn.left = (scrnwidth - drawmng.rect.right) / 2;
                   drawmng.scrn.top = (scrnheight - drawmng.rect.bottom) / 2;
                   drawmng.scrn.right = drawmng.scrn.left + drawmng.rect.right;
                   drawmng.scrn.bottom = drawmng.scrn.top + drawmng.rect.bottom;
   
                   gtk_widget_set_size_request(drawarea, scrnwidth, scrnheight);
           } else {
                   multiple = scrnstat.multiple;
                 if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) {                  if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) {
                         if (np2oscfg.paddingx > 0) {                          if ((np2oscfg.paddingx > 0) && (multiple == SCREEN_DEFMUL)) {
                                 extend = min(scrnstat.extend, drawmng.extend);                                  extend = min(scrnstat.extend, drawmng.extend);
                         }                          }
                         scrnwidth = width;                          scrnwidth = (width * multiple) / SCREEN_DEFMUL;
                         scrnheight = height;                          scrnheight = (height * multiple) / SCREEN_DEFMUL;
                         drawmng.rect.right = width + extend;  
                         drawmng.rect.bottom = height;                          drawmng.rect.right = scrnwidth + extend;
                           drawmng.rect.bottom = scrnheight;
   
                           drawmng.ratio_w = (double)drawmng.rect.right / width;
                           drawmng.ratio_h = (double)drawmng.rect.bottom / height;
   
                         drawmng.scrn.left = np2oscfg.paddingx - extend;                          drawmng.scrn.left = np2oscfg.paddingx - extend;
                         drawmng.scrn.top = np2oscfg.paddingy;                          drawmng.scrn.top = np2oscfg.paddingy;
                 } else {                  } else {
                         if (np2oscfg.paddingy > 0) {                          if ((np2oscfg.paddingy > 0) && (multiple == SCREEN_DEFMUL)) {
                                 extend = min(scrnstat.extend, drawmng.extend);                                  extend = min(scrnstat.extend, drawmng.extend);
                         }                          }
                         scrnwidth = height;                          scrnwidth = (height * multiple) / SCREEN_DEFMUL;
                         scrnheight = width;                          scrnheight = (width * multiple) / SCREEN_DEFMUL;
                         drawmng.rect.right = height;  
                         drawmng.rect.bottom = width + extend;                          drawmng.rect.right = scrnwidth;
                           drawmng.rect.bottom = scrnheight + extend;
   
                           drawmng.ratio_w = (double)drawmng.rect.right / height;
                           drawmng.ratio_h = (double)drawmng.rect.bottom / width;
   
                         drawmng.scrn.left = np2oscfg.paddingx;                          drawmng.scrn.left = np2oscfg.paddingx;
                         drawmng.scrn.top = np2oscfg.paddingy - extend;                          drawmng.scrn.top = np2oscfg.paddingy - extend;
                 }                  }
                 drawmng.scrn.right = np2oscfg.paddingx + scrnwidth;                  drawmng.scrn.right = np2oscfg.paddingx + scrnwidth;
                 drawmng.scrn.bottom = np2oscfg.paddingy + scrnheight;                  drawmng.scrn.bottom = np2oscfg.paddingy + scrnheight;
   
                 set_window_size(scrnwidth, scrnheight);                  set_window_size(scrnwidth, scrnheight);
         }          }
         scrnsurf.ss.width = width;  
         scrnsurf.ss.height = height;          scrnsurf.width = width;
         scrnsurf.ss.extend = extend;          scrnsurf.height = height;
           scrnsurf.extend = extend;
 }  }
   
 static void  static void
Line 185  clear_out_of_rect(const RECT_T *target,  Line 235  clear_out_of_rect(const RECT_T *target, 
 static void  static void
 clear_outscreen(void)  clear_outscreen(void)
 {  {
         RECT_T target;  
         RECT_T base;          RECT_T base;
   
         base.left = base.top = 0;          base.left = base.top = 0;
         base.right = drawmng.scrw;          base.right = drawarea->allocation.width;
         base.bottom = drawmng.scrh;          base.bottom = drawarea->allocation.height;
         target = drawmng.scrn;          clear_out_of_rect(&drawmng.scrn, &base);
         clear_out_of_rect(&target, &base);  
 }  }
   
 static void  static void
 palette_init(void)  palette_init(void)
 {  {
         GdkColor color;  
         GdkColormap *cmap;          GdkColormap *cmap;
         int rv;          gboolean success;
         int i;          int i;
   
         cmap = gdk_colormap_get_system();          cmap = gdk_colormap_get_system();
         rv = gdk_colors_alloc(cmap, TRUE, NULL, 0, drawmng.pixel, 24);  
         if (rv == 0) {  
                 g_error("Can't allocate enough color.\n");  
                 return;  
         }  
   
         for (i = 0; i < 8; i++) {          for (i = 0; i < 8; i++) {
                 color.pixel = drawmng.pixel[NP2PAL_TEXT + i + 1];                  drawmng.pal[NP2PAL_TEXT + i + 1].pixel =
                 color.red = np2_pal32[NP2PAL_TEXT + i + 1].p.r << 8;                      (np2_pal32[NP2PAL_TEXT + i + 1].p.r << 0) |
                 color.green = np2_pal32[NP2PAL_TEXT + i + 1].p.g << 8;                      (np2_pal32[NP2PAL_TEXT + i + 1].p.g << 8) |
                 color.blue = np2_pal32[NP2PAL_TEXT + i + 1].p.b << 8;                      (np2_pal32[NP2PAL_TEXT + i + 1].p.b << 16);
                 gdk_colormap_alloc_color(cmap, &color, TRUE, FALSE);                  drawmng.pal[NP2PAL_TEXT + i + 1].red =
                       np2_pal32[NP2PAL_TEXT + i + 1].p.r << 8;
                   drawmng.pal[NP2PAL_TEXT + i + 1].green =
                       np2_pal32[NP2PAL_TEXT + i + 1].p.g << 8;
                   drawmng.pal[NP2PAL_TEXT + i + 1].blue =
                       np2_pal32[NP2PAL_TEXT + i + 1].p.b << 8;
         }          }
           gdk_colormap_alloc_colors(cmap, &drawmng.pal[NP2PAL_TEXT + 1], 8,
               TRUE, FALSE, &success);
 }  }
   
 static void  static void
 palette_set(void)  palette_set(void)
 {  {
         GdkColor color;          static int first = 1;
         GdkColormap *cmap;          GdkColormap *cmap;
           gboolean success;
         int i;          int i;
   
         cmap = gdk_colormap_get_system();          cmap = gdk_colormap_get_system();
   
           if (!first) {
                   gdk_colormap_free_colors(cmap, &drawmng.pal[NP2PAL_GRPH],
                       NP2PALS_GRPH);
           }
           first = 0;
   
         for (i = 0; i < NP2PALS_GRPH; i++) {          for (i = 0; i < NP2PALS_GRPH; i++) {
                 color.pixel = drawmng.pixel[NP2PAL_GRPH + i];                  drawmng.pal[NP2PAL_GRPH + i].pixel =
                 color.red = np2_pal32[NP2PAL_GRPH + i].p.r << 8;                      (np2_pal32[NP2PAL_GRPH + i].p.r << 0) |
                 color.green = np2_pal32[NP2PAL_GRPH + i].p.g << 8;                      (np2_pal32[NP2PAL_GRPH + i].p.g << 8) |
                 color.blue = np2_pal32[NP2PAL_GRPH + i].p.b << 8;                      (np2_pal32[NP2PAL_GRPH + i].p.b << 16);
                 gdk_colormap_alloc_color(cmap, &color, TRUE, FALSE);                  drawmng.pal[NP2PAL_GRPH + i].red =
                       np2_pal32[NP2PAL_GRPH + i].p.r << 8;
                   drawmng.pal[NP2PAL_GRPH + i].green =
                       np2_pal32[NP2PAL_GRPH + i].p.g << 8;
                   drawmng.pal[NP2PAL_GRPH + i].blue =
                       np2_pal32[NP2PAL_GRPH + i].p.b << 8;
         }          }
           gdk_colormap_alloc_colors(cmap, &drawmng.pal[NP2PAL_GRPH], NP2PALS_GRPH,
               TRUE, FALSE, &success);
 }  }
   
 void  void
Line 244  scrnmng_initialize(void) Line 307  scrnmng_initialize(void)
         scrnstat.width = 640;          scrnstat.width = 640;
         scrnstat.height = 400;          scrnstat.height = 400;
         scrnstat.extend = 1;          scrnstat.extend = 1;
           scrnstat.multiple = SCREEN_DEFMUL;
         set_window_size(scrnstat.width, scrnstat.height);          set_window_size(scrnstat.width, scrnstat.height);
   
           real_fullscreen = gtk_window_init_fullscreen(main_window);
   
           switch (np2oscfg.drawinterp) {
           case INTERP_NEAREST:
                   drawmng.interp = GDK_INTERP_NEAREST;
                   break;
   
           case INTERP_TILES:
                   drawmng.interp = GDK_INTERP_TILES;
                   break;
   
           case INTERP_HYPER:
                   drawmng.interp = GDK_INTERP_HYPER;
                   break;
   
           case INTERP_BILINEAR:
           default:
                   drawmng.interp = GDK_INTERP_BILINEAR;
                   break;
           }
 }  }
   
 BOOL  BOOL
 scrnmng_create(UINT8 mode)  scrnmng_create(UINT8 mode)
 {  {
           GdkScreen *screen;
         GdkVisual *visual;          GdkVisual *visual;
         RECT_T rect;          RECT_T rect;
         int height;  
         UINT lpitch;  
         UINT8 bytes_per_pixel;  
         pixmap_format_t fmt;          pixmap_format_t fmt;
         int padding;  
   
         while (drawmng.drawing)          while (drawmng.drawing)
                 gtk_main_iteration_do(FALSE);                  gtk_main_iteration_do(FALSE);
         drawmng.drawing = TRUE;          drawmng.drawing = TRUE;
   
 #if notyet          visual = gtk_widget_get_visual(drawarea);
         if (mode & SCRNMODE_FULLSCREEN) {          if (!gtkdrawmng_getformat(drawarea, main_window, &fmt))
                 mode &= ~SCRNMODE_ROTATEMASK;  
                 drawmng.extend = 0;  
                 return FAILURE;                  return FAILURE;
         } else  
 #endif  
         {  
                 scrnmng.flag = SCRNFLAG_HAVEEXTEND;  
   
                 visual = gtk_widget_get_visual(drawarea);          switch (fmt.bits_per_pixel) {
                 if (!gtkdrawmng_getformat(drawarea, main_window, &fmt))          case 16:
                         return FAILURE;                  drawmng_make16mask(&drawmng.pal16mask, visual->blue_mask,
                       visual->red_mask, visual->green_mask);
                 switch (fmt.bits_per_pixel) {                  break;
                 case 16:  
                         drawmng_make16mask(&drawmng.pal16mask, visual->blue_mask, visual->red_mask, visual->green_mask);          case 8:
                         break;                  palette_init();
                   break;
                 case 8:          }
                         palette_init();  
                         break;  
                 }  
                 drawmng.extend = 1;  
                 bytes_per_pixel = (UINT8)(fmt.bits_per_pixel / 8);  
   
                 if (!(mode & SCRNMODE_ROTATE)) {          if (mode & SCRNMODE_FULLSCREEN) {
                         rect.right = 641;                  mode &= ~SCRNMODE_ROTATEMASK;
                         rect.bottom = 480;                  scrnmng.flag = 0;
                   drawmng.extend = 0;
                   if (real_fullscreen) {
                           drawmng.width = FULLSCREEN_WIDTH;
                           drawmng.height = FULLSCREEN_HEIGHT;
                 } else {                  } else {
                         rect.right = 480;                          screen = gdk_screen_get_default();
                         rect.bottom = 641;                          drawmng.width = gdk_screen_get_width(screen);
                 }                          drawmng.height = gdk_screen_get_height(screen);
                 lpitch = rect.right * bytes_per_pixel;  
                 padding = lpitch % (fmt.scanline_pad / 8);  
                 if (padding > 0) {  
                         rect.right += padding / bytes_per_pixel;  
                         lpitch = rect.right * bytes_per_pixel;  
                 }  
                 height = 480;  
   
                 drawmng.surface = gdk_image_new(GDK_IMAGE_FASTEST, visual,  
                     rect.right, rect.bottom);  
                 if (drawmng.surface == NULL) {  
                         g_message("can't create surface.");  
                         return FAILURE;  
                 }                  }
           } else {
                   scrnmng.flag = SCRNFLAG_HAVEEXTEND;
                   drawmng.extend = 1;
                   drawmng.width = 640;
                   drawmng.height = 480;
           }
   
                 drawmng.backsurf = gdk_pixmap_new(drawarea->window,          if (!(mode & SCRNMODE_ROTATE)) {
                     rect.right, rect.bottom, visual->depth);                  rect.right = 640 + drawmng.extend;
                 if (drawmng.backsurf == NULL) {                  rect.bottom = 480;
                         g_message("can't create pixmap.");          } else {
                         return FAILURE;                  rect.right = 480;
                 }                  rect.bottom = 640 + drawmng.extend;
                 gdk_draw_rectangle(drawmng.backsurf, drawarea->style->black_gc,  
                     TRUE, 0, 0, rect.right, rect.bottom);  
         }          }
         scrnmng.bpp = (UINT8)fmt.bits_per_pixel;  
         drawmng.lpitch = lpitch;          scrnmng.bpp = BITS_PER_PIXEL;
         scrnsurf.ss.bpp = fmt.bits_per_pixel;          scrnsurf.bpp = BITS_PER_PIXEL;
         drawmng.scrnmode = mode;          drawmng.scrnmode = mode;
         drawmng.width = 640;  
         drawmng.height = height;  
         drawmng.clipping = 0;          drawmng.clipping = 0;
         renewal_client_size();          renewal_client_size();
   
           drawmng.backsurf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
               rect.right, rect.bottom);
           if (drawmng.backsurf == NULL) {
                   drawmng.drawing = FALSE;
                   g_message("can't create backsurf.");
                   return FAILURE;
           }
           gdk_pixbuf_fill(drawmng.backsurf, 0);
   
           drawmng.surface = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
               drawmng.rect.right, drawmng.rect.bottom);
           if (drawmng.surface == NULL) {
                   drawmng.drawing = FALSE;
                   g_message("can't create surface.");
                   return FAILURE;
           }
           gdk_pixbuf_fill(drawmng.surface, 0);
   
           if (mode & SCRNMODE_FULLSCREEN) {
                   xmenu_hide();
                   if (real_fullscreen) {
                           gtk_window_fullscreen_mode(main_window);
                   } else {
                           gtk_window_fullscreen(GTK_WINDOW(main_window));
                   }
           } else {
                   if (real_fullscreen) {
                           gtk_window_restore_mode(main_window);
                   } else {
                           gtk_window_unfullscreen(GTK_WINDOW(main_window));
                   }
                   xmenu_show();
           }
   
         drawmng.drawing = FALSE;          drawmng.drawing = FALSE;
   
         return SUCCESS;          return SUCCESS;
Line 338  scrnmng_destroy(void) Line 436  scrnmng_destroy(void)
 {  {
   
         if (drawmng.backsurf) {          if (drawmng.backsurf) {
                 gdk_pixmap_unref(drawmng.backsurf);                  g_object_unref(drawmng.backsurf);
                 drawmng.backsurf = NULL;                  drawmng.backsurf = NULL;
         }          }
         if (drawmng.surface) {          if (drawmng.surface) {
                 gdk_image_destroy(drawmng.surface);                  g_object_unref(drawmng.surface);
                 drawmng.surface = NULL;                  drawmng.surface = NULL;
         }          }
 }  }
Line 379  scrnmng_setextend(int extend) Line 477  scrnmng_setextend(int extend)
 {  {
   
         scrnstat.extend = extend;          scrnstat.extend = extend;
           scrnmng.allflash = TRUE;
         renewal_client_size();          renewal_client_size();
 }  }
   
   void
   scrnmng_setmultiple(int multiple)
   {
   
           if (scrnstat.multiple != multiple) {
                   scrnstat.multiple = multiple;
                   renewal_client_size();
           }
   }
   
 const SCRNSURF *  const SCRNSURF *
 scrnmng_surflock(void)  scrnmng_surflock(void)
 {  {
         int lpitch = drawmng.lpitch;          const int lpitch = gdk_pixbuf_get_rowstride(drawmng.backsurf);
         int bytes_per_pixel = scrnsurf.ss.bpp >> 3;  
   
 #if !defined(USE_SCREEN_INVALIDATE)          scrnsurf.ptr = (UINT8 *)gdk_pixbuf_get_pixels(drawmng.backsurf);
         memcpy(scrnsurf.renewal, renewal_line, sizeof(scrnsurf.renewal));  
 #endif  
   
         scrnsurf.ss.ptr = (UINT8 *)drawmng.surface->mem;  
         if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) {          if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) {
                 scrnsurf.ss.xalign = bytes_per_pixel;                  scrnsurf.xalign = BYTES_PER_PIXEL;
                 scrnsurf.ss.yalign = lpitch;                  scrnsurf.yalign = lpitch;
         } else if (!(drawmng.scrnmode & SCRNMODE_ROTATEDIR)) {          } else if (!(drawmng.scrnmode & SCRNMODE_ROTATEDIR)) {
                 /* rotate left */                  /* rotate left */
                 scrnsurf.ss.ptr += (scrnsurf.ss.width + scrnsurf.ss.extend - 1) * lpitch;                  scrnsurf.ptr += (scrnsurf.width + scrnsurf.extend - 1) * lpitch;
                 scrnsurf.ss.xalign = -lpitch;                  scrnsurf.xalign = -lpitch;
                 scrnsurf.ss.yalign = bytes_per_pixel;                  scrnsurf.yalign = BYTES_PER_PIXEL;
         } else {          } else {
                 /* rotate right */                  /* rotate right */
                 scrnsurf.ss.ptr += (drawmng.rect.right - 1) * bytes_per_pixel;                  scrnsurf.ptr += (scrnsurf.height - 1) * BYTES_PER_PIXEL;
                 scrnsurf.ss.xalign = lpitch;                  scrnsurf.xalign = lpitch;
                 scrnsurf.ss.yalign = -bytes_per_pixel;                  scrnsurf.yalign = -BYTES_PER_PIXEL;
         }          }
         return &scrnsurf.ss;          return &scrnsurf;
 }  }
   
 void  void
 scrnmng_surfunlock(const SCRNSURF *surf)  scrnmng_surfunlock(const SCRNSURF *surf)
 {  {
         GdkDrawable *d = drawarea->window;  
         GdkGC *gc = drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)];  
         X11SCRNSURF *ss = (X11SCRNSURF *)surf;  
         UINT8 *delta = ss->renewal;  
         RECT_T r;  
         gint h, s;  
   
         r.left = drawmng.scrn.left;  
         r.top = drawmng.scrn.top;  
         r.right = drawmng.rect.right;  
         r.bottom = drawmng.rect.bottom;  
   
 #if !defined(USE_SCREEN_INVALIDATE)          UNUSED(surf);
         if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) {  
                 /* normal */  
                 for (s = h = 0; h < r.bottom; h++) {  
                         if ((renewal_line[h] != delta[h]) || (s == h))  
                                 continue;  
   
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             0, s, r.left, r.top + s, r.right, h - s);  
                         s = h + 1;  
                 }  
                 if (s != h) {  
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             0, s, r.left, r.top + s, r.right, h - s);  
                 }  
         } else if (!(drawmng.scrnmode & SCRNMODE_ROTATEDIR)) {  
                 /* rotate left */  
                 for (s = h = 0; h < r.right; h++) {  
                         if ((renewal_line[h] != delta[h]) || (s == h))  
                                 continue;  
   
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             s, 0, r.left + s, r.top, h - s, r.bottom);  
                         s = h + 1;  
                 }  
                 if (s != h) {  
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             s, 0, r.left + s, r.top, h - s, r.bottom);  
                 }  
         } else {  
                 /* rotate right */  
                 for (s = h = 0; h < r.right; h++) {  
                         if ((renewal_line[h] != delta[h]) || (s == h))  
                                 continue;  
   
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             r.right - h, 0,  
                             drawmng.scrn.right - h, r.top, h - s, r.bottom);  
                         s = h + 1;  
                 }  
                 if (s != h) {  
                         gdk_draw_image(drawmng.backsurf, gc, drawmng.surface,  
                             r.right - h, 0,  
                             drawmng.scrn.right - h, r.top, h - s, r.bottom);  
                 }  
         }  
 #else  
         gtk_widget_queue_draw_area(drawarea, r.left, r.top, r.right, r.bottom);  
 #endif  
   
         if (scrnmng.palchanged) {          if (((drawmng.scrnmode & SCRNMODE_FULLSCREEN) && real_fullscreen)
                 scrnmng.palchanged = FALSE;           && !(drawmng.scrnmode & SCRNMODE_FULLSCREEN) && (scrnstat.multiple == SCREEN_DEFMUL)) {
                 palette_set();                  /* Nothing to do */
           } else {
                   gdk_pixbuf_scale(drawmng.backsurf, drawmng.surface,
                       0, 0, drawmng.rect.right, drawmng.rect.bottom,
                       0, 0, drawmng.ratio_w, drawmng.ratio_h,
                       drawmng.interp);
         }          }
   
 #if !defined(USE_SCREEN_INVALIDATE)          scrnmng_update();
         if (drawmng.drawing)  
                 return;  
   
         drawmng.drawing = TRUE;  
 #if notyet  
         if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) {  
         } else  
 #endif  
         {  
                 if (scrnmng.allflash) {  
                         scrnmng.allflash = 0;  
                         if (np2oscfg.paddingx || np2oscfg.paddingy) {  
                                 clear_outscreen();  
                         }  
                 }  
                 gdk_draw_pixmap(d, gc, drawmng.backsurf,  
                     0, 0,                                     /* src  */  
                     drawmng.scrn.left, drawmng.scrn.top,      /* dest */  
                     drawmng.rect.right, drawmng.rect.bottom); /* w/h  */  
         }  
         drawmng.drawing = FALSE;  
 #endif  
 }  }
   
 void  void
 scrnmng_draw(RECT_T *r)  scrnmng_update(void)
 {  {
         GdkDrawable *d = drawarea->window;          GdkDrawable *d = drawarea->window;
         GdkGC *gc = drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)];          GdkGC *gc = drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)];
   
           if (scrnmng.palchanged) {
                   scrnmng.palchanged = FALSE;
                   palette_set();
           }
   
         if (drawmng.drawing)          if (drawmng.drawing)
                 return;                  return;
   
         drawmng.drawing = TRUE;          drawmng.drawing = TRUE;
   
         if (r->right > drawmng.rect.right)  
                 r->right = drawmng.rect.right;  
         if (r->bottom > drawmng.rect.bottom)  
                 r->bottom = drawmng.rect.bottom;  
   
 #if notyet  
         if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) {          if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) {
         } else                  if (scrnmng.allflash) {
 #endif                          scrnmng.allflash = 0;
         {                          clear_outscreen();
                   }
           } else {
                 if (scrnmng.allflash) {                  if (scrnmng.allflash) {
                         scrnmng.allflash = 0;                          scrnmng.allflash = 0;
                         if (np2oscfg.paddingx || np2oscfg.paddingy) {                          if (np2oscfg.paddingx || np2oscfg.paddingy) {
                                 clear_outscreen();                                  clear_outscreen();
                         }                          }
                 }                  }
 #if !defined(USE_SCREEN_INVALIDATE)  
                 gdk_draw_pixmap(d, gc, drawmng.backsurf,  
                     r->left, r->top,  
                     r->left, r->top, r->right, r->bottom);  
 #else  
                 gdk_draw_image(d, gc, drawmng.surface,  
                     r->left, r->top,  
                     r->left, r->top, r->right, r->bottom);  
 #endif  
         }          }
   
           if (((drawmng.scrnmode & SCRNMODE_FULLSCREEN) && real_fullscreen)
            && !(drawmng.scrnmode & SCRNMODE_FULLSCREEN) && (scrnstat.multiple == SCREEN_DEFMUL)) {
                   gdk_draw_pixbuf(d, gc, drawmng.backsurf,
                       0, 0,
                       drawmng.scrn.left, drawmng.scrn.top,
                       drawmng.rect.right, drawmng.rect.bottom,
                       GDK_RGB_DITHER_NORMAL, 0, 0);
           } else {
                   gdk_draw_pixbuf(d, gc, drawmng.surface,
                       0, 0,
                       drawmng.scrn.left, drawmng.scrn.top,
                       drawmng.rect.right, drawmng.rect.bottom,
                       GDK_RGB_DITHER_NORMAL, 0, 0);
           }
   
         drawmng.drawing = FALSE;          drawmng.drawing = FALSE;
 }  }

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


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