rnd-20020803-1-src
[rocksndiamonds.git] / src / libgame / image.c
index ef2898e25b258478bca80bf61a6f595480931d8e..8299ad2b400e1ec20907442d04f575582d9ac830 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2001 Artsoft Entertainment                      *
+* (c) 1994-2002 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -175,9 +175,13 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
   XImage *ximage;
   XImageInfo *ximageinfo;
   byte *src_ptr, *dst_ptr;
+  char *error = "Image_to_Pixmap(): %s";
 
   if (image->type == IMAGETYPE_TRUECOLOR && depth == 8)
-    Error(ERR_EXIT, "cannot handle true-color images on 8-bit display");
+  {
+    SetError(error, "cannot handle true-color images on 8-bit display");
+    return NULL;
+  }
 
   if (!global_cmap)
   {
@@ -241,6 +245,7 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
       bluestep = 256 / bluecolors;
       redbottom = greenbottom = bluebottom = 0;
       redtop = greentop = bluetop = 0;
+
       for (a=0; a<visual->map_entries; a++)
       {
        if (redbottom < 256)
@@ -271,10 +276,12 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
          /* something completely unexpected happened */
 
          fprintf(stderr, "Image_to_Pixmap: XAllocColor failed on a TrueColor/Directcolor visual\n");
+
           free(redvalue);
           free(greenvalue);
           free(bluevalue);
           free(ximageinfo);
+
          return NULL;
        }
 
@@ -287,6 +294,7 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
        while ((bluebottom < 256) && (bluebottom < bluetop))
          bluevalue[bluebottom++] = xcolor.pixel & visual->blue_mask;
       }
+
       break;
     }
 
@@ -392,7 +400,10 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
          }
 
          if (!color_found)             /* no more free color cells */
-           Error(ERR_EXIT, "cannot allocate enough color cells");
+         {
+           SetError(error, "cannot allocate enough color cells");
+           return NULL;
+         }
 
          xcolor.pixel = xcolor2.pixel;
          xcolor_private[xcolor.pixel] = xcolor;
@@ -412,9 +423,10 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
       break;
   
     default:
-      Error(ERR_RETURN, "display class not supported");
-      Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
-      break;
+      Error(ERR_RETURN,"DirectColor, TrueColor or PseudoColor display needed");
+      SetError(error, "display class not supported");
+
+      return NULL;
   }
 
 #if DEBUG_TIMING
@@ -460,6 +472,7 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
              dst_ptr += display_bytes_per_pixel;
            }
          }
+
          break;
        }
 
@@ -479,14 +492,17 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
              dst_ptr += display_bytes_per_pixel;
            }
          }
+
          break;
        }
 
         default:
-         Error(ERR_RETURN, "image type not supported");
-         Error(ERR_EXIT, "RGB or TrueColor image needed");
-         break;
+         Error(ERR_RETURN, "RGB or TrueColor image needed");
+         SetError(error, "image type not supported");
+
+         return NULL;
       }
+
       break;
     }
 
@@ -510,13 +526,15 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
          }
        }
       }
+
       break;
     }
 
     default:
-      Error(ERR_RETURN, "display class not supported");
-      Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
-      break;
+      Error(ERR_RETURN,"DirectColor, TrueColor or PseudoColor display needed");
+      SetError(error, "display class not supported");
+
+      return NULL;
   }
 
   if (redvalue)
@@ -537,11 +555,9 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
   XPutImage(ximageinfo->display, ximageinfo->pixmap, gc,
            ximage, 0, 0, 0, 0, ximage->width, ximage->height);
 
-  free(ximage->data);
-  ximage->data = NULL;
   XDestroyImage(ximage);
 
-  return(ximageinfo);
+  return ximageinfo;
 }
 
 void freeXImage(Image *image, XImageInfo *ximageinfo)
@@ -586,7 +602,11 @@ int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
   /* convert image structure to X11 Pixmap */
   if (!(ximageinfo = Image_to_Pixmap(display, screen, visual,
                                     window, gc, depth, image)))
-    Error(ERR_EXIT, "cannot convert Image to Pixmap");
+  {
+    freeImage(image);
+
+    return PCX_OtherError;
+  }
 
   /* if a private colormap has been created, install it */
   if (ximageinfo->cmap != DefaultColormap(display, screen))
@@ -606,6 +626,10 @@ int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
   *pixmap = ximageinfo->pixmap;
   *pixmap_mask = ximageinfo->pixmap_mask;
 
+  /* free generic image and ximageinfo after native Pixmap has been created */
+  free(ximageinfo);
+  freeImage(image);
+
   return PCX_Success;
 }