/* babl - dynamically extendable universal pixel conversion library. * Copyright (C) 2017, Øyvind Kolås and others. * * 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_SPACE_H #define _BABL_SPACE_H #include "config.h" #include #include #include "base/util.h" #include "babl-matrix.h" #ifdef HAVE_LCMS #include #endif BABL_CLASS_DECLARE (space); typedef struct { //int is_cmyk; #ifdef HAVE_LCMS cmsHPROFILE lcms_profile; cmsHTRANSFORM lcms_to_rgba; cmsHTRANSFORM lcms_from_rgba; #endif int filler; } BablCMYK; #if 0 // draft datastructures for spectral spaces typedef struct _BablSpectrumType BablSpectrumType; struct _BablSpectrumType { double nm_start; double nm_gap; double nm_end; /* last band, computed */ int bands; }; typedef struct { BablSpectrumType spectrum_type; int is_spectral; float *observer_x; float *observer_y; float *observer_z; float *illuminant; float rev_y_scale; } BablSpectralSpace; typedef struct { BablSpectralSpace *spectral_space; int inks; float *on_white; float *on_black; float *opaqueness; float scale; float trc_gamma; float *illuminant; } BablCoat; #define BABL_MAX_COATS 16 typedef struct { BablSpectralSpace *spectral_space; BablCoat coat_def[BABL_MAX_COATS]; int coats; float *substrate; int stochastic_iterations; float stochastic_diffusion0; float stochastic_diffusion1; } BablProcessSpace; #endif typedef enum { BablICCTypeRGB = 0, BablICCTypeGray = 2, BablICCTypeCMYK = 3, } BablICCType; typedef struct { BablInstance instance; double xw; // white-point chromaticity double yw; double xr; // red primary chromaticity double yr; double xg; // green primary chromaticity double yg; double xb; // blue primary chromaticity double yb; BablICCType icc_type; /* taken into account when looking for duplicate spaces*/ double whitepoint[3]; /* CIE XYZ whitepoint */ const Babl *trc[3]; /* ------------- end of dedup zone -------------- */ char name[512]; // XXX: allocate this dynamically instead - // or use iccv4 style hashes for name. double RGBtoXYZ[9]; /* matrices for conversions */ double XYZtoRGB[9]; float RGBtoXYZf[9]; /* matrices for conversions */ float XYZtoRGBf[9]; /* the space should contain matrix to/from XYZ */ /* and before converting a span, all that needs to be rigged is merging matrices */ /* we should here also add more things read from ICC profile, * making it possible to round-trip data. Unless it is sRGB, when * standard should win. */ char *icc_profile; int icc_length; BablCMYK cmyk; } BablSpace; static inline void babl_space_to_xyzf (const Babl *space, const float *rgb, float *xyz) { BablSpace *space_ = (void*)space; babl_matrix_mul_vectorff (space_->RGBtoXYZf, rgb, xyz); } static inline void babl_space_from_xyzf (const Babl *space, const float *xyz, float *rgb) { BablSpace *space_ = (void*)space; babl_matrix_mul_vectorff (space_->XYZtoRGBf, xyz, rgb); } static inline void _babl_space_to_xyz (const Babl *space, const double *rgb, double *xyz) { BablSpace *space_ = (void*)space; babl_matrix_mul_vector (space_->RGBtoXYZ, rgb, xyz); } static inline void _babl_space_from_xyz (const Babl *space, const double *xyz, double *rgb) { BablSpace *space_ = (void*)space; babl_matrix_mul_vector (space_->XYZtoRGB, xyz, rgb); } void babl_space_class_init (void); const Babl * babl_space_from_gray_trc (const char *name, const Babl *trc_gray, BablSpaceFlags flags); #endif