+
+
+
+/* this table is useful for quick conversions between depth and ncolors
+ */
+
+unsigned long DepthToColorsTable[] =
+{
+ /* 0 */ 1,
+ /* 1 */ 2,
+ /* 2 */ 4,
+ /* 3 */ 8,
+ /* 4 */ 16,
+ /* 5 */ 32,
+ /* 6 */ 64,
+ /* 7 */ 128,
+ /* 8 */ 256,
+ /* 9 */ 512,
+ /* 10 */ 1024,
+ /* 11 */ 2048,
+ /* 12 */ 4096,
+ /* 13 */ 8192,
+ /* 14 */ 16384,
+ /* 15 */ 32768,
+ /* 16 */ 65536,
+ /* 17 */ 131072,
+ /* 18 */ 262144,
+ /* 19 */ 524288,
+ /* 20 */ 1048576,
+ /* 21 */ 2097152,
+ /* 22 */ 4194304,
+ /* 23 */ 8388608,
+ /* 24 */ 16777216
+};
+
+void newRGBMapData(RGBMap *rgb, unsigned int size)
+{
+ rgb->used = 0;
+ rgb->size = size;
+ rgb->compressed = FALSE;
+ rgb->red = (Intensity *)checked_malloc(sizeof(Intensity) * size);
+ rgb->green = (Intensity *)checked_malloc(sizeof(Intensity) * size);
+ rgb->blue = (Intensity *)checked_malloc(sizeof(Intensity) * size);
+}
+
+void freeRGBMapData(RGBMap *rgb)
+{
+ free((byte *)rgb->red);
+ free((byte *)rgb->green);
+ free((byte *)rgb->blue);
+}
+
+Image *newBitImage(unsigned int width, unsigned int height)
+{
+ Image *image;
+ unsigned int linelen;
+
+ image = (Image *)checked_malloc(sizeof(Image));
+ image->type = IBITMAP;
+ newRGBMapData(&(image->rgb), (unsigned int)2);
+ *(image->rgb.red)= *(image->rgb.green) = *(image->rgb.blue)= 65535;
+ *(image->rgb.red + 1)= *(image->rgb.green + 1) = *(image->rgb.blue + 1)= 0;
+ image->rgb.used = 2;
+ image->width = width;
+ image->height = height;
+ image->depth = 1;
+ linelen = ((width + 7) / 8);
+ image->data = (unsigned char *)checked_calloc(linelen * height);
+ return(image);
+}
+
+Image *newRGBImage(unsigned int width, unsigned int height, unsigned int depth)
+{
+ Image *image;
+ unsigned int pixlen, numcolors;
+
+ if (depth == 0) /* special case for `zero' depth image, which is */
+ depth = 1; /* sometimes interpreted as `one color' */
+ pixlen = ((depth+7) / 8);
+ numcolors = depthToColors(depth);
+ image = (Image *)checked_malloc(sizeof(Image));
+ image->type = IRGB;
+ newRGBMapData(&(image->rgb), numcolors);
+ image->width = width;
+ image->height = height;
+ image->depth = depth;
+ image->pixlen = pixlen;
+ image->data = (unsigned char *)checked_malloc(width * height * pixlen);
+ return(image);
+}
+
+void freeImageData(Image *image)
+{
+ freeRGBMapData(&(image->rgb));
+ free(image->data);
+}
+
+void freeImage(Image *image)
+{
+ freeImageData(image);
+ free((byte *)image);
+}