From: Holger Schemel Date: Fri, 4 Sep 1998 12:19:27 +0000 (+0200) Subject: rnd-19980904 X-Git-Tag: 1.2.0^2~87 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=e4566563844c4bcfc472159c9ae870941099708c;p=rocksndiamonds.git rnd-19980904 --- diff --git a/src/gif.c b/src/gif.c index 2462e139..d8f56a4a 100644 --- a/src/gif.c +++ b/src/gif.c @@ -521,7 +521,9 @@ Image *gifLoad(char *fullname) return(NULL); } + /* tellAboutImage(fullname); + */ image= newRGBImage(gifin_img_width, gifin_img_height, (gifin_l_cmap_flag ? gifin_l_pixel_bits : diff --git a/src/gifload.c b/src/gifload.c index 89c06ae5..f26ba5a1 100644 --- a/src/gifload.c +++ b/src/gifload.c @@ -26,7 +26,7 @@ extern int test_picture_count; -int Read_GIF_to_Image(Display *display, Window window, char *filename) +int Read_GIF_to_Pixmaps(Display *display, Window window, char *filename) { Image *image, *image_mask; XImageInfo *ximageinfo, *ximageinfo_mask; @@ -64,7 +64,9 @@ int Read_GIF_to_Image(Display *display, Window window, char *filename) if (ximageinfo->cmap != DefaultColormap(display, screen)) { + /* printf("--> '%s' gets own colormap\n", filename); + */ XSetWindowColormap(display, window, ximageinfo->cmap); } @@ -76,9 +78,9 @@ int Read_GIF_to_Image(Display *display, Window window, char *filename) exit(1); } - + /* printf("test_picture_count == %d\n", test_picture_count); - + */ test_pix[test_picture_count] = pixmap; diff --git a/src/gifload.h b/src/gifload.h index 06074967..ebc260ac 100644 --- a/src/gifload.h +++ b/src/gifload.h @@ -29,11 +29,7 @@ #define GIF_NoMemory -4 #define GIF_ColorFailed -5 -int Read_GIF_to_Image(Display *, Window, char *); -int Read_GIF_to_Bitmap(Display *, char *, Pixmap *); -int Read_GIF_to_Pixmap(Display *, char *, Pixmap *); -int Read_GIF_to_XImage(Display *, char *, XImage **); - +int Read_GIF_to_Pixmaps(Display *, Window, char *); #endif #endif diff --git a/src/init.c b/src/init.c index 2eced3e3..ebaeb4b1 100644 --- a/src/init.c +++ b/src/init.c @@ -196,6 +196,9 @@ void InitJoystick() void InitDisplay(int argc, char *argv[]) { char *display_name = NULL; + XVisualInfo vinfo_template, *vinfo; + int num_visuals; + unsigned int depth; int i; /* get X server to connect to, if given as an argument */ @@ -222,9 +225,36 @@ void InitDisplay(int argc, char *argv[]) } screen = DefaultScreen(display); + visual = DefaultVisual(display, screen); + depth = DefaultDepth(display, screen); cmap = DefaultColormap(display, screen); pen_fg = WhitePixel(display,screen); pen_bg = BlackPixel(display,screen); + + /* look for good enough visual */ + vinfo_template.screen = screen; + vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor); + vinfo_template.depth = depth; + if ((vinfo = XGetVisualInfo(display, VisualScreenMask | VisualClassMask | + VisualDepthMask, &vinfo_template, &num_visuals))) + { + visual = vinfo->visual; + XFree((void *)vinfo); + } + + /* got appropriate visual? */ + if (depth < 8) + { + printf("Sorry, displays with less than 8 bits per pixel not supported.\n"); + exit(-1); + } + else if ((depth ==8 && visual->class != PseudoColor) || + (depth > 8 && visual->class != TrueColor && + visual->class != DirectColor)) + { + printf("Sorry, cannot get appropriate visual.\n"); + exit(-1); + } } void InitWindow(int argc, char *argv[]) @@ -506,7 +536,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) count1 = Counter(); #endif - Read_GIF_to_Image(display, window, filename); + Read_GIF_to_Pixmaps(display, window, filename); #ifdef DEBUG_TIMING count2 = Counter(); @@ -604,8 +634,10 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) #ifdef DEBUG_TIMING count2 = Counter(); + /* printf("XPM LOADING %s IN %.2f SECONDS\n", filename,(float)(count2-count1)/100.0); + */ #endif #if 0 @@ -704,8 +736,10 @@ msdos_jmp: #ifdef DEBUG_TIMING count2 = Counter(); + /* printf("LOADING %s IN %.2f SECONDS\n", filename,(float)(count2-count1)/100.0); + */ #endif #if 0 diff --git a/src/main.c b/src/main.c index 2395ec1b..08ee469e 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #endif Display *display; +Visual *visual; int screen; Window window; GC gc, clip_gc[NUM_PIXMAPS]; diff --git a/src/main.h b/src/main.h index 5969bfc4..11a80a88 100644 --- a/src/main.h +++ b/src/main.h @@ -263,6 +263,7 @@ struct JoystickInfo }; extern Display *display; +extern Visual *visual; extern int screen; extern Window window; extern GC gc, clip_gc[]; diff --git a/src/send.c b/src/send.c index e8f0ffd9..aa55152e 100644 --- a/src/send.c +++ b/src/send.c @@ -22,8 +22,10 @@ Image *monochrome(Image *cimage) if (BITMAPP(cimage)) return(NULL); + /* printf(" Converting to monochrome..."); fflush(stdout); + */ image= newBitImage(cimage->width, cimage->height); if (cimage->title) @@ -59,7 +61,9 @@ Image *monochrome(Image *cimage) dp += dll; /* next row */ } + /* printf("done\n"); + */ return(image); } @@ -254,8 +258,10 @@ void compress(Image *image) if (!RGBP(image) || image->rgb.compressed) return; + /* printf(" Compressing colormap..."); fflush(stdout); + */ used = (unsigned char *)lcalloc(sizeof(unsigned char) * depthToColors(image->depth)); dmask = (1 << image->depth) -1; /* Mask any illegal bits for that depth */ @@ -335,6 +341,7 @@ void compress(Image *image) lfree(map); lfree(used); + /* if (badcount) printf("%d out-of-range pixels, ", badcount); @@ -349,6 +356,7 @@ void compress(Image *image) printf("%d unique color%s\n", next_index, (next_index == 1 ? "" : "s")); } + */ image->rgb.compressed= TRUE; /* don't do it again */ } @@ -413,10 +421,6 @@ static unsigned int bitsPerPixelAtDepth(Display *disp, int scrn, exit(1); } -/* - visual: visual to use - ddepth: depth of the visual to use -*/ XImageInfo *imageToXImage(Display *disp, int scrn, Visual *visual, @@ -426,6 +430,9 @@ XImageInfo *imageToXImage(Display *disp, Pixel *redvalue, *greenvalue, *bluevalue; unsigned int a, c=0, x, y, linelen, dpixlen, dbits; XColor xcolor; + + static XColor xcolor_used[NOFLASH_COLORS]; + XGCValues gcv; XImageInfo *ximageinfo; Image *orig_image; @@ -435,6 +442,10 @@ XImageInfo *imageToXImage(Display *disp, static int free_cmap_entries, max_cmap_entries; int use_cmap_entry; + + static unsigned long pixel_used[NOFLASH_COLORS]; + + if (!our_default_cmap) { #if 0 @@ -459,6 +470,9 @@ XImageInfo *imageToXImage(Display *disp, xcolor.pixel = *(our_default_index + a); XQueryColor(disp, DefaultColormap(disp, scrn), &xcolor); XStoreColor(disp, our_default_cmap, &xcolor); + + pixel_used[xcolor.pixel] = 0; + xcolor_used[xcolor.pixel] = xcolor; } } @@ -588,61 +602,144 @@ XImageInfo *imageToXImage(Display *disp, while ((bluebottom < 256) && (bluebottom < bluetop)) bluevalue[bluebottom++]= xcolor.pixel & visual->blue_mask; } + break; } - break; - - default: /* Not TrueColor or DirectColor */ - - ximageinfo->index= (Pixel *)lmalloc(sizeof(Pixel) * (image->rgb.used+NOFLASH_COLORS)); + case PseudoColor: - /* get the colormap to use. - */ + ximageinfo->index= (Pixel *)lmalloc(sizeof(Pixel) * (image->rgb.used+NOFLASH_COLORS)); - ximageinfo->cmap = our_default_cmap; - /* allocate colors shareable (if we can) - */ - - for (a= 0; a < image->rgb.used; a++) - { - int i; - XColor xcolor2; - - xcolor.red= *(image->rgb.red + a); - xcolor.green= *(image->rgb.green + a); - xcolor.blue= *(image->rgb.blue + a); - - for (i=max_cmap_entries-1; i>=free_cmap_entries; i--) - { - xcolor2.pixel = *(our_default_index + i); - XQueryColor(disp, ximageinfo->cmap, &xcolor2); - - if ((xcolor.red >> 8) == (xcolor2.red >> 8) && - (xcolor.green >> 8) == (xcolor2.green >> 8) && - (xcolor.blue >> 8) == (xcolor2.blue >> 8)) - break; - } + /* get the colormap to use. + */ - use_cmap_entry = i; + ximageinfo->cmap = our_default_cmap; - if (use_cmap_entry < free_cmap_entries) - free_cmap_entries--; + /* allocate colors shareable (if we can) + */ - if (free_cmap_entries < 0) + for (a = 0; a < image->rgb.used; a++) { - printf("imageToXImage: too many global colors!\n"); - exit(0); + int i; + XColor xcolor2; + + xcolor2.flags = DoRed | DoGreen | DoBlue; + + xcolor.red= *(image->rgb.red + a); + xcolor.green= *(image->rgb.green + a); + xcolor.blue= *(image->rgb.blue + a); + + /* look if this color already exists in our colormap */ + + #if 0 + for (i=max_cmap_entries-1; i>=free_cmap_entries; i--) + + #else + for (i=max_cmap_entries-1; i>=0; i--) + { + /* + if (!pixel_used[i]) + continue; + */ + #endif + + xcolor2.pixel = *(our_default_index + i); + + #if 0 + XQueryColor(disp, ximageinfo->cmap, &xcolor2); + #else + xcolor2 = xcolor_used[xcolor2.pixel]; + #endif + + if ((xcolor.red >> 8) == (xcolor2.red >> 8) && + (xcolor.green >> 8) == (xcolor2.green >> 8) && + (xcolor.blue >> 8) == (xcolor2.blue >> 8)) + break; + } + + use_cmap_entry = i; + + if (0 && use_cmap_entry < free_cmap_entries) /* not found in colormap */ + { + free_cmap_entries--; + } + else if (0 && use_cmap_entry < free_cmap_entries) /* not found in colormap */ + { + } + else if (use_cmap_entry < 0) /* not found in colormap */ + { + /* look for an existing 'unused' color near the one we want */ + + for (i=free_cmap_entries-1; i>=0; i--) + { + int closeness = 14; + + if (pixel_used[i]) + continue; + + xcolor2.pixel = *(our_default_index + i); + + #if 0 + XQueryColor(disp, ximageinfo->cmap, &xcolor2); + #else + xcolor2 = xcolor_used[xcolor2.pixel]; + #endif + + + if ((xcolor.red >> closeness) == (xcolor2.red >> closeness) && + (xcolor.green >> closeness) == (xcolor2.green >> closeness) && + (xcolor.blue >> closeness) == (xcolor2.blue >> closeness)) + break; + } + + use_cmap_entry = i; + + if (use_cmap_entry < 0) /* no 'near' color found */ + { + /* look for the next free color */ + + while (pixel_used[--free_cmap_entries]) + ; + use_cmap_entry = free_cmap_entries; + } + } + + if (free_cmap_entries < 0) + { + printf("imageToXImage: too many global colors!\n"); + exit(0); + } + + + /* + printf("--> eating color %d\n", use_cmap_entry); + */ + + + + xcolor.pixel = use_cmap_entry; + + xcolor_used[xcolor.pixel] = xcolor; + + *(ximageinfo->index + a) = xcolor.pixel; + + XStoreColor(disp, ximageinfo->cmap, &xcolor); + + pixel_used[use_cmap_entry] = 1; } + + ximageinfo->no = a; /* number of pixels allocated in default visual */ - xcolor.pixel = use_cmap_entry; - *(ximageinfo->index + a) = xcolor.pixel; - XStoreColor(disp, ximageinfo->cmap, &xcolor); - } - - ximageinfo->no = a; /* number of pixels allocated in default visual */ + /* + printf("still %d free colormap entries\n", free_cmap_entries); + */ - printf("still %d free colormap entries\n", free_cmap_entries); + break; + + default: + printf("Sorry, only DirectColor, TrueColor and PseudoColor supported\n"); + exit(0); + break; } @@ -651,8 +748,10 @@ XImageInfo *imageToXImage(Display *disp, * we have. */ + /* printf(" Building XImage..."); fflush(stdout); + */ switch (image->type) { @@ -779,7 +878,9 @@ XImageInfo *imageToXImage(Display *disp, } } + /* printf("done\n"); + */ if (redvalue) {