rnd-19980904
authorHolger Schemel <info@artsoft.org>
Fri, 4 Sep 1998 12:19:27 +0000 (14:19 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:30:32 +0000 (10:30 +0200)
src/gif.c
src/gifload.c
src/gifload.h
src/init.c
src/main.c
src/main.h
src/send.c

index 2462e1395500336e5c79de394232afbd78ca39ba..d8f56a4a2e176797b0b04cbf3a7e3cc4d8cc4203 100644 (file)
--- 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 :
index 89c06ae5d91a1c1154b76562dea1aaf1c07903bf..f26ba5a1702349551b61668052e84b0a4919bbef 100644 (file)
@@ -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;
 
index 060749675a2dd30ea3d4148f76a730d2da75b17e..ebc260ac3f852c3ee9073ff27e1c26bc09b9d116 100644 (file)
 #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
index 2eced3e30f9af07d0162b6b5c00012c125e80457..ebaeb4b180d987ae4245da094c3be32691344a2a 100644 (file)
@@ -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
index 2395ec1b708f19e5bacf74727bedb65f6239bee7..08ee469ef6738edae465790c08818f1aee52b2f8 100644 (file)
@@ -23,6 +23,7 @@
 #endif
 
 Display        *display;
+Visual        *visual;
 int            screen;
 Window         window;
 GC             gc, clip_gc[NUM_PIXMAPS];
index 5969bfc4508e7cafa1ba5a01f0ae5cdb5f3e5be9..11a80a88dfa3bbec349451fce56ade1fb7fc6226 100644 (file)
@@ -263,6 +263,7 @@ struct JoystickInfo
 };
 
 extern Display        *display;
+extern Visual         *visual;
 extern int             screen;
 extern Window                  window;
 extern GC              gc, clip_gc[];
index e8f0ffd99879a79deb3d372e513cf2662d72bb65..aa55152ea7fd0a21376ba96f3d4bca89e9d52de2 100644 (file)
@@ -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)
   {