IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6874


Ignore:
Timestamp:
Apr 17, 2006, 12:00:35 PM (20 years ago)
Author:
magnier
Message:

variety of small changes related to inconsistencies between psModules and psLib

Location:
trunk
Files:
4 added
2 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/astro/psCoord.h

    r6230 r6874  
    1111 *  @author GLG, MHPCC
    1212 *
    13  *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2006-01-28 01:31:44 $
     13 *  @version $Revision: 1.51 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2006-04-17 22:00:03 $
    1515 *
    1616 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2626#include "psPolynomial.h"
    2727#include "psPixels.h"
     28#include "psRegion.h"
    2829//#include "psTime.h"
    2930
  • trunk/psLib/src/fits/psFitsImage.c

    r6767 r6874  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-04-04 19:52:42 $
     9 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-04-17 22:00:03 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    120120}
    121121
    122 psImage* psFitsReadImage(psImage* output, // a psImage to recycle.
    123                          const psFits* fits,    // the psFits object
     122psImage* psFitsReadImage(const psFits* fits,    // the psFits object
    124123                         psRegion region, // the region in the FITS image to read
    125124                         int z)           // the z-plane in the FITS image cube to read
     
    140139        psError(PS_ERR_BAD_PARAMETER_NULL, true,
    141140                PS_ERRORTEXT_psFits_NULL);
    142         psFree(output);
    143141        return NULL;
    144142    }
     
    166164                PS_ERRORTEXT_psFits_DATATYPE_UNKNOWN,
    167165                fitsErr);
    168         psFree(output);
    169166        return NULL;
    170167    }
     
    176173                PS_ERRORTEXT_psFits_IMAGE_DIM_UNKNOWN,
    177174                fitsErr);
    178         psFree(output);
    179175        return NULL;
    180176    }
     
    185181                PS_ERRORTEXT_psFits_IMAGE_DIMENSION_UNSUPPORTED,
    186182                nAxis);
    187         psFree(output);
    188183        return NULL;
    189184    }
     
    195190                PS_ERRORTEXT_psFits_IMAGE_SIZE_UNKNOWN,
    196191                fitsErr);
    197         psFree(output);
    198192        return NULL;
    199193    }
     
    260254                PS_ERRORTEXT_psFits_FITS_TYPE_UNSUPPORTED,
    261255                bitPix);
    262         psFree(output);
    263         return NULL;
    264     }
    265 
    266     output = psImageRecycle(output,
    267                             lastPixel[0]-firstPixel[0]+1,
    268                             lastPixel[1]-firstPixel[1]+1,
    269                             datatype);
    270 
    271     if (output == NULL) {
    272         psError(PS_ERR_UNKNOWN, false,
    273                 "Failed to allocate a properly sized image.");
    274         return false;
    275     }
     256        return NULL;
     257    }
     258
     259    psImage *output = psImageAlloc(lastPixel[0]-firstPixel[0]+1,
     260                                   lastPixel[1]-firstPixel[1]+1,
     261                                   datatype);
    276262
    277263    // n.b., this assumes contiguous image buffer
     
    532518}
    533519
     520psArray *psFitsReadImageCube(const psFits *fits, psRegion region)
     521{
     522    int nAxis = 0;                      // Number of axes
     523    long nAxes[3];                      // Number of pixels on each axis
     524    int status = 0;                     // cfitsio status value
     525    char fitsErr[80] = "";              // CFITSIO error message string
     526
     527    if (fits == NULL) {
     528        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     529                PS_ERRORTEXT_psFits_NULL);
     530        return NULL;
     531    }
     532
     533    // Some of this replicates what is in psFitsReadImage, so it's a little inefficient.  But it saves
     534    // code replication, and should be sufficient for our needs.
     535
     536    if (fits_get_img_dim(fits->fd, &nAxis, &status) != 0) {
     537        (void)fits_get_errstatus(status, fitsErr);
     538        psError(PS_ERR_IO, true,
     539                PS_ERRORTEXT_psFits_IMAGE_DIM_UNKNOWN,
     540                fitsErr);
     541        return NULL;
     542    }
     543
     544    if (nAxis == 2) {
     545        psArray *images = psArrayAlloc(1); // Single image plane
     546        images->data[0] = psFitsReadImage(fits, region, 0);
     547        return images;
     548    }
     549    if (nAxis == 3) {
     550        if (fits_get_img_size(fits->fd, nAxis, nAxes, &status) != 0) {
     551            (void)fits_get_errstatus(status, fitsErr);
     552            psError(PS_ERR_IO, true,
     553                    PS_ERRORTEXT_psFits_IMAGE_SIZE_UNKNOWN,
     554                    fitsErr);
     555            return NULL;
     556        }
     557
     558        psArray *images = psArrayAlloc(nAxes[2]); // Array of image planes
     559        for (int i = 0; i < nAxes[2]; i++) {
     560            images->data[i] = psFitsReadImage(fits, region, i);
     561        }
     562
     563        return images;
     564    }
     565
     566    // Bad dimensionality
     567    psError(PS_ERR_IO, true, PS_ERRORTEXT_psFits_IMAGE_DIMENSION_UNSUPPORTED, nAxis);
     568    return NULL;
     569}
     570
     571bool psFitsWriteImageCube(psFits *fits, psMetadata *header, const psArray *input, const char *extname)
     572{
     573    if (fits == NULL) {
     574        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     575                PS_ERRORTEXT_psFits_NULL);
     576        return false;
     577    }
     578
     579    if (input == NULL) {
     580        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     581                PS_ERRORTEXT_psFits_IMAGE_NULL);
     582        return false;
     583    }
     584
     585    if (input->n == 0) {
     586        psError(PS_ERR_BAD_PARAMETER_SIZE, true, PS_ERRORTEXT_psFits_ARRAY_EMPTY);
     587        return false;
     588    }
     589
     590    if (input->n == 1) {
     591        // The problem reduces to one already solved
     592        return psFitsWriteImage(fits, header, input->data[0], 1, extname);
     593    }
     594
     595    // Check that all images are of the same size
     596    psImage *testImage = input->data[0];// First image off the array
     597    int numCols = testImage->numCols;   // Number of columns
     598    int numRows = testImage->numRows;   // Number of rows
     599    for (int i = 1; i < input->n; i++) {
     600        testImage = input->data[i];
     601        if (testImage->numCols != numCols || testImage->numRows != numRows) {
     602            psError(PS_ERR_BAD_PARAMETER_SIZE, true, PS_ERRORTEXT_psFits_ARRAY_SIZE_DIFFER);
     603            return false;
     604        }
     605    }
     606
     607    // Need to check the header to make sure NAXIS and NAXIS[1-3] are correct
     608    psMetadata *headerCopy = NULL;      // Copy of header
     609    if (header) {
     610        headerCopy = psMemIncrRefCounter(header);
     611    } else {
     612        headerCopy = psMetadataAlloc();
     613    }
     614    bool update = psMetadataAddS32(headerCopy, PS_LIST_HEAD, "NAXIS", PS_META_REPLACE, "Dimensionality", 3) &&
     615                  psMetadataAddS32(headerCopy, PS_LIST_HEAD, "NAXIS1", PS_META_REPLACE, "Number of columns", numCols) &&
     616                  psMetadataAddS32(headerCopy, PS_LIST_HEAD, "NAXIS2", PS_META_REPLACE, "Number of rows", numRows) &&
     617                  psMetadataAddS32(headerCopy, PS_LIST_HEAD, "NAXIS3", PS_META_REPLACE, "Number of image planes",
     618                                   input->n);
     619    if (! update) {
     620        psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
     621                "NAXIS, NAXIS1, NAXIS2, NAXIS3");
     622        psFree(headerCopy);
     623        return false;
     624    }
     625
     626    // Now we can safely write the images out.
     627    // The first is an psFitsImageWrite to create the extension.
     628    // The next are psFitsImageUpdate to write into the extension.
     629    if (! psFitsWriteImage(fits, headerCopy, input->data[0], input->n, extname)) {
     630        psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psFits_WRITE_PLANE_FAILED, 0);
     631        psFree(headerCopy);
     632        return false;
     633    }
     634    psFree(headerCopy);                 // Free, or drop reference
     635
     636    for (int i = 1; i < input->n; i++) {
     637        if (! psFitsUpdateImage(fits, input->data[i], 0, 0, i)) {
     638            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psFits_WRITE_PLANE_FAILED, i);
     639            return false;
     640        }
     641    }
     642
     643    return true;
     644}
     645
     646bool psFitsUpdateImageCube(psFits *fits, const psArray *input, int x0, int y0)
     647{
     648    if (fits == NULL) {
     649        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     650                PS_ERRORTEXT_psFits_NULL);
     651        return false;
     652    }
     653
     654    if (input == NULL) {
     655        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     656                PS_ERRORTEXT_psFits_IMAGE_NULL);
     657        return false;
     658    }
     659
     660    if (input->n == 0) {
     661        psError(PS_ERR_BAD_PARAMETER_SIZE, true, PS_ERRORTEXT_psFits_ARRAY_EMPTY);
     662        return false;
     663    }
     664
     665    for (int i = 0; i < input->n; i++) {
     666        if (! psFitsUpdateImage(fits, input->data[i], x0, y0, i)) {
     667            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psFits_UPDATE_PLANE_FAILED, i);
     668            return false;
     669        }
     670    }
     671
     672    return true;
     673}
     674
  • trunk/psLib/src/fits/psFitsImage.h

    r6767 r6874  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-04-04 19:52:42 $
     9 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-04-17 22:00:03 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3232 */
    3333psImage* psFitsReadImage(
    34     psImage* out,                      ///< a psImage to recycle.
    3534    const psFits* fits,                ///< the psFits object
    3635    psRegion region,                   ///< the region in the FITS image to read
     
    7877);
    7978
     79psArray *psFitsReadImageCube(const psFits *fits, psRegion region);
     80bool psFitsWriteImageCube(psFits *fits, psMetadata *header, const psArray *input, const char *extname);
     81bool psFitsUpdateImageCube(psFits *fits, const psArray *input, int x0, int y0);
     82
    8083/// @}
    8184
  • trunk/psLib/src/imageops/psImageStats.c

    r6778 r6874  
    99 *  @author GLG, MHPCC
    1010 *
    11  *  @version $Revision: 1.92 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2006-04-05 01:49:40 $
     11 *  @version $Revision: 1.93 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2006-04-17 22:00:03 $
    1313 *
    1414 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3131#include "psConstants.h"
    3232#include "psErrorText.h"
     33#include "psRegion.h"
     34#include "psRegionForImage.h"
    3335
    3436/// This routine must determine the various statistics for the image.
     
    748750        return -1;
    749751    }/* else if (col0 == col1 && row0 == row1) {
    750                 psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    751                         "Invalid psRegion specified.  Region contains only 1 pixel.\n");
    752                 return -1;
    753             }
    754         */
     752                    psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     753                            "Invalid psRegion specified.  Region contains only 1 pixel.\n");
     754                    return -1;
     755                }
     756            */
    755757    x0 = col0;
    756758    x1 = col1;
  • trunk/psLib/src/imageops/psImageStats.h

    r5137 r6874  
    99*  @author GLG, MHPCC
    1010*
    11 *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-09-26 22:35:53 $
     11*  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
     12*  @date $Date: 2006-04-17 22:00:03 $
    1313*
    1414*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2222#include "psStats.h"
    2323#include "psPolynomial.h"
     24#include "psRegion.h"
    2425
    2526/// @addtogroup ImageStats
  • trunk/psLib/src/imageops/psImageStructManip.h

    r4162 r6874  
    88*  @author Robert DeSonia, MHPCC
    99*
    10 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
    11 *  @date $Date: 2005-06-08 23:40:45 $
     10*  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
     11*  @date $Date: 2006-04-17 22:00:03 $
    1212*
    1313*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    1818
    1919#include "psImage.h"
     20#include "psRegion.h"
    2021
    2122/// @addtogroup Image
  • trunk/psLib/src/math/Makefile.am

    r6305 r6874  
    1313        psMinimizePolyFit.c \
    1414        psRandom.c \
     15        psRegion.c \
     16        psRegionForImage.c \
    1517        psPolynomial.c \
    1618        psSpline.c \
     
    3133        psMinimizePolyFit.h \
    3234        psRandom.h \
     35        psRegion.h \
     36        psRegionForImage.h \
    3337        psPolynomial.h \
    3438        psSpline.h \
  • trunk/psLib/src/mathtypes/psImage.c

    r6778 r6874  
    99 *  @author Ross Harman, MHPCC
    1010 *
    11  *  @version $Revision: 1.101 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2006-04-05 01:49:41 $
     11 *  @version $Revision: 1.102 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2006-04-17 22:00:03 $
    1313 *
    1414 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    104104
    105105
     106// XXX these have been moved to psRegion* in src/math/
     107# if 0
    106108psRegion psRegionSet(float x0,
    107109                     float x1,
     
    160162    return psStringCopy(tmpText);
    161163}
    162 
    163164
    164165// set actual region based on image parameters:
     
    227228    return (region);
    228229}
     230# endif /* commented-out psRegion functions */
    229231
    230232bool psImageInit (psImage *image,...)
  • trunk/psLib/src/mathtypes/psImage.h

    r6227 r6874  
    1111 *  @author Ross Harman, MHPCC
    1212 *
    13  *  @version $Revision: 1.74 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2006-01-28 01:12:14 $
     13 *  @version $Revision: 1.75 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2006-04-17 22:00:03 $
    1515 *
    1616 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8484                #define P_PSIMAGE_SET_TYPE(img,t) *(psMathType*)&img->type = t
    8585
     86                        // XXX moved to psRegion.h in src/math
     87                        # if 0
    8688                        /** Basic image region structure.
    8789                         *
     
    9799                        }
    98100                        psRegion;
     101# endif
    99102
    100103/** Create an image of the specified size and type.
     
    124127
    125128
     129// XXX these have been moved to psRegion* in src/math
     130# if 0
    126131/** Create a psRegion with the specified attributes.
    127132 *
     
    184189    double radius                       ///< radius of square
    185190);
     191# endif /* commented-out psRegions */
    186192
    187193/** Initializes the image with the given value.
  • trunk/psLib/src/psErrorText_en.dat

    r6766 r6874  
    147147psFits_METADATA_ADD_FAILED             Failed to add metadata item, %s.
    148148psFits_WRITE_FAILED                    Could not write data to file.\nCFITSIO Error: %s
     149psFits_WRITE_PLANE_FAILED              Could not write image plane %d.
     150psFits_UPDATE_PLANE_FAILED             Could not update image plane %d.
    149151psFits_IMAGE_NULL                      The input psImage was NULL.  Need a non-NULL psImage for operation to be performed.
     152psFits_ARRAY_EMPTY                     The input array was empty.
     153psFits_ARRAY_SIZE_DIFFER               The sizes of images in the array differ.
    150154psFits_METADATA_NULL                   The input psMetadata was NULL.  Need a non-NULL psMetadata for operation to be performed.
    151155psFits_METADATA_PTYPE_UNSUPPORTED      A metadata item's primative type, %d, is not supported.
  • trunk/psLib/src/pslib_strict.h

    r6504 r6874  
    99*  @author Eric Van Alst, MHPCC
    1010*
    11 *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2006-02-28 20:03:22 $
     11*  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
     12*  @date $Date: 2006-04-17 22:00:03 $
    1313*
    1414*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    5858#include "psMinimizePolyFit.h"
    5959#include "psRandom.h"
     60#include "psRegion.h"
     61#include "psRegionForImage.h"
    6062#include "psPolynomial.h"
    6163#include "psSpline.h"
  • trunk/psLib/src/sys/psString.c

    r6278 r6874  
    1313 *  @author David Robbins, MHPCC
    1414 *
    15  *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
    16  *  @date $Date: 2006-02-01 20:40:56 $
     15 *  @version $Revision: 1.25 $ $Name: not supported by cvs2svn $
     16 *  @date $Date: 2006-04-17 22:00:03 $
    1717 *
    1818 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    214214}
    215215
     216// given the input string, search for all copies of the key, and replace with the replacement value
     217// the input string may be freed if not needed
     218char *psStringSubstitute (char *input, char *replace, char *key)
     219{
     220
     221    char *p;
     222
     223    if (key == NULL)
     224        return input;
     225    if (strlen(key) == 0)
     226        return input;
     227
     228    while (true) {
     229        p = strstr (input, key);
     230        if (p == NULL)
     231            return input;
     232
     233        // we have input = xxxkeyxxx
     234        // we want output = xxxreplacexxx
     235
     236        // this is safe since we will subtract strlen(key) elements from input
     237        char *output = psAlloc(strlen(input) + strlen(replace) + 1);
     238        int Nc = p - input;
     239
     240        // copy the first segement into 'output'
     241        strncpy (output, input, Nc);
     242
     243        // copy the key replacement to the start of the key
     244
     245        strcpy (&output[Nc], replace);
     246        Nc += strlen (replace);
     247
     248        // copy the remainder to the end of the replacement
     249        strcpy (&output[Nc], p + strlen(key));
     250
     251        psFree (input);
     252        input = output;
     253    }
     254    return input;
     255}
     256
  • trunk/psLib/src/sys/psString.h

    r6278 r6874  
    1414 *  @author David Robbins, MHPCC
    1515 *
    16  *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
    17  *  @date $Date: 2006-02-01 20:40:56 $
     16 *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
     17 *  @date $Date: 2006-04-17 22:00:03 $
    1818 *
    1919 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    103103);
    104104
     105// given the input string, search for all copies of the key, and replace with the replacement value
     106// the input string may be freed if not needed
     107char *psStringSubstitute (
     108    char *input,    ///< input string to be modified
     109    char *replace,    ///< replacement value
     110    char *key    ///< string to be replaced in input
     111);
     112
    105113/** @} */// Doxygen - End of SystemGroup Functions
    106114
  • trunk/psLib/src/sys/psType.h

    r6349 r6874  
    1010*  @author Ross Harman, MHPCC
    1111*
    12 *  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2006-02-08 00:00:35 $
     12*  @version $Revision: 1.47 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2006-04-17 22:00:03 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    130130    PS_DATA_POLYNOMIAL4D,              ///< psPolynomial4D
    131131    PS_DATA_PROJECTION,                ///< psProjection
     132    PS_DATA_REGION,                    ///< psRegion
    132133    PS_DATA_SCALAR,                    ///< psScalar
    133134    PS_DATA_SPHERE,                    ///< psSphere
  • trunk/psLib/src/types/psMetadata.c

    r6548 r6874  
    1212 *  @author Ross Harman, MHPCC
    1313 *
    14  *  @version $Revision: 1.101 $ $Name: not supported by cvs2svn $
    15  *  @date $Date: 2006-03-08 21:09:16 $
     14 *  @version $Revision: 1.102 $ $Name: not supported by cvs2svn $
     15 *  @date $Date: 2006-04-17 22:00:03 $
    1616 *
    1717 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    293293    case     PS_DATA_POLYNOMIAL4D:              // psPolynomial4D
    294294    case     PS_DATA_PROJECTION:                // psProjection
     295    case     PS_DATA_REGION:                  // psRegion
    295296    case     PS_DATA_SCALAR:                    // psScalar
    296297    case     PS_DATA_SPHERE:                    // psSphere
     
    341342}
    342343
     344
     345psMetadataItem *psMetadataItemCopy(const psMetadataItem *in
     346                                  )
     347{
     348    PS_ASSERT_PTR_NON_NULL(in,NULL);
     349
     350    psMetadataItem *newItem = NULL;     // New metadata item, to be returned
     351
     352    #define PS_METADATA_ITEM_COPY_CASE(NAME,TYPE) \
     353case PS_DATA_##NAME: \
     354    newItem = psMetadataItemAlloc(in->name, PS_DATA_##NAME, in->comment, in->data.TYPE); \
     355    break; \
     356
     357    switch (in->type) {
     358        // Simple types
     359        PS_METADATA_ITEM_COPY_CASE(BOOL,B);
     360        PS_METADATA_ITEM_COPY_CASE(S8,S8);
     361        PS_METADATA_ITEM_COPY_CASE(S16,S16);
     362        PS_METADATA_ITEM_COPY_CASE(S32,S32);
     363        PS_METADATA_ITEM_COPY_CASE(U8,U8);
     364        PS_METADATA_ITEM_COPY_CASE(U16,U16);
     365        PS_METADATA_ITEM_COPY_CASE(U32,U32);
     366        PS_METADATA_ITEM_COPY_CASE(F32,F32);
     367        PS_METADATA_ITEM_COPY_CASE(F64,F64);
     368        PS_METADATA_ITEM_COPY_CASE(STRING,V); // This will copy the string, not point at it.
     369    case PS_DATA_VECTOR: {
     370            psVector *vecCopy = psVectorCopy(NULL, (psVector*)(in->data.V),
     371                                             ((psVector*)(in->data.V))->type.type);
     372            if (vecCopy == NULL) {
     373                psError(PS_ERR_BAD_PARAMETER_NULL, false,
     374                        "Error copying vector.  Vector skipped.\n");
     375            } else {
     376                newItem = psMetadataItemAlloc(in->name, PS_DATA_VECTOR, in->comment, vecCopy);
     377                psFree(vecCopy);    // Drop reference
     378            }
     379            break;
     380        }
     381    case PS_DATA_TIME: {
     382            psTime *timeCopy = p_psTimeCopy( (psTime*)(in->data.V) );
     383            if (timeCopy == NULL) {
     384                psError(PS_ERR_BAD_PARAMETER_NULL, false,
     385                        "Error copying time.  Time skipped.\n");
     386            } else {
     387                newItem = psMetadataItemAlloc(in->name, PS_DATA_TIME, in->comment, timeCopy);
     388                psFree(timeCopy);   // Drop reference
     389            }
     390            break;
     391        }
     392    case PS_DATA_METADATA: {
     393            // Metadata: copy the next level and stuff that in too
     394            psMetadata *metadata = psMetadataCopy(NULL, in->data.md);
     395            newItem = psMetadataItemAlloc(in->name, PS_DATA_METADATA, in->comment, metadata);
     396            psFree(metadata);       // Drop reference
     397            break;
     398        }
     399    case PS_DATA_REGION: {
     400            psRegion *region = in->data.V; // The region
     401            psRegion *new = psRegionAlloc(region->x0, region->x1, region->y0, region->y1); // Copy of the region
     402            newItem = psMetadataItemAlloc(in->name, PS_DATA_REGION, in->comment, new);
     403            psFree(new);                  // Drop reference
     404            break;
     405        }
     406    default:
     407        // Other kinds of pointers
     408        psLogMsg(__func__, PS_LOG_WARN, "Copying a pointer in the metadata item: %x\n", in->type);
     409        newItem = psMetadataItemAlloc(in->name, in->type, in->comment, in->data.V);
     410        break;
     411    }
     412
     413    return newItem;
     414}
     415
    343416psMetadata *psMetadataCopy(psMetadata *out,
    344417                           const psMetadata *in)
     
    349422        out = psMetadataAlloc();
    350423    }
    351     //    psMetadataItem *item = NULL;
    352     psMetadataIterator *iter = NULL;
    353     iter = psMetadataIteratorAlloc(*(psMetadata**)&in, PS_LIST_HEAD, NULL);
    354     /*
    355         item = psMetadataGetAndIncrement(iter);
    356         while (item != NULL) {
    357             psMetadataAddItem(out, item, PS_LIST_TAIL, 0);
    358             item = psMetadataGetAndIncrement(iter);
    359         }
    360         psFree(item);
    361         psFree(iter);
    362         return out;
    363     */
     424    psMetadataIterator *iter = psMetadataIteratorAlloc(*(psMetadata**)&in, PS_LIST_HEAD, NULL);
    364425    psMetadataItem *inItem = NULL;
    365     unsigned long numPointers = 0;      // Number of pointers we were forced to copy
    366426    while ((inItem = psMetadataGetAndIncrement(iter))) {
    367427        // Need to look for MULTI, which won't be picked up using the iterator.
     
    370430        if (multiCheckItem->type == PS_DATA_METADATA_MULTI) {
    371431            psTrace(__func__, 10, "MULTI: %s (%s)\n", inItem->name, inItem->comment);
    372             flag = PS_DATA_METADATA_MULTI;
     432            flag = PS_META_DUPLICATE_OK;
    373433        }
    374434        psTrace(__func__, 5, "Copying %s (%s)...\n", inItem->name, inItem->comment);
    375435
    376 
    377         //        case PS_TYPE_##NAME:
    378         #define PS_METADATA_COPY_CASE(NAME,TYPE) \
    379     case PS_DATA_##NAME: \
    380         if (! psMetadataAdd(out, PS_LIST_TAIL, inItem->name, \
    381                             PS_DATA_##NAME | flag, inItem->comment, inItem->data.TYPE)) { \
    382             psErrorStackPrint(stderr, "Error copying %s (%s) in the metadata\n", \
    383                               inItem->name, inItem->comment); \
    384         } \
    385         break;
    386 
    387         switch (inItem->type) {
    388             // Numerical types
    389             PS_METADATA_COPY_CASE(BOOL,B);
    390             PS_METADATA_COPY_CASE(S8,S8);
    391             PS_METADATA_COPY_CASE(S16,S16);
    392             PS_METADATA_COPY_CASE(S32,S32);
    393             PS_METADATA_COPY_CASE(U8,U8);
    394             PS_METADATA_COPY_CASE(U16,U16);
    395             PS_METADATA_COPY_CASE(U32,U32);
    396             PS_METADATA_COPY_CASE(F32,F32);
    397             PS_METADATA_COPY_CASE(F64,F64);
    398 
    399         case PS_DATA_VECTOR: {
    400                 psVector *vecCopy = psVectorCopy(NULL, (psVector*)(inItem->data.V),
    401                                                  ((psVector*)(inItem->data.V))->type.type);
    402                 if (vecCopy == NULL) {
    403                     psError(PS_ERR_BAD_PARAMETER_NULL, false,
    404                             "Error copying vector.  Vector skipped.\n");
    405                 } else {
    406                     psMetadataAddVector(out, PS_LIST_TAIL, inItem->name, flag,
    407                                         inItem->comment, vecCopy);
    408                     psFree(vecCopy);
    409                 }
    410                 break;
    411             }
    412         case PS_DATA_TIME: {
    413                 psTime *timeCopy = p_psTimeCopy( (psTime*)(inItem->data.V) );
    414                 if (timeCopy == NULL) {
    415                     psError(PS_ERR_BAD_PARAMETER_NULL, false,
    416                             "Error copying time.  Time skipped.\n");
    417                 } else {
    418                     psMetadataAddTime(out, PS_LIST_TAIL, inItem->name, flag,
    419                                       inItem->comment, timeCopy);
    420                     psFree(timeCopy);
    421                 }
    422                 break;
    423             }
    424             // String: relying on the fact that this will copy the string, not point at it.
    425         case PS_DATA_STRING:
    426             psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_STRING |
    427                           flag, inItem->comment, inItem->data.V);
    428             break;
    429             // Metadata: copy the next level and stuff that in too
    430         case PS_DATA_METADATA: {
    431                 psMetadata *metadata = psMetadataCopy(NULL, inItem->data.md);
    432                 psMetadataAdd(out, PS_LIST_TAIL, inItem->name,
    433                               PS_DATA_METADATA | flag, inItem->comment, metadata);
    434                 psFree(metadata);
    435                 break;
    436             }
    437             // Other kinds of pointers
    438         default:
    439             numPointers++;
    440             psTrace(__func__, 10, "Copying a pointer in the metadata: %x\n", inItem->type);
    441             psMetadataAdd(out, PS_LIST_TAIL, inItem->name, inItem->type | flag,
    442                           inItem->comment, inItem->data.V);
    443             break;
    444         }
     436        // Copy the item and add it on
     437        psMetadataItem *newItem = psMetadataItemCopy(inItem); // Copied item
     438        if (!psMetadataAddItem(out, newItem, PS_LIST_TAIL, flag)) {
     439            psErrorStackPrint(stderr, "Error copying %s (%s) in the metadata\n", inItem->name,
     440                              inItem->comment);
     441        }
     442        psFree(newItem);                // Drop reference
    445443    }
    446444    psFree(iter);
    447 
    448     if (numPointers > 0) {
    449         psLogMsg(__func__, PS_LOG_WARN,
    450                  "Forced to copy %d pointers when copying metadata.  Updating the "
    451                  "copied psMetadata will affect the original!\n", numPointers);
    452     }
    453445
    454446    return out;
     
    528520        } else {
    529521            // default is to error on duplicate entry.
     522            if ((flags & PS_META_NO_REPLACE) != 0) {
     523                return true;
     524            }
    530525            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    531526                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
     
    554549                   const char *name,
    555550                   int format,
    556                    const char *comment,
    557                    ...)
     551                   const char *comment,...)
    558552{
    559553    PS_ASSERT_PTR_NON_NULL(md,false);
     
    11401134            psMetadataPrint(item->data.V, level + 1);
    11411135            break;
     1136        case PS_DATA_REGION: {
     1137                psString region = psRegionToString(*(psRegion*)item->data.V);
     1138                printf("%s", region);
     1139                psFree(region);
     1140                break;
     1141            }
     1142        case PS_DATA_LIST:
     1143            printf("<a list of unknown contents>");
     1144            break;
     1145        case PS_DATA_TIME: {
     1146                psString time = psTimeToISO(item->data.V);
     1147                printf("%s", time);
     1148                psFree(time);
     1149                break;
     1150            }
    11421151        default:
     1152            printf("\n");
    11431153            psError(PS_ERR_IO, false, "Non-printable metadata type: %x\n", item->type);
    11441154        }
  • trunk/psLib/src/types/psMetadata.h

    r6251 r6874  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.74 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2006-01-30 20:28:33 $
     13*  @version $Revision: 1.75 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2006-04-17 22:00:03 $
    1515*
    1616*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    5959    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
    6060    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
    61     PS_META_DUPLICATE_OK = 0x2000000,  ///< allow duplicate entries
    62     PS_META_NULL = 0x4000000           ///< psMetadataItem.data is a NULL value
     61    PS_META_NO_REPLACE = 0x2000000,    ///< duplicate entry is silently skipped
     62    PS_META_DUPLICATE_OK = 0x4000000,  ///< allow duplicate entries
     63    PS_META_NULL = 0x8000000           ///< psMetadataItem.data is a NULL value
    6364} psMetadataFlags;
    6465
     
    342343);
    343344
     345/** Creates a new copy of a psMetadataItem.
     346 *
     347 * @return psMetadataItem*: the copy of the psMetadataItem
     348 */
     349psMetadataItem *psMetadataItemCopy(const psMetadataItem *in ///< metadata item to be copied
     350                                  );
     351
     352
    344353/** Creates a new copy of all the psMetadataItems in the psMetadata collection, in, and
    345354 *  returns them in out, or creates a new container if out is NULL.
     
    939948
    940949
     950psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder);
     951bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...);
     952
     953psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder);
     954bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...);
     955
     956psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder);
     957bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...);
     958
     959
    941960/// @}
    942961
  • trunk/psLib/src/types/psPixels.h

    r6500 r6874  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-28 02:53:03 $
     9 *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-04-17 22:00:03 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    1717#include "psImage.h"
    1818#include "psVector.h"
     19#include "psRegion.h"
    1920
    2021/// @addtogroup Image
     
    125126 *
    126127 *  psMaskToPixels shall return a psPixels consisting of the coordinates in
    127  *  the mask that match the maskVal. The out pixel list shall be modified if
     128 *  the mask that match the maskVal. The out pixel list shall be modified if
    128129 *  supplied, or allocated and returned if NULL. In hte event that mask is
    129130 *  NULL, the function shall generate an error and return NULL.
  • trunk/psModules/src/astrom/pmFPAConstruct.c

    r6872 r6874  
    104104        return NULL;
    105105    }
     106    // XXX EAM test
     107    fprintf (stderr, "phu name: %s == %s\n", keyword, name);
    106108    return psMetadataItemParseString(resultItem);
    107109}
  • trunk/psModules/src/pslib/psMetadataItemParse.c

    r6872 r6874  
    11#include <stdio.h>
    22#include "pslib.h"
     3
     4# define PS_METADATA_ITEM_PARSE_NUMBER(INTYPE,OUTTYPE) \
     5case PS_DATA_##INTYPE: { \
     6    return (ps##OUTTYPE)(item->data.INTYPE); } \
    37
    48psF32 psMetadataItemParseF32(psMetadataItem *item
     
    610{
    711    switch (item->type) {
    8     case PS_DATA_F32:
    9         return item->data.F32;
    10     case PS_DATA_F64:
    11         // Assume it's OK to truncate to floating point from double
    12         return (float)item->data.F64;
    13     case PS_DATA_S32:
    14         // Promote to float
    15         return (float)item->data.S32;
     12        PS_METADATA_ITEM_PARSE_NUMBER (F32, F32);
     13        PS_METADATA_ITEM_PARSE_NUMBER (F64, F32);
     14        PS_METADATA_ITEM_PARSE_NUMBER (S8,  F32);
     15        PS_METADATA_ITEM_PARSE_NUMBER (S16, F32);
     16        PS_METADATA_ITEM_PARSE_NUMBER (S32, F32);
     17        PS_METADATA_ITEM_PARSE_NUMBER (U8,  F32);
     18        PS_METADATA_ITEM_PARSE_NUMBER (U16, F32);
     19        PS_METADATA_ITEM_PARSE_NUMBER (U32, F32);
    1620    default:
    1721        psError(PS_ERR_IO, true, "Item %s (%s) is not of floating point type (%x) --- treating as NaN.\n",
     
    2529{
    2630    switch (item->type) {
    27     case PS_TYPE_F64:
    28         return item->data.F64;
    29     case PS_TYPE_F32:
    30         // Promote to double
    31         return (double)item->data.F32;
    32     case PS_TYPE_S32:
    33         // Promote to double
    34         return (double)item->data.S32;
     31        PS_METADATA_ITEM_PARSE_NUMBER (F32, F64);
     32        PS_METADATA_ITEM_PARSE_NUMBER (F64, F64);
     33        PS_METADATA_ITEM_PARSE_NUMBER (S8,  F64);
     34        PS_METADATA_ITEM_PARSE_NUMBER (S16, F64);
     35        PS_METADATA_ITEM_PARSE_NUMBER (S32, F64);
     36        PS_METADATA_ITEM_PARSE_NUMBER (U8,  F64);
     37        PS_METADATA_ITEM_PARSE_NUMBER (U16, F64);
     38        PS_METADATA_ITEM_PARSE_NUMBER (U32, F64);
    3539    default:
    3640        psError(PS_ERR_IO, true, "Item %s (%s) is not of double-precision floating point type (%x) "
     
    6165}
    6266
     67# define PS_METADATA_ITEM_PARSE_STRING(TYPE,MODE) \
     68case PS_DATA_##TYPE: { \
     69    psString value = NULL; \
     70    psStringAppend(&value, MODE, item->data.TYPE); \
     71    return value; } \
     72
    6373psString psMetadataItemParseString(psMetadataItem *item
    6474                                  )
     
    6777    case PS_DATA_STRING:
    6878        return psMemIncrRefCounter(item->data.V);
    69     case PS_DATA_F32: {
    70             psString value = NULL;    // String to return
    71             psStringAppend(&value, "%f", item->data.F32);
    72             return value;
    73         }
    74     case PS_DATA_S32: {
    75             psString value = NULL;    // String to return
    76             psStringAppend(&value, "%d", item->data.S32);
    77             return value;
    78         }
     79
     80        PS_METADATA_ITEM_PARSE_STRING(F32, "%f");
     81        PS_METADATA_ITEM_PARSE_STRING(F64, "%f");
     82        PS_METADATA_ITEM_PARSE_STRING(S8,  "%d");
     83        PS_METADATA_ITEM_PARSE_STRING(S16, "%d");
     84        PS_METADATA_ITEM_PARSE_STRING(S32, "%d");
     85        PS_METADATA_ITEM_PARSE_STRING(U8,  "%d");
     86        PS_METADATA_ITEM_PARSE_STRING(U16, "%d");
     87        PS_METADATA_ITEM_PARSE_STRING(U32, "%d");
     88
    7989    default:
    8090        psError(PS_ERR_IO, true, "Item %s (%s) is not of string type (%x) --- treating as "
     
    8494}
    8595
     96
     97# if 0
     98case PS_DATA_F32:
     99{
     100psString value = NULL;    // String to return
     101psStringAppend(&value, "%f", item->data.F32);
     102    return value;
     103}
     104case PS_DATA_S32:
     105{
     106    psString value = NULL;    // String to return
     107    psStringAppend(&value, "%d", item->data.S32);
     108    return value;
     109}
     110# endif
Note: See TracChangeset for help on using the changeset viewer.