diff options
author | Elena Pourmal <epourmal@hdfgroup.org> | 2005-06-24 05:00:01 (GMT) |
---|---|---|
committer | Elena Pourmal <epourmal@hdfgroup.org> | 2005-06-24 05:00:01 (GMT) |
commit | 2ab6b12b552e9260e2e76640a788b5a3744c6a9f (patch) | |
tree | 6ef872a02a4fd46af33370854af5e7876f4fa29b /hl/fortran/src | |
parent | e38365206ae36d83b8e573eb0b2e51e555699c97 (diff) | |
download | hdf5-2ab6b12b552e9260e2e76640a788b5a3744c6a9f.zip hdf5-2ab6b12b552e9260e2e76640a788b5a3744c6a9f.tar.gz hdf5-2ab6b12b552e9260e2e76640a788b5a3744c6a9f.tar.bz2 |
[svn-r10977] Purpose: Bug fix
Description:
1.7 daily tests failed in HL library when Fortran was not
enabled; also long long instead of long_long declarations
were used and caused failures on Windows
Solution:
Removed Fortran related functions (except H5IM_find_palette) from
H5IM.c file and put it into fortran/src/H5IMcc.c
Modified appropriate Makefile.am files, regenerated Makefile.in files, updated header files, MANIFEST, etc.
Note: H5IM_find_palette should be also in H5IMcc.c, but
for some unknown to me reason, linking fails if the function is
included in H5IMcc.c. I will really appreciate if some C guru
will look into the code and figure out what is wrong :-) Thanks!
Platforms tested: mir with g95, heping with and without Fortran enabled
Misc. update:
Diffstat (limited to 'hl/fortran/src')
-rw-r--r-- | hl/fortran/src/H5IMcc.c | 424 | ||||
-rw-r--r-- | hl/fortran/src/H5IMcc.h | 66 | ||||
-rwxr-xr-x | hl/fortran/src/H5LTfc.c | 4 | ||||
-rw-r--r-- | hl/fortran/src/Makefile.am | 10 | ||||
-rw-r--r-- | hl/fortran/src/Makefile.in | 17 |
5 files changed, 507 insertions, 14 deletions
diff --git a/hl/fortran/src/H5IMcc.c b/hl/fortran/src/H5IMcc.c new file mode 100644 index 0000000..b55e242 --- /dev/null +++ b/hl/fortran/src/H5IMcc.c @@ -0,0 +1,424 @@ +/**************************************************************************** + * NCSA HDF * + * Scientific Data Technologies * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ +#include "H5IM.h" +#include "H5IMcc.h" +#include "H5f90i_gen.h" + + +#include <string.h> +#include <stdlib.h> + + +/*------------------------------------------------------------------------- + * Function: H5IMmake_image_8bitf + * + * Purpose: Creates and writes an image an 8 bit image + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu + * + * Date: May 10, 2005 + * + * Comments: + * This function allows the creation and writing of an 8bit image on disk. + * The memory datatype is H5T_NATIVE_INT. It is supposed to be called from + * the FORTRAN interface where the image buffer is defined as type "integer" + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5IMmake_image_8bitf( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + int_f *buf ) +{ + hid_t did; /* dataset ID */ + hid_t sid; /* space ID */ + hsize_t dims[IMAGE8_RANK]; /* dimensions */ + + /* initialize the image dimensions */ + dims[0] = height; + dims[1] = width; + dims[2] = 1; + +/*------------------------------------------------------------------------- + * create and write the dataset + *------------------------------------------------------------------------- + */ + + /* create the data space for the dataset. */ + if ((sid=H5Screate_simple(IMAGE8_RANK,dims,NULL))<0) + return -1; + + /* create the dataset as H5T_NATIVE_UCHAR */ + if ((did=H5Dcreate(loc_id,dset_name,H5T_NATIVE_UINT8,sid,H5P_DEFAULT))<0) + return -1; + + /* write with memory type H5T_NATIVE_INT */ + /* Use long type if Fortran integer is 8 bytes and C long long is also 8 bytes*/ + /* Fail if otherwise */ + if (buf) + { + if (sizeof(int_f) == sizeof(int)) { + if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long_long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else + return -1; + } + + /* close */ + if (H5Dclose(did)<0) + return -1; + if (H5Sclose(sid)<0) + return -1; + +/*------------------------------------------------------------------------- + * attach the specification attributes + *------------------------------------------------------------------------- + */ + + /* attach the CLASS attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0 ) + return -1; + + /* attach the VERSION attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0 ) + return -1; + + /* attach the IMAGE_SUBCLASS attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_INDEXED" ) < 0 ) + return -1; + + return 0; +} + + + +/*------------------------------------------------------------------------- + * Function: H5IMmake_image_24bitf + * + * Purpose: + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu + * + * Date: May 10, 2005 + * + * Comments: + * This function allows the creation and writing of an 8bit image on disk. + * The memory datatype is H5T_NATIVE_INT. It is supposed to be called from + * the FORTRAN interface where the image buffer is defined as type "integer" + * + * Interlace Mode Dimensions in the Dataspace + * INTERLACE_PIXEL [height][width][pixel components] + * INTERLACE_PLANE [pixel components][height][width] + * + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5IMmake_image_24bitf( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + const char *interlace, + int_f *buf) +{ + hid_t did; /* dataset ID */ + hid_t sid; /* space ID */ + hsize_t dims[IMAGE24_RANK]; /* dimensions */ + +/*------------------------------------------------------------------------- + * attach the image dimensions according to the interlace mode + *------------------------------------------------------------------------- + */ + if ( strcmp( interlace, "INTERLACE_PIXEL" ) == 0 ) + { + /* Number of color planes is defined as the third dimension */ + dims[0] = height; + dims[1] = width; + dims[2] = IMAGE24_RANK; + } + else + if ( strcmp( interlace, "INTERLACE_PLANE" ) == 0 ) + { + /* Number of color planes is defined as the first dimension */ + dims[0] = IMAGE24_RANK; + dims[1] = height; + dims[2] = width; + } + else return -1; + +/*------------------------------------------------------------------------- + * create and write the dataset + *------------------------------------------------------------------------- + */ + + /* create the data space for the dataset. */ + if ((sid=H5Screate_simple(IMAGE24_RANK,dims,NULL))<0) + return -1; + + /* create the dataset as H5T_NATIVE_UCHAR */ + if ((did=H5Dcreate(loc_id,dset_name,H5T_NATIVE_UCHAR,sid,H5P_DEFAULT))<0) + return -1; + + /* write with memory type H5T_NATIVE_INT */ + if (buf) + { + if (sizeof(int_f) == sizeof(int)) { + if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long_long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else + return -1; + } + + /* close */ + if (H5Dclose(did)<0) + return -1; + if (H5Sclose(sid)<0) + return -1; + +/*------------------------------------------------------------------------- + * attach the specification attributes + *------------------------------------------------------------------------- + */ + + /* Attach the CLASS attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0 ) + return -1; + + /* Attach the VERSION attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0 ) + return -1; + + /* Attach the IMAGE_SUBCLASS attribute */ + if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_TRUECOLOR" ) < 0 ) + return -1; + + /* Attach the INTERLACE_MODE attribute. This attributes is only for true color images */ + if ( H5LTset_attribute_string( loc_id, dset_name, "INTERLACE_MODE", interlace ) < 0 ) + return -1; + + return 0; + +} + + +/*------------------------------------------------------------------------- + * Function: H5IMread_imagef + * + * Purpose: Reads image data from disk. + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu + * + * Date: May 10, 2005 + * + * Comments: + * This function allows reading of an 8bit image on disk. + * The memory datatype is H5T_NATIVE_INT. It is supposed to be called from + * the FORTRAN interface where the image buffer is defined as type "integer" + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5IMread_imagef( hid_t loc_id, + const char *dset_name, + int_f *buf ) +{ + hid_t did; + + /* open the dataset */ + if ( (did = H5Dopen( loc_id, dset_name )) < 0 ) + return -1; + + /* read to memory type H5T_NATIVE_INT */ + if (sizeof(int_f) == sizeof(int)){ + if ( H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else if (sizeof(int_f) == sizeof(long)) { + if ( H5Dread( did, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else if (sizeof(int_f) == sizeof(long_long)) { + if ( H5Dread( did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else + goto out; + + /* close */ + if ( H5Dclose( did ) ) + return -1; + return 0; + +out: + H5Dclose( did ); + return -1; + +} + + +/*------------------------------------------------------------------------- + * Function: H5IMmake_palettef + * + * Purpose: Creates and writes a palette. + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu + * + * Date: May 10, 2005 + * + * Comments: + * This function allows writing of an 8bit palette to disk. + * The memory datatype is H5T_NATIVE_INT. It is supposed to be called from + * the FORTRAN interface where the image buffer is defined as type "integer" + * + * based on HDF5 Image and Palette Specification + * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5IMmake_palettef( hid_t loc_id, + const char *pal_name, + const hsize_t *pal_dims, + int_f *pal_data ) + +{ + + hid_t did; /* dataset ID */ + hid_t sid; /* space ID */ + int has_pal; + + /* Check if the dataset already exists */ + has_pal = H5LTfind_dataset( loc_id, pal_name ); + + /* It exists. Return */ + if ( has_pal == 1 ) + return 0; + +/*------------------------------------------------------------------------- + * create and write the dataset + *------------------------------------------------------------------------- + */ + + /* create the data space for the dataset. */ + if ((sid=H5Screate_simple(2,pal_dims,NULL))<0) + return -1; + + /* create the dataset as H5T_NATIVE_UCHAR */ + if ((did=H5Dcreate(loc_id,pal_name,H5T_NATIVE_UCHAR,sid,H5P_DEFAULT))<0) + return -1; + + /* write with memory type H5T_NATIVE_INT */ + if (pal_data) + { + if (sizeof(int_f) == sizeof(int)) { + if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long_long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else + return -1; + } + + /* close */ + if (H5Dclose(did)<0) + return -1; + if (H5Sclose(sid)<0) + return -1; + +/*------------------------------------------------------------------------- + * attach the specification attributes + *------------------------------------------------------------------------- + */ + + /* Attach the attribute "CLASS" to the >>palette<< dataset*/ + if ( H5LTset_attribute_string( loc_id, pal_name, "CLASS", PALETTE_CLASS ) < 0 ) + return -1; + + /* Attach the attribute "PAL_VERSION" to the >>palette<< dataset*/ + if ( H5LTset_attribute_string( loc_id, pal_name, "PAL_VERSION", "1.2" ) < 0 ) + return -1; + + return 0; + +} + + +/*------------------------------------------------------------------------- + * Function: H5IMget_palettef + * + * Purpose: Read palette + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu + * + * Date: May 10, 2005 + * + * Comments: + * This function allows reading of an 8bit palette from disk. + * The memory datatype is H5T_NATIVE_INT. It is supposed to be called from + * the FORTRAN interface where the image buffer is defined as type "integer" + * + * based on HDF5 Image and Palette Specification + * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5IMget_palettef( hid_t loc_id, + const char *image_name, + int pal_number, + int_f *pal_data ) +{ + if(sizeof(int_f) == sizeof(int)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_INT,pal_data); + else if (sizeof(int_f) == sizeof(long)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LONG,pal_data); + else if (sizeof(int_f) == sizeof(long_long)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LLONG,pal_data); + else + return -1; + +} diff --git a/hl/fortran/src/H5IMcc.h b/hl/fortran/src/H5IMcc.h new file mode 100644 index 0000000..32c79ff --- /dev/null +++ b/hl/fortran/src/H5IMcc.h @@ -0,0 +1,66 @@ + +/**************************************************************************** + * NCSA HDF * + * Scientific Data Technologies * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ + + +#ifndef _H5IMCC_H +#define _H5IMCC_H + +#include "H5LT.h" +#include "H5IM.h" +#include "../../fortran/src/H5f90i_gen.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IMAGE_CLASS "IMAGE" +#define PALETTE_CLASS "PALETTE" +#define IMAGE_VERSION "1.2" +#define IMAGE8_RANK 3 +#define IMAGE24_RANK 3 + + + +herr_t H5IMmake_image_8bitf( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + int_f *buf ); + +herr_t H5IMmake_image_24bitf( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + const char *interlace, + int_f *buf); + +herr_t H5IMread_imagef( hid_t loc_id, + const char *dset_name, + int_f *buf ); + +herr_t H5IMmake_palettef( hid_t loc_id, + const char *pal_name, + const hsize_t *pal_dims, + int_f *pal_data ); + +herr_t H5IMget_palettef( hid_t loc_id, + const char *image_name, + int pal_number, + int_f *pal_data ); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hl/fortran/src/H5LTfc.c b/hl/fortran/src/H5LTfc.c index 15733ab..6078b23 100755 --- a/hl/fortran/src/H5LTfc.c +++ b/hl/fortran/src/H5LTfc.c @@ -305,7 +305,7 @@ nh5ltset_attribute_int_c(hid_t_f *loc_id, ret = H5LTset_attribute_int(c_loc_id,c_name,c_attrname,buf,c_size); else if (sizeof(int_f) == sizeof(long)) ret = H5LTset_attribute_long(c_loc_id,c_name,c_attrname,buf,c_size); - else if (sizeof(int_f) == sizeof(long long)) + else if (sizeof(int_f) == sizeof(long_long)) ret = H5LTset_attribute_long_long(c_loc_id,c_name,c_attrname,buf,c_size); else return ret_value; @@ -551,7 +551,7 @@ nh5ltget_attribute_int_c(hid_t_f *loc_id, ret = H5LTget_attribute_int(c_loc_id,c_name,c_attrname,buf); else if (sizeof(int_f) == sizeof(long)) ret = H5LTget_attribute_long(c_loc_id,c_name,c_attrname,buf); - else if (sizeof(int_f) == sizeof(long long)) + else if (sizeof(int_f) == sizeof(long_long)) ret = H5LTget_attribute_long_long(c_loc_id,c_name,c_attrname,buf); else return ret_value; diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am index 7d06024..1462fbb 100644 --- a/hl/fortran/src/Makefile.am +++ b/hl/fortran/src/Makefile.am @@ -22,14 +22,14 @@ AM_LDFLAGS=-static lib_LTLIBRARIES=libhdf5hl_fortran.la # Source files for the library -if BUILD_PARALLEL_CONDITIONAL - PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.f90 -endif +#if BUILD_PARALLEL_CONDITIONAL +# PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.f90 +#endif -libhdf5hl_fortran_la_SOURCES=H5LTfc.c H5IMfc.c H5TBfc.c H5LTff.f90 \ +libhdf5hl_fortran_la_SOURCES=H5LTfc.c H5IMfc.c H5IMcc.c H5TBfc.c H5LTff.f90 \ H5IMff.f90 H5TBff.f90 -libhdf5hl_fortran_la_LIBADD=$(LIBH5_HL) +#libhdf5hl_fortran_la_LIBADD=$(LIBH5_HL) # Fortran module files can have different extensions and different names # (e.g., different capitalizations) on different platforms. Write rules diff --git a/hl/fortran/src/Makefile.in b/hl/fortran/src/Makefile.in index a7ee379..0fdf5cf 100644 --- a/hl/fortran/src/Makefile.in +++ b/hl/fortran/src/Makefile.in @@ -65,10 +65,9 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) -am__DEPENDENCIES_1 = $(top_builddir)/hl/src/libhdf5_hl.la -libhdf5hl_fortran_la_DEPENDENCIES = $(am__DEPENDENCIES_1) -am_libhdf5hl_fortran_la_OBJECTS = H5LTfc.lo H5IMfc.lo H5TBfc.lo \ - H5LTff.lo H5IMff.lo H5TBff.lo +libhdf5hl_fortran_la_LIBADD = +am_libhdf5hl_fortran_la_OBJECTS = H5LTfc.lo H5IMfc.lo H5IMcc.lo \ + H5TBfc.lo H5LTff.lo H5IMff.lo H5TBff.lo libhdf5hl_fortran_la_OBJECTS = $(am_libhdf5hl_fortran_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/bin/depcomp @@ -309,11 +308,12 @@ AM_LDFLAGS = -static lib_LTLIBRARIES = libhdf5hl_fortran.la # Source files for the library -@BUILD_PARALLEL_CONDITIONAL_TRUE@PARALLEL_COND_SRC = HDFDmpiof.c HDF5mpio.f90 -libhdf5hl_fortran_la_SOURCES = H5LTfc.c H5IMfc.c H5TBfc.c H5LTff.f90 \ +#if BUILD_PARALLEL_CONDITIONAL +# PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.f90 +#endif +libhdf5hl_fortran_la_SOURCES = H5LTfc.c H5IMfc.c H5IMcc.c H5TBfc.c H5LTff.f90 \ H5IMff.f90 H5TBff.f90 -libhdf5hl_fortran_la_LIBADD = $(LIBH5_HL) # Automake needs to be taught how to build lib, progs, and tests targets. # These will be filled in automatically for the most part (e.g., @@ -396,6 +396,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5IMcc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5IMfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5LTfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5TBfc.Plo@am__quote@ @@ -617,6 +618,8 @@ uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ uninstall-libLTLIBRARIES uninstall-local +#libhdf5hl_fortran_la_LIBADD=$(LIBH5_HL) + # Fortran module files can have different extensions and different names # (e.g., different capitalizations) on different platforms. Write rules # for them explicitly rather than trying to teach automake about them. |