/* babl - dynamically extendable universal pixel conversion library. * Copyright (C) 2005-2008, Øyvind Kolås. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . */ #ifndef _BABL_H #define _BABL_H #ifdef __cplusplus extern "C" { #endif #define BABL_INSIDE_BABL_H #include #include #include #undef BABL_INSIDE_BABL_H /** * babl_init: * * Initializes the babl library. */ void babl_init (void); /** * babl_exit: * * Deinitializes the babl library and frees any resources used when * matched with the number of calls to babl_init(). */ void babl_exit (void); /** * babl_type: * * Returns the babl object representing the data type given by @name * such as for example "u8", "u16" or "float". */ const Babl * babl_type (const char *name); /** * babl_sampling: * * Returns the babl object representing the @horizontal and @vertical * sampling such as for example 2, 2 for the chroma components in * YCbCr. */ const Babl * babl_sampling (int horizontal, int vertical); /** * babl_component: * * Returns the babl object representing the color component given by * @name such as for example "R", "cyan" or "CIE L". */ const Babl * babl_component (const char *name); /** * babl_model: * * Returns the babl object representing the color model given by @name * such as for example "RGB", "CMYK" or "CIE Lab". */ const Babl * babl_model (const char *name); /** * babl_model_with_space: * * The models for formats also have a space in babl, try to avoid code * needing to use this. */ const Babl * babl_model_with_space (const char *name, const Babl *space); /** * babl_space: * * Returns the babl object representing the specific RGB matrix color * working space referred to by name. Babl knows of: * sRGB, Rec2020, Adobish, Apple and ProPhoto * */ const Babl * babl_space (const char *name); typedef enum { BABL_ICC_INTENT_PERCEPTUAL = 0, BABL_ICC_INTENT_RELATIVE_COLORIMETRIC = 1, BABL_ICC_INTENT_SATURATION = 2, BABL_ICC_INTENT_ABSOLUTE_COLORIMETRIC = 3, BABL_ICC_INTENT_PERFORMANCE = 32 // black-point compensation toggle will be added if/when support exist in babl } BablIccIntent; /** * babl_space_from_icc: * @icc_data: pointer to icc profile in memory * @icc_length: length of icc profile in bytes * @intent: the intent from the ICC profile to use. * @error: (out): pointer to a string where decoding errors can be stored, * if an error occurs, NULL is returned and an error message * is provided in error. * * Create a babl space from an in memory ICC profile, the profile does no * longer need to be loaded for the space to work, multiple calls with the same * icc profile and same intent will result in the same babl space. * * On a profile that doesn't contain A2B0 and B2A0 CLUTs perceptual and * relative-colorimetric intents are treated the same. * * If a BablSpace cannot be created from the profile NULL is returned and a * static string is set on the const char *value pointed at with &value * containing a message describing why the provided data does not yield a babl * space. */ const Babl *babl_space_from_icc (const char *icc_data, int icc_length, BablIccIntent intent, const char **error); // XXX : deprecated const Babl *babl_icc_make_space (const char *icc_data, int icc_length, BablIccIntent intent, const char **error); /* babl_icc_get_key: * * @icc_data: pointer to in-memory icc profile * @icc_length: length of icc profile in bytes * @key: the key we want to quey, see below for some supported values * @language: 2 char code for language to extract or NULL * @country: 2 char country code or NULL * * Returns: (transfer full) (nullable): %NULL if key not found or a newly * allocated utf8 string of the key when found, free with free() when done. * Supported keys: "description", "copyright", "manufacturer", "device", * "profile-class", "color-space" and "pcs". */ char *babl_icc_get_key (const char *icc_data, int icc_length, const char *key, const char *language, const char *country); /** * babl_format: * * Returns the babl object representing the color format given by * @name such as for example "RGB u8", "CMYK float" or "CIE Lab u16", * creates a format using the sRGB space, to also specify the color space * and TRCs for a format, see babl_format_with_space. */ const Babl * babl_format (const char *encoding); /** * babl_format_with_space: * * Returns the babl object representing the color format given by * @name such as for example "RGB u8", "R'G'B'A float", "Y float" with * a specific RGB working space used as the space, the resulting format * has -space suffixed to it, unless the space requested is sRGB then * the unsuffixed version is used. If a format is passed in as space * the space of the format is used. */ const Babl * babl_format_with_space (const char *encoding, const Babl *space); /** * babl_format_exists: * * Returns 1 if the provided format name is known by babl or 0 if it is * not. Can also be used to verify that specific extension formats are * available (though this can also be inferred from the version of babl). */ int babl_format_exists (const char *name); /* * babl_format_get_space: * * Retrieve the RGB color space used for a pixel format. */ const Babl * babl_format_get_space (const Babl *format); /** * babl_fish: * * Create a babl fish capable of converting from source_format to * destination_format, source and destination can be either strings * with the names of the formats or Babl-format objects. */ const Babl * babl_fish (const void *source_format, const void *destination_format); /** * babl_fast_fish: * * Create a faster than normal fish with specified performance (and thus * corresponding precision tradeoff), values tolerance can hold: NULL and * "default", means do same as babl_fish(), other values understood in * increasing order of speed gain are: * "exact" "precise" "fast" "glitch" * * Fast fishes should be cached, since they are not internally kept track * of/made into singletons by babl and many creations of fast fishes will * otherwise be a leak. * */ const Babl * babl_fast_fish (const void *source_format, const void *destination_format, const char *performance); /** * babl_process: * * Process n pixels from source to destination using babl_fish, * returns number of pixels converted. */ long babl_process (const Babl *babl_fish, const void *source, void *destination, long n); long babl_process_rows (const Babl *babl_fish, const void *source, int source_stride, void *dest, int dest_stride, long n, int rows); /** * babl_get_name: * * Returns a string describing a Babl object. */ const char * babl_get_name (const Babl *babl); /** * babl_format_has_alpha: * * Returns whether the @format has an alpha channel. */ int babl_format_has_alpha (const Babl *format); /** * babl_format_get_bytes_per_pixel: * * Returns the bytes per pixel for a babl color format. */ int babl_format_get_bytes_per_pixel (const Babl *format); /** * babl_format_get_model: * * Return the model used for constructing the format. */ const Babl * babl_format_get_model (const Babl *format); /** * BablModelFlag * @BABL_MODEL_FLAG_ALPHA: the model encodes alpha. * @BABL_MODEL_FLAG_ASSOCIATED: the alpha is associated alpha. * @BABL_MODEL_FLAG_INVERTED: the components are inverted (used for getting the additive complement space of CMYK). * @BABL_MODEL_FLAG_LINEAR: the data has no TRC, i.e. is linear * @BABL_MODEL_FLAG_NONLINEAR: the data has a TRC - the TRC from the configured space * @BABL_MODEL_FLAG_PERCEPTUAL: the data has a TRC - a perceptual TRC where 50% gray is 0.5 * @BABL_MODEL_FLAG_GRAY: this is a gray component model * @BABL_MODEL_FLAG_RGB: this is an RGB based component model, the space associated is expected to contain an RGB matrix profile. * @BABL_MODEL_FLAG_CIE: this model is part of the CIE family of spaces * @BABL_MODEL_FLAG_CMYK: the encodings described are CMYK encodings, the space associated is expected to contain an CMYK ICC profile. * */ typedef enum { BABL_MODEL_FLAG_ALPHA = 1<<1, BABL_MODEL_FLAG_ASSOCIATED = 1<<2, BABL_MODEL_FLAG_INVERTED = 1<<3, BABL_MODEL_FLAG_LINEAR = 1<<10, BABL_MODEL_FLAG_NONLINEAR = 1<<11, BABL_MODEL_FLAG_PERCEPTUAL = 1<<12, BABL_MODEL_FLAG_GRAY = 1<<20, BABL_MODEL_FLAG_RGB = 1<<21, /* BABL_MODEL_FLAG_SPECTRAL = 1<<22, NYI */ BABL_MODEL_FLAG_CIE = 1<<23, BABL_MODEL_FLAG_CMYK = 1<<24, /* BABL_MODEL_FLAG_LUZ = 1<<25, NYI */ } BablModelFlag; // XXX : should warn when used #define BABL_MODEL_FLAG_PREMULTIPLIED BABL_MODEL_FLAG_ASSOCIATED /* linear, nonlinear and perceptual could occupy two bits with a decidated 0, * but we do not have a lack of bits in this bit pattern so leave it be. */ BablModelFlag babl_get_model_flags (const Babl *model); /** * babl_format_get_n_components: * * Returns the number of components for the given @format. */ int babl_format_get_n_components (const Babl *format); /** * babl_format_get_type: * * Returns the type in the given @format for the given * @component_index. */ const Babl * babl_format_get_type (const Babl *format, int component_index); /** * babl_type_new: * * Defines a new data type in babl. A data type that babl can have in * its buffers requires conversions to and from "double" to be * registered before passing sanity. * * babl_type_new (const char *name, * "bits", int bits, * ["min_val", double min_val,] * ["max_val", double max_val,] * NULL); */ const Babl * babl_type_new (void *first_arg, ...) BABL_ARG_NULL_TERMINATED; /** * babl_component_new: * * Defines a new color component with babl. * * babl_component_new (const char *name, * NULL); */ const Babl * babl_component_new (void *first_arg, ...) BABL_ARG_NULL_TERMINATED; /** * babl_model_new: * * Defines a new color model in babl. If no name is provided a name is * generated by concatenating the name of all the involved components. * * babl_model_new (["name", const char *name,] * BablComponent *component1, * [BablComponent *componentN, ...] * NULL); */ const Babl * babl_model_new (void *first_arg, ...) BABL_ARG_NULL_TERMINATED; /** * babl_format_new: * * Defines a new pixel format in babl. Provided BablType and|or * BablSampling is valid for the following components as well. If no * name is provided a (long) descriptive name is used. * * babl_format_new (["name", const char *name,] * BablModel *model, * [BablType *type,] * [BablSampling, *sampling,] * BablComponent *component1, * [[BablType *type,] * [BablSampling *sampling,] * BablComponent *componentN, * ...] * ["planar",] * NULL); */ const Babl * babl_format_new (const void *first_arg, ...) BABL_ARG_NULL_TERMINATED; /* * babl_format_n: * * Defines a new pixel format in babl. With the specified data storage * type and the given number of components. At the moment behavior of * conversions are only well defined to other babl_format_n derived formats * with the same number of components. */ const Babl * babl_format_n (const Babl *type, int components); /** * babl_format_is_format_n: * * Returns whether the @format is a format_n type. */ int babl_format_is_format_n (const Babl *format); /** * babl_conversion_new: * * Defines a new conversion between either two formats, two models or * two types in babl. * * babl_conversion_new (, * <"linear"|"planar">, conv_func, * NULL); */ const Babl * babl_conversion_new (const void *first_arg, ...) BABL_ARG_NULL_TERMINATED; /** * babl_conversion_get_source_space: * * Returns the RGB space defined for the source of conversion. */ const Babl *babl_conversion_get_source_space (const Babl *conversion); /** * babl_conversion_get_destination_space: * * Returns the RGB space defined for the destination of conversion. */ const Babl *babl_conversion_get_destination_space (const Babl *conversion); /** * babl_new_palette: * * create a new palette based format, name is optional pass in NULL to get * an anonymous format. If you pass in with_alpha the format also gets * an 8bit alpha channel. Returns the BablModel of the color model. If * you pass in the same name the previous formats will be provided * again. */ const Babl *babl_new_palette (const char *name, const Babl **format_u8, const Babl **format_u8_with_alpha); /** * babl_new_palette_with_space: * * create a new palette based format, name is optional pass in NULL to get * an anonymous format. If you pass in with_alpha the format also gets * an 8bit alpha channel. Returns the BablModel of the color model. If * you pass in the same name the previous formats will be provided * again. */ const Babl *babl_new_palette_with_space (const char *name, const Babl *space, const Babl **format_u8, const Babl **format_u8_with_alpha); /** * babl_format_is_palette: * * check whether a format is a palette backed format. */ int babl_format_is_palette (const Babl *format); /** * babl_palette_set_palette: * @babl: a #Babl * @format: The pixel format * @data: (array) (element-type guint8): The pixel data * @count: The number of pixels in @data * * Assign a palette to a palette format, the data is a single span of pixels * representing the colors of the palette. */ void babl_palette_set_palette (const Babl *babl, const Babl *format, void *data, int count); /** * babl_palette_reset: * * reset a palette to initial state, frees up some caches that optimize * conversions. */ void babl_palette_reset (const Babl *babl); /** * babl_set_user_data: (skip) * * associate a data pointer with a format/model, this data can be accessed and * used from the conversion functions, encoding color profiles, palettes or * similar with the data, perhaps this should be made internal API, not * accesible at all from */ void babl_set_user_data (const Babl *babl, void *data); /** * babl_get_user_data: (skip) * * Get data set with babl_set_user_data */ void * babl_get_user_data (const Babl *babl); typedef enum { BABL_SPACE_FLAG_NONE = 0, BABL_SPACE_FLAG_EQUALIZE = 1 } BablSpaceFlags; /** * babl_space_from_chromaticities: * @name: (nullable): The name for the color space * @wx: The X-coordinate of the color space's white point * @wy: The Y-coordinate of the color space's white point * @rx: The X-coordinate of the red primary * @ry: The Y-coordinate of the red primary * @gx: The X-coordinate of the green primary * @gy: The Y-coordinate of the green primary * @bx: The X-coordinate of the blue primary * @by: The Y-coordinate of the blue primary * @trc_red: The red component of the TRC. * @trc_green: (nullable): The green component of the TRC (can be %NULL if it's * the same as @trc_red). * @trc_blue: (nullable): The blue component of the TRC (can be %NULL if it's * the same as @trc_red). * @flags: The #BablSpaceFlags * * Creates a new babl-space/ RGB matrix color space definition with the * specified CIE xy(Y) values for white point: wx, wy and primary * chromaticities: rx,ry,gx,gy,bx,by and TRCs to be used. After registering a * new babl-space it can be used with babl_space() passing its name; * * Internally this does the math to derive the RGBXYZ matrix as used in an ICC * profile. */ const Babl * babl_space_from_chromaticities (const char *name, double wx, double wy, double rx, double ry, double gx, double gy, double bx, double by, const Babl *trc_red, const Babl *trc_green, const Babl *trc_blue, BablSpaceFlags flags); /** * babl_trc_gamma: * * Creates a Babl TRC for a specific gamma value, it will be given * a name that is a short string representation of the value. */ const Babl * babl_trc_gamma (double gamma); /** * babl_trc: * * Look up a TRC by name, "sRGB" and "linear" are recognized * strings in a stock babl configuration. */ const Babl * babl_trc (const char *name); /** * babl_space_with_trc: * * Creates a variant of an existing space with different trc. */ const Babl *babl_space_with_trc (const Babl *space, const Babl *trc); /** * babl_space_get: * @space: A #Babl instance * @xw: (out) (optional): The X-coordinate of the color space's white point * @yw: (out) (optional): The Y-coordinate of the color space's white point * @xr: (out) (optional): The X-coordinate of the red primary * @yr: (out) (optional): The Y-coordinate of the red primary * @xg: (out) (optional): The X-coordinate of the blue primary * @yg: (out) (optional): The Y-coordinate of the green primary * @xb: (out) (optional): The X-coordinate of the blue primary * @yb: (out) (optional): The Y-coordinate of the blue primary * @red_trc: (out) (optional): The red component of the TRC. * @green_trc: (out) (optional): The green component of the TRC (can be %NULL * if it's the same as @red_trc). * @blue_trc: (out) (optional): The blue component of the TRC (can be %NULL if * it's the same as @red_trc). * * query the chromaticities of white point and primaries as well as trcs * used for r g a nd b, all arguments are optional (can be %NULL). */ void babl_space_get (const Babl *space, double *xw, double *yw, double *xr, double *yr, double *xg, double *yg, double *xb, double *yb, const Babl **red_trc, const Babl **green_trc, const Babl **blue_trc); /** * babl_space_get_rgb_luminance: * @space: a BablSpace * @red_luminance: (out) (optional): Location for the red luminance factor. * @green_luminance: (out) (optional): Location for the green luminance factor. * @blue_luminance: (out) (optional): Location for the blue luminance factor. * * Retrieve the relevant RGB luminance constants for a babl space. */ void babl_space_get_rgb_luminance (const Babl *space, double *red_luminance, double *green_luminance, double *blue_luminance); /** * babl_model_is: * * Returns: 0 if the name of the model in babl does not correspond to the * provided model name. */ int babl_model_is (const Babl *babl, const char *model_name); #define babl_model_is(babl,model) (babl&&(babl)==babl_model_with_space(model,babl)) /** * babl_space_get_icc: * @babl: a #Babl * @length: (out) (optional): Length of the profile in bytes. * * Return pointer to ICC profile for space note that this is * the ICC profile for R'G'B', though in formats only supporting linear * like EXR GEGL chooses to load this lienar data as RGB and use the sRGB * TRC. * * Returns: pointer to ICC profile data. */ const char *babl_space_get_icc (const Babl *babl, int *length); /** * babl_space_from_rgbxyz_matrix: * @name: (nullable): The name for the color space * @wx: The X-coordinate of the color space's white point * @wy: The Y-coordinate of the color space's white point * @wz: The Z-coordinate of the color space's white point * @rx: The X-coordinate of the red primary * @ry: The Y-coordinate of the red primary * @rz: The Z-coordinate of the red primary * @gx: The X-coordinate of the green primary * @gy: The Y-coordinate of the green primary * @gz: The Z-coordinate of the green primary * @bx: The X-coordinate of the blue primary * @by: The Y-coordinate of the blue primary * @bz: The Z-coordinate of the blue primary * @trc_red: The red component of the TRC. * @trc_green: (nullable): The green component of the TRC (can be %NULL if it's * the same as @trc_red). * @trc_blue: (nullable): The blue component of the TRC (can be %NULL if it's * the same as @trc_red). * * Creates a new RGB matrix color space definition using a precomputed D50 * adapted 3x3 matrix and associated CIE XYZ whitepoint, as possibly read from * an ICC profile. */ const Babl * babl_space_from_rgbxyz_matrix (const char *name, double wx, double wy, double wz, double rx, double gx, double bx, double ry, double gy, double by, double rz, double gz, double bz, const Babl *trc_red, const Babl *trc_green, const Babl *trc_blue); /** * babl_format_get_encoding: * * Returns the components and data type, without space suffix. */ const char * babl_format_get_encoding (const Babl *babl); int babl_space_is_cmyk (const Babl *space); int babl_space_is_gray (const Babl *space); /* values below this are stored associated with this value, it should also be * used as a generic alpha zero epsilon in GEGL to keep the threshold effects * on one known value. */ #define BABL_ALPHA_FLOOR (1/65536.0) #define BABL_ALPHA_FLOOR_F (1/65536.0f) #ifdef __cplusplus } #endif #endif /* Trademarks: * * International Color Consortium is a registered trademarks of the. * International Color Consortium. * Apple is a trademark or registered trademark of Apple Inc in many countries. * Adobish is meant to concisely convey resemblence/compatibility with Adobe * RGB- without actualy being it, Adobe is a trademark or registered trademark * of Adobe Systems Incorporated in many countires. */