--- np2/x11/gtk/Attic/gtk_screen.c 2004/02/06 16:51:22 1.3 +++ np2/x11/gtk/Attic/gtk_screen.c 2004/07/27 17:07:49 1.6 @@ -1,3 +1,5 @@ +/* $Id: gtk_screen.c,v 1.6 2004/07/27 17:07:49 monaka Exp $ */ + /* * Copyright (c) 2003 NONAKA Kimihiro * All rights reserved. @@ -38,7 +40,8 @@ typedef struct { - BYTE scrnmode; + UINT8 scrnmode; + UINT8 drawing; int width; int height; int extend; @@ -53,8 +56,6 @@ typedef struct { int scrw; int scrh; - int shared_pixmap; - /* toolkit depend */ GdkImage *surface; GdkPixmap *backsurf; @@ -71,7 +72,7 @@ typedef struct { typedef struct { SCRNSURF ss; - BYTE renewal[SURFACE_HEIGHT]; + UINT8 renewal[SURFACE_HEIGHT]; } X11SCRNSURF; static SCRNMNG scrnmng; @@ -241,6 +242,7 @@ void scrnmng_initialize(void) { + drawmng.drawing = FALSE; scrnstat.width = 640; scrnstat.height = 400; scrnstat.extend = 1; @@ -248,14 +250,19 @@ scrnmng_initialize(void) } BOOL -scrnmng_create(BYTE mode) +scrnmng_create(UINT8 mode) { GdkVisual *visual; RECT_T rect; int height; - int bitcolor; UINT lpitch; - BYTE bytes_per_pixel; + UINT8 bytes_per_pixel; + pixmap_format_t fmt; + int padding; + + while (drawmng.drawing) + gtk_main_iteration_do(FALSE); + drawmng.drawing = TRUE; #if notyet if (mode & SCRNMODE_FULLSCREEN) { @@ -268,28 +275,32 @@ scrnmng_create(BYTE mode) scrnmng.flag = SCRNFLAG_HAVEEXTEND; visual = gtk_widget_get_visual(drawarea); - bitcolor = gtkdrawmng_getbpp(drawarea, window); - if (bitcolor == 0) { + if (!gtkdrawmng_getformat(drawarea, window, &fmt)) return FAILURE; - } else if (bitcolor == 16) { + + switch (fmt.bits_per_pixel) { + case 16: drawmng_make16mask(&drawmng.pal16mask, visual->blue_mask, visual->red_mask, visual->green_mask); - } else if (bitcolor == 8) { + break; + + case 8: palette_init(); + break; } drawmng.extend = 1; - bytes_per_pixel = bitcolor >> 3; + bytes_per_pixel = (UINT8)(fmt.bits_per_pixel / 8); if (!(mode & SCRNMODE_ROTATE)) { rect.right = 641; rect.bottom = 480; - lpitch = rect.right * bytes_per_pixel; - if (lpitch % 4) { - rect.right += (lpitch % 4) / bytes_per_pixel; - lpitch = rect.right * bytes_per_pixel; - } } else { rect.right = 480; rect.bottom = 641; + } + 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; @@ -301,18 +312,8 @@ scrnmng_create(BYTE mode) return FAILURE; } - drawmng.shared_pixmap = use_shared_pixmap; - drawmng.backsurf = NULL; - if (use_shared_pixmap) { - drawmng.backsurf = gdk_pixmap_shpix_new( - drawarea->window, drawmng.surface, - rect.right, rect.bottom, visual->depth); - } - if (drawmng.backsurf == NULL) { - drawmng.shared_pixmap = FALSE; - drawmng.backsurf = gdk_pixmap_new(drawarea->window, - rect.right, rect.bottom, visual->depth); - } + drawmng.backsurf = gdk_pixmap_new(drawarea->window, + rect.right, rect.bottom, visual->depth); if (drawmng.backsurf == NULL) { g_message("can't create pixmap."); return FAILURE; @@ -320,32 +321,32 @@ scrnmng_create(BYTE mode) gdk_draw_rectangle(drawmng.backsurf, drawarea->style->black_gc, TRUE, 0, 0, rect.right, rect.bottom); } - scrnmng.bpp = (BYTE)bitcolor; + scrnmng.bpp = (UINT8)fmt.bits_per_pixel; drawmng.lpitch = lpitch; - scrnsurf.ss.bpp = bitcolor; + scrnsurf.ss.bpp = fmt.bits_per_pixel; drawmng.scrnmode = mode; drawmng.width = 640; drawmng.height = height; drawmng.clipping = 0; renewal_client_size(); + drawmng.drawing = FALSE; + return SUCCESS; } void scrnmng_destroy(void) { - GdkVisual *visual; - visual = gtk_widget_get_visual(drawarea); -#if 0 - if (visual->class == PseudoColor) - XFreeColors(display, cmap, pixel, 24, 0); -#endif - if (drawmng.backsurf) + if (drawmng.backsurf) { gdk_pixmap_unref(drawmng.backsurf); - if (drawmng.surface) + drawmng.backsurf = NULL; + } + if (drawmng.surface) { gdk_image_destroy(drawmng.surface); + drawmng.surface = NULL; + } } RGB16 @@ -389,9 +390,11 @@ scrnmng_surflock(void) int lpitch = drawmng.lpitch; int bytes_per_pixel = scrnsurf.ss.bpp >> 3; +#if !defined(USE_SCREEN_INVALIDATE) memcpy(scrnsurf.renewal, renewal_line, sizeof(scrnsurf.renewal)); +#endif - scrnsurf.ss.ptr = (BYTE *)drawmng.surface->mem; + scrnsurf.ss.ptr = (UINT8 *)drawmng.surface->mem; if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) { scrnsurf.ss.xalign = bytes_per_pixel; scrnsurf.ss.yalign = lpitch; @@ -414,70 +417,76 @@ 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 (!drawmng.shared_pixmap) { - X11SCRNSURF *ss = (X11SCRNSURF *)surf; - BYTE *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 (!(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); - } +#if !defined(USE_SCREEN_INVALIDATE) + 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) { scrnmng.palchanged = FALSE; palette_set(); } +#if !defined(USE_SCREEN_INVALIDATE) + if (drawmng.drawing) + return; + + drawmng.drawing = TRUE; #if notyet if (drawmng.scrnmode & SCRNMODE_FULLSCREEN) { } else @@ -494,4 +503,46 @@ scrnmng_surfunlock(const SCRNSURF *surf) drawmng.scrn.left, drawmng.scrn.top, /* dest */ drawmng.rect.right, drawmng.rect.bottom); /* w/h */ } + drawmng.drawing = FALSE; +#endif +} + +void +scrnmng_draw(RECT_T *r) +{ + GdkDrawable *d = drawarea->window; + GdkGC *gc = drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)]; + + if (drawmng.drawing) + return; + + 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) { + } else +#endif + { + if (scrnmng.allflash) { + scrnmng.allflash = 0; + if (np2oscfg.paddingx || np2oscfg.paddingy) { + 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 + } + drawmng.drawing = FALSE; }