--- imgJPEG.c	Thu Jun  9 06:36:41 2005
+++ imgJPEG.c	Thu Jun  9 20:27:11 2005
@@ -173,115 +173,4 @@
 		    j_common_ptr cinfo));
 static int	load_jpeg_library _ANSI_ARGS_((Tcl_Interp *interp));
-static int	CreateCompress _ANSI_ARGS_((j_compress_ptr, int, size_t));
-static int	CreateDecompress _ANSI_ARGS_((j_decompress_ptr, int, size_t));
-
-/*
- * Stuff to support dynamic loading of libjpeg
- */
-
-static struct JpegFunctions {
-    VOID *handle;
-    int (* abort_decompress) _ANSI_ARGS_((j_decompress_ptr));
-    int (* destroy_compress) _ANSI_ARGS_((j_compress_ptr));
-    int (* destroy_decompress) _ANSI_ARGS_((j_decompress_ptr));
-    int (* finish_compress) _ANSI_ARGS_((j_compress_ptr));
-    int (* finish_decompress) _ANSI_ARGS_((j_decompress_ptr));
-    int (* read_header) _ANSI_ARGS_((j_decompress_ptr, int));
-    JDIMENSION (* read_scanlines) _ANSI_ARGS_((j_decompress_ptr,
-			JSAMPARRAY, JDIMENSION));
-    boolean (* resync_to_restart) _ANSI_ARGS_((j_decompress_ptr, int));
-    int (* set_defaults) _ANSI_ARGS_((j_compress_ptr));
-    int (* start_compress) _ANSI_ARGS_((j_compress_ptr, int));
-    int (* start_decompress) _ANSI_ARGS_((j_decompress_ptr));
-    struct jpeg_error_mgr *(* std_error) _ANSI_ARGS_((struct jpeg_error_mgr *));
-    JDIMENSION (* write_scanlines) _ANSI_ARGS_((j_compress_ptr,
-			JSAMPARRAY, JDIMENSION));
-    int (* set_colorspace) _ANSI_ARGS_((j_compress_ptr, J_COLOR_SPACE));
-    int (* set_quality) _ANSI_ARGS_((j_compress_ptr, int, int));
-    int (* simple_progression) _ANSI_ARGS_((j_compress_ptr));
-    int (* CreateCompress) _ANSI_ARGS_((j_compress_ptr, int, size_t));
-    int (* CreateDecompress) _ANSI_ARGS_((j_decompress_ptr, int, size_t));
-    int (* create_compress) _ANSI_ARGS_((j_compress_ptr));
-    int (* create_decompress) _ANSI_ARGS_((j_decompress_ptr));
-    void (* destroy) _ANSI_ARGS_((j_common_ptr));
-    JDIMENSION (* write_raw_data) _ANSI_ARGS_((j_compress_ptr,
-	    JSAMPIMAGE, JDIMENSION));
-    void (* suppress_tables) _ANSI_ARGS_((j_compress_ptr, boolean));
-    void (* write_tables) _ANSI_ARGS_((j_compress_ptr));
-    JDIMENSION (* read_raw_data) _ANSI_ARGS_((j_decompress_ptr,
-	    JSAMPIMAGE, JDIMENSION));
-    void (* abort) _ANSI_ARGS_((j_common_ptr));
-} jpeg = {0};
-
-static char *symbols[] = {
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-    "jAbrtDecompress",
-    "jDestCompress",
-    "jDestDecompress",
-    "jFinCompress",
-    "jFinDecompress",
-    "jReadHeader",
-    "jReadScanlines",
-    "jResyncRestart",
-    "jSetDefaults",
-    "jStrtCompress",
-    "jStrtDecompress",
-    "jStdError",
-    "jWrtScanlines",
-    /*	the following 3 symbols are not crucial. They implement
-	resp. the "-grayscale", "-quality" and "-progressive"
-	options. If any of the symbols are missing from the
-	library, the corresponding option just has no effect. */
-    "jSetColorspace",
-    "jSetQuality",
-    "jSimProgress",
-    "jCreaCompress",
-    "jCreaDecompress",
-    "jCreaCompress",
-    "jCreaDecompress",
-    "jDestroy",
-    "jWrtRawData",
-    "jSuppressTables",
-    "jWrtTables",
-    "jReadRawData",
-    "jAbort",
-#else
-    "jpeg_abort_decompress",
-    "jpeg_destroy_compress",
-    "jpeg_destroy_decompress",
-    "jpeg_finish_compress",
-    "jpeg_finish_decompress",
-    "jpeg_read_header",
-    "jpeg_read_scanlines",
-    "jpeg_resync_to_restart",
-    "jpeg_set_defaults",
-    "jpeg_start_compress",
-    "jpeg_start_decompress",
-    "jpeg_std_error",
-    "jpeg_write_scanlines",
-    /*	the following 3 symbols are not crucial. They implement
-	resp. the "-grayscale", "-quality" and "-progressive"
-	options. If any of the symbols are missing from the
-	library, the corresponding option just has no effect. */
-    "jpeg_set_colorspace",
-    "jpeg_set_quality",
-    "jpeg_simple_progression",
-    /* In later versions, jpeg_create_compress and jpeg_create_decompress
-       are macros pointing to jpeg_CreateCompress and jpeg_CreateDecompres.
-       Which one is found depends on the version. */
-    "jpeg_CreateCompress",
-    "jpeg_CreateDecompress",
-    "jpeg_create_compress",
-    "jpeg_create_decompress",
-    "jpeg_destroy",
-    "jpeg_write_raw_data",
-    "jpeg_suppress_tables",
-    "jpeg_write_tables",
-    "jpeg_read_raw_data",
-    "jpeg_abort",
-#endif
-    (char *) NULL
-};
-
 
 static int
@@ -292,21 +181,10 @@
     struct my_error_mgr jerror;	/* for controlling libjpeg error handling */
     int i;
+    static int initialized;
 
-    if (ImgLoadLib(interp, JPEG_LIB_NAME, &jpeg.handle, symbols, 13)
-	    != TCL_OK) {
-	return TCL_ERROR;
-    }
-    if (jpeg.CreateCompress == NULL) {
-	if (jpeg.create_compress == NULL) {
-	    goto load_failed;
-	}
-	jpeg.CreateCompress = CreateCompress;
-    }
-    if (jpeg.CreateDecompress == NULL) {
-	if (jpeg.create_decompress == NULL) {
-	    goto load_failed;
-	}
-	jpeg.CreateDecompress = CreateDecompress;
-    }
+    if (initialized)
+	return TCL_OK;
+
+    initialized = 1;
 
     /* The followin code tries to determine if the JPEG library is
@@ -322,5 +200,5 @@
     cinfo = (struct jpeg_compress_struct *)
 	    ckalloc(8*sizeof(struct jpeg_compress_struct));
-    cinfo->err = jpeg.std_error(&jerror.pub);
+    cinfo->err = jpeg_std_error(&jerror.pub);
     jerror.pub.error_exit = my_error_exit;
     jerror.pub.output_message = my_output_message;
@@ -328,18 +206,16 @@
     if (setjmp(jerror.setjmp_buffer)) {
       /* If we get here, the JPEG library is invalid. */
-      jpeg.destroy_compress(cinfo);
+      jpeg_destroy_compress(cinfo);
       ckfree((char *)cinfo);
-load_failed:
       if (interp) {
-	Tcl_AppendResult(interp, "couldn't load \"", JPEG_LIB_NAME,
-		"\": please upgrade to at least version 6a", (char *) NULL);
+	Tcl_AppendResult(interp, "JPEG library mismatch, expecting \"",
+	    JPEG_LIB_NAME, NULL);
       }
-      ImgLoadFailed(&jpeg.handle);
       return TCL_ERROR;
     }
 
     /* Now we can initialize libjpeg. */
     ((char *) cinfo)[sizeof(struct jpeg_compress_struct)] = 53;
-    jpeg.CreateCompress(cinfo, JPEG_LIB_VERSION,
+    jpeg_CreateCompress(cinfo, JPEG_LIB_VERSION,
 			(size_t) sizeof(struct jpeg_compress_struct));
     if (((char *) cinfo)[sizeof(struct jpeg_compress_struct)] != 53) {
@@ -359,5 +235,5 @@
     cinfo->X_density = 0;
     cinfo->Y_density = 0;
-    jpeg.set_defaults(cinfo);
+    jpeg_set_defaults(cinfo);
 
     if ((cinfo->data_precision != BITS_IN_JSAMPLE) ||
@@ -375,5 +251,5 @@
 	}
     }
-    jpeg.destroy_compress(cinfo);
+    jpeg_destroy_compress(cinfo);
     ckfree((char *) cinfo);
     return TCL_OK;
@@ -383,13 +259,6 @@
 ImgLoadJpegLibrary()
 {
-    if ((load_jpeg_library(NULL) == TCL_OK)
-	    && jpeg.destroy
-	    && jpeg.write_raw_data
-	    && jpeg.suppress_tables
-	    && jpeg.write_tables
-	    && jpeg.read_raw_data
-	    && jpeg.abort) {
+    if (load_jpeg_library(NULL) == TCL_OK)
 	return TCL_OK;
-    }
     return TCL_ERROR;
 }
@@ -420,179 +289,4 @@
 			JSAMPARRAY, JDIMENSION));
 
-static int
-CreateCompress(cinfo, version, size)
-    j_compress_ptr cinfo;
-    int version;
-    size_t size;
-{
-    return jpeg.create_compress(cinfo);
-}
-
-static int
-CreateDecompress(cinfo, version, size)
-    j_decompress_ptr cinfo;
-    int version;
-    size_t size;
-{
-    return jpeg.create_decompress(cinfo);
-}
-
-int
-Imgjpeg_CreateCompress(cinfo, version, size)
-    j_compress_ptr cinfo;
-    int version;
-    size_t size;
-{
-    return jpeg.CreateCompress(cinfo, version, size);
-}
-
-int
-Imgjpeg_CreateDecompress(cinfo, version, size)
-    j_decompress_ptr cinfo;
-    int version;
-    size_t size;
-{
-    return jpeg.CreateDecompress(cinfo, version, size);
-}
-
-boolean
-Imgjpeg_resync_to_restart(a,b)
-    j_decompress_ptr a;
-    int b;
-{
-    return jpeg.resync_to_restart(a,b);
-}
-
-JDIMENSION
-Imgjpeg_read_scanlines(a,b,c)
-    j_decompress_ptr a;
-    JSAMPARRAY b;
-    JDIMENSION c;
-{
-    return jpeg.read_scanlines(a,b,c);
-}
-
-int
-Imgjpeg_set_colorspace(a,b)
-    j_compress_ptr a;
-    J_COLOR_SPACE b;
-{
-    return jpeg.set_colorspace(a,b);
-}
-
-int
-Imgjpeg_set_defaults(a)
-    j_compress_ptr a;
-{
-    return jpeg.set_defaults(a);
-}
-
-int
-Imgjpeg_start_decompress(a)
-    j_decompress_ptr a;
-{
-    return jpeg.start_decompress(a);
-}
-
-void
-Imgjpeg_destroy(a)
-    j_common_ptr a;
-{
-    jpeg.destroy(a);
-}
-
-struct jpeg_error_mgr *
-Imgjpeg_std_error(a)
-    struct jpeg_error_mgr *a;
-{
-    return jpeg.std_error(a);
-}
-
-JDIMENSION Imgjpeg_write_raw_data(a,b,c)
-    j_compress_ptr a;
-    JSAMPIMAGE b;
-    JDIMENSION c;
-{
-    return jpeg.write_raw_data(a,b,c);
-}
-
-void
-Imgjpeg_suppress_tables(a,b)
-    j_compress_ptr a;
-    boolean b;
-{
-    jpeg.suppress_tables(a,b);
-}
-
-void
-Imgjpeg_abort(a)
-    j_common_ptr a;
-{
-    jpeg.abort(a);
-}
-
-int
-Imgjpeg_read_header(a,b)
-    j_decompress_ptr a;
-    int b;
-{
-    return jpeg.read_header(a,b);
-}
-
-int
-Imgjpeg_start_compress(a,b)
-    j_compress_ptr a;
-    int b;
-{
-    return jpeg.start_compress(a,b);
-}
-
-void
-Imgjpeg_write_tables(a)
-    j_compress_ptr a;
-{
-    jpeg.write_tables(a);
-}
-
-int
-Imgjpeg_finish_decompress(a)
-    j_decompress_ptr a;
-{
-    return jpeg.finish_decompress(a);
-}
-
-int
-Imgjpeg_finish_compress(a)
-    j_compress_ptr a;
-{
-    return jpeg.finish_compress(a);
-}
-
-JDIMENSION
-Imgjpeg_read_raw_data(a,b,c)
-    j_decompress_ptr a;
-    JSAMPIMAGE b;
-    JDIMENSION c;
-{
-    return jpeg.read_raw_data(a,b,c);
-}
-
-int
-Imgjpeg_set_quality(a,b,c)
-    j_compress_ptr a;
-    int b;
-    int c;
-{
-    return jpeg.set_quality(a,b,c);
-}
-
-JDIMENSION
-Imgjpeg_write_scanlines(a,b,c)
-    j_compress_ptr a;
-    JSAMPARRAY b;
-    JDIMENSION c;
-{
-    return jpeg.write_scanlines(a,b,c);
-}
 
 
@@ -794,5 +488,5 @@
     /* Initialize JPEG error handler */
     /* We set up the normal JPEG error routines, then override error_exit. */
-    cinfo.err = jpeg.std_error(&jerror.pub);
+    cinfo.err = jpeg_std_error(&jerror.pub);
     jerror.pub.error_exit = my_error_exit;
     jerror.pub.output_message = my_output_message;
@@ -803,10 +497,10 @@
       Tcl_AppendResult(interp, "couldn't read JPEG string: ", (char *) NULL);
       append_jpeg_message(interp, (j_common_ptr) &cinfo);
-      jpeg.destroy_decompress(&cinfo);
+      jpeg_destroy_decompress(&cinfo);
       return TCL_ERROR;
     }
 
     /* Now we can initialize libjpeg. */
-    jpeg.CreateDecompress(&cinfo, JPEG_LIB_VERSION,
+    jpeg_CreateDecompress(&cinfo, JPEG_LIB_VERSION,
 			(size_t) sizeof(struct jpeg_decompress_struct));
     jpeg_channel_src(&cinfo, chan);
@@ -817,5 +511,5 @@
 
     /* Reclaim libjpeg's internal resources. */
-    jpeg.destroy_decompress(&cinfo);
+    jpeg_destroy_decompress(&cinfo);
 
     return result;
@@ -865,5 +559,5 @@
     /* Initialize JPEG error handler */
     /* We set up the normal JPEG error routines, then override error_exit. */
-    cinfo.err = jpeg.std_error(&jerror.pub);
+    cinfo.err = jpeg_std_error(&jerror.pub);
     jerror.pub.error_exit = my_error_exit;
     jerror.pub.output_message = my_output_message;
@@ -874,10 +568,10 @@
       Tcl_AppendResult(interp, "couldn't read JPEG string: ", (char *) NULL);
       append_jpeg_message(interp, (j_common_ptr) &cinfo);
-      jpeg.destroy_decompress(&cinfo);
+      jpeg_destroy_decompress(&cinfo);
       return TCL_ERROR;
     }
 
     /* Now we can initialize libjpeg. */
-    jpeg.CreateDecompress(&cinfo, JPEG_LIB_VERSION,
+    jpeg_CreateDecompress(&cinfo, JPEG_LIB_VERSION,
 			(size_t) sizeof(struct jpeg_decompress_struct));
     jpeg_obj_src(&cinfo, data);
@@ -888,5 +582,5 @@
 
     /* Reclaim libjpeg's internal resources. */
-    jpeg.destroy_decompress(&cinfo);
+    jpeg_destroy_decompress(&cinfo);
 
     return result;
@@ -926,5 +620,5 @@
 				 * in image being read. */
 {
-    static char *jpegReadOptions[] = {"-fast", "-grayscale", NULL};
+    static const char *jpegReadOptions[] = {"-fast", "-grayscale", NULL};
     int fileWidth, fileHeight, stopY, curY, outY, outWidth, outHeight;
     myblock bl;
@@ -935,5 +629,5 @@
 
     /* Ready to read header data. */
-    jpeg.read_header(cinfo, TRUE);
+    jpeg_read_header(cinfo, TRUE);
 
     /* This code only supports 8-bit-precision JPEG files. */
@@ -972,5 +666,5 @@
     }
 
-    jpeg.start_decompress(cinfo);
+    jpeg_start_decompress(cinfo);
 
     /* Check dimensions. */
@@ -1029,5 +723,5 @@
     outY = destY;
     for (curY = 0; curY < stopY; curY++) {
-      jpeg.read_scanlines(cinfo, buffer, 1);
+      jpeg_read_scanlines(cinfo, buffer, 1);
       if (curY >= srcY) {
 	Tk_PhotoPutBlock(imageHandle, &block, destX, outY, outWidth, 1, TK_PHOTO_COMPOSITE_SET);
@@ -1038,7 +732,7 @@
     /* Do normal cleanup if we read the whole image; else early abort */
     if (cinfo->output_scanline == cinfo->output_height)
-	jpeg.finish_decompress(cinfo);
+	jpeg_finish_decompress(cinfo);
     else
-	jpeg.abort_decompress(cinfo);
+	jpeg_abort_decompress(cinfo);
 
     return TCL_OK;
@@ -1086,5 +780,5 @@
     /* Initialize JPEG error handler */
     /* We set up the normal JPEG error routines, then override error_exit. */
-    cinfo.err = jpeg.std_error(&jerror.pub);
+    cinfo.err = jpeg_std_error(&jerror.pub);
     jerror.pub.error_exit = my_error_exit;
     jerror.pub.output_message = my_output_message;
@@ -1096,11 +790,11 @@
 		       "\": ", (char *) NULL);
       append_jpeg_message(interp, (j_common_ptr) &cinfo);
-      jpeg.destroy_compress(&cinfo);
+      jpeg_destroy_compress(&cinfo);
       Tcl_Close(interp, chan);
       return TCL_ERROR;
     }
 
     /* Now we can initialize libjpeg. */
-    jpeg.CreateCompress(&cinfo, JPEG_LIB_VERSION,
+    jpeg_CreateCompress(&cinfo, JPEG_LIB_VERSION,
 			(size_t) sizeof(struct jpeg_compress_struct));
     jpeg_channel_dest(&cinfo, chan);
@@ -1109,5 +803,5 @@
     result = CommonWriteJPEG(interp, &cinfo, format, blockPtr);
 
-    jpeg.destroy_compress(&cinfo);
+    jpeg_destroy_compress(&cinfo);
     if (Tcl_Close(interp, chan) == TCL_ERROR) {
 	return TCL_ERROR;
@@ -1154,5 +848,5 @@
     /* Initialize JPEG error handler */
     /* We set up the normal JPEG error routines, then override error_exit. */
-    cinfo.err = jpeg.std_error(&jerror.pub);
+    cinfo.err = jpeg_std_error(&jerror.pub);
     jerror.pub.error_exit = my_error_exit;
     jerror.pub.output_message = my_output_message;
@@ -1167,6 +861,6 @@
     }
 
     /* Now we can initialize libjpeg. */
-    jpeg.CreateCompress(&cinfo, JPEG_LIB_VERSION,
+    jpeg_CreateCompress(&cinfo, JPEG_LIB_VERSION,
 	    (size_t) sizeof(struct jpeg_compress_struct));
     jpeg_string_dest(&cinfo, dataPtr);
@@ -1177,5 +871,5 @@
 writeend:
 
-    jpeg.destroy_compress(&cinfo);
+    jpeg_destroy_compress(&cinfo);
     if (dataPtr == &data) {
 	if (result == TCL_OK) {
@@ -1210,5 +904,5 @@
     Tk_PhotoImageBlock *blockPtr;
 {
-    static char *jpegWriteOptions[] = {"-grayscale", "-optimize",
+    static const char *jpegWriteOptions[] = {"-grayscale", "-optimize",
 	"-progressive", "-quality", "-smooth", NULL};
     JSAMPROW row_pointer[1];	/* pointer to original data scanlines */
@@ -1239,5 +933,5 @@
     cinfo->in_color_space = JCS_RGB;
 
-    jpeg.set_defaults(cinfo);
+    jpeg_set_defaults(cinfo);
 
     /* Parse options, if any, and alter default parameters */
@@ -1262,7 +956,7 @@
 		}
 		case 2: {
-		    if (jpeg.simple_progression != NULL) {
+		    if (jpeg_simple_progression != NULL) {
 			/* Select simple progressive mode. */
-			jpeg.simple_progression(cinfo);
+			jpeg_simple_progression(cinfo);
 		    }
 		    break;
@@ -1278,5 +972,5 @@
 			return TCL_ERROR;
 		    }
-		    jpeg.set_quality(cinfo, quality, FALSE);
+		    jpeg_set_quality(cinfo, quality, FALSE);
 		    break;
 		}
@@ -1301,11 +995,11 @@
     greenOffset = blockPtr->offset[1] - blockPtr->offset[0];
     blueOffset = blockPtr->offset[2] - blockPtr->offset[0];
-    if ((jpeg.set_colorspace != NULL) &&
+    if ((jpeg_set_colorspace != NULL) &&
 	    (grayscale || (!greenOffset && !blueOffset))) {
 	/* Generate monochrome JPEG file if source block is grayscale. */
-	jpeg.set_colorspace(cinfo, JCS_GRAYSCALE);
+	jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
     }
 
-    jpeg.start_compress(cinfo, TRUE);
+    jpeg_start_compress(cinfo, TRUE);
     
     /* note: we assume libjpeg is configured for standard RGB pixel order. */
@@ -1315,5 +1009,5 @@
 	for (h = blockPtr->height; h > 0; h--) {
 	    row_pointer[0] = (JSAMPROW) pixLinePtr;
-	    jpeg.write_scanlines(cinfo, row_pointer, 1);
+	    jpeg_write_scanlines(cinfo, row_pointer, 1);
 	    pixLinePtr += blockPtr->pitch;
 	}
@@ -1341,10 +1035,10 @@
 		pixelPtr += blockPtr->pixelSize;
 	    }
-	    jpeg.write_scanlines(cinfo, buffer, 1);
+	    jpeg_write_scanlines(cinfo, buffer, 1);
 	    pixLinePtr += blockPtr->pitch;
 	}
     }
 
-    jpeg.finish_compress(cinfo);
+    jpeg_finish_compress(cinfo);
     return TCL_OK;
 }
@@ -1370,5 +1064,5 @@
   src->pub.fill_input_buffer = fill_input_buffer;
   src->pub.skip_input_data = skip_input_data;
-  src->pub.resync_to_restart = jpeg.resync_to_restart; /* use default method */
+  src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
   src->pub.term_source = dummy_source;
 
@@ -1443,5 +1137,5 @@
   src->pub.fill_input_buffer = fill_input_buffer;
   src->pub.skip_input_data = skip_input_data;
-  src->pub.resync_to_restart = jpeg.resync_to_restart; /* use default method */
+  src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
   src->pub.term_source = dummy_source;
 
