--- np2/x11/gtk/Attic/gtkdraw.c 2003/11/16 16:43:45 1.1 +++ np2/x11/gtk/Attic/gtkdraw.c 2003/11/28 16:29:57 1.3 @@ -34,31 +34,30 @@ #include "scrnmng.h" #include "gtk/xnp2.h" +#include "gtk/gtkdrawmng.h" typedef struct { - BYTE scrnmode; - int width; - int height; - int extend; - int clipping; - - RGB32 pal16mask; - BYTE r16b; - BYTE l16r; - BYTE l16g; - - RECT_T scrn; - RECT_T rect; - - int scrw; - int scrh; - - int lpitch; + BYTE scrnmode; + int width; + int height; + int extend; + int clipping; + + PAL16MASK pal16mask; + + RECT_T scrn; + RECT_T rect; + + int lpitch; + int scrw; + int scrh; /* toolkit depend */ - GdkImage* surface; - GdkPixmap* backsurf; + GdkImage *surface; + GdkPixmap *backsurf; + BOOL shared_pixmap; + unsigned long pixel[24]; /* pallete */ } DRAWMNG; @@ -145,6 +144,8 @@ renewal_client_size(void) static void clear_out_of_rect(const RECT_T* target, const RECT_T* base) { + GdkDrawable *d = drawarea->window; + GdkGC *gc = drawarea->style->black_gc; RECT_T rect; rect.left = base->left; @@ -152,15 +153,13 @@ clear_out_of_rect(const RECT_T* target, rect.top = base->top; rect.bottom = target->top; if (rect.top < rect.bottom) { - gdk_draw_rectangle(drawmng.backsurf, - drawarea->style->black_gc, TRUE, + gdk_draw_rectangle(d, gc, TRUE, rect.left, rect.top, rect.right, rect.bottom); } rect.top = target->bottom; rect.bottom = base->bottom; if (rect.top < rect.bottom) { - gdk_draw_rectangle(drawmng.backsurf, - drawarea->style->black_gc, TRUE, + gdk_draw_rectangle(d, gc, TRUE, rect.left, rect.top, rect.right, rect.bottom); } @@ -170,15 +169,13 @@ clear_out_of_rect(const RECT_T* target, rect.left = base->left; rect.right = target->left; if (rect.left < rect.right) { - gdk_draw_rectangle(drawmng.backsurf, - drawarea->style->black_gc, TRUE, + gdk_draw_rectangle(d, gc, TRUE, rect.left, rect.top, rect.right, rect.bottom); } rect.left = target->right; rect.right = base->right; if (rect.left < rect.right) { - gdk_draw_rectangle(drawmng.backsurf, - drawarea->style->black_gc, TRUE, + gdk_draw_rectangle(d, gc, TRUE, rect.left, rect.top, rect.right, rect.bottom); } } @@ -190,8 +187,10 @@ clear_outscreen(void) RECT_T target; RECT_T base; + base.left = base.top = 0; + base.right = drawmng.scrw; + base.bottom = drawmng.scrh; target = drawmng.scrn; - memset(&base, 0, sizeof(base)); clear_out_of_rect(&target, &base); } @@ -236,37 +235,6 @@ palette_set(void) } } - -static void -make16mask(UINT32 bmask, UINT32 rmask, UINT32 gmask) -{ - BYTE sft; - - sft = 0; - while ((!(bmask & 0x80)) && (sft < 32)) { - bmask <<= 1; - sft++; - } - drawmng.pal16mask.p.b = (BYTE)bmask; - drawmng.r16b = sft; - - sft = 0; - while ((rmask & 0xffffff00) && (sft < 32)) { - rmask >>= 1; - sft++; - } - drawmng.pal16mask.p.r = (BYTE)rmask; - drawmng.l16r = sft; - - sft = 0; - while ((gmask & 0xffffff00) && (sft < 32)) { - gmask >>= 1; - sft++; - } - drawmng.pal16mask.p.g = (BYTE)gmask; - drawmng.l16g = sft; -} - void scrnmng_initialize(void) { @@ -298,66 +266,30 @@ scrnmng_create(BYTE mode) scrnmng.flag = SCRNFLAG_HAVEEXTEND; visual = gtk_widget_get_visual(drawarea); - switch (visual->type) { - case GDK_VISUAL_TRUE_COLOR: - break; - - case GDK_VISUAL_PSEUDO_COLOR: - break; - - case GDK_VISUAL_DIRECT_COLOR: - if (visual->depth > 8) { - break; - } - /* FALLTHROUGH */ - default: - fprintf(stderr, "No support visual class.\n"); - return 1; - } - - if (visual->depth == 32) { - bitcolor = 32; - } else if (visual->depth == 24) { - if (is_32bpp(window->window)) { - bitcolor = 32; - } else { - bitcolor = 24; - } - } else if (visual->depth == 15 || visual->depth == 16) { - bitcolor = 16; - make16mask(visual->blue_mask, visual->red_mask, visual->green_mask); - } else if (visual->depth == 8) { - bitcolor = 8; - palette_init(); - } else if (visual->depth < 8) { - fprintf(stderr, "Too few allocable color.\n"); - return FAILURE; - } else { - fprintf(stderr, "No support depth.\n"); + bitcolor = gtkdrawmng_getbpp(drawarea, window); + if (bitcolor == 0) { return FAILURE; + } else if (bitcolor == 16) { + drawmng_make16mask(&drawmng.pal16mask, visual->blue_mask, visual->red_mask, visual->green_mask); + } else if (bitcolor == 8) { + palette_init(); } drawmng.extend = 1; bytes_per_pixel = bitcolor >> 3; if (!(mode & SCRNMODE_ROTATE)) { - rect.right = 640; + rect.right = 641; rect.bottom = 480; - if (np2oscfg.paddingx) { - rect.right++; - } - 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 = 640; - if (np2oscfg.paddingx) { - rect.bottom++; - } + rect.bottom = 641; + lpitch = rect.right * bytes_per_pixel; } - lpitch = rect.right * bytes_per_pixel; height = 480; drawmng.surface = gdk_image_new(GDK_IMAGE_FASTEST, visual, @@ -366,6 +298,25 @@ scrnmng_create(BYTE mode) g_message("can't create surface."); 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); + } + if (drawmng.backsurf == NULL) { + g_message("can't create pixmap."); + return FAILURE; + } + gdk_draw_rectangle(drawmng.backsurf, drawarea->style->black_gc, + TRUE, 0, 0, rect.right, rect.bottom); } scrnmng.bpp = (BYTE)bitcolor; drawmng.lpitch = lpitch; @@ -376,15 +327,6 @@ scrnmng_create(BYTE mode) drawmng.clipping = 0; renewal_client_size(); - drawmng.backsurf = gdk_pixmap_new(drawarea->window, - drawmng.scrw, drawmng.scrh, visual->depth); - if (drawmng.backsurf == NULL) { - g_message("can't create pixmap."); - return FAILURE; - } - gdk_draw_rectangle(drawmng.backsurf, drawarea->style->black_gc, TRUE, - 0, 0, drawmng.scrw, drawmng.scrh); - return SUCCESS; } @@ -407,10 +349,8 @@ scrnmng_destroy(void) RGB16 scrnmng_makepal16(RGB32 pal32) { - RGB32 pal; - pal.d = pal32.d & drawmng.pal16mask.d; - return (RGB16)((pal.p.g << drawmng.l16g) + (pal.p.r << drawmng.l16r) + (pal.p.b >> drawmng.r16b)); + return drawmng_makepal16(&drawmng.pal16mask, pal32); } void @@ -471,73 +411,65 @@ void scrnmng_surfunlock(const SCRNSURF* surf) { X11SCRNSURF *ss = (X11SCRNSURF *)surf; - GtkWidget *w = drawarea; - GdkGC *gc = w->style->fg_gc[GTK_WIDGET_STATE(w)]; + GdkDrawable *d = drawarea->window; + GdkGC *gc = drawarea->style->fg_gc[GTK_WIDGET_STATE(drawarea)]; 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; + if (!drawmng.shared_pixmap) { + r.left = drawmng.scrn.left; + r.top = drawmng.scrn.top; + r.right = drawmng.rect.right; + r.bottom = drawmng.rect.bottom; - 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 (!(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); + } } } - scrnmng_update(); -} - -void -scrnmng_update(void) -{ - GdkDrawable *d = (GdkDrawable *)drawarea->window; - GtkWidget *w = drawarea; - GdkGC *gc = w->style->fg_gc[GTK_WIDGET_STATE(w)]; - if (scrnmng.palchanged) { scrnmng.palchanged = FALSE; palette_set(); @@ -550,9 +482,13 @@ scrnmng_update(void) { if (scrnmng.allflash) { scrnmng.allflash = 0; - clear_outscreen(); + if (np2oscfg.paddingx || np2oscfg.paddingy) { + clear_outscreen(); + } } gdk_draw_pixmap(d, gc, drawmng.backsurf, - 0, 0, 0, 0, drawmng.scrw, drawmng.scrh); + 0, 0, /* src */ + drawmng.scrn.left, drawmng.scrn.top, /* dest */ + drawmng.rect.right, drawmng.rect.bottom); /* w/h */ } }