summaryrefslogtreecommitdiffstats
path: root/libdimension/dimension/color.h
blob: c9d777b9210803f749681566367afc7ad33612af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*************************************************************************
 * Copyright (C) 2009-2010 Tavian Barnes <tavianator@tavianator.com>     *
 *                                                                       *
 * This file is part of The Dimension Library.                           *
 *                                                                       *
 * The Dimension 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.                       *
 *                                                                       *
 * The Dimension 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 program.  If not, see                         *
 * <http://www.gnu.org/licenses/>.                                       *
 *************************************************************************/

/**
 * @file
 * Color-related types and operations.
 */

#ifndef DIMENSION_COLOR_H
#define DIMENSION_COLOR_H

#include <stdbool.h>

/** A color value. */
typedef struct {
  /** Filtered transparency. */
  double filter;
  /** Unfiltered transparency; <tt>filter + trans</tt> should be <= 1. */
  double trans;

  /* Internally we use sRGB color. */
  double R; /**< @internal sRGB red value. */
  double G; /**< @internal sRGB green value. */
  double B; /**< @internal sRGB blue value. */
} dmnsn_color;

/** sRGB color. */
typedef struct {
  double R; /**< sRGB red value. */
  double G; /**< sRGB green value. */
  double B; /**< sRGB blue value. */
} dmnsn_sRGB;

/** CIE XYZ color. */
typedef struct {
  double X; /**< X component. */
  double Y; /**< Y (luminance) component. */
  double Z; /**< Z component. */
} dmnsn_CIE_XYZ;

/** CIE xyY color. */
typedef struct {
  double x; /**< x chromaticity coordinate (in [0, 1]). */
  double y; /**< y chromaticity coordinate (in [0, 1]). */
  double Y; /**< Luminance, unbounded >= 0; 1 is diffuse white. */
} dmnsn_CIE_xyY;

/** CIE 1976 (L*, a*, b*) color. */
typedef struct {
  double L; /**< Luminance (100 is diffuse white). */
  double a; /**< Red/greed color-opponent value. */
  double b; /**< Yellow/blue color-opponent value. */
} dmnsn_CIE_Lab;

/** CIE 1976 (L*, u*, v*) color. */
typedef struct {
  double L; /**< Luminance (same L* as CIE L*, a*, b*). */
  double u; /**< u* coordinate. */
  double v; /**< v* coordinate. */
} dmnsn_CIE_Luv;

/* Standard colors */
extern const dmnsn_color dmnsn_black;   /**< Black.   */
extern const dmnsn_color dmnsn_white;   /**< White.   */
extern const dmnsn_color dmnsn_clear;   /**< Clear.   */
extern const dmnsn_color dmnsn_red;     /**< Red.     */
extern const dmnsn_color dmnsn_green;   /**< Green.   */
extern const dmnsn_color dmnsn_blue;    /**< Blue.    */
extern const dmnsn_color dmnsn_magenta; /**< Magenta. */
extern const dmnsn_color dmnsn_orange;  /**< Orange.  */
extern const dmnsn_color dmnsn_yellow;  /**< Yellow.  */
extern const dmnsn_color dmnsn_cyan;    /**< Cyan.    */

/** Standard whitepoint, determined by the conversion of sRGB white to
    CIE XYZ */
extern const dmnsn_CIE_XYZ dmnsn_whitepoint;

/** Is this color black? */
bool dmnsn_color_is_black(dmnsn_color color);

/* Color conversions */

/** Convert an sRGB color to a Dimension color. */
dmnsn_color dmnsn_color_from_sRGB(dmnsn_sRGB sRGB);
/** Convert a CIE XYZ color to a Dimension color. */
dmnsn_color dmnsn_color_from_XYZ(dmnsn_CIE_XYZ XYZ);
/** Convert a CIE xyY color to a Dimension color. */
dmnsn_color dmnsn_color_from_xyY(dmnsn_CIE_xyY xyY);
/** Convert a CIE L*, a*, b* color to a Dimension color. */
dmnsn_color dmnsn_color_from_Lab(dmnsn_CIE_Lab Lab, dmnsn_CIE_XYZ white);
/** Convert a CIE L*, u*, v* color to a Dimension color. */
dmnsn_color dmnsn_color_from_Luv(dmnsn_CIE_Luv Luv, dmnsn_CIE_XYZ white);

/** Convert a Dimension color to sRGB. */
dmnsn_sRGB dmnsn_sRGB_from_color(dmnsn_color color);
/** Convert a Dimension color to CIE XYZ. */
dmnsn_CIE_XYZ dmnsn_XYZ_from_color(dmnsn_color color);
/** Convert a Dimension color to CIE xyY. */
dmnsn_CIE_xyY dmnsn_xyY_from_color(dmnsn_color color);
/** Convert a Dimension color to CIE L*, a*, b*. */
dmnsn_CIE_Lab dmnsn_Lab_from_color(dmnsn_color color, dmnsn_CIE_XYZ white);
/** Convert a Dimension color to CIE L*, u*, v*. */
dmnsn_CIE_Luv dmnsn_Luv_from_color(dmnsn_color color, dmnsn_CIE_XYZ white);

/* Perceptual color manipulation */

/** Add two colors together. */
dmnsn_color dmnsn_color_add(dmnsn_color color1, dmnsn_color color2);
/** Multiply a color's intensity by \p n. */
dmnsn_color dmnsn_color_mul(double n, dmnsn_color color);
/** Return the color at \p n on a gradient from \p c1 at 0 to \p c2 at 1. */
dmnsn_color dmnsn_color_gradient(dmnsn_color c1, dmnsn_color c2, double n);
/** Filter \p light through \p filter. */
dmnsn_color dmnsn_filter_light(dmnsn_color light, dmnsn_color filter);
/** Add the background contribution \p filtered to \p filter. */
dmnsn_color dmnsn_apply_translucency(dmnsn_color filtered, dmnsn_color filter);
/** Add the background contribution of \p color to \p filter. */
dmnsn_color dmnsn_apply_filter(dmnsn_color color, dmnsn_color filter);
/** Illuminate \p color with \p light. */
dmnsn_color dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color);

/** Return the perceptual difference between two colors. */
double dmnsn_color_difference(dmnsn_color color1, dmnsn_color color2);

#endif /* DIMENSION_COLOR_H */