diff options
Diffstat (limited to 'hl/fortran/src/H5IMcc.c')
-rw-r--r-- | hl/fortran/src/H5IMcc.c | 424 |
1 files changed, 424 insertions, 0 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; + +} |