summaryrefslogtreecommitdiffstats
path: root/libdimension/dimension/color.h
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension/dimension/color.h')
-rw-r--r--libdimension/dimension/color.h90
1 files changed, 47 insertions, 43 deletions
diff --git a/libdimension/dimension/color.h b/libdimension/dimension/color.h
index 3eacbfe..afc4a5c 100644
--- a/libdimension/dimension/color.h
+++ b/libdimension/dimension/color.h
@@ -25,19 +25,19 @@
#include <stdbool.h>
-/// A color value.
+/** A color value. */
typedef struct {
- double R; ///< Red component.
- double G; ///< Green component.
- double B; ///< Blue component.
+ double R; /**< Red component. */
+ double G; /**< Green component. */
+ double B; /**< Blue component. */
} dmnsn_color;
-/// A standard format string for colors.
+/** A standard format string for colors. */
#define DMNSN_COLOR_FORMAT "Color<%g, %g, %g>"
-/// The appropriate arguements to printf() a color.
+/** The appropriate arguements to printf() a color. */
#define DMNSN_COLOR_PRINTF(c) (c).R, (c).G, (c).B
-/// Construct a new color.
+/** Construct a new color. */
DMNSN_INLINE dmnsn_color
dmnsn_new_color(double R, double G, double B)
{
@@ -45,17 +45,19 @@ dmnsn_new_color(double R, double G, double B)
return ret;
}
-/// Apply sRGB gamma
+/** Apply sRGB gamma */
DMNSN_INLINE double
dmnsn_sRGB_gamma(double Clinear)
{
- // If C represents R, G, and B, then the sRGB values are now found as follows:
- //
- // { 12.92*Clinear, Clinear <= 0.0031308
- // Csrgb = { 1/2.4
- // { (1.055)*Clinear - 0.055, Clinear > 0.0031308
+ /*
+ * If C represents R, G, and B, then the sRGB values are now found as follows:
+ *
+ * { 12.92*Clinear, Clinear <= 0.0031308
+ * Csrgb = { 1/2.4
+ * { (1.055)*Clinear - 0.055, Clinear > 0.0031308
+ */
if (Clinear == 1.0) {
- return 1.0; // Map 1.0 to 1.0 instead of 0.9999999999999999
+ return 1.0; /* Map 1.0 to 1.0 instead of 0.9999999999999999 */
} else if (Clinear > 0.0031308) {
return 1.055*pow(Clinear, 1.0/2.4) - 0.055;
} else {
@@ -63,7 +65,7 @@ dmnsn_sRGB_gamma(double Clinear)
}
}
-/// Convert to sRGB space.
+/** Convert to sRGB space. */
DMNSN_INLINE dmnsn_color
dmnsn_color_to_sRGB(dmnsn_color color)
{
@@ -74,18 +76,20 @@ dmnsn_color_to_sRGB(dmnsn_color color)
);
}
-/// Remove sRGB gamma
+/** Remove sRGB gamma */
DMNSN_INLINE double
dmnsn_sRGB_inverse_gamma(double CsRGB)
{
- // If C represents R, G, and B, then the Clinear values are now found as
- // follows:
- //
- // { Csrgb/12.92, Csrgb <= 0.04045
- // Clinear = { 2.4
- // { ((Csrgb + 0.055)/1.055) , Csrgb > 0.04045
+ /*
+ * If C represents R, G, and B, then the Clinear values are now found as
+ * follows:
+ *
+ * { Csrgb/12.92, Csrgb <= 0.04045
+ * Clinear = { 2.4
+ * { ((Csrgb + 0.055)/1.055) , Csrgb > 0.04045
+ */
if (CsRGB == 1.0) {
- return 1.0; // Map 1.0 to 1.0 instead of 0.9999999999999999
+ return 1.0; /* Map 1.0 to 1.0 instead of 0.9999999999999999 */
} else if (CsRGB <= 0.040449936) {
return CsRGB/12.92;
} else {
@@ -93,7 +97,7 @@ dmnsn_sRGB_inverse_gamma(double CsRGB)
}
}
-/// Convert from sRGB space.
+/** Convert from sRGB space. */
DMNSN_INLINE dmnsn_color
dmnsn_color_from_sRGB(dmnsn_color color)
{
@@ -104,35 +108,35 @@ dmnsn_color_from_sRGB(dmnsn_color color)
);
}
-/// Greyscale color intensity.
+/** Greyscale color intensity. */
DMNSN_INLINE double
dmnsn_color_intensity(dmnsn_color color)
{
return 0.2126*color.R + 0.7152*color.G + 0.0722*color.B;
}
-/// Add two colors together.
+/** Add two colors together. */
DMNSN_INLINE dmnsn_color
dmnsn_color_add(dmnsn_color lhs, dmnsn_color rhs)
{
return dmnsn_new_color(lhs.R + rhs.R, lhs.G + rhs.G, lhs.B + rhs.B);
}
-/// Subtract two colors.
+/** Subtract two colors. */
DMNSN_INLINE dmnsn_color
dmnsn_color_sub(dmnsn_color lhs, dmnsn_color rhs)
{
return dmnsn_new_color(lhs.R - rhs.R, lhs.G - rhs.G, lhs.B - rhs.B);
}
-/// Scale a color's intensity.
+/** Scale a color's intensity. */
DMNSN_INLINE dmnsn_color
dmnsn_color_mul(double n, dmnsn_color color)
{
return dmnsn_new_color(n*color.R, n*color.G, n*color.B);
}
-/// Return the color at \p n on a gradient from \p c1 at 0 to \p c2 at 1.
+/** Return the color at \p n on a gradient from \p c1 at 0 to \p c2 at 1. */
DMNSN_INLINE dmnsn_color
dmnsn_color_gradient(dmnsn_color c1, dmnsn_color c2, double n)
{
@@ -143,14 +147,14 @@ dmnsn_color_gradient(dmnsn_color c1, dmnsn_color c2, double n)
);
}
-/// Illuminate \p color with \p light.
+/** Illuminate \p color with \p light. */
DMNSN_INLINE dmnsn_color
dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color)
{
return dmnsn_new_color(light.R*color.R, light.G*color.G, light.B*color.B);
}
-/// Saturate the color components to [0.0, 1.0].
+/** Saturate the color components to [0.0, 1.0]. */
DMNSN_INLINE dmnsn_color
dmnsn_color_saturate(dmnsn_color color)
{
@@ -160,30 +164,30 @@ dmnsn_color_saturate(dmnsn_color color)
return color;
}
-/// Return whether a color contains any NaN components.
+/** Return whether a color contains any NaN components. */
DMNSN_INLINE bool
dmnsn_color_isnan(dmnsn_color color)
{
- return isnan(color.R) || isnan(color.G) || isnan(color.B);
+ return dmnsn_isnan(color.R) || dmnsn_isnan(color.G) || dmnsn_isnan(color.B);
}
-// Standard colors
+/* Standard colors */
-/// Black.
+/** Black. */
#define dmnsn_black dmnsn_new_color(0.0, 0.0, 0.0)
-/// White.
+/** White. */
#define dmnsn_white dmnsn_new_color(1.0, 1.0, 1.0)
-/// Red.
+/** Red. */
#define dmnsn_red dmnsn_new_color(1.0, 0.0, 0.0)
-/// Green.
+/** Green. */
#define dmnsn_green dmnsn_new_color(0.0, 1.0, 0.0)
-/// Blue.
+/** Blue. */
#define dmnsn_blue dmnsn_new_color(0.0, 0.0, 1.0)
-/// Magenta.
+/** Magenta. */
#define dmnsn_magenta dmnsn_new_color(1.0, 0.0, 1.0)
-/// Orange.
+/** Orange. */
#define dmnsn_orange dmnsn_new_color(1.0, 0.21404114048223255, 0.0)
-/// Yellow.
+/** Yellow. */
#define dmnsn_yellow dmnsn_new_color(1.0, 1.0, 0.0)
-/// Cyan.
+/** Cyan. */
#define dmnsn_cyan dmnsn_new_color(0.0, 1.0, 1.0)