%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/include/OpenEXR/
Upload File :
Create Path :
Current File : //usr/include/OpenEXR/openexr_attr.h

/*
** SPDX-License-Identifier: BSD-3-Clause
** Copyright Contributors to the OpenEXR Project.
*/

#ifndef OPENEXR_ATTR_H
#define OPENEXR_ATTR_H

#include "openexr_context.h"

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/** 
 * @defgroup AttributeTypes Attribute / metadata value types and struct declarations
 *
 * @brief These are a group of enum values defining valid values for
 * some attributes and then associated structs for other types.
 *
 * Some of these types will be directly representable / storable in
 * the file, some not. There is some overlap here with Imath, and they
 * should be kept in the same order for compatibility. However do note
 * that these are just the raw data, and no useful functions are
 * declared at this layer, that is what Imath is for.
 *
 * @{
 */

/** enum declaring allowed values for uint8_t value stored in built-in compression type */
typedef enum
{
    EXR_COMPRESSION_NONE  = 0,
    EXR_COMPRESSION_RLE   = 1,
    EXR_COMPRESSION_ZIPS  = 2,
    EXR_COMPRESSION_ZIP   = 3,
    EXR_COMPRESSION_PIZ   = 4,
    EXR_COMPRESSION_PXR24 = 5,
    EXR_COMPRESSION_B44   = 6,
    EXR_COMPRESSION_B44A  = 7,
    EXR_COMPRESSION_DWAA  = 8,
    EXR_COMPRESSION_DWAB  = 9,
    EXR_COMPRESSION_LAST_TYPE /**< invalid value, provided for range checking */
} exr_compression_t;

/** enum declaring allowed values for uint8_t value stored in built-in env map type */
typedef enum
{
    EXR_ENVMAP_LATLONG = 0,
    EXR_ENVMAP_CUBE    = 1,
    EXR_ENVMAP_LAST_TYPE /**< invalid value, provided for range checking */
} exr_envmap_t;

/** enum declaring allowed values for uint8_t value stored in lineOrder type */
typedef enum
{
    EXR_LINEORDER_INCREASING_Y = 0,
    EXR_LINEORDER_DECREASING_Y = 1,
    EXR_LINEORDER_RANDOM_Y     = 2,
    EXR_LINEORDER_LAST_TYPE /**< invalid value, provided for range checking */
} exr_lineorder_t;

/** enum declaring allowed values for part type */
typedef enum
{
    EXR_STORAGE_SCANLINE = 0,  /**< corresponds to type of 'scanlineimage' */
    EXR_STORAGE_TILED,         /**< corresponds to type of 'tiledimage' */
    EXR_STORAGE_DEEP_SCANLINE, /**< corresponds to type of 'deepscanline' */
    EXR_STORAGE_DEEP_TILED,    /**< corresponds to type of 'deeptile' */
    EXR_STORAGE_LAST_TYPE /**< invalid value, provided for range checking */
} exr_storage_t;

/** @brief Enum representing what type of tile information is contained */
typedef enum
{
    EXR_TILE_ONE_LEVEL     = 0, /**< single level of image data */
    EXR_TILE_MIPMAP_LEVELS = 1, /**< mipmapped image data */
    EXR_TILE_RIPMAP_LEVELS = 2, /**< ripmapped image data */
    EXR_TILE_LAST_TYPE          /**< guard / out of range type */
} exr_tile_level_mode_t;

/** @brief Enum representing how to scale positions between levels */
typedef enum
{
    EXR_TILE_ROUND_DOWN = 0,
    EXR_TILE_ROUND_UP   = 1,
    EXR_TILE_ROUND_LAST_TYPE
} exr_tile_round_mode_t;

/** @brief Enum capturing the underlying data type on a channel */
typedef enum
{
    EXR_PIXEL_UINT  = 0,
    EXR_PIXEL_HALF  = 1,
    EXR_PIXEL_FLOAT = 2,
    EXR_PIXEL_LAST_TYPE
} exr_pixel_type_t;

/* /////////////////////////////////////// */
/* First set of structs are data where we can read directly with no allocation needed... */

/* Most are naturally aligned, but force some of these
 * structs to be tightly packed */
#pragma pack(push, 1)

/** @brief struct to hold color chromaticities to interpret the tristimulus color values in the image data */
typedef struct
{
    float red_x;
    float red_y;
    float green_x;
    float green_y;
    float blue_x;
    float blue_y;
    float white_x;
    float white_y;
} exr_attr_chromaticities_t;

/** @brief struct to hold keycode information */
typedef struct
{
    int32_t film_mfc_code;
    int32_t film_type;
    int32_t prefix;
    int32_t count;
    int32_t perf_offset;
    int32_t perfs_per_frame;
    int32_t perfs_per_count;
} exr_attr_keycode_t;

/** @brief struct to hold a 32-bit floating-point 3x3 matrix */
typedef struct
{
    float m[9];
} exr_attr_m33f_t;

/** @brief struct to hold a 64-bit floating-point 3x3 matrix */
typedef struct
{
    double m[9];
} exr_attr_m33d_t;

/** @brief struct to hold a 32-bit floating-point 4x4 matrix */
typedef struct
{
    float m[16];
} exr_attr_m44f_t;

/** @brief struct to hold a 64-bit floating-point 4x4 matrix */
typedef struct
{
    double m[16];
} exr_attr_m44d_t;

/** @brief struct to hold an integer ratio value */
typedef struct
{
    int32_t  num;
    uint32_t denom;
} exr_attr_rational_t;

/** @brief struct to hold timecode information */
typedef struct
{
    uint32_t time_and_flags;
    uint32_t user_data;
} exr_attr_timecode_t;

/** @brief struct to hold a 2-element integer vector */
typedef struct
{
    union
    {
        struct
        {
            int32_t x, y;
        };
        int32_t arr[2];
    };
} exr_attr_v2i_t;

/** @brief struct to hold a 2-element 32-bit float vector */
typedef struct
{
    union
    {
        struct
        {
            float x, y;
        };
        float arr[2];
    };
} exr_attr_v2f_t;

/** @brief struct to hold a 2-element 64-bit float vector */
typedef struct
{
    union
    {
        struct
        {
            double x, y;
        };
        double arr[2];
    };
} exr_attr_v2d_t;

/** @brief struct to hold a 3-element integer vector */
typedef struct
{
    union
    {
        struct
        {
            int32_t x, y, z;
        };
        int32_t arr[3];
    };
} exr_attr_v3i_t;

/** @brief struct to hold a 3-element 32-bit float vector */
typedef struct
{
    union
    {
        struct
        {
            float x, y, z;
        };
        float arr[3];
    };
} exr_attr_v3f_t;

/** @brief struct to hold a 3-element 64-bit float vector */
typedef struct
{
    union
    {
        struct
        {
            double x, y, z;
        };
        double arr[3];
    };
} exr_attr_v3d_t;

/** @brief struct to hold an integer box / region definition */
typedef struct
{
    exr_attr_v2i_t min;
    exr_attr_v2i_t max;
} exr_attr_box2i_t;

/** @brief struct to hold a floating-point box / region definition */
typedef struct
{
    exr_attr_v2f_t min;
    exr_attr_v2f_t max;
} exr_attr_box2f_t;

/** @brief Struct holding base tiledesc attribute type defined in spec
 *
 * NB: this is in a tightly packed area so it can be read directly, be
 * careful it doesn't become padded to the next uint32_t boundary
 */
typedef struct
{
    uint32_t x_size;
    uint32_t y_size;
    uint8_t  level_and_round;
} exr_attr_tiledesc_t;

/** @brief macro to access type of tiling from packed structure */
#define EXR_GET_TILE_LEVEL_MODE(tiledesc)                                      \
    ((exr_tile_level_mode_t) (((tiledesc).level_and_round) & 0xF))
/** @brief macro to access the rounding mode of tiling from packed structure */
#define EXR_GET_TILE_ROUND_MODE(tiledesc)                                      \
    ((exr_tile_round_mode_t) ((((tiledesc).level_and_round) >> 4) & 0xF))
/** @brief macro to pack the tiling type and rounding mode into packed structure */
#define EXR_PACK_TILE_LEVEL_ROUND(lvl, mode)                                   \
    ((uint8_t) ((((uint8_t) ((mode) &0xF) << 4)) | ((uint8_t) ((lvl) &0xF))))

#pragma pack(pop)

/* /////////////////////////////////////// */
/* Now structs that involve heap allocation to store data. */

/** Storage for a string */
typedef struct
{
    int32_t length;
    /** if this is non-zero, the string owns the data, if 0, is a const ref to a static string */
    int32_t alloc_size;

    const char* str;
} exr_attr_string_t;

/** storage for a string vector */
typedef struct
{
    int32_t n_strings;
    /** if this is non-zero, the string vector owns the data, if 0, is a const ref */
    int32_t alloc_size;

    const exr_attr_string_t* strings;
} exr_attr_string_vector_t;

/** float vector storage struct */
typedef struct
{
    int32_t length;
    /** if this is non-zero, the float vector owns the data, if 0, is a const ref */
    int32_t alloc_size;

    const float* arr;
} exr_attr_float_vector_t;

/** Hint for lossy compression methods about how to treat values
 * (logarithmic or linear), meaning a human sees values like R, G, B,
 * luminance difference between 0.1 and 0.2 as about the same as 1.0
 * to 2.0 (logarithmic), where chroma coordinates are closer to linear
 * (0.1 and 0.2 is about the same difference as 1.0 and 1.1)
 */
typedef enum
{
    EXR_PERCEPTUALLY_LOGARITHMIC  = 0,
    EXR_PERCEPTUALLY_LINEAR   = 1
} exr_perceptual_treatment_t;

/** Individual channel information*/
typedef struct
{
    exr_attr_string_t name;
    /** Data representation for these pixels: uint, half, float */
    exr_pixel_type_t pixel_type;
    /** Possible values are 0 and 1 per docs \ref exr_perceptual_treatment_t */
    uint8_t p_linear;
    uint8_t reserved[3];
    int32_t x_sampling;
    int32_t y_sampling;
} exr_attr_chlist_entry_t;

/** List of channel information (sorted alphabetically) */
typedef struct
{
    int num_channels;
    int num_alloced;

    const exr_attr_chlist_entry_t* entries;
} exr_attr_chlist_t;

/** @brief Struct to define attributes of an embedded preview image */
typedef struct
{
    uint32_t width;
    uint32_t height;
    /** if this is non-zero, the preview owns the data, if 0, is a const ref */
    size_t alloc_size;

    const uint8_t* rgba;
} exr_attr_preview_t;

/** Custom storage structure for opaque data
 *
 * Handlers for opaque types can be registered, then when a
 * non-builtin type is encountered with a registered handler, the
 * function pointers to unpack / pack it will be set up.
 *
 * @sa exr_register_attr_type_handler
 */
typedef struct
{
    int32_t size;
    int32_t unpacked_size;
    /** if this is non-zero, the struct owns the data, if 0, is a const ref */
    int32_t packed_alloc_size;
    uint8_t pad[4];

    void*   packed_data;

    /** when an application wants to have custom data, they can store an unpacked form here which will
	 * be requested to be destroyed upon destruction of the attribute */
    void* unpacked_data;

    /* an application can register an attribute handler which then
	 * fills in these function pointers. This allows a user to delay
	 * the expansion of the custom type until access is desired, and
	 * similarly, to delay the packing of the data until write time */
    exr_result_t (*unpack_func_ptr) (
        exr_context_t ctxt,
        const void*   data,
        int32_t       attrsize,
        int32_t*      outsize,
        void**        outbuffer);
    exr_result_t (*pack_func_ptr) (
        exr_context_t ctxt,
        const void*   data,
        int32_t       datasize,
        int32_t*      outsize,
        void*         outbuffer);
    void (*destroy_unpacked_func_ptr) (
        exr_context_t ctxt, void* data, int32_t attrsize);
} exr_attr_opaquedata_t;

/* /////////////////////////////////////// */

/** @brief built-in / native attribute type enum
 *
 * This will enable us to do a tagged type struct to generically store
 * attributes.
 */
typedef enum
{
    EXR_ATTR_UNKNOWN =
        0,           /**< type indicating an error or uninitialized attribute */
    EXR_ATTR_BOX2I,  /**< integer region definition. @see exr_box2i */
    EXR_ATTR_BOX2F,  /**< float region definition. @see exr_box2f */
    EXR_ATTR_CHLIST, /**< Definition of channels in file @see exr_chlist_entry */
    EXR_ATTR_CHROMATICITIES, /**< Values to specify color space of colors in file @see exr_attr_chromaticities_t */
    EXR_ATTR_COMPRESSION,    /**< uint8_t declaring compression present */
    EXR_ATTR_DOUBLE,         /**< double precision floating point number */
    EXR_ATTR_ENVMAP,         /**< uint8_t declaring environment map type */
    EXR_ATTR_FLOAT, /**< a normal (4 byte) precision floating point number */
    EXR_ATTR_FLOAT_VECTOR, /**< a list of normal (4 byte) precision floating point numbers */
    EXR_ATTR_INT,     /**< a 32-bit signed integer value */
    EXR_ATTR_KEYCODE, /**< structure recording keycode @see exr_attr_keycode_t */
    EXR_ATTR_LINEORDER, /**< uint8_t declaring scanline ordering */
    EXR_ATTR_M33F,      /**< 9 32-bit floats representing a 3x3 matrix */
    EXR_ATTR_M33D,      /**< 9 64-bit floats representing a 3x3 matrix */
    EXR_ATTR_M44F,      /**< 16 32-bit floats representing a 4x4 matrix */
    EXR_ATTR_M44D,      /**< 16 64-bit floats representing a 4x4 matrix */
    EXR_ATTR_PREVIEW, /**< 2 unsigned ints followed by 4 x w x h uint8_t image */
    EXR_ATTR_RATIONAL, /**< int followed by unsigned int */
    EXR_ATTR_STRING,   /**< int (length) followed by char string data */
    EXR_ATTR_STRING_VECTOR, /**< 0 or more text strings (int + string). number is based on attribute size */
    EXR_ATTR_TILEDESC, /**< 2 unsigned ints xSize, ySize followed by mode */
    EXR_ATTR_TIMECODE, /**< 2 unsigned ints time and flags, user data */
    EXR_ATTR_V2I,      /**< pair of 32-bit integers */
    EXR_ATTR_V2F,      /**< pair of 32-bit floats */
    EXR_ATTR_V2D,      /**< pair of 64-bit floats */
    EXR_ATTR_V3I,      /**< set of 3 32-bit integers */
    EXR_ATTR_V3F,      /**< set of 3 32-bit floats */
    EXR_ATTR_V3D,      /**< set of 3 64-bit floats */
    EXR_ATTR_OPAQUE,   /**< user / unknown provided type */
    EXR_ATTR_LAST_KNOWN_TYPE
} exr_attribute_type_t;

/** @brief storage, name and type information for an attribute.
 *
 * Attributes (metadata) for the file cause a surprising amount of
 * overhead. It is not uncommon for a production-grade EXR to have
 * many attributes. As such, the attribute struct is designed in a
 * slightly more complicated manner. It is optimized to have the
 * storage for that attribute: the struct itself, the name, the type,
 * and the data all allocated as one block. Further, the type and
 * standard names may use a static string to avoid allocating space
 * for those as necessary with the pointers pointing to static strings
 * (not to be freed). Finally, small values are optimized for.
 */
typedef struct 
{
    /** name of the attribute */
    const char* name;
    /** string type name of the attribute */
    const char* type_name;
    /** length of name string (short flag is 31 max, long allows 255) */
    uint8_t name_length;
    /** length of type string (short flag is 31 max, long allows 255) */
    uint8_t type_name_length;

    uint8_t pad[2];

    /** enum of the attribute type */
    exr_attribute_type_t type;

    /** Union of pointers of different types that can be used to type
	 * pun to an appropriate type for builtins. Do note that while
	 * this looks like a big thing, it is only the size of a single
	 * pointer.  these are all pointers into some other data block
	 * storing the value you want, with the exception of the pod types
	 * which are just put in place (i.e. small value optimization)
	 *
	 * The attribute type \ref type should directly correlate to one of
	 * these entries
	 */
    union
    {
        // NB: not pointers for POD types
        uint8_t uc;
        double  d;
        float   f;
        int32_t i;

        exr_attr_box2i_t*          box2i;
        exr_attr_box2f_t*          box2f;
        exr_attr_chlist_t*         chlist;
        exr_attr_chromaticities_t* chromaticities;
        exr_attr_keycode_t*        keycode;
        exr_attr_float_vector_t*   floatvector;
        exr_attr_m33f_t*           m33f;
        exr_attr_m33d_t*           m33d;
        exr_attr_m44f_t*           m44f;
        exr_attr_m44d_t*           m44d;
        exr_attr_preview_t*        preview;
        exr_attr_rational_t*       rational;
        exr_attr_string_t*         string;
        exr_attr_string_vector_t*  stringvector;
        exr_attr_tiledesc_t*       tiledesc;
        exr_attr_timecode_t*       timecode;
        exr_attr_v2i_t*            v2i;
        exr_attr_v2f_t*            v2f;
        exr_attr_v2d_t*            v2d;
        exr_attr_v3i_t*            v3i;
        exr_attr_v3f_t*            v3f;
        exr_attr_v3d_t*            v3d;
        exr_attr_opaquedata_t*     opaque;
        uint8_t*                   rawptr;
    };
} exr_attribute_t;

/** @} */

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* OPENEXR_ATTR_H */

Zerion Mini Shell 1.0