358 lines
9.8 KiB
C
358 lines
9.8 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
#ifndef __IMB_IMBUF_TYPES_H__
|
|
#define __IMB_IMBUF_TYPES_H__
|
|
|
|
#include "DNA_vec_types.h" /* for rcti */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** \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_FILENAME_SIZE 1024
|
|
|
|
typedef 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;
|
|
} DDSData;
|
|
|
|
/**
|
|
* \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!
|
|
*/
|
|
|
|
/* Warning: Keep explicit value assignments here,
|
|
* this file is included in areas where not all format defines are set
|
|
* (e.g. intern/dds only get WITH_DDS, even if TIFF, HDR etc are also defined).
|
|
* See T46524. */
|
|
|
|
/** #ImBuf.ftype flag, main image types. */
|
|
enum eImbTypes {
|
|
IMB_FTYPE_PNG = 1,
|
|
IMB_FTYPE_TGA = 2,
|
|
IMB_FTYPE_JPG = 3,
|
|
IMB_FTYPE_BMP = 4,
|
|
IMB_FTYPE_OPENEXR = 5,
|
|
IMB_FTYPE_IMAGIC = 6,
|
|
#ifdef WITH_OPENIMAGEIO
|
|
IMB_FTYPE_PSD = 7,
|
|
#endif
|
|
#ifdef WITH_OPENJPEG
|
|
IMB_FTYPE_JP2 = 8,
|
|
#endif
|
|
#ifdef WITH_HDR
|
|
IMB_FTYPE_RADHDR = 9,
|
|
#endif
|
|
#ifdef WITH_TIFF
|
|
IMB_FTYPE_TIF = 10,
|
|
#endif
|
|
#ifdef WITH_CINEON
|
|
IMB_FTYPE_CINEON = 11,
|
|
IMB_FTYPE_DPX = 12,
|
|
#endif
|
|
|
|
#ifdef WITH_DDS
|
|
IMB_FTYPE_DDS = 13,
|
|
#endif
|
|
};
|
|
|
|
/* ibuf->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
|
|
|
|
#ifdef WITH_TIFF
|
|
# 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)
|
|
#endif
|
|
|
|
typedef struct ImbFormatOptions {
|
|
short flag;
|
|
/** quality serves dual purpose as quality number for jpeg or compression amount for png */
|
|
char quality;
|
|
} ImbFormatOptions;
|
|
|
|
/**
|
|
* \name Imbuf Component flags
|
|
* \brief These flags determine the components of an ImBuf struct.
|
|
*
|
|
* \{ */
|
|
|
|
typedef enum eImBufFlags {
|
|
IB_rect = 1 << 0,
|
|
IB_test = 1 << 1,
|
|
IB_zbuf = 1 << 3,
|
|
IB_mem = 1 << 4,
|
|
IB_rectfloat = 1 << 5,
|
|
IB_zbuffloat = 1 << 6,
|
|
IB_multilayer = 1 << 7,
|
|
IB_metadata = 1 << 8,
|
|
IB_animdeinterlace = 1 << 9,
|
|
IB_tiles = 1 << 10,
|
|
IB_tilecache = 1 << 11,
|
|
/** 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,
|
|
} eImBufFlags;
|
|
|
|
/** \} */
|
|
typedef struct ImBuf {
|
|
struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */
|
|
|
|
/* 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/bitplanes */
|
|
unsigned char planes;
|
|
/** Number of channels in `rect_float` (0 = 4 channel default) */
|
|
int channels;
|
|
|
|
/* flags */
|
|
/** Controls which components should exist. */
|
|
int flags;
|
|
/** what is malloced internal, and can be freed */
|
|
int mall;
|
|
|
|
/* pixels */
|
|
|
|
/** Image pixel buffer (8bit representation):
|
|
* - color space defaults to `sRGB`.
|
|
* - alpha defaults to 'straight'.
|
|
*/
|
|
unsigned int *rect;
|
|
/** 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.
|
|
*/
|
|
float *rect_float;
|
|
|
|
/* resolution - pixels per meter */
|
|
double ppm[2];
|
|
|
|
/* tiled pixel storage */
|
|
int tilex, tiley;
|
|
int xtiles, ytiles;
|
|
unsigned int **tiles;
|
|
|
|
/* zbuffer */
|
|
/** z buffer data, original zbuffer */
|
|
int *zbuf;
|
|
/** z buffer data, camera coordinates */
|
|
float *zbuf_float;
|
|
|
|
/* 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 */
|
|
struct 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 */
|
|
struct IDProperty *metadata;
|
|
/** temporary storage */
|
|
void *userdata;
|
|
|
|
/* file information */
|
|
/** file type we are going to save as */
|
|
enum eImbTypes ftype;
|
|
/** file format specific flags */
|
|
ImbFormatOptions foptions;
|
|
/** filename associated with this image */
|
|
char name[IMB_FILENAME_SIZE];
|
|
/** full filename used for reading from cache */
|
|
char cachename[IMB_FILENAME_SIZE];
|
|
|
|
/* memory cache limiter */
|
|
/** handle for cache limiter */
|
|
struct MEM_CacheLimiterHandle_s *c_handle;
|
|
/** reference counter for multiple users */
|
|
int refcounter;
|
|
|
|
/* some parameters to pass along for packing images */
|
|
/** Compressed image only used with png and exr currently */
|
|
unsigned char *encodedbuffer;
|
|
/** Size of data written to encodedbuffer */
|
|
unsigned int encodedsize;
|
|
/** Size of encodedbuffer */
|
|
unsigned int encodedbuffersize;
|
|
|
|
/* color management */
|
|
/** color space of byte buffer */
|
|
struct ColorSpace *rect_colorspace;
|
|
/** color space of float buffer, used by sequencer only */
|
|
struct ColorSpace *float_colorspace;
|
|
/** array of per-display display buffers dirty flags */
|
|
unsigned int *display_buffer_flags;
|
|
/** cache used by color management */
|
|
struct ColormanageCache *colormanage_cache;
|
|
int colormanage_flag;
|
|
rcti invalid_rect;
|
|
|
|
/* information for compressed textures */
|
|
struct DDSData dds_data;
|
|
} ImBuf;
|
|
|
|
/**
|
|
* \brief userflags: Flags used internally by blender for imagebuffers
|
|
*/
|
|
|
|
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 */
|
|
#ifdef WITH_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_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'))
|
|
|
|
#endif /* DDS */
|
|
extern const char *imb_ext_image[];
|
|
extern const char *imb_ext_movie[];
|
|
extern const char *imb_ext_audio[];
|
|
|
|
/* image formats that can only be loaded via filepath */
|
|
extern const char *imb_ext_image_filepath_only[];
|
|
|
|
/**
|
|
* \name Imbuf Color Management Flag
|
|
* \brief Used with #ImBuf.colormanage_flag
|
|
*
|
|
* \{ */
|
|
|
|
enum {
|
|
IMB_COLORMANAGE_IS_DATA = (1 << 0),
|
|
};
|
|
|
|
/** \} */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __IMB_IMBUF_TYPES_H__ */
|