# Loop over all executables:
 FOREACH(exe j2k_to_image image_to_j2k)
   ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS})
-  TARGET_LINK_LIBRARIES(${exe} gdcmopenjpeg)
+  TARGET_LINK_LIBRARIES(${exe} ${OPJ_PREFIX}openjpeg)
   IF(UNIX)
     TARGET_LINK_LIBRARIES(${exe} -lm)
   ENDIF(UNIX)
 ENDFOREACH(exe)
 
-## $Id: CMakeLists.txt,v 1.2 2005/10/24 18:40:55 malaterre Exp $
-##
-## makefile for OpenJPEG codec
-#
-#OPENJPEG_DIR = ../libopenjpeg
-#
-#ifndef DEBUG
-#  LDFLAGS = -s -lm
-#else
-#  LDFLAGS = -lm
-#endif
-#
-#CFLAGS = -Wall -O3 -fno-strength-reduce -fomit-frame-pointer -I$(OPENJPEG_DIR)
-#
-#OBJ_DIR_W32 = obj.w32
-#BIN_DIR_W32 = bin.w32
-#LIB_DIR_W32 = $(OPENJPEG_DIR)/lib.w32
-#
-#ifdef MINGW32
-#  CC = i386-mingw32-gcc
-#  CFLAGS += -DDONT_HAVE_GETOPT
-#  OBJ_DIR = $(OBJ_DIR_W32)
-#  BIN_DIR = $(BIN_DIR_W32)
-#  LIB_DIR = lib.w32
-#  all:   $(BIN_DIR) $(OBJ_DIR) $(LIB_DIR) \
-#   $(addprefix $(BIN_DIR)/,j2k_to_image.exe image_to_j2k.exe)
-#else
-#  CC = gcc
-#  OBJ_DIR = obj
-#  BIN_DIR = bin
-#  LIB_DIR = lib
-#  all:   $(BIN_DIR) $(OBJ_DIR) $(LIB_DIR) \
-#     $(addprefix $(BIN_DIR)/,j2k_to_image image_to_j2k)
-#endif
-#
-#ifdef DYNAMIC
-#  ifdef MINGW32
-#    LIB_OPENJPEG = $(LIB_DIR)/libopenjpeg.dll
-#    LDFLAGS += -L$(LIB_DIR) -lopenjpeg
-#  else
-#    LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so
-#    LDFLAGS += -L$(OPENJPEG_DIR)/$(LIB_DIR) -lopenjpeg
-#  endif
-#else
-#  LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a
-#  LDFLAGS += $(LIB_OPENJPEG)
-#endif
-#
-#$(BIN_DIR):
-#   mkdir $(BIN_DIR)
-#
-#$(OBJ_DIR):
-#   mkdir $(OBJ_DIR)
-#
-#$(LIB_DIR):   
-#   mkdir $(LIB_DIR)
-#
-#$(LIB_DIR)/libopenjpeg.dll: $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll
-#   ln -sf ../$< $@
-#$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll:
-#   cd $(OPENJPEG_DIR) && \
-#   $(MAKE) $(OBJ_DIR) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.dll
-#$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a:
-#   cd $(OPENJPEG_DIR) && \
-#   $(MAKE) $(OBJ_DIR) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.a
-#$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so:
-#   cd $(OPENJPEG_DIR) && \
-#   $(MAKE) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.so
-#
-#$(OBJ_DIR)/%.o:
-#   $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
-#
-#$(OBJ_DIR)/getopt.o:      compat/getopt.c
-#$(OBJ_DIR)/convert.o:      convert.c
-#$(OBJ_DIR)/j2k_to_image.o:   j2k_to_image.c
-#$(OBJ_DIR)/image_to_j2k.o:   image_to_j2k.c convert.h
-#
-#J2I_OBJS = $(addprefix $(OBJ_DIR)/,j2k_to_image.o)
-#I2J_OBJS = $(addprefix $(OBJ_DIR)/,image_to_j2k.o convert.o)
-#
-#$(BIN_DIR)/j2k_to_image:   $(J2I_OBJS) $(LIB_OPENJPEG)
-#   ${CC} -o $@  $(J2I_OBJS) ${LDFLAGS} 
-#
-#$(BIN_DIR)/image_to_j2k:   $(I2J_OBJS) $(LIB_OPENJPEG)
-#   ${CC} -o $@  $(I2J_OBJS) ${LDFLAGS} 
-#
-#$(BIN_DIR)/j2k_to_image.exe:   $(J2I_OBJS) $(LIB_OPENJPEG)
-#   ${CC} -o $@  $(J2I_OBJS) ${LDFLAGS} 
-#
-#$(BIN_DIR)/image_to_j2k.exe:   $(I2J_OBJS) $(LIB_OPENJPEG) $(OBJ_DIR)/getopt.o
-#   ${CC} -o $@  $(I2J_OBJS) ${LDFLAGS} $(OBJ_DIR)/getopt.o
-#
-#clean:
-#   rm -f $(BIN_DIR_W32)/* $(BIN_DIR)/* $(OBJ_DIR_W32)/* $(OBJ_DIR)/*
+
 
   opj_image_cmptparm_t cmptparm[3];  /* maximum of 3 components */
   opj_image_t * image = NULL;
   char value;
-  char comment[256];
 
   f = fopen(filename, "rb");
   if (!f) {
   switch(value) {
     case '2':  /* greyscale image type */
     case '5':
-    {
       numcomps = 1;
       color_space = CLRSPC_GRAY;
-
-      fgetc(f);
-
-      if (fgetc(f) == '#') {
-        /* skip comments */
-        fseek(f, 0, SEEK_SET);
-        if (value == '2') {
-          fscanf(f, "P2\n");
-        } else if (value == '5') {
-          fscanf(f, "P5\n");
-        }
-        fgets(comment, 256, f);
-        fscanf(f, "%d %d\n255", &w, &h);
-      } else {
-        fseek(f, 0, SEEK_SET);
-        if (value == '2') {
-          fscanf(f, "P2\n%d %d\n255", &w, &h);
-        } else if (value == '5') {
-          fscanf(f, "P5\n%d %d\n255", &w, &h);
-        }
-      }
-      
-      fgetc(f);  /* <cr><lf> */
-    }
     break;
 
     case '3':  /* RGB image type */
     case '6':
-    {
       numcomps = 3;
       color_space = CLRSPC_SRGB;
-
-      fgetc(f);
-
-      if (fgetc(f) == '#') {
-        /* skip comments */
-        fseek(f, 0, SEEK_SET);
-        if (value == '3') {
-          fscanf(f, "P3\n");
-        } else if (value == '6') {
-          fscanf(f, "P6\n");
-        }
-        fgets(comment, 256, f);
-        fscanf(f, "%d %d\n255", &w, &h);
-      } else {
-        fseek(f, 0, SEEK_SET);
-        if (value == '3') {
-          fscanf(f, "P3\n%d %d\n255", &w, &h);
-        } else if (value == '6') {
-          fscanf(f, "P6\n%d %d\n255", &w, &h);
-        }
-      }
-      
-      fgetc(f);  /* <cr><lf> */
-    }
     break;
 
     default:
       return NULL;
   }
 
+    fgetc(f);
+    
+    /* skip comments */
+    while(fgetc(f) == '#') while(fgetc(f) != '\n');
+    
+    fseek(f, -1, SEEK_CUR);
+    fscanf(f, "%d %d\n255", &w, &h);      
+    fgetc(f);  /* <cr><lf> */
+    
   /* initialize image components */
   memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
   for(i = 0; i < numcomps; i++) {
 
 
 #define OPENJPEG_VERSION "1.0.0"
 
+#if defined(_WIN32) && !defined (OPJ_STATIC)
+#ifdef OPJ_SHARED
+#define OPJ_EXPORT __declspec(dllexport)
+#else
+#define OPJ_EXPORT __declspec(dllimport)
+#endif
+#else
+#ifdef OPJ_STATIC
+#define OPJ_EXPORT extern
+#else
+#define OPJ_EXPORT
+#endif
+#endif
+
 /* 
 ==========================================================
    Compiler directives
 @param clrspc image color space
 @return returns a new image structure if successful, returns NULL otherwise
 */
-opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+OPJ_EXPORT opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
 /**
 Deallocate any resources associated with an image
 @param image image to be destroyed
 */
-void opj_image_destroy(opj_image_t *image);
+OPJ_EXPORT void opj_image_destroy(opj_image_t *image);
 
 /* 
 ==========================================================
 @param length Reading: buffer length. Writing: 0
 @return Returns a CIO handle if successful, returns NULL otherwise
 */
-opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
+OPJ_EXPORT opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
 
 /**
 Close and free a CIO handle
 @param cio CIO handle to free
 */
-void opj_cio_close(opj_cio_t *cio);
+OPJ_EXPORT void opj_cio_close(opj_cio_t *cio);
 
 /**
 Get position in byte stream
 @param cio CIO handle
 @return Returns the position in bytes
 */
-int cio_tell(opj_cio_t *cio);
+OPJ_EXPORT int cio_tell(opj_cio_t *cio);
 /**
 Set position in byte stream
 @param cio CIO handle
 ==========================================================
 */
 
-opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
+OPJ_EXPORT opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
 
 /* 
 ==========================================================
 @param format Decoder to select
 @return Returns a handle to a decompressor if successful, returns NULL otherwise
 */
-opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);
+OPJ_EXPORT opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);
 /**
 Destroy a decompressor handle
 @param dinfo decompressor handle to destroy
 */
-void opj_destroy_decompress(opj_dinfo_t *dinfo);
+OPJ_EXPORT void opj_destroy_decompress(opj_dinfo_t *dinfo);
 /**
 Set decoding parameters to default values
 @param parameters Decompression parameters
 */
-void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+OPJ_EXPORT void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
 /**
 Setup the decoder decoding parameters using user parameters.
 Decoding parameters are returned in j2k->cp. 
 @param dinfo decompressor handle
 @param parameters decompression parameters
 */
-void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
+OPJ_EXPORT void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
 /**
 Decode an image from a JPEG-2000 codestream
 @param dinfo decompressor handle
 @param cio Input buffer stream
 @return Returns a decoded image if successful, returns NULL otherwise
 */
-opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
+OPJ_EXPORT opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
 /**
 Creates a J2K/JP2 compression structure
 @param format Coder to select
 @return Returns a handle to a compressor if successful, returns NULL otherwise
 */
-opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);
+OPJ_EXPORT opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);
 /**
 Destroy a compressor handle
 @param cinfo compressor handle to destroy
 */
-void opj_destroy_compress(opj_cinfo_t *cinfo);
+OPJ_EXPORT void opj_destroy_compress(opj_cinfo_t *cinfo);
 /**
 Set encoding parameters to default values, that means : 
 <ul>
 </ul>
 @param parameters Compression parameters
 */
-void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+OPJ_EXPORT void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
 /**
 Setup the encoder parameters using the current image and using user parameters. 
 @param cinfo compressor handle
 @param parameters compression parameters
 @param image input filled image
 */
-void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
+OPJ_EXPORT void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
 /**
 Encode an image into a JPEG-2000 codestream
 @param cinfo compressor handle
 @param index Name of the index file if required, NULL otherwise
 @return Returns true if successful, returns false otherwise
 */
-bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
+OPJ_EXPORT bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
 
 #ifdef __cplusplus
 }