170 lines
6.5 KiB
C
170 lines
6.5 KiB
C
|
|
/*
|
|
* cam97s3
|
|
*
|
|
* Color Appearance Model, based on
|
|
* CIECAM97, "Revision for Practical Applications"
|
|
* by Mark D. Fairchild, with the addition of the Viewing Flare
|
|
* model described on page 487 of "Digital Color Management",
|
|
* by Edward Giorgianni and Thomas Madden, and the
|
|
* Helmholtz-Kohlraush effect, using the equation
|
|
* the Bradford-Hunt 96C model as detailed in Mark Fairchilds
|
|
* book "Color Appearance Models".
|
|
*
|
|
* Author: Graeme W. Gill
|
|
* Date: 5/10/00
|
|
* Version: 1.20
|
|
*
|
|
* Copyright 2000 Graeme W. Gill
|
|
* Please refer to COPYRIGHT file for details.
|
|
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
|
|
* see the License.txt file for licencing details.
|
|
*/
|
|
|
|
/* Algorithm tweaks */
|
|
#define CIECAM97S3_SPLINE_E /* Use spline interpolation for eccentricity factor */
|
|
|
|
/* Definitions assumed here:
|
|
|
|
Stimulus field is the 2 degrees field of view of the sample
|
|
being characterised.
|
|
|
|
Viewing/Scene/Image field is the area of the whole image or
|
|
display surface that the stimulus is part of.
|
|
|
|
Background field is 10-12 degree field surrounding the stimulus field.
|
|
This may be within, overlap or encompass the Viewing/Scene/Image field.
|
|
|
|
Surround/Adapting field is the visual field minus the background field.
|
|
|
|
Visual field is the 130 degree angular field that is seen by the eyes.
|
|
|
|
Illuminating field is the field that illuminates the reflective
|
|
Scene/Image. It may be the same as the Ambient field.
|
|
|
|
Ambient field is the whole surrounding environmental light field.
|
|
|
|
NOTE: In "Digital Color Management", Giorgianni and Madden use the term
|
|
"Surround" to mean the same thing as "Background" in the CIECAM97 terminology.
|
|
The ICC standard doesn't define what it means by "Surround illumination".
|
|
|
|
*/
|
|
|
|
/* Rules of Thumb: */
|
|
/* Ambient Luminance (Lat, cd/m^2) is Ambient Illuminance (Lux) divided by PI. */
|
|
/* i.e. Lat = Iat/PI */ /* (1 foot candle = 0.0929 lux) */
|
|
|
|
/* The Adapting/Surround Luminance is often taken to be */
|
|
/* the 20% of the Ambient Luminance. (gray world) */
|
|
/* i.e. La = Lat/5 = Iat/15.7 */
|
|
|
|
/* For a reflective print, the Viewing/Scene/Image luminance (Lv, cd/m^2), */
|
|
/* will be the Illuminating Luminance (Li, cd/m^2) reflected by the */
|
|
/* media white point (Yw) */
|
|
|
|
/* If there is no special illumination for a reflective print, */
|
|
/* then the Illuminating Luminance (Li) will be the Ambient Luminance (Lat) */
|
|
|
|
/* An emisive display will have an independently determined Lv. */
|
|
|
|
/* The classification of the type of surround is */
|
|
/* determined by comparing the Adapting/Surround luminance (La, cd/m^2) */
|
|
/* with the average luminance of the Viewing/Scene/Image field (Lv, cd/m^2) */
|
|
|
|
/* La/Lv == 0%, dark */
|
|
/* La/Lv 0 - 20%, dim */
|
|
/* La/Lv > 20%, average */
|
|
/* special, cut sheet */
|
|
|
|
/* The Background relative luminance Yb is typically assumed to */
|
|
/* be 0.18 .. 0.2, and is assumed to be grey. */
|
|
|
|
/* The source of flare light depends on the type of display system. */
|
|
/* For a CRT, it will be the Ambient light reflecting off the glass surface. */
|
|
/* (This implies Yf = Lat * reflectance/Lv) */
|
|
/* For a reflection print, it will be the Illuminant reflecting from the media */
|
|
/* surface. (Yf = Li * reflectance) */
|
|
/* For a projected image, it will be stray projector light, scattered by the */
|
|
/* surround, screen and air particles. (Yf = Li * reflectance_and_scattering) */
|
|
|
|
/*
|
|
|
|
Typical Ambient Illuminance brightness
|
|
(Lux) La Condition
|
|
11 1 Twilight
|
|
32 2 Subdued indoor lighting
|
|
64 4 Less than typical office light; sometimes recommended for
|
|
display-only workplaces (sRGB)
|
|
350 22 Typical Office (sRGB annex D)
|
|
500 32 Practical print evaluationa (ISO-3664 P2)
|
|
1000 64 Good Print evaluation (CIE 116-1995)
|
|
1000 64 Overcast Outdoors
|
|
2000 127 Critical print evaluation (ISO-3664 P1)
|
|
10000 637 Typical outdoors, full daylight
|
|
50000 3185 Bright summers day
|
|
|
|
*/
|
|
|
|
/* ---------------------------------- */
|
|
struct _cam97s3 {
|
|
/* Public: */
|
|
void (*del)(struct _cam97s3 *s); /* We're done with it */
|
|
|
|
int (*set_view)(
|
|
struct _cam97s3 *s,
|
|
ViewingCondition Ev, /* Enumerated Viewing Condition */
|
|
double Wxyz[3], /* Reference/Adapted White XYZ (Y scale 1.0) */
|
|
double La, /* Adapting/Surround Luminance cd/m^2 */
|
|
double Yb, /* Luminance of Background relative to reference white (range 0.0 .. 1.0) */
|
|
double Lv, /* Luminance of white in the Viewing/Scene/Image field (cd/m^2) */
|
|
/* Ignored if Ev is set */
|
|
double Yf, /* Flare as a fraction of the reference white (range 0.0 .. 1.0) */
|
|
double Fxyz[3], /* The Flare white coordinates (typically the Ambient color) */
|
|
int hk /* Flag, NZ to use Helmholtz-Kohlraush effect */
|
|
);
|
|
|
|
/* Conversions */
|
|
int (*XYZ_to_cam)(struct _cam97s3 *s, double *out, double *in);
|
|
int (*cam_to_XYZ)(struct _cam97s3 *s, double *out, double *in);
|
|
|
|
/* Private: */
|
|
/* Scene parameters */
|
|
ViewingCondition Ev; /* Enumerated Viewing Condition */
|
|
double Wxyz[3]; /* Reference/Adapted White XYZ (Y range 0.0 .. 1.0) */
|
|
double Yb; /* Relative Luminance of Background to reference white (Y range 0.0 .. 1.0) */
|
|
double La; /* Adapting/Surround Luminance cd/m^2 */
|
|
double Yf; /* Flare as a fraction of the reference white (Y range 0.0 .. 1.0) */
|
|
double Fxyz[3]; /* The Flare white coordinates (typically the Ambient color) */
|
|
|
|
/* Internal parameters */
|
|
double C; /* Surround Impact */
|
|
double Nc; /* Chromatic Induction */
|
|
double F; /* Adaptation Degree */
|
|
|
|
/* Pre-computed values */
|
|
double Fsc; /* Flare scale */
|
|
double Fisc; /* Inverse flare scale */
|
|
double Fsxyz[3]; /* Scaled Flare color coordinates */
|
|
double rgbW[3]; /* Sharpened cone response white values */
|
|
double D; /* Degree of chromatic adaption */
|
|
double rgbcW[3]; /* Chromatically transformed white value */
|
|
double rgbpW[3]; /* Hunt-Pointer-Estevez cone response space white */
|
|
double n; /* Background induction factor */
|
|
double nn; /* Precomuted function of n */
|
|
double Fl; /* Lightness contrast factor ?? */
|
|
double Nbb; /* Background brightness induction factors */
|
|
double Ncb; /* Chromatic brightness induction factors */
|
|
double z; /* Base exponential nonlinearity */
|
|
double rgbaW[3]; /* Post-adapted cone response of white */
|
|
double Aw; /* Achromatic response of white */
|
|
|
|
/* Flags */
|
|
int hk; /* If NZ, use Helmholtz-Kohlraush effect */
|
|
int trace; /* Trace values through computation */
|
|
}; typedef struct _cam97s3 cam97s3;
|
|
|
|
|
|
/* Create a cam97s3 conversion class, with default viewing conditions */
|
|
cam97s3 *new_cam97s3(void);
|
|
|