00001 #ifndef __IMAGERW_H__
00002 #define __IMAGERW_H__
00003
00004
00005
00006
00007
00008
00009
00010 #include "configure.h"
00011 #include "filelist.h"
00012 #include "vassert.h"
00013 #include <limits.h>
00014 #include <string.h>
00015
00016
00017
00018
00019
00020 typedef enum
00021 {
00022 vPIXEL_FORMAT_NOT_SUPPORTED,
00023 vPIXEL_FORMAT_GRAYSCALE,
00024 vPIXEL_FORMAT_RGB,
00025 vPIXEL_FORMAT_RGBA,
00026 vPIXEL_FORMAT_BGR,
00027 vPIXEL_FORMAT_BGRA
00028 }
00029 vPIXEL_FORMAT_TYPE;
00030
00031 #define vPIXEL_FORMAT_GRAYSCALE_CHANNELS 1
00032 #define vPIXEL_FORMAT_RGB_CHANNELS 3
00033 #define vPIXEL_FORMAT_RGBA_CHANNELS 4
00034 #define vPIXEL_FORMAT_BGR_CHANNELS 3
00035 #define vPIXEL_FORMAT_BGRA_CHANNELS 4
00036
00037
00038 typedef enum
00039 {
00040 vPIXEL_CHANNEL_NOT_SUPPORTED,
00041 vPIXEL_CHANNEL_UCHAR,
00042 vPIXEL_CHANNEL_USHORT12,
00043 vPIXEL_CHANNEL_USHORT16
00044 }
00045 vPIXEL_CHANNEL_TYPE;
00046
00047 #define vPIXEL_CHANNEL_UCHAR_BITS 8
00048 #define vPIXEL_CHANNEL_USHORT12_BITS 12
00049 #define vPIXEL_CHANNEL_USHORT16_BITS 16
00050
00051
00052 #define vPIXEL_CODE( format, type ) ( ( format << 16 ) | type )
00053
00054 typedef enum
00055 {
00056 vPIXEL_CODE_NOT_SUPPORTED = 0,
00057
00058 vPIXEL_CODE_GRAYSCALE_UCHAR =
00059 vPIXEL_CODE( vPIXEL_FORMAT_GRAYSCALE, vPIXEL_CHANNEL_UCHAR ),
00060
00061 vPIXEL_CODE_GRAYSCALE_USHORT12 =
00062 vPIXEL_CODE( vPIXEL_FORMAT_GRAYSCALE, vPIXEL_CHANNEL_USHORT12 ),
00063
00064 vPIXEL_CODE_GRAYSCALE_USHORT16 =
00065 vPIXEL_CODE( vPIXEL_FORMAT_GRAYSCALE, vPIXEL_CHANNEL_USHORT16 ),
00066
00067 vPIXEL_CODE_RGB_UCHAR =
00068 vPIXEL_CODE( vPIXEL_FORMAT_RGB, vPIXEL_CHANNEL_UCHAR ),
00069
00070 vPIXEL_CODE_RGBA_UCHAR =
00071 vPIXEL_CODE( vPIXEL_FORMAT_RGBA, vPIXEL_CHANNEL_UCHAR ),
00072
00073 vPIXEL_CODE_BGR_UCHAR =
00074 vPIXEL_CODE( vPIXEL_FORMAT_BGR, vPIXEL_CHANNEL_UCHAR ),
00075
00076 vPIXEL_CODE_BGRA_UCHAR =
00077 vPIXEL_CODE( vPIXEL_FORMAT_BGRA, vPIXEL_CHANNEL_UCHAR )
00078 }
00079 vPIXEL_CODE_TYPE;
00080
00081
00082 #define G_PIXEL_UNSUPPORTED vPIXEL_CODE_NOT_SUPPORTED
00083 #define G_PIXEL_LUMINANCE8 vPIXEL_CODE_GRAYSCALE_UCHAR
00084 #define G_PIXEL_LUMINANCE12 vPIXEL_CODE_GRAYSCALE_USHORT12
00085 #define G_PIXEL_LUMINANCE16 vPIXEL_CODE_GRAYSCALE_USHORT16
00086 #define G_PIXEL_RGB24 vPIXEL_CODE_RGB_UCHAR
00087 #define G_PIXEL_RGBA32 vPIXEL_CODE_RGBA_UCHAR
00088 #define G_PIXEL_BGR24 vPIXEL_CODE_BGR_UCHAR
00089 #define G_PIXEL_BGRA32 vPIXEL_CODE_BGRA_UCHAR
00090
00091
00092 #define vPIXEL_CODE_GRAYSCALE_UCHAR_BYTES 1
00093 #define vPIXEL_CODE_GRAYSCALE_USHORT12_BYTES 2
00094 #define vPIXEL_CODE_GRAYSCALE_USHORT16_BYTES 2
00095 #define vPIXEL_CODE_RGB_UCHAR_BYTES 3
00096 #define vPIXEL_CODE_RGBA_UCHAR_BYTES 4
00097 #define vPIXEL_CODE_BGR_UCHAR_BYTES 3
00098 #define vPIXEL_CODE_BGRA_UCHAR_BYTES 4
00099
00100
00101
00102 const char* GetPixelCodeDescriptionString( const vPIXEL_CODE_TYPE type );
00103
00104
00105 typedef struct tagPixelDescriptor
00106 {
00107 vSIZE channelsPerPixel;
00108 vSIZE bytesPerPixel;
00109 vSIZE grayscaleBits;
00110 vSIZE redChannelBits;
00111 vSIZE greenChannelBits;
00112 vSIZE blueChannelBits;
00113 vSIZE alphaChannelBits;
00114 }
00115 PixelDescriptor;
00116
00117
00118 vBOOL GetPixelDescriptor( vPIXEL_CODE_TYPE pixelCode, PixelDescriptor *pd );
00119
00120
00121
00122 vSIZE GetPixelBufferSize( vPIXEL_CODE_TYPE pixelCode, vSIZE width, vSIZE height );
00123
00124
00125 typedef struct tagColor1ub
00126 {
00127 vUCHAR luminance;
00128 }
00129 Color1ub;
00130
00131 typedef struct tagColor1us12
00132 {
00133 vUSHORT luminance;
00134 }
00135 Color1us12;
00136
00137 typedef struct tagColor1us16
00138 {
00139 vUSHORT luminance;
00140 }
00141 Color1us16;
00142
00143 typedef struct tagColor3ub
00144 {
00145 vUCHAR red;
00146 vUCHAR green;
00147 vUCHAR blue;
00148 }
00149 Color3ub;
00150
00151 typedef struct tagColor4ub
00152 {
00153 vUCHAR red;
00154 vUCHAR green;
00155 vUCHAR blue;
00156 vUCHAR alpha;
00157 }
00158 Color4ub;
00159
00160
00161 Color1ub MakeColor1ub( Color3ub color );
00162 Color1us12 MakeColor1us12( Color3ub color );
00163 Color1us16 MakeColor1us16( Color3ub color );
00164
00165 Color3ub MakeColor3ub( Color3ub color, vPIXEL_CODE_TYPE type );
00166
00167
00168
00169 typedef enum
00170 {
00171 vIMAGERW_NO_ERROR,
00172 vIMAGERW_ERROR_FILE_OPEN,
00173 vIMAGERW_ERROR_FILE_READ,
00174 vIMAGERW_ERROR_FILE_WRITE,
00175 vIMAGERW_ERROR_FILE_INVALID,
00176 vIMAGERW_ERROR_FILE_TYPE,
00177 vIMAGERW_ERROR_UNSUPPORTED,
00178 vIMAGERW_ERROR_OUT_OF_MEMORY
00179 }
00180 vIMAGERW_ERROR_CODE;
00181
00182
00183 #define G_IMAGE_DOMAIN 0
00184
00185
00186 typedef vIMAGERW_ERROR_CODE GImageErrorType;
00187
00188 #define G_IMAGE_NO_ERROR vIMAGERW_NO_ERROR
00189 #define G_IMAGE_ERROR_FILE_OPEN vIMAGERW_ERROR_FILE_OPEN
00190 #define G_IMAGE_ERROR_FILE_READ vIMAGERW_ERROR_FILE_READ
00191 #define G_IMAGE_ERROR_FILE_WRITE vIMAGERW_ERROR_FILE_WRITE
00192 #define G_IMAGE_ERROR_FILE_INVALID vIMAGERW_ERROR_FILE_INVALID
00193 #define G_IMAGE_ERROR_FILE_TYPE vIMAGERW_ERROR_FILE_TYPE
00194 #define G_IMAGE_ERROR_UNSUPPORTED vIMAGERW_ERROR_UNSUPPORTED
00195 #define G_IMAGE_ERROR_OUT_OF_MEMORY vIMAGERW_ERROR_OUT_OF_MEMORY
00196
00197
00198
00199 typedef enum
00200 {
00201 vFILE_TYPE_TIFF,
00202 vFILE_TYPE_TARGA,
00203 vFILE_TYPE_BIORAD_PIC,
00204 vFILE_TYPE_RAW,
00205
00206 vFILE_TYPE_UNSUPPORTED
00207 }
00208 vFILE_TYPE;
00209
00210 #define vNUM_FILE_TYPES ( ( vINT )vFILE_TYPE_UNSUPPORTED )
00211
00212
00213 typedef vFILE_TYPE GImageFileType;
00214
00215 #define G_NUM_IMAGE_FILE_TYPES vNUM_FILE_TYPES
00216
00217 #define G_IMAGE_FILE_TIFF vFILE_TYPE_TIFF
00218 #define G_IMAGE_FILE_TARGA vFILE_TYPE_TARGA
00219 #define G_IMAGE_FILE_BIORAD_PIC vFILE_TYPE_BIORAD_PIC
00220 #define G_IMAGE_FILE_RAW vFILE_TYPE_RAW
00221
00222 #define G_IMAGE_FILE_UNSUPPORTED vFILE_TYPE_UNSUPPORTED
00223
00224
00225
00226
00227
00228 typedef struct tagImageDescriptor
00229 {
00230 vPIXEL_CODE_TYPE pixelCode;
00231 PixelDescriptor pd;
00232 vSIZE width;
00233 vSIZE height;
00234 vSIZE length;
00235 vENDIAN_TYPE endian;
00236 vSIZE extra1;
00237 }
00238 ImageDescriptor;
00239
00240
00241
00242
00243 vIMAGERW_ERROR_CODE GetFileTypeId( vSTRING fileName, vFILE_TYPE *fileType );
00244
00245
00246 vFILE_TYPE GetFileTypeByExtension( const char *fileName );
00247
00248 #define g_image_file_type_by_extension GetFileTypeByExtension
00249
00250
00251
00252
00253
00254 vSTRING GetFileFilter( vFILE_TYPE fileType );
00255
00256
00257
00258 vSTRING GetFileExtension( vFILE_TYPE fileType );
00259
00260
00261 typedef struct _GImage Image_t;
00262
00263
00264
00265
00266 vIMAGERW_ERROR_CODE ReadImage
00267 (
00268 const char *fileName,
00269 vFILE_TYPE fileType,
00270 Image_t *image,
00271 const ImageDescriptor *desc
00272 );
00273
00274 vIMAGERW_ERROR_CODE WriteImage
00275 (
00276 const char *fileName,
00277 vFILE_TYPE fileType,
00278 const Image_t *image,
00279 const ImageDescriptor *desc
00280 );
00281
00282
00283 typedef ImageDescriptor GImageInfo;
00284 typedef FileListNode GList;
00285 #define g_list_next( iter ) NextFileListIterator( ( iter ) )
00286 #define g_list_data( iter ) ( ( void* )( ( iter )->fileName ) )
00287 typedef PixelDescriptor GPixelInfo;
00288 typedef vPIXEL_CODE_TYPE GPixelType;
00289
00290
00291
00292
00293 gpointer g_pointer_offset( gpointer ptr, glong bytes );
00294
00295
00296 typedef struct _GImage GImage;
00297 typedef struct _GImageClass GImageClass;
00298
00299 struct _GImage
00300 {
00301 GObject parent_instance;
00302
00303 GPixelType pixel_type;
00304 GPixelInfo pixel_info;
00305 gsize width;
00306 gsize height;
00307 gsize length;
00308 gpointer pixels;
00309 gpointer user_data;
00310 GImageInfo image_info;
00311 gsize max_intensity;
00312 };
00313
00314 struct _GImageClass
00315 {
00316 GObjectClass parent_class;
00317 GObjectFinalizeFunc parent_finalize;
00318 };
00319
00320
00321 #define G_TYPE_IMAGE ( g_image_get_type() )
00322 #define G_IMAGE( obj ) ( G_TYPE_CHECK_INSTANCE_CAST( ( obj ), G_TYPE_IMAGE, GImage ) )
00323 #define G_IMAGE_CLASS( klass ) ( G_TYPE_CHECK_CLASS_CAST( ( klass ), G_TYPE_IMAGE, GImageClass ) )
00324 #define G_IMAGE_GET_CLASS( obj ) ( G_TYPE_INSTANCE_GET_CLASS( ( obj ), G_TYPE_IMAGE, GImageClass ) )
00325
00326
00327 GType g_image_get_type( void );
00328
00329 GImage* g_image_new( void );
00330
00331
00332
00333
00334 #define g_image_pixel_type( image ) ( G_IMAGE( image )->pixel_type )
00335 #define g_image_pixel_info( image ) ( G_IMAGE( image )->pixel_info )
00336 #define g_image_width( image ) ( G_IMAGE( image )->width )
00337 #define g_image_height( image ) ( G_IMAGE( image )->height )
00338 #define g_image_length( image ) ( G_IMAGE( image )->length )
00339 #define g_image_pixels( image ) ( G_IMAGE( image )->pixels )
00340
00341
00342 gboolean g_image_read_from_file
00343 (
00344 GImage *image,
00345 const gchar *file_name,
00346 GImageFileType file_type,
00347 gpointer user_data,
00348 GError **error
00349 );
00350
00351 gboolean g_image_write_to_file
00352 (
00353 const GImage *image,
00354 const gchar *file_name,
00355 GImageFileType file_type,
00356 gpointer user_data,
00357 GError **error
00358 );
00359
00360
00361 gboolean g_image_info_from_file
00362 (
00363 GImage *image,
00364 const gchar *file_name,
00365 GImageFileType file_type,
00366 gpointer user_data,
00367 GError **error
00368 );
00369
00370
00371 gboolean g_image_read_from_file_at
00372 (
00373 GImage *image,
00374 const gchar *file_name,
00375 GImageFileType file_type,
00376 gpointer user_data,
00377 gsize z,
00378 GError **error
00379 );
00380
00381
00382
00383
00384
00385 typedef struct _GImageReader GImageReader;
00386 typedef struct _GImageReaderClass GImageReaderClass;
00387
00388 struct _GImageReader
00389 {
00390 GObject parent_instance;
00391
00392 GList *current_file;
00393 GList *end_files;
00394 GImageInfo image_info;
00395 GImage *image_2d;
00396 gsize length_3d;
00397 gsize index_2d;
00398 gsize offset;
00399 gboolean enabled;
00400 };
00401
00402 struct _GImageReaderClass
00403 {
00404 GObjectClass parent_class;
00405 GObjectFinalizeFunc parent_finalize;
00406 };
00407
00408
00409 #define G_TYPE_IMAGE_READER ( g_image_reader_get_type() )
00410 #define G_IMAGE_READER( obj ) ( G_TYPE_CHECK_INSTANCE_CAST( ( obj ), G_TYPE_IMAGE_READER, GImageReader ) )
00411 #define G_IMAGE_READER_CLASS( klass ) ( G_TYPE_CHECK_CLASS_CAST( ( klass ), G_TYPE_IMAGE_READER, GImageReaderClass ) )
00412 #define G_IMAGE_READER_GET_CLASS( obj ) ( G_TYPE_INSTANCE_GET_CLASS( ( obj ), G_TYPE_IMAGE_READER, GImageReaderClass ) )
00413
00414
00415 GType g_image_reader_get_type( void );
00416
00417 GImageReader* g_image_reader_new( void );
00418
00419 gboolean g_image_reader_create
00420 (
00421 GImageReader *image_reader,
00422 GList *first_file,
00423 GList *end_files,
00424 const GImageInfo *image_info,
00425 gboolean enabled,
00426 GError **error
00427 );
00428
00429
00430
00431 gboolean g_image_reader_enable( GImageReader *image_reader, GError **error );
00432 void g_image_reader_disable( GImageReader *image_reader );
00433
00434 gboolean g_image_reader_has_more( const GImageReader *image_reader );
00435
00436 gboolean g_image_reader_advance( GImageReader *image_reader, GError **error );
00437
00438 GImage* g_image_reader_read( GImageReader *image_reader );
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451 #endif
00452