00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __GZ_IMAGE_H__
00022 #define __GZ_IMAGE_H__
00023
00033 #include "gzBase.h"
00034 #include "gzReference.h"
00035 #include "gzSerialize.h"
00036
00037 #include "gzRGBA.h"
00038 #include "gzObject.h"
00039
00040 enum gzImageChanges
00041 {
00042 GZ_IMAGE_CHANGE_DATA = 1<<0 ,
00043 GZ_IMAGE_CHANGE_FORMAT = 1<<1 ,
00044 GZ_IMAGE_CHANGE_ALL = GZ_IMAGE_CHANGE_DATA+GZ_IMAGE_CHANGE_FORMAT
00045 };
00046
00047 enum gzImageType
00048 {
00051 GZ_IMAGE_TYPE_RGB_8 ,
00054 GZ_IMAGE_TYPE_RGBA_8 ,
00055 GZ_IMAGE_TYPE_BW_8 ,
00056 GZ_IMAGE_TYPE_BWA_8 ,
00057 GZ_IMAGE_TYPE_DEPTHMAP ,
00058 GZ_IMAGE_TYPE_BITMAP ,
00059 GZ_IMAGE_TYPE_BGRA_5_5_5_1 ,
00060 GZ_IMAGE_TYPE_BGR_5_6_5 ,
00061 GZ_IMAGE_TYPE_CUSTOM
00062 };
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 class gzImage : public gzObject , public gzNameInterface , public gzUpdateIDFeatureInterface
00080 {
00081 public:
00082
00083 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_BASE_EXPORT);
00084
00086
00089 GZ_BASE_EXPORT gzImage(const gzString & name=GZ_EMPTY_STRING);
00090
00092 GZ_BASE_EXPORT virtual ~gzImage(){};
00093
00094
00095
00096 GZ_BASE_EXPORT gzVoid setAlignment(gzUByte alignment);
00097 GZ_BASE_EXPORT gzVoid setSwapBytes(gzBool swap);
00098 GZ_BASE_EXPORT gzVoid setRowLength(gzUInt rowLength);
00099 GZ_BASE_EXPORT gzVoid setSkipRows(gzUInt skiprows);
00100 GZ_BASE_EXPORT gzVoid setSkipPixels(gzUInt skippix);
00101 GZ_BASE_EXPORT gzVoid setLSBFirst(gzBool lsbfirst);
00102
00104 GZ_BASE_EXPORT gzVoid setWidth(gzULong width);
00105
00107 GZ_BASE_EXPORT gzVoid setHeight(gzULong height);
00108
00110 GZ_BASE_EXPORT gzVoid setSize(gzULong width , gzULong height);
00111
00112 GZ_BASE_EXPORT gzVoid setFormat(gzEnum format);
00113 GZ_BASE_EXPORT gzVoid setCompressedFormat(gzEnum format);
00114
00115 GZ_BASE_EXPORT gzVoid setComponentType(gzEnum type);
00116 GZ_BASE_EXPORT gzVoid setComponents(gzUByte components);
00117 GZ_BASE_EXPORT gzVoid setBytesPerComponent(gzFloat size);
00118
00120 GZ_BASE_EXPORT gzBool isCompressed() { return m_compressedFormat!=0; }
00121
00123 GZ_BASE_EXPORT virtual gzBool compress(gzEnum compressFormat);
00124 GZ_BASE_EXPORT virtual gzBool uncompress();
00125
00126
00127 GZ_BASE_EXPORT gzUByte getAlignment() { return m_alignment; }
00128 GZ_BASE_EXPORT gzBool getSwapBytes() { return m_swapBytes; }
00129 GZ_BASE_EXPORT gzUInt getRowLength() { return m_rowLength; }
00130 GZ_BASE_EXPORT gzUInt getSkipRows() { return m_skipRows; }
00131 GZ_BASE_EXPORT gzUInt getSkipPixels() { return m_skipPixels; }
00132 GZ_BASE_EXPORT gzBool getLSBFirst() { return m_lsbFirst; }
00133
00135 GZ_BASE_EXPORT gzULong getWidth() { return m_width; }
00136
00138 GZ_BASE_EXPORT gzULong getHeight() { return m_height; }
00139
00141 GZ_BASE_EXPORT gzEnum getFormat() { return m_format; }
00142
00144 GZ_BASE_EXPORT gzEnum getCompressedFormat() { return m_compressedFormat;}
00145
00146 GZ_BASE_EXPORT gzEnum getComponentType() { return m_componentType; }
00147 GZ_BASE_EXPORT gzUByte getComponents() { return m_components; }
00148 GZ_BASE_EXPORT gzFloat getBytesPerComponent() { return m_bytesPerComponent; }
00149
00151 GZ_BASE_EXPORT gzImageType getImageType() { return m_imageType; }
00152
00154
00161 GZ_BASE_EXPORT gzImage * reSample(gzULong width , gzULong height , gzImage *template_image=NULL , gzBool sample=TRUE , gzInt sampleWidth=2,gzBool progress=FALSE);
00162
00164
00168 GZ_BASE_EXPORT gzImage * create(gzImage *template_image=NULL,gzRGBASwizzle swizzle=GZ_MAP_RGBA_TO_RGBA , gzFloat R_factor =GZ_FLOAT_ONE, gzFloat G_factor =GZ_FLOAT_ONE, gzFloat B_factor =GZ_FLOAT_ONE, gzFloat A_factor =GZ_FLOAT_ONE , gzFloat C_value=GZ_FLOAT_ONE);
00169
00171
00176 GZ_BASE_EXPORT gzVoid copyFrom(gzImage *image,gzRGBASwizzle swizzle=GZ_MAP_RGBA_TO_RGBA , gzFloat R_factor =GZ_FLOAT_ONE, gzFloat G_factor =GZ_FLOAT_ONE, gzFloat B_factor =GZ_FLOAT_ONE, gzFloat A_factor =GZ_FLOAT_ONE , gzFloat C_value=GZ_FLOAT_ONE);
00177
00178
00179
00181 GZ_BASE_EXPORT gzVoid invert();
00182
00183 GZ_BASE_EXPORT gzVoid toGray();
00184 GZ_BASE_EXPORT gzVoid alphaMask(gzDouble level);
00185 GZ_BASE_EXPORT gzVoid alphaMask(gzRGBA mask);
00186
00188 GZ_BASE_EXPORT gzVoid flipVertical();
00189
00191 GZ_BASE_EXPORT gzVoid flipHorizontal();
00192
00193
00194
00196
00200 GZ_BASE_EXPORT gzBool hasSignificantAlpha(gzBool evaluateDDS =FALSE);
00201
00203
00207 GZ_BASE_EXPORT gzBool hasContiniousAlpha(gzBool evaluateDDS =FALSE,gzFloat minMaxDiff=0.05);
00208
00209
00211 GZ_BASE_EXPORT virtual gzBool hasAlphaComponent();
00212
00214 GZ_BASE_EXPORT virtual gzULong getRowSize(gzULong width);
00215
00217 GZ_BASE_EXPORT virtual gzULong getArraySize(gzULong width=0 , gzULong height=0 );
00218
00220 GZ_BASE_EXPORT virtual gzRGBA getPixel(gzULong width , gzULong height );
00221
00223 GZ_BASE_EXPORT virtual gzVoid setPixel(gzULong width , gzULong height , const gzRGBA &value);
00224
00225
00226 GZ_BASE_EXPORT gzDynamicArray<gzUByte> & getArray() { return m_data; }
00227 GZ_BASE_EXPORT gzDynamicArray<gzUByte> & createArray(gzBool clearData=FALSE);
00228 GZ_BASE_EXPORT gzVoid setArray(const gzDynamicArray<gzUByte> &array);
00229 GZ_BASE_EXPORT gzBool hasCreatedArray() { return m_hasCreatedArray; }
00230 GZ_BASE_EXPORT gzVoid setCreatedArray(gzBool on) { m_hasCreatedArray=on; }
00231
00232 GZ_BASE_EXPORT virtual gzImage *cloneImageType() const;
00233 GZ_BASE_EXPORT virtual gzReference *clone() const;
00234
00235
00236
00238 GZ_BASE_EXPORT gzBool hasSubImage();
00239
00241 GZ_BASE_EXPORT gzULong getNumberOfSubImages();
00242
00244 GZ_BASE_EXPORT gzImage *getSubImage(gzULong index);
00245
00246 GZ_BASE_EXPORT gzRefList<gzImage> &getSubImageList();
00247
00249
00252 GZ_BASE_EXPORT gzVoid addSubImage(gzImage *image,gzLong index = -1);
00253
00255 GZ_BASE_EXPORT gzVoid removeSubImage(gzImage *image);
00256
00258 GZ_BASE_EXPORT gzVoid removeAllSubImages();
00259
00260
00261
00263 GZ_BASE_EXPORT virtual gzVoid write(gzSerializeAdapter *adapter);
00264
00266 GZ_BASE_EXPORT virtual gzVoid read(gzSerializeAdapter *adapter);
00267
00269 GZ_BASE_EXPORT virtual gzULong getDataSize(gzSerializeAdapter *adapter=NULL) const;
00270
00271
00272
00274
00283 GZ_BASE_EXPORT static gzImage *createImage(gzImageType type , const gzString & name=GZ_EMPTY_STRING);
00284
00285
00286 protected:
00287
00288 GZ_BASE_EXPORT gzFloat sampleFunction(gzFloat x);
00289 GZ_BASE_EXPORT gzVoid setImageType(gzImageType type);
00290
00291
00292 gzDynamicArray<gzUByte> m_data;
00293
00294 gzUInt m_rowLength;
00295 gzUInt m_skipRows;
00296 gzUInt m_skipPixels;
00297
00298 gzULong m_width;
00299 gzULong m_height;
00300 gzEnum m_format;
00301 gzEnum m_compressedFormat;
00302 gzEnum m_componentType;
00303 gzImageType m_imageType;
00304
00305 gzULong m_calculatedRowSize;
00306
00307 gzUByte m_components;
00308 gzUByte m_alignment;
00309 gzFloat m_bytesPerComponent;
00310
00311 gzBool m_hasCreatedArray:1;
00312 gzBool m_hasCalculatedRowSize:1;
00313 gzBool m_lsbFirst:1;
00314 gzBool m_swapBytes:1;
00315
00316 gzLateBindData<gzRefList<gzImage> > m_subImageList;
00317 };
00318
00319
00320 GZ_DECLARE_REFPTR(gzImage);
00321
00322 #define GZ_EVALUATE_EXTENSION ("<*!*>")
00323
00324
00327 #define GZ_IMAGE_FLAG_NUM(x) (gzSerializeAdapterFlags)(1<<( x+GZ_SERIALIZE_ADAPTER_FLAG_MAX_SIZE))
00328
00329 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_DEFAULT = (gzSerializeAdapterFlags)0;
00330
00334 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_FLIP_DDS_IMAGES = GZ_IMAGE_FLAG_NUM(0);
00335
00342 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_NO_CACHED_IMAGE = GZ_IMAGE_FLAG_NUM(1);
00343
00349 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_NO_ALTERNATE_IMAGE_EXT = GZ_IMAGE_FLAG_NUM(2);
00350 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_IGNORE_IMAGE_MIPMAPS = GZ_IMAGE_FLAG_NUM(3);
00351
00353 const gzSerializeAdapterFlags GZ_IMAGE_FLAGS_NO_DXT1_ALPHA = GZ_IMAGE_FLAG_NUM(4);
00354
00356 const gzULongLong GZ_IMAGE_FLAG_MAX_SIZE = GZ_SERIALIZE_ADAPTER_FLAG_MAX_SIZE+5;
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 class gzImageManager : public gzReference
00374 {
00375 public:
00377 GZ_BASE_EXPORT virtual ~gzImageManager(){};
00378
00380 GZ_BASE_EXPORT static gzVoid registerManager(gzImageManager *manager);
00381
00383 GZ_BASE_EXPORT static gzVoid unregisterManager(gzImageManager *manager);
00384
00386 GZ_BASE_EXPORT static gzVoid unregisterManagers();
00387
00389 GZ_BASE_EXPORT static gzImage *loadImage(const gzString &url , gzString extension=GZ_EVALUATE_EXTENSION , gzSerializeAdapterFlags flags=GZ_IMAGE_FLAGS_DEFAULT , gzULong version=0 , const gzString &password=GZ_EMPTY_STRING);
00390
00392 GZ_BASE_EXPORT virtual gzImage *loadImage(gzSerializeAdapter *adapter);
00393
00395 GZ_BASE_EXPORT static gzBool saveImage(gzImage *image , const gzString &url , gzString extension=GZ_EVALUATE_EXTENSION , gzSerializeAdapterFlags flags=GZ_IMAGE_FLAGS_DEFAULT , gzULong version=0, const gzString &password=GZ_EMPTY_STRING);
00396
00398 GZ_BASE_EXPORT virtual gzBool saveImage(gzImage *image , gzSerializeAdapter *adapter);
00399
00400 GZ_BASE_EXPORT static gzVoid clearCachedImages(gzBool leaveShared=TRUE);
00401
00402 GZ_BASE_EXPORT static gzVoid updateCachedImage(gzImage *oldImage , gzImage *newImage);
00403
00404 GZ_BASE_EXPORT static gzVoid registerImageFactoryObjects();
00405
00406 GZ_BASE_EXPORT static gzString getAllExtensions();
00407
00409 GZ_BASE_EXPORT virtual gzString getExtensions()=0;
00410
00412 GZ_BASE_EXPORT virtual gzULong getVersion(const gzString &extension)=0;
00413
00414 protected:
00415
00417 GZ_BASE_EXPORT virtual gzVoid registerManager(const gzString &extension);
00418
00419 static gzRefDict<gzString,gzImageManager> s_registeredImageManagers;
00420
00421 static gzRefDict<gzString,gzImage> s_imageCache;
00422
00423 };
00424
00425 #endif