X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fglyphs-eimage.c;h=c4daa12e2c00035f216a47eebcc2aeb4f8c96afb;hb=55de37d925f441d9d66aaaee6770bc8064d5d5e0;hp=3308449a24fc450a2dba053dd3252be382aa93fd;hpb=dbf2768f7b146e97e37a27316f70bb313f1acf15;p=chise%2Fxemacs-chise.git.1 diff --git a/src/glyphs-eimage.c b/src/glyphs-eimage.c index 3308449..c4daa12 100644 --- a/src/glyphs-eimage.c +++ b/src/glyphs-eimage.c @@ -49,15 +49,15 @@ Boston, MA 02111-1307, USA. */ #include "lstream.h" #include "console.h" #include "device.h" -#include "faces.h" #include "glyphs.h" #include "objects.h" #include "buffer.h" #include "frame.h" +#include "insdel.h" #include "opaque.h" -#include "window.h" +#include "imgproc.h" #include "sysfile.h" #ifdef HAVE_PNG @@ -75,6 +75,16 @@ extern "C" { #include "file-coding.h" #endif +#if INTBITS == 32 +# define FOUR_BYTE_TYPE unsigned int +#elif LONGBITS == 32 +# define FOUR_BYTE_TYPE unsigned long +#elif SHORTBITS == 32 +# define FOUR_BYTE_TYPE unsigned short +#else +#error What kind of strange-ass system are we running on? +#endif + #ifdef HAVE_TIFF DEFINE_IMAGE_INSTANTIATOR_FORMAT (tiff); Lisp_Object Qtiff; @@ -119,8 +129,7 @@ jpeg_validate (Lisp_Object instantiator) } static Lisp_Object -jpeg_normalize (Lisp_Object inst, Lisp_Object console_type, - Lisp_Object dest_mask) +jpeg_normalize (Lisp_Object inst, Lisp_Object console_type) { return simple_image_type_normalize (inst, console_type, Qjpeg); } @@ -234,7 +243,7 @@ our_skip_input_data (j_decompress_ptr cinfo, long num_bytes) if (!src) { return; - } else if (num_bytes > (long) src->bytes_in_buffer) + } else if (num_bytes > src->bytes_in_buffer) { ERREXIT(cinfo, JERR_INPUT_EOF); /*NOTREACHED*/ @@ -316,7 +325,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); /* It is OK for the unwind data to be local to this function, because the unwind-protect is always executed when this stack frame is still valid. */ @@ -374,13 +383,13 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - const Extbyte *bytes; + CONST Extbyte *bytes; Extcount len; /* #### This is a definite problem under Mule due to the amount of stack data it might allocate. Need to be able to convert and write out to a file. */ - TO_EXTERNAL_FORMAT (LISP_STRING, data, ALLOCA, (bytes, len), Qbinary); + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); jpeg_memory_src (&cinfo, (JOCTET *) bytes, len); } @@ -409,7 +418,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, { /* we're relying on the jpeg driver to do any other conversions, or signal an error if the conversion isn't supported. */ - cinfo.out_color_space = JCS_RGB; + cinfo.out_color_space = JCS_RGB; } /* Step 5: Start decompressor */ @@ -444,7 +453,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, */ while (cinfo.output_scanline < cinfo.output_height) { - unsigned int i; + int i; /* jpeg_read_scanlines expects an array of pointers to scanlines. * Here the array is only one element long, but you could ask for @@ -455,7 +464,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, for (i = 0; i < cinfo.output_width; i++) { int clr; - if (jpeg_gray) + if (jpeg_gray) { unsigned char val; #if (BITS_IN_JSAMPLE == 8) @@ -482,10 +491,10 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, /* Step 6.5: Create the pixmap and set up the image instance */ /* now instantiate */ - MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), + MAYBE_DEVMETH (XDEVICE (ii->device), init_image_instance_from_eimage, - (ii, cinfo.output_width, cinfo.output_height, 1, - unwind.eimage, dest_mask, + (ii, cinfo.output_width, cinfo.output_height, + unwind.eimage, dest_mask, instantiator, domain)); /* Step 7: Finish decompression */ @@ -507,7 +516,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, * GIF * **********************************************************************/ -#include "gifrlib.h" +#include static void gif_validate (Lisp_Object instantiator) @@ -516,8 +525,7 @@ gif_validate (Lisp_Object instantiator) } static Lisp_Object -gif_normalize (Lisp_Object inst, Lisp_Object console_type, - Lisp_Object dest_mask) +gif_normalize (Lisp_Object inst, Lisp_Object console_type) { return simple_image_type_normalize (inst, console_type, Qgif); } @@ -567,9 +575,9 @@ static size_t gif_read_from_memory(GifByteType *buf, size_t size, VoidPtr data) { gif_memory_storage *mem = (gif_memory_storage*)data; - - if ((ssize_t) size > (mem->len - mem->index)) - return (size_t) -1; + + if (size > (mem->len - mem->index)) + return -1; memcpy(buf, mem->bytes + mem->index, size); mem->index = mem->index + size; return size; @@ -583,12 +591,12 @@ gif_memory_close(VoidPtr data) struct gif_error_struct { - const char *err_str; /* return the error string */ + CONST char *err_str; /* return the error string */ jmp_buf setjmp_buffer; /* for return to caller */ }; static void -gif_error_func(const char *err_str, VoidPtr error_ptr) +gif_error_func(CONST char *err_str, VoidPtr error_ptr) { struct gif_error_struct *error_data = (struct gif_error_struct*)error_ptr; @@ -602,7 +610,7 @@ gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); /* It is OK for the unwind data to be local to this function, because the unwind-protect is always executed when this stack frame is still valid. */ @@ -614,20 +622,20 @@ gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Extcount len; int height = 0; int width = 0; - + xzero (unwind); record_unwind_protect (gif_instantiate_unwind, make_opaque_ptr (&unwind)); - + /* 1. Now decode the data. */ - + { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - + assert (!NILP (data)); - + if (!(unwind.giffile = GifSetup())) - signal_image_error ("Insufficient memory to instantiate GIF image", instantiator); - + signal_image_error ("Insufficent memory to instantiate GIF image", instantiator); + /* set up error facilities */ if (setjmp(gif_err.setjmp_buffer)) { @@ -638,109 +646,76 @@ gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, signal_image_error_2 ("GIF decoding error", errstring, instantiator); } GifSetErrorFunc(unwind.giffile, (Gif_error_func)gif_error_func, (VoidPtr)&gif_err); - - TO_EXTERNAL_FORMAT (LISP_STRING, data, ALLOCA, (bytes, len), Qbinary); + + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); mem_struct.bytes = bytes; mem_struct.len = len; mem_struct.index = 0; GifSetReadFunc(unwind.giffile, gif_read_from_memory, (VoidPtr)&mem_struct); GifSetCloseFunc(unwind.giffile, gif_memory_close, (VoidPtr)&mem_struct); DGifInitRead(unwind.giffile); - + /* Then slurp the image into memory, decoding along the way. The result is the image in a simple one-byte-per-pixel format (#### the GIF routines only support 8-bit GIFs, it appears). */ DGifSlurp (unwind.giffile); } - - /* 3. Now create the EImage(s) */ + + /* 3. Now create the EImage */ { ColorMapObject *cmo = unwind.giffile->SColorMap; - int i, j, row, pass, interlace, slice; + int i, j, row, pass, interlace; unsigned char *eip; /* interlaced gifs have rows in this order: 0, 8, 16, ..., 4, 12, 20, ..., 2, 6, 10, ..., 1, 3, 5, ... */ static int InterlacedOffset[] = { 0, 4, 2, 1 }; static int InterlacedJumps[] = { 8, 8, 4, 2 }; - + height = unwind.giffile->SHeight; width = unwind.giffile->SWidth; - unwind.eimage = (unsigned char*) - xmalloc (width * height * 3 * unwind.giffile->ImageCount); + unwind.eimage = (unsigned char*) xmalloc (width * height * 3); if (!unwind.eimage) signal_image_error("Unable to allocate enough memory for image", instantiator); - + /* write the data in EImage format (8bit RGB triples) */ - - for (slice = 0; slice < unwind.giffile->ImageCount; slice++) + + /* Note: We just use the first image in the file and ignore the rest. + We check here that that image covers the full "screen" size. + I don't know whether that's always the case. + -dkindred@cs.cmu.edu */ + if (unwind.giffile->SavedImages[0].ImageDesc.Height != height + || unwind.giffile->SavedImages[0].ImageDesc.Width != width + || unwind.giffile->SavedImages[0].ImageDesc.Left != 0 + || unwind.giffile->SavedImages[0].ImageDesc.Top != 0) + signal_image_error ("First image in GIF file is not full size", + instantiator); + + interlace = unwind.giffile->SavedImages[0].ImageDesc.Interlace; + pass = 0; + row = interlace ? InterlacedOffset[pass] : 0; + eip = unwind.eimage; + for (i = 0; i < height; i++) { - /* We check here that the current image covers the full "screen" size. */ - if (unwind.giffile->SavedImages[slice].ImageDesc.Height != height - || unwind.giffile->SavedImages[slice].ImageDesc.Width != width - || unwind.giffile->SavedImages[slice].ImageDesc.Left != 0 - || unwind.giffile->SavedImages[slice].ImageDesc.Top != 0) - signal_image_error ("Image in GIF file is not full size", - instantiator); - - interlace = unwind.giffile->SavedImages[slice].ImageDesc.Interlace; - pass = 0; - row = interlace ? InterlacedOffset[pass] : 0; - eip = unwind.eimage + (width * height * 3 * slice); - for (i = 0; i < height; i++) + if (interlace && row >= height) + row = InterlacedOffset[++pass]; + eip = unwind.eimage + (row * width * 3); + for (j = 0; j < width; j++) { - if (interlace) - if (row >= height) { - row = InterlacedOffset[++pass]; - while (row >= height) - row = InterlacedOffset[++pass]; - } - eip = unwind.eimage + (width * height * 3 * slice) + (row * width * 3); - for (j = 0; j < width; j++) - { - unsigned char pixel = - unwind.giffile->SavedImages[slice].RasterBits[(i * width) + j]; - *eip++ = cmo->Colors[pixel].Red; - *eip++ = cmo->Colors[pixel].Green; - *eip++ = cmo->Colors[pixel].Blue; - } - row += interlace ? InterlacedJumps[pass] : 1; + unsigned char pixel = unwind.giffile->SavedImages[0].RasterBits[(i * width) + j]; + *eip++ = cmo->Colors[pixel].Red; + *eip++ = cmo->Colors[pixel].Green; + *eip++ = cmo->Colors[pixel].Blue; } + row += interlace ? InterlacedJumps[pass] : 1; } - - /* now instantiate */ - MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), - init_image_instance_from_eimage, - (ii, width, height, unwind.giffile->ImageCount, unwind.eimage, dest_mask, - instantiator, domain)); } - - /* We read the gif successfully. If we have more than one slice then - animate the gif. */ - if (unwind.giffile->ImageCount > 1) - { - /* See if there is a timeout value. In theory there could be one - for every image - but that makes the implementation way to - complicated for now so we just take the first. */ - unsigned short timeout = 0; - Lisp_Object tid; - - if (unwind.giffile->SavedImages[0].Function == GRAPHICS_EXT_FUNC_CODE - && - unwind.giffile->SavedImages[0].ExtensionBlockCount) - { - timeout = (unsigned short) - ((unwind.giffile->SavedImages[0].ExtensionBlocks[0].Bytes[2] << 8) + - unwind.giffile-> SavedImages[0].ExtensionBlocks[0].Bytes[1]) * 10; - } - - /* Too short a timeout will crucify us performance-wise. */ - tid = add_glyph_animated_timeout (timeout > 10 ? timeout : 10, image_instance); - - if (!NILP (tid)) - IMAGE_INSTANCE_PIXMAP_TIMEOUT (ii) = XINT (tid); - } - + /* now instantiate */ + MAYBE_DEVMETH (XDEVICE (ii->device), + init_image_instance_from_eimage, + (ii, width, height, unwind.eimage, dest_mask, + instantiator, domain)); + unbind_to (speccount, Qnil); } @@ -759,8 +734,7 @@ png_validate (Lisp_Object instantiator) } static Lisp_Object -png_normalize (Lisp_Object inst, Lisp_Object console_type, - Lisp_Object dest_mask) +png_normalize (Lisp_Object inst, Lisp_Object console_type) { return simple_image_type_normalize (inst, console_type, Qpng); } @@ -773,7 +747,7 @@ png_possible_dest_types (void) struct png_memory_storage { - const Extbyte *bytes; /* The data */ + CONST Extbyte *bytes; /* The data */ Extcount len; /* How big is it? */ int index; /* Where are we? */ }; @@ -785,7 +759,7 @@ png_read_from_memory(png_structp png_ptr, png_bytep data, struct png_memory_storage *tbr = (struct png_memory_storage *) png_get_io_ptr (png_ptr); - if ((ssize_t) length > (tbr->len - tbr->index)) + if (length > (tbr->len - tbr->index)) png_error (png_ptr, (png_const_charp) "Read Error"); memcpy (data,tbr->bytes + tbr->index,length); tbr->index = tbr->index + length; @@ -793,13 +767,13 @@ png_read_from_memory(png_structp png_ptr, png_bytep data, struct png_error_struct { - const char *err_str; + CONST char *err_str; jmp_buf setjmp_buffer; /* for return to caller */ }; /* jh 98/03/12 - #### AARRRGH! libpng includes jmp_buf inside its own structure, and there are cases where the size can be different from - between inside the library, and inside the code! To do an end run + between inside the libarary, and inside the code! To do an end run around this, use our own error functions, and don't rely on things passed in the png_ptr to them. This is an ugly hack and must go away when the lisp engine is threaded! */ @@ -838,8 +812,6 @@ png_instantiate_unwind (Lisp_Object unwind_obj) if (data->instream) fclose (data->instream); - if (data->eimage) xfree(data->eimage); - return Qnil; } @@ -848,7 +820,7 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); struct png_unwind_data unwind; int speccount = specpdl_depth (); int height, width; @@ -869,7 +841,7 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, png_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL); signal_image_error ("Error obtaining memory for png_read", instantiator); } - + xzero (unwind); unwind.png_ptr = png_ptr; unwind.info_ptr = info_ptr; @@ -884,7 +856,7 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, and is no longer usable for previous versions. jh */ - /* Set the jmp_buf return context for png_error ... if this returns !0, then + /* Set the jmp_buf reurn context for png_error ... if this returns !0, then we ran into a problem somewhere, and need to clean up after ourselves. */ if (setjmp (png_err_stct.setjmp_buffer)) { @@ -897,14 +869,14 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, /* Initialize the IO layer and read in header information */ { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - const Extbyte *bytes; + CONST Extbyte *bytes; Extcount len; assert (!NILP (data)); /* #### This is a definite problem under Mule due to the amount of stack data it might allocate. Need to think about using Lstreams */ - TO_EXTERNAL_FORMAT (LISP_STRING, data, ALLOCA, (bytes, len), Qbinary); + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); tbr.bytes = bytes; tbr.len = len; tbr.index = 0; @@ -924,51 +896,15 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, /* libpng expects that the image buffer passed in contains a picture to draw on top of if the png has any transparencies. This could be a good place to pass that in... */ - + row_pointers = xnew_array (png_byte *, height); for (y = 0; y < height; y++) row_pointers[y] = unwind.eimage + (width * 3 * y); - { - /* if the png specifies a background chunk, go ahead and - use it, else use what we can get from the default face. */ - png_color_16 my_background, *image_background; - Lisp_Object bkgd = Qnil; - - my_background.red = 0x7fff; - my_background.green = 0x7fff; - my_background.blue = 0x7fff; - bkgd = FACE_BACKGROUND (Vdefault_face, domain); - if (!COLOR_INSTANCEP (bkgd)) - { - warn_when_safe (Qpng, Qinfo, "Couldn't get background color!"); - } - else - { - Lisp_Color_Instance *c; - Lisp_Object rgblist; - - c = XCOLOR_INSTANCE (bkgd); - rgblist = MAYBE_LISP_DEVMETH (XDEVICE (c->device), - color_instance_rgb_components, - (c)); - my_background.red = (unsigned short) XINT (XCAR (rgblist)); - my_background.green = (unsigned short) XINT (XCAR (XCDR (rgblist))); - my_background.blue = (unsigned short) XINT (XCAR (XCDR (XCDR (rgblist)))); - } - - if (png_get_bKGD (png_ptr, info_ptr, &image_background)) - png_set_background (png_ptr, image_background, - PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); - else - png_set_background (png_ptr, &my_background, - PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); - } - /* Now that we're using EImage, ask for 8bit RGB triples for any type of image*/ - /* convert palette images to full RGB */ + /* convert palatte images to full RGB */ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_set_expand (png_ptr); /* send grayscale images to RGB too */ @@ -978,6 +914,12 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, /* we can't handle alpha values */ if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) png_set_strip_alpha (png_ptr); + /* rip out any transparancy layers/colors */ + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) + { + png_set_expand (png_ptr); + png_set_strip_alpha (png_ptr); + } /* tell libpng to strip 16 bit depth files down to 8 bits */ if (info_ptr->bit_depth == 16) png_set_strip_16 (png_ptr); @@ -990,9 +932,28 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, png_set_packing (png_ptr); } +#if 1 /* tests? or permanent? */ + { + /* if the png specifies a background chunk, go ahead and + use it */ + png_color_16 my_background, *image_background; + + /* ### how do I get the background of the current frame? */ + my_background.red = 0x7fff; + my_background.green = 0x7fff; + my_background.blue = 0x7fff; + + if (png_get_bKGD (png_ptr, info_ptr, &image_background)) + png_set_background (png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background (png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } +#endif png_read_image (png_ptr, row_pointers); png_read_end (png_ptr, info_ptr); - + #ifdef PNG_SHOW_COMMENTS /* #### * I turn this off by default now, because the !%^@#!% comments @@ -1021,9 +982,9 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, } /* now instantiate */ - MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), + MAYBE_DEVMETH (XDEVICE (ii->device), init_image_instance_from_eimage, - (ii, width, height, 1, unwind.eimage, dest_mask, + (ii, width, height, unwind.eimage, dest_mask, instantiator, domain)); /* This will clean up everything else. */ @@ -1046,8 +1007,7 @@ tiff_validate (Lisp_Object instantiator) } static Lisp_Object -tiff_normalize (Lisp_Object inst, Lisp_Object console_type, - Lisp_Object dest_mask) +tiff_normalize (Lisp_Object inst, Lisp_Object console_type) { return simple_image_type_normalize (inst, console_type, Qtiff); } @@ -1128,7 +1088,7 @@ static toff_t tiff_memory_seek(thandle_t data, toff_t off, int whence) if ((newidx > mem->len) || (newidx < 0)) return -1; - + mem->index = newidx; return newidx; } @@ -1160,7 +1120,7 @@ tiff_memory_size(thandle_t data) struct tiff_error_struct { -#ifdef HAVE_VSNPRINTF +#if HAVE_VSNPRINTF char err_str[256]; #else char err_str[1024]; /* return the error string */ @@ -1175,12 +1135,12 @@ struct tiff_error_struct static struct tiff_error_struct tiff_err_data; static void -tiff_error_func(const char *module, const char *fmt, ...) +tiff_error_func(CONST char *module, CONST char *fmt, ...) { va_list vargs; va_start (vargs, fmt); -#ifdef HAVE_VSNPRINTF +#if HAVE_VSNPRINTF vsnprintf (tiff_err_data.err_str, 255, fmt, vargs); #else /* pray this doesn't overflow... */ @@ -1192,17 +1152,17 @@ tiff_error_func(const char *module, const char *fmt, ...) } static void -tiff_warning_func(const char *module, const char *fmt, ...) +tiff_warning_func(CONST char *module, CONST char *fmt, ...) { va_list vargs; -#ifdef HAVE_VSNPRINTF +#if HAVE_VSNPRINTF char warn_str[256]; #else char warn_str[1024]; #endif va_start (vargs, fmt); -#ifdef HAVE_VSNPRINTF +#if HAVE_VSNPRINTF vsnprintf (warn_str, 255, fmt, vargs); #else vsprintf (warn_str, fmt, vargs); @@ -1217,7 +1177,7 @@ tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); tiff_memory_storage mem_struct; /* It is OK for the unwind data to be local to this function, because the unwind-protect is always executed when this @@ -1228,7 +1188,7 @@ tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, xzero (unwind); record_unwind_protect (tiff_instantiate_unwind, make_opaque_ptr (&unwind)); - + /* set up error facilities */ if (setjmp (tiff_err_data.setjmp_buffer)) { @@ -1252,32 +1212,30 @@ tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, /* #### This is a definite problem under Mule due to the amount of stack data it might allocate. Think about Lstreams... */ - TO_EXTERNAL_FORMAT (LISP_STRING, data, - ALLOCA, (bytes, len), - Qbinary); + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); mem_struct.bytes = bytes; mem_struct.len = len; mem_struct.index = 0; - unwind.tiff = TIFFClientOpen ("memfile", "r", (thandle_t) &mem_struct, + unwind.tiff = TIFFClientOpen ("memfile", "r", &mem_struct, (TIFFReadWriteProc)tiff_memory_read, (TIFFReadWriteProc)tiff_memory_write, tiff_memory_seek, tiff_memory_close, tiff_memory_size, tiff_map_noop, tiff_unmap_noop); if (!unwind.tiff) - signal_image_error ("Insufficient memory to instantiate TIFF image", instantiator); + signal_image_error ("Insufficent memory to instantiate TIFF image", instantiator); TIFFGetField (unwind.tiff, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField (unwind.tiff, TIFFTAG_IMAGELENGTH, &height); unwind.eimage = (unsigned char *) xmalloc (width * height * 3); - /* #### This is little more than proof-of-concept/function testing. - It needs to be reimplemented via scanline reads for both memory + /* ### This is little more than proof-of-concept/function testing. + It needs to be reimplimented via scanline reads for both memory compactness. */ raster = (uint32*) _TIFFmalloc (width * height * sizeof (uint32)); if (raster != NULL) { - unsigned int i,j; + int i,j; uint32 *rp; ep = unwind.eimage; rp = raster; @@ -1304,9 +1262,9 @@ tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, } /* now instantiate */ - MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), + MAYBE_DEVMETH (XDEVICE (ii->device), init_image_instance_from_eimage, - (ii, width, height, 1, unwind.eimage, dest_mask, + (ii, width, height, unwind.eimage, dest_mask, instantiator, domain)); unbind_to (speccount, Qnil);