1 /* 2 3 Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 4 Digital Ltd. LLC 5 6 All rights reserved. 7 8 Redistribution and use in source and binary forms, with or without 9 modification, are permitted provided that the following conditions are 10 met: 11 * Redistributions of source code must retain the above copyright 12 notice, this list of conditions and the following disclaimer. 13 * Redistributions in binary form must reproduce the above 14 copyright notice, this list of conditions and the following disclaimer 15 in the documentation and/or other materials provided with the 16 distribution. 17 * Neither the name of Industrial Light & Magic nor the names of 18 its contributors may be used to endorse or promote products derived 19 from this software without specific prior written permission. 20 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 33 */ 34 35 #ifndef INCLUDED_IMF_C_RGBA_FILE_H 36 #define INCLUDED_IMF_C_RGBA_FILE_H 37 38 39 #include <stdlib.h> 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 /* 46 ** Interpreting unsigned shorts as 16-bit floating point numbers 47 */ 48 49 typedef unsigned short ImfHalf; 50 51 void ImfFloatToHalf (float f, 52 ImfHalf *h); 53 54 void ImfFloatToHalfArray (int n, 55 const float f[/*n*/], 56 ImfHalf h[/*n*/]); 57 58 float ImfHalfToFloat (ImfHalf h); 59 60 void ImfHalfToFloatArray (int n, 61 const ImfHalf h[/*n*/], 62 float f[/*n*/]); 63 64 /* 65 ** RGBA pixel; memory layout must be the same as struct Imf::Rgba. 66 */ 67 68 struct ImfRgba 69 { 70 ImfHalf r; 71 ImfHalf g; 72 ImfHalf b; 73 ImfHalf a; 74 }; 75 76 typedef struct ImfRgba ImfRgba; 77 78 /* 79 ** Magic number; this must be the same as Imf::MAGIC 80 */ 81 82 #define IMF_MAGIC 20000630 83 84 /* 85 ** Version number; this must be the same as Imf::EXR_VERSION 86 */ 87 88 #define IMF_VERSION_NUMBER 2 89 90 /* 91 ** Line order; values must the the same as in Imf::LineOrder. 92 */ 93 94 #define IMF_INCREASING_Y 0 95 #define IMF_DECREASING_Y 1 96 #define IMF_RAMDOM_Y 2 97 98 99 /* 100 ** Compression types; values must be the same as in Imf::Compression. 101 */ 102 103 #define IMF_NO_COMPRESSION 0 104 #define IMF_RLE_COMPRESSION 1 105 #define IMF_ZIPS_COMPRESSION 2 106 #define IMF_ZIP_COMPRESSION 3 107 #define IMF_PIZ_COMPRESSION 4 108 #define IMF_PXR24_COMPRESSION 5 109 #define IMF_B44_COMPRESSION 6 110 #define IMF_B44A_COMPRESSION 7 111 112 113 /* 114 ** Channels; values must be the same as in Imf::RgbaChannels. 115 */ 116 117 #define IMF_WRITE_R 0x01 118 #define IMF_WRITE_G 0x02 119 #define IMF_WRITE_B 0x04 120 #define IMF_WRITE_A 0x08 121 #define IMF_WRITE_Y 0x10 122 #define IMF_WRITE_C 0x20 123 #define IMF_WRITE_RGB 0x07 124 #define IMF_WRITE_RGBA 0x0f 125 #define IMF_WRITE_YC 0x30 126 #define IMF_WRITE_YA 0x18 127 #define IMF_WRITE_YCA 0x38 128 129 130 /* 131 ** Level modes; values must be the same as in Imf::LevelMode 132 */ 133 134 #define IMF_ONE_LEVEL 0 135 #define IMF_MIPMAP_LEVELS 1 136 #define IMF_RIPMAP_LEVELS 2 137 138 139 /* 140 ** Level rounding modes; values must be the same as in Imf::LevelRoundingMode 141 */ 142 143 #define IMF_ROUND_DOWN 0 144 #define IMF_ROUND_UP 1 145 146 147 /* 148 ** RGBA file header 149 */ 150 151 struct ImfHeader; 152 typedef struct ImfHeader ImfHeader; 153 154 ImfHeader * ImfNewHeader (void); 155 156 void ImfDeleteHeader (ImfHeader *hdr); 157 158 ImfHeader * ImfCopyHeader (const ImfHeader *hdr); 159 160 void ImfHeaderSetDisplayWindow (ImfHeader *hdr, 161 int xMin, int yMin, 162 int xMax, int yMax); 163 164 void ImfHeaderDisplayWindow (const ImfHeader *hdr, 165 int *xMin, int *yMin, 166 int *xMax, int *yMax); 167 168 void ImfHeaderSetDataWindow (ImfHeader *hdr, 169 int xMin, int yMin, 170 int xMax, int yMax); 171 172 void ImfHeaderDataWindow (const ImfHeader *hdr, 173 int *xMin, int *yMin, 174 int *xMax, int *yMax); 175 176 void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, 177 float pixelAspectRatio); 178 179 float ImfHeaderPixelAspectRatio (const ImfHeader *hdr); 180 181 void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, 182 float x, float y); 183 184 void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, 185 float *x, float *y); 186 187 void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, 188 float width); 189 190 float ImfHeaderScreenWindowWidth (const ImfHeader *hdr); 191 192 void ImfHeaderSetLineOrder (ImfHeader *hdr, 193 int lineOrder); 194 195 int ImfHeaderLineOrder (const ImfHeader *hdr); 196 197 void ImfHeaderSetCompression (ImfHeader *hdr, 198 int compression); 199 200 int ImfHeaderCompression (const ImfHeader *hdr); 201 202 int ImfHeaderSetIntAttribute (ImfHeader *hdr, 203 const char name[], 204 int value); 205 206 int ImfHeaderIntAttribute (const ImfHeader *hdr, 207 const char name[], 208 int *value); 209 210 int ImfHeaderSetFloatAttribute (ImfHeader *hdr, 211 const char name[], 212 float value); 213 214 int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, 215 const char name[], 216 double value); 217 218 int ImfHeaderFloatAttribute (const ImfHeader *hdr, 219 const char name[], 220 float *value); 221 222 int ImfHeaderDoubleAttribute (const ImfHeader *hdr, 223 const char name[], 224 double *value); 225 226 int ImfHeaderSetStringAttribute (ImfHeader *hdr, 227 const char name[], 228 const char value[]); 229 230 int ImfHeaderStringAttribute (const ImfHeader *hdr, 231 const char name[], 232 const char **value); 233 234 int ImfHeaderSetBox2iAttribute (ImfHeader *hdr, 235 const char name[], 236 int xMin, int yMin, 237 int xMax, int yMax); 238 239 int ImfHeaderBox2iAttribute (const ImfHeader *hdr, 240 const char name[], 241 int *xMin, int *yMin, 242 int *xMax, int *yMax); 243 244 int ImfHeaderSetBox2fAttribute (ImfHeader *hdr, 245 const char name[], 246 float xMin, float yMin, 247 float xMax, float yMax); 248 249 int ImfHeaderBox2fAttribute (const ImfHeader *hdr, 250 const char name[], 251 float *xMin, float *yMin, 252 float *xMax, float *yMax); 253 254 int ImfHeaderSetV2iAttribute (ImfHeader *hdr, 255 const char name[], 256 int x, int y); 257 258 int ImfHeaderV2iAttribute (const ImfHeader *hdr, 259 const char name[], 260 int *x, int *y); 261 262 int ImfHeaderSetV2fAttribute (ImfHeader *hdr, 263 const char name[], 264 float x, float y); 265 266 int ImfHeaderV2fAttribute (const ImfHeader *hdr, 267 const char name[], 268 float *x, float *y); 269 270 int ImfHeaderSetV3iAttribute (ImfHeader *hdr, 271 const char name[], 272 int x, int y, int z); 273 274 int ImfHeaderV3iAttribute (const ImfHeader *hdr, 275 const char name[], 276 int *x, int *y, int *z); 277 278 int ImfHeaderSetV3fAttribute (ImfHeader *hdr, 279 const char name[], 280 float x, float y, float z); 281 282 int ImfHeaderV3fAttribute (const ImfHeader *hdr, 283 const char name[], 284 float *x, float *y, float *z); 285 286 int ImfHeaderSetM33fAttribute (ImfHeader *hdr, 287 const char name[], 288 const float m[3][3]); 289 290 int ImfHeaderM33fAttribute (const ImfHeader *hdr, 291 const char name[], 292 float m[3][3]); 293 294 int ImfHeaderSetM44fAttribute (ImfHeader *hdr, 295 const char name[], 296 const float m[4][4]); 297 298 int ImfHeaderM44fAttribute (const ImfHeader *hdr, 299 const char name[], 300 float m[4][4]); 301 302 /* 303 ** RGBA output file 304 */ 305 306 struct ImfOutputFile; 307 typedef struct ImfOutputFile ImfOutputFile; 308 309 ImfOutputFile * ImfOpenOutputFile (const char name[], 310 const ImfHeader *hdr, 311 int channels); 312 313 int ImfCloseOutputFile (ImfOutputFile *out); 314 315 int ImfOutputSetFrameBuffer (ImfOutputFile *out, 316 const ImfRgba *base, 317 size_t xStride, 318 size_t yStride); 319 320 int ImfOutputWritePixels (ImfOutputFile *out, 321 int numScanLines); 322 323 int ImfOutputCurrentScanLine (const ImfOutputFile *out); 324 325 const ImfHeader * ImfOutputHeader (const ImfOutputFile *out); 326 327 int ImfOutputChannels (const ImfOutputFile *out); 328 329 330 /* 331 ** Tiled RGBA output file 332 */ 333 334 struct ImfTiledOutputFile; 335 typedef struct ImfTiledOutputFile ImfTiledOutputFile; 336 337 ImfTiledOutputFile * ImfOpenTiledOutputFile (const char name[], 338 const ImfHeader *hdr, 339 int channels, 340 int xSize, int ySize, 341 int mode, int rmode); 342 343 int ImfCloseTiledOutputFile (ImfTiledOutputFile *out); 344 345 int ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, 346 const ImfRgba *base, 347 size_t xStride, 348 size_t yStride); 349 350 int ImfTiledOutputWriteTile (ImfTiledOutputFile *out, 351 int dx, int dy, 352 int lx, int ly); 353 354 int ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, 355 int dxMin, int dxMax, 356 int dyMin, int dyMax, 357 int lx, int ly); 358 359 const ImfHeader * ImfTiledOutputHeader (const ImfTiledOutputFile *out); 360 361 int ImfTiledOutputChannels (const ImfTiledOutputFile *out); 362 363 int ImfTiledOutputTileXSize (const ImfTiledOutputFile *out); 364 365 int ImfTiledOutputTileYSize (const ImfTiledOutputFile *out); 366 367 int ImfTiledOutputLevelMode (const ImfTiledOutputFile *out); 368 int ImfTiledOutputLevelRoundingMode 369 (const ImfTiledOutputFile *out); 370 371 372 /* 373 ** RGBA input file 374 */ 375 376 struct ImfInputFile; 377 typedef struct ImfInputFile ImfInputFile; 378 379 ImfInputFile * ImfOpenInputFile (const char name[]); 380 381 int ImfCloseInputFile (ImfInputFile *in); 382 383 int ImfInputSetFrameBuffer (ImfInputFile *in, 384 ImfRgba *base, 385 size_t xStride, 386 size_t yStride); 387 388 int ImfInputReadPixels (ImfInputFile *in, 389 int scanLine1, 390 int scanLine2); 391 392 const ImfHeader * ImfInputHeader (const ImfInputFile *in); 393 394 int ImfInputChannels (const ImfInputFile *in); 395 396 const char * ImfInputFileName (const ImfInputFile *in); 397 398 399 /* 400 ** Tiled RGBA input file 401 */ 402 403 struct ImfTiledInputFile; 404 typedef struct ImfTiledInputFile ImfTiledInputFile; 405 406 ImfTiledInputFile * ImfOpenTiledInputFile (const char name[]); 407 408 int ImfCloseTiledInputFile (ImfTiledInputFile *in); 409 410 int ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, 411 ImfRgba *base, 412 size_t xStride, 413 size_t yStride); 414 415 int ImfTiledInputReadTile (ImfTiledInputFile *in, 416 int dx, int dy, 417 int lx, int ly); 418 419 int ImfTiledInputReadTiles (ImfTiledInputFile *in, 420 int dxMin, int dxMax, 421 int dyMin, int dyMax, 422 int lx, int ly); 423 424 const ImfHeader * ImfTiledInputHeader (const ImfTiledInputFile *in); 425 426 int ImfTiledInputChannels (const ImfTiledInputFile *in); 427 428 const char * ImfTiledInputFileName (const ImfTiledInputFile *in); 429 430 int ImfTiledInputTileXSize (const ImfTiledInputFile *in); 431 432 int ImfTiledInputTileYSize (const ImfTiledInputFile *in); 433 434 int ImfTiledInputLevelMode (const ImfTiledInputFile *in); 435 436 int ImfTiledInputLevelRoundingMode 437 (const ImfTiledInputFile *in); 438 439 /* 440 ** Lookup tables 441 */ 442 443 struct ImfLut; 444 typedef struct ImfLut ImfLut; 445 446 ImfLut * ImfNewRound12logLut (int channels); 447 448 ImfLut * ImfNewRoundNBitLut (unsigned int n, int channels); 449 450 void ImfDeleteLut (ImfLut *lut); 451 452 void ImfApplyLut (ImfLut *lut, 453 ImfRgba *data, 454 int nData, 455 int stride); 456 /* 457 ** Most recent error message 458 */ 459 460 const char * ImfErrorMessage (void); 461 462 463 #ifdef __cplusplus 464 } /* extern "C" */ 465 #endif 466 467 #endif 468