tornavis/source/blender/imbuf/IMB_imbuf_types.hh

343 lines
9.7 KiB
C++

/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#include "DNA_vec_types.h" /* for rcti */
#include "BLI_sys_types.h"
#include "IMB_imbuf_enums.h"
struct ColormanageCache;
struct ColorSpace;
struct GPUTexture;
struct IDProperty;
/** \file
* \ingroup imbuf
* \brief Contains defines and structs used throughout the imbuf module.
* \todo Clean up includes.
*
* Types needed for using the image buffer.
*
* ImBuf is external code, slightly adapted to live in the Blender
* context. It requires an external JPEG module, and the AVI-module
* (also external code) in order to function correctly.
*
* This file contains types and some constants that go with them. Most
* are self-explanatory (e.g. IS_amiga tests whether the buffer
* contains an Amiga-format file).
*/
#define IMB_MIPMAP_LEVELS 20
#define IMB_FILEPATH_SIZE 1024
/**
* \ingroup imbuf
* This is the abstraction of an image. ImBuf is the basic type used for all imbuf operations.
*
* Also; add new variables to the end to save pain!
*/
/**
* #ImBuf::foptions.flag, type specific options.
* Some formats include compression rations on some bits.
*/
#define OPENEXR_HALF (1 << 8)
/* careful changing this, it's used in DNA as well */
#define OPENEXR_COMPRESS (15)
#ifdef WITH_CINEON
# define CINEON_LOG (1 << 8)
# define CINEON_16BIT (1 << 7)
# define CINEON_12BIT (1 << 6)
# define CINEON_10BIT (1 << 5)
#endif
#ifdef WITH_OPENJPEG
# define JP2_12BIT (1 << 9)
# define JP2_16BIT (1 << 8)
# define JP2_YCC (1 << 7)
# define JP2_CINE (1 << 6)
# define JP2_CINE_48FPS (1 << 5)
# define JP2_JP2 (1 << 4)
# define JP2_J2K (1 << 3)
#endif
#define PNG_16BIT (1 << 10)
#define RAWTGA 1
#define TIF_16BIT (1 << 8)
#define TIF_COMPRESS_NONE (1 << 7)
#define TIF_COMPRESS_DEFLATE (1 << 6)
#define TIF_COMPRESS_LZW (1 << 5)
#define TIF_COMPRESS_PACKBITS (1 << 4)
struct ImbFormatOptions {
short flag;
/** Quality serves dual purpose as quality number for JPEG or compression amount for PNG. */
char quality;
};
/* -------------------------------------------------------------------- */
/** \name ImBuf Component flags
* \brief These flags determine the components of an ImBuf struct.
* \{ */
enum eImBufFlags {
IB_rect = 1 << 0,
IB_test = 1 << 1,
IB_mem = 1 << 4,
IB_rectfloat = 1 << 5,
IB_multilayer = 1 << 7,
IB_metadata = 1 << 8,
IB_animdeinterlace = 1 << 9,
/** Do not clear image pixel buffer to zero. Without this flag, allocating
* a new ImBuf does clear the pixel data to zero (transparent black). If
* whole pixel data is overwritten after allocation, then this flag can be
* faster since it avoids a memory clear. */
IB_uninitialized_pixels = 1 << 10,
/** indicates whether image on disk have premul alpha */
IB_alphamode_premul = 1 << 12,
/** if this flag is set, alpha mode would be guessed from file */
IB_alphamode_detect = 1 << 13,
/* alpha channel is unrelated to RGB and should not affect it */
IB_alphamode_channel_packed = 1 << 14,
/** ignore alpha on load and substitute it with 1.0f */
IB_alphamode_ignore = 1 << 15,
IB_thumbnail = 1 << 16,
IB_multiview = 1 << 17,
IB_halffloat = 1 << 18,
};
/** \} */
/* -------------------------------------------------------------------- */
/** \name ImBuf buffer storage
* \{ */
/* Specialization of an ownership whenever a bare pointer is provided to the ImBuf buffers
* assignment API. */
enum ImBufOwnership {
/* The ImBuf simply shares pointer with data owned by someone else, and will not perform any
* memory management when the ImBuf frees the buffer. */
IB_DO_NOT_TAKE_OWNERSHIP = 0,
/* The ImBuf takes ownership of the buffer data, and will use MEM_freeN() to free this memory
* when the ImBuf needs to free the data. */
IB_TAKE_OWNERSHIP = 1,
};
struct DDSData {
/** DDS fourcc info */
unsigned int fourcc;
/** The number of mipmaps in the dds file */
unsigned int nummipmaps;
/** The compressed image data */
unsigned char *data;
/** The size of the compressed data */
unsigned int size;
/** Who owns the data buffer. */
ImBufOwnership ownership;
};
/* Different storage specialization.
*
* NOTE: Avoid direct assignments and allocations, use the buffer utilities from the IMB_imbuf.hh
* instead.
*
* Accessing the data pointer directly is fine and is an expected way of accessing it. */
struct ImBufByteBuffer {
uint8_t *data;
ImBufOwnership ownership;
ColorSpace *colorspace;
};
struct ImBufFloatBuffer {
float *data;
ImBufOwnership ownership;
ColorSpace *colorspace;
};
struct ImBufGPU {
/* Texture which corresponds to the state of the ImBug on the GPU.
*
* Allocation is supposed to happen outside of the ImBug module from a proper GPU context.
* De-referencing the ImBuf or its GPU texture can happen from any state. */
/* TODO(sergey): This should become a list of textures, to support having high-res ImBuf on GPU
* without hitting hardware limitations. */
GPUTexture *texture;
};
/** \} */
/* -------------------------------------------------------------------- */
/** \name Image Buffer
* \{ */
struct ImBuf {
/* dimensions */
/** Width and Height of our image buffer.
* Should be 'unsigned int' since most formats use this.
* but this is problematic with texture math in `imagetexture.c`
* avoid problems and use int. - campbell */
int x, y;
/** Active amount of bits/bit-planes. */
unsigned char planes;
/** Number of channels in `rect_float` (0 = 4 channel default) */
int channels;
/* flags */
/** Controls which components should exist. */
int flags;
/* pixels */
/**
* Image pixel buffer (8bit representation):
* - color space defaults to `sRGB`.
* - alpha defaults to 'straight'.
*/
ImBufByteBuffer byte_buffer;
/**
* Image pixel buffer (float representation):
* - color space defaults to 'linear' (`rec709`).
* - alpha defaults to 'premul'.
* \note May need gamma correction to `sRGB` when generating 8bit representations.
* \note Formats that support higher more than 8 but channels load as floats.
*/
ImBufFloatBuffer float_buffer;
/* Image buffer on the GPU. */
ImBufGPU gpu;
/** Resolution in pixels per meter. Multiply by `0.0254` for DPI. */
double ppm[2];
/* parameters used by conversion between byte and float */
/** random dither value, for conversion from float -> byte rect */
float dither;
/* mipmapping */
/** MipMap levels, a series of halved images */
ImBuf *mipmap[IMB_MIPMAP_LEVELS];
int miptot, miplevel;
/* externally used data */
/** reference index for ImBuf lists */
int index;
/** used to set imbuf to dirty and other stuff */
int userflags;
/** image metadata */
IDProperty *metadata;
/** temporary storage */
void *userdata;
/* file information */
/** file type we are going to save as */
enum eImbFileType ftype;
/** file format specific flags */
ImbFormatOptions foptions;
/** The absolute file path associated with this image. */
char filepath[IMB_FILEPATH_SIZE];
/* memory cache limiter */
/** reference counter for multiple users */
int refcounter;
/* some parameters to pass along for packing images */
/** Compressed image only used with PNG and EXR currently. */
ImBufByteBuffer encoded_buffer;
/** Size of data written to `encoded_buffer`. */
unsigned int encoded_size;
/** Size of `encoded_buffer` */
unsigned int encoded_buffer_size;
/* color management */
/** array of per-display display buffers dirty flags */
unsigned int *display_buffer_flags;
/** cache used by color management */
ColormanageCache *colormanage_cache;
int colormanage_flag;
rcti invalid_rect;
/* information for compressed textures */
DDSData dds_data;
};
/**
* \brief userflags: Flags used internally by blender for image-buffers.
*/
enum {
/** image needs to be saved is not the same as filename */
IB_BITMAPDIRTY = (1 << 1),
/** image mipmaps are invalid, need recreate */
IB_MIPMAP_INVALID = (1 << 2),
/** float buffer changed, needs recreation of byte rect */
IB_RECT_INVALID = (1 << 3),
/** either float or byte buffer changed, need to re-calculate display buffers */
IB_DISPLAY_BUFFER_INVALID = (1 << 4),
/** image buffer is persistent in the memory and should never be removed from the cache */
IB_PERSISTENT = (1 << 5),
};
/** \} */
/* -------------------------------------------------------------------- */
/** \name ImBuf Preset Profile Tags
*
* \brief Some predefined color space profiles that 8 bit imbufs can represent.
* \{ */
#define IB_PROFILE_NONE 0
#define IB_PROFILE_LINEAR_RGB 1
#define IB_PROFILE_SRGB 2
#define IB_PROFILE_CUSTOM 3
/** \} */
/* dds */
#ifndef DDS_MAKEFOURCC
# define DDS_MAKEFOURCC(ch0, ch1, ch2, ch3) \
((unsigned long)(unsigned char)(ch0) | ((unsigned long)(unsigned char)(ch1) << 8) | \
((unsigned long)(unsigned char)(ch2) << 16) | ((unsigned long)(unsigned char)(ch3) << 24))
#endif /* DDS_MAKEFOURCC */
/*
* FOURCC codes for DX compressed-texture pixel formats.
*/
#define FOURCC_DDS (DDS_MAKEFOURCC('D', 'D', 'S', ' '))
#define FOURCC_DX10 (DDS_MAKEFOURCC('D', 'X', '1', '0'))
#define FOURCC_DXT1 (DDS_MAKEFOURCC('D', 'X', 'T', '1'))
#define FOURCC_DXT2 (DDS_MAKEFOURCC('D', 'X', 'T', '2'))
#define FOURCC_DXT3 (DDS_MAKEFOURCC('D', 'X', 'T', '3'))
#define FOURCC_DXT4 (DDS_MAKEFOURCC('D', 'X', 'T', '4'))
#define FOURCC_DXT5 (DDS_MAKEFOURCC('D', 'X', 'T', '5'))
extern const char *imb_ext_image[];
extern const char *imb_ext_movie[];
extern const char *imb_ext_audio[];
/* -------------------------------------------------------------------- */
/** \name ImBuf Color Management Flag
*
* \brief Used with #ImBuf.colormanage_flag
* \{ */
enum {
IMB_COLORMANAGE_IS_DATA = (1 << 0),
};
/** \} */