diff options
Diffstat (limited to 'applications/rview/rviewMDD.hh')
-rw-r--r-- | applications/rview/rviewMDD.hh | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/applications/rview/rviewMDD.hh b/applications/rview/rviewMDD.hh new file mode 100644 index 0000000..0248b35 --- /dev/null +++ b/applications/rview/rviewMDD.hh @@ -0,0 +1,185 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see <http://www.rasdaman.org> +* or contact Peter Baumann via <baumann@rasdaman.com>. +/ + +/** + * PURPOSE: + * + * The rviewMDD module encapsulates various generic operations on + * MDD objects; it relies heavily on templates for this. All functions + * provided here are a) completely independent from the rest of rView + * and b) work on any kind of MDD, i.e. no restrictions whatsoever on + * dimensionality or base type. Most functions utilize + * mdd_objectFunctionType() for this which iterates over the MDD object + * basetype first and calls functions provided in the mdd_function_pointers + * structure which perform the required operation on each of the primitive + * basetypes. + * + * Functions provided are: + * + * - mdd_objectRange(): return the minimum and maximum cell values. + * - mdd_createSubcube(): creates a new MDD object by copying a subcube + * (or all of) a source MDD object; optionally persistent. + * - mdd_objectScaleInter(): creates new object by resampling (part of) + * the source object using n-linear interpolation. Use for upsampling. + * - mdd_objectScaleAverage(): creates new object by resampling (part of) + * the source object using averaging. Use for downsampling. + * - mdd_objectScaleSimple(): creates new object by scaling (part of) + * the source object using simple nearest neighbour. Fast but blocky. + * - mdd_objectChangeEndianness(): creates a new object where the + * endianness is inverted compared to the source object, or changes + * the object itself. + * + * COMMENTS: + * None + */ + + + +#ifndef _RVIEW_MDD_H_ +#define _RVIEW_MDD_H_ + + + +#ifdef __GNUG__ +#pragma interface +#endif + + +#include "rasodmg/ref.hh" +#include "rasodmg/marray.hh" +#include "rasodmg/gmarray.hh" +#include "rasodmg/database.hh" +#include "raslib/odmgtypes.hh" + +#include "raslib/primitivetype.hh" +#include "raslib/structuretype.hh" + + + + + +/* + * Generic functionality on MDD objects -- data types and support functions + */ + +// 1) Data types + +// A descriptor of the mdd iteration +typedef struct mdd_function_desc { + double step; + long lstep; + long srcoff; + long low; // Entire domain of source cube + long high; + long useLow; // Domain that should be used, must be wholly contained in source cube + long useHigh; + long newLow; // Domain of resulting cube + long newHigh; +} mdd_function_desc; + + + +// The signature of a basic mdd function +// Important note: VISUAL C needs the variable pointers first, followed by the +// constant pointers, or the variable pointers will be interpreted as constant +// ones too. No joke. +#define MDD_FUNCTION_SIGNATURE(type) \ + (type *dest, const type *src, const mdd_function_desc *mfd, int dim, int datastep, void *auxData) + +typedef int (*mdd_func_bool)MDD_FUNCTION_SIGNATURE(r_Boolean); +typedef int (*mdd_func_char)MDD_FUNCTION_SIGNATURE(r_Char); +typedef int (*mdd_func_octet)MDD_FUNCTION_SIGNATURE(r_Octet); +typedef int (*mdd_func_short)MDD_FUNCTION_SIGNATURE(r_Short); +typedef int (*mdd_func_ushort)MDD_FUNCTION_SIGNATURE(r_UShort); +typedef int (*mdd_func_long)MDD_FUNCTION_SIGNATURE(r_Long); +typedef int (*mdd_func_ulong)MDD_FUNCTION_SIGNATURE(r_ULong); +typedef int (*mdd_func_float)MDD_FUNCTION_SIGNATURE(r_Float); +typedef int (*mdd_func_double)MDD_FUNCTION_SIGNATURE(r_Double); + +// A structure of mdd functions for all atomic base types +typedef struct mdd_function_pointers { + mdd_func_bool mddf_bool; + mdd_func_char mddf_char; + mdd_func_octet mddf_octet; + mdd_func_short mddf_short; + mdd_func_ushort mddf_ushort; + mdd_func_long mddf_long; + mdd_func_ulong mddf_ulong; + mdd_func_float mddf_float; + mdd_func_double mddf_double; +} mdd_function_pointers; + +// Init a mdd_function_pointers structure with a mdd function template (therefore the +// same function name for all members) +#define MDD_INIT_FUNCTIONS(mfp, tf) \ + mfp.mddf_bool = (mdd_func_bool)tf; \ + mfp.mddf_char = (mdd_func_char)tf; \ + mfp.mddf_octet = (mdd_func_octet)tf; \ + mfp.mddf_short = (mdd_func_short)tf; \ + mfp.mddf_ushort = (mdd_func_ushort)tf; \ + mfp.mddf_long = (mdd_func_long)tf; \ + mfp.mddf_ulong = (mdd_func_ulong)tf; \ + mfp.mddf_float = (mdd_func_float)tf; \ + mfp.mddf_double = (mdd_func_double)tf; + + + +// 2) Support functions +extern char *objectCalcStart(const char *src, const mdd_function_desc *mfd, int dim); + +// execute mdd functions over arbitrary objects +extern int mdd_objectFunctionPrim(const mdd_function_pointers *mfp, r_Primitive_Type *primType, const char *src, char *dest, const mdd_function_desc *mfd, int dim, int tpsize, void *auxData); +extern int mdd_objectFunctionStruct(const mdd_function_pointers *mfp, r_Structure_Type *structType, const char *src, char *dest, const mdd_function_desc *mfd, int dim, int tpsize, void *auxData); +extern int mdd_objectFunctionType(const mdd_function_pointers *mfp, const r_Type *baseType, const char *src, char *dest, const mdd_function_desc *mfd, int dim, int tpsize, void *auxData); + +// Initialising mdd functions +#define MDD_OBJECT_INIT_NEWIV 1 +#define MDD_OBJECT_INIT_FPSTEP (2 | MDD_OBJECT_INIT_NEWIV) +extern char *mdd_objectFunctionInitMdd(r_Ref<r_GMarray> mddPtr, r_Ref<r_GMarray> &newMddPtr, r_Minterval &newInterv, int tpsize, r_Dimension dim, r_Database *db=NULL); +extern mdd_function_desc *mdd_objectFunctionInitData(r_Minterval &interv, r_Minterval &useInterv, r_Minterval &newInterv, int tpsize, unsigned int flags=0); + + + + + + +/* + * Wrapper functions for mdd function templates + */ +int mdd_objectRange(r_Ref<r_GMarray> mddObj, r_Minterval &useInterv, double &min, double &max); + +int mdd_createSubcube(r_Ref<r_GMarray> srcMdd, r_Ref<r_GMarray> &newMdd, r_Minterval *domain, r_Database *db); + +int mdd_objectScaleInter(r_Ref<r_GMarray> srcMdd, r_Minterval &useInterv, r_Ref<r_GMarray> &newMdd, r_Minterval &newInterv); + +int mdd_objectScaleAverage(r_Ref<r_GMarray> srcMdd, r_Minterval &useInterv, r_Ref<r_GMarray> &newMdd, r_Minterval &newInterv); + +int mdd_objectScaleSimple(r_Ref<r_GMarray> srcMdd, r_Minterval &useInterv, r_Ref<r_GMarray> &newMdd, r_Minterval &newInterv); + +int mdd_objectChangeEndianness(r_Ref<r_GMarray> srcMdd, r_Minterval &useInterv, r_Ref<r_GMarray> *newMdd=NULL, r_Minterval *newInterv=NULL); + +#if (defined(EARLY_TEMPLATE) && defined(__EXECUTABLE__)) +#include "rviewMDD.cpp" +#endif + +#endif |