|
|
| version 1.2, 2003/11/26 14:55:01 | version 1.3, 2003/11/28 16:29:57 |
|---|---|
| Line 34 | Line 34 |
| #include "scrnmng.h" | #include "scrnmng.h" |
| #include "gtk/xnp2.h" | #include "gtk/xnp2.h" |
| #include "gtk/gtkdrawmng.h" | |
| typedef struct { | typedef struct { |
| BYTE scrnmode; | BYTE scrnmode; |
| int width; | int width; |
| int height; | int height; |
| int extend; | int extend; |
| int clipping; | int clipping; |
| RGB32 pal16mask; | PAL16MASK pal16mask; |
| BYTE r16b; | |
| BYTE l16r; | RECT_T scrn; |
| BYTE l16g; | RECT_T rect; |
| RECT_T scrn; | int lpitch; |
| RECT_T rect; | int scrw; |
| int scrh; | |
| int lpitch; | |
| int scrw; | |
| int scrh; | |
| /* toolkit depend */ | /* toolkit depend */ |
| GdkImage *surface; | GdkImage *surface; |
| GdkPixmap *backsurf; | GdkPixmap *backsurf; |
| unsigned long pixel[24]; /* pallete */ | |
| BOOL shared_pixmap; | BOOL shared_pixmap; |
| unsigned long pixel[24]; /* pallete */ | |
| } DRAWMNG; | } DRAWMNG; |
| typedef struct { | typedef struct { |
| Line 237 palette_set(void) | Line 235 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 | void |
| scrnmng_initialize(void) | scrnmng_initialize(void) |
| { | { |
| Line 299 scrnmng_create(BYTE mode) | Line 266 scrnmng_create(BYTE mode) |
| scrnmng.flag = SCRNFLAG_HAVEEXTEND; | scrnmng.flag = SCRNFLAG_HAVEEXTEND; |
| visual = gtk_widget_get_visual(drawarea); | visual = gtk_widget_get_visual(drawarea); |
| switch (visual->type) { | bitcolor = gtkdrawmng_getbpp(drawarea, window); |
| case GDK_VISUAL_TRUE_COLOR: | if (bitcolor == 0) { |
| 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"); | |
| return FAILURE; | 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; | drawmng.extend = 1; |
| bytes_per_pixel = bitcolor >> 3; | bytes_per_pixel = bitcolor >> 3; |
| Line 346 scrnmng_create(BYTE mode) | Line 283 scrnmng_create(BYTE mode) |
| lpitch = rect.right * bytes_per_pixel; | lpitch = rect.right * bytes_per_pixel; |
| if (lpitch % 4) { | if (lpitch % 4) { |
| rect.right += (lpitch % 4) / bytes_per_pixel; | rect.right += (lpitch % 4) / bytes_per_pixel; |
| lpitch = rect.right * bytes_per_pixel; | |
| } | } |
| } else { | } else { |
| rect.right = 480; | rect.right = 480; |
| rect.bottom = 641; | rect.bottom = 641; |
| lpitch = rect.right * bytes_per_pixel; | |
| } | } |
| lpitch = rect.right * bytes_per_pixel; | |
| height = 480; | height = 480; |
| drawmng.surface = gdk_image_new(GDK_IMAGE_FASTEST, visual, | drawmng.surface = gdk_image_new(GDK_IMAGE_FASTEST, visual, |
| Line 361 scrnmng_create(BYTE mode) | Line 299 scrnmng_create(BYTE mode) |
| return FAILURE; | return FAILURE; |
| } | } |
| drawmng.shared_pixmap = use_shared_pixmap; | |
| drawmng.backsurf = NULL; | drawmng.backsurf = NULL; |
| if (use_shared_pixmap) { | if (use_shared_pixmap) { |
| drawmng.backsurf = gdk_pixmap_shpix_new( | drawmng.backsurf = gdk_pixmap_shpix_new( |
| Line 410 scrnmng_destroy(void) | Line 349 scrnmng_destroy(void) |
| RGB16 | RGB16 |
| scrnmng_makepal16(RGB32 pal32) | scrnmng_makepal16(RGB32 pal32) |
| { | { |
| RGB32 pal; | |
| pal.d = pal32.d & drawmng.pal16mask.d; | return drawmng_makepal16(&drawmng.pal16mask, pal32); |
| return (RGB16)((pal.p.g << drawmng.l16g) + (pal.p.r << drawmng.l16r) + (pal.p.b >> drawmng.r16b)); | |
| } | } |
| void | void |
| Line 480 scrnmng_surfunlock(const SCRNSURF* surf) | Line 417 scrnmng_surfunlock(const SCRNSURF* surf) |
| RECT_T r; | RECT_T r; |
| gint h, s; | 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) { | if (!drawmng.shared_pixmap) { |
| 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)) { | if (!(drawmng.scrnmode & SCRNMODE_ROTATE)) { |
| /* normal */ | /* normal */ |
| for (s = h = 0; h < r.bottom; h++) { | for (s = h = 0; h < r.bottom; h++) { |