* image.c *
***********************************************************/
+#if defined(TARGET_X11)
+
#include "image.h"
+#include "pcx.h"
#include "misc.h"
+/* for MS-DOS/Allegro, exclude all except newImage() and freeImage() */
-#ifdef DEBUG
+Image *newImage(unsigned int width, unsigned int height, unsigned int depth)
+{
+ Image *image;
+ const unsigned int bytes_per_pixel = 1;
+ int i;
-#define DEBUG_TIMING
+ if (depth > 8)
+ Error(ERR_EXIT, "images with more than 256 colors are not supported");
-#endif
+ depth = 8;
+ image = checked_malloc(sizeof(Image));
+ image->data = checked_malloc(width * height * bytes_per_pixel);
+ image->width = width;
+ image->height = height;
+ image->depth = depth;
+ image->rgb.used = 0;
+ for (i=0; i<MAX_COLORS; i++)
+ image->rgb.color_used[i] = FALSE;
-#ifdef DEBUG_TIMING
- long count1, count2;
-#endif
+ return image;
+}
+
+void freeImage(Image *image)
+{
+ free(image->data);
+ free(image);
+}
+#if defined(PLATFORM_UNIX)
/* extra colors to try allocating in private color maps to minimize flashing */
#define NOFLASH_COLORS 256
static Pixmap Image_to_Mask(Image *image, Display *display, Window window)
{
- unsigned char *src_ptr, *dst_ptr, *dst_ptr2;
+ byte *src_ptr, *dst_ptr, *dst_ptr2;
unsigned int bytes_per_row;
unsigned int x, y;
- unsigned char bitmask;
+ byte bitmask;
byte *mask_data;
Pixmap mask_pixmap;
dst_ptr += bytes_per_row; /* continue with leftmost byte of next row */
}
- mask_pixmap = XCreateBitmapFromData(display, window, mask_data,
+ mask_pixmap = XCreateBitmapFromData(display, window, (char *)mask_data,
image->width, image->height);
free(mask_data);
return mask_pixmap;
}
-/* find the best pixmap depth supported by the server for a particular
- visual and return that depth */
-
-static unsigned int bitsPerPixelAtDepth(Display *display, int screen,
- unsigned int depth)
+static int bitsPerPixelAtDepth(Display *display, int screen, int depth)
{
- XPixmapFormatValues *xf;
- int nxf, a;
+ XPixmapFormatValues *pixmap_format;
+ int i, num_pixmap_formats, bits_per_pixel = -1;
- xf = XListPixmapFormats(display, &nxf);
- for (a = 0; a < nxf; a++)
- {
- if (xf[a].depth == depth)
- {
- int bpp;
- bpp = xf[a].bits_per_pixel;
- XFree(xf);
- return (unsigned int) bpp;
- }
- }
- XFree(xf);
+ /* get Pixmap formats supported by the X server */
+ pixmap_format = XListPixmapFormats(display, &num_pixmap_formats);
- /* this should never happen; if it does, we're in trouble */
- Error(ERR_EXIT, "bitsPerPixelAtDepth: can't find pixmap depth info");
- return 0; /* never reached -- just to make gcc happy */
+ /* find format that matches the given depth */
+ for (i=0; i<num_pixmap_formats; i++)
+ if (pixmap_format[i].depth == depth)
+ bits_per_pixel = pixmap_format[i].bits_per_pixel;
+
+ XFree(pixmap_format);
+
+ if (bits_per_pixel == -1)
+ Error(ERR_EXIT, "cannot find pixmap format for depth %d", depth);
+
+ return bits_per_pixel;
}
XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual,
- Window window, GC gc,
- unsigned int depth, Image *image)
+ Window window, GC gc, int depth, Image *image)
{
static XColor xcolor_private[NOFLASH_COLORS];
static int colorcell_used[NOFLASH_COLORS];
redvalue = greenvalue = bluevalue = NULL;
ximageinfo = checked_malloc(sizeof(XImageInfo));
ximageinfo->display = display;
- ximageinfo->screen = screen;
ximageinfo->depth = depth;
switch (visual->class)
break;
default:
- Error(ERR_RETURN, "display type not supported");
+ Error(ERR_RETURN, "display class not supported");
Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
break;
}
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf(" CONVERTING IMAGE TO XIMAGE (IMAGE COLORMAP) IN %.2f SECONDS\n",
- (float)(count2-count1)/1000.0);
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(2, " ALLOCATING IMAGE COLORS: ");
#endif
/* create XImage from internal image structure and convert it to Pixmap */
ximage->byte_order = MSBFirst;
src_ptr = image->data;
- dst_ptr = ximage->data;
+ dst_ptr = (byte *)ximage->data;
switch (visual->class)
{
}
default:
- Error(ERR_RETURN, "display type not supported");
+ Error(ERR_RETURN, "display class not supported");
Error(ERR_EXIT, "DirectColor, TrueColor or PseudoColor display needed");
break;
}
free((byte *)bluevalue);
}
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf(" CONVERTING IMAGE TO XIMAGE IN %.2f SECONDS\n",
- (float)(count2-count1)/1000.0);
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(2, " CONVERTING IMAGE TO XIMAGE:");
#endif
ximageinfo->pixmap = XCreatePixmap(display, window,
free(ximageinfo);
}
-Image *newImage(unsigned int width, unsigned int height, unsigned int depth)
-{
- Image *image;
- const unsigned int bytes_per_pixel = 1;
- int i;
-
- if (depth > 8)
- Error(ERR_EXIT, "images with more than 256 colors are not supported");
-
- depth = 8;
- image = checked_malloc(sizeof(Image));
- image->data = checked_malloc(width * height * bytes_per_pixel);
- image->width = width;
- image->height = height;
- image->depth = depth;
- image->rgb.used = 0;
- for (i=0; i<MAX_COLORS; i++)
- image->rgb.color_used[i] = FALSE;
-
- return image;
-}
-
-void freeImage(Image *image)
-{
- free(image->data);
- free(image);
-}
-
-int Read_PCX_to_Pixmaps(Display *display, Window window, GC gc, char *filename,
- Pixmap *pixmap, Pixmap *pixmap_mask)
+int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
+ Pixmap *pixmap, Pixmap *pixmap_mask)
{
Image *image;
XImageInfo *ximageinfo;
int screen;
Visual *visual;
- unsigned int depth;
+ int depth;
-#ifdef DEBUG_TIMING
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(2, NULL); /* initialize timestamp function */
#endif
/* read the graphic file in PCX format to image structure */
if ((image = Read_PCX_to_Image(filename)) == NULL)
- return PCX_FileInvalid;
+ return errno_pcx;
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf(" LOADING '%s' IN %.2f SECONDS\n",
- filename, (float)(count2-count1)/1000.0);
- count1 = Counter();
+#if DEBUG_TIMING
+ printf("%s:\n", filename);
+ debug_print_timestamp(2, " READING PCX FILE TO IMAGE: ");
#endif
screen = DefaultScreen(display);
if (ximageinfo->cmap != DefaultColormap(display, screen))
XSetWindowColormap(display, window, ximageinfo->cmap);
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf(" CONVERTING IMAGE TO PIXMAP IN %.2f SECONDS\n",
- (float)(count2-count1)/1000.0);
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(2, " CONVERTING IMAGE TO PIXMAP:");
#endif
/* create clip mask for the image */
ximageinfo->pixmap_mask = Image_to_Mask(image, display, window);
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf(" CONVERTING IMAGE TO MASK IN %.2f SECONDS\n",
- (float)(count2-count1)/1000.0);
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(2, " CONVERTING IMAGE TO MASK: ");
#endif
*pixmap = ximageinfo->pixmap;
*pixmap_mask = ximageinfo->pixmap_mask;
- return(PCX_Success);
+ return PCX_Success;
}
+
+#endif /* PLATFORM_UNIX */
+#endif /* TARGET_X11 */