diff options
Diffstat (limited to 'dmagick')
| -rw-r--r-- | dmagick/ColorGray.d | 6 | ||||
| -rw-r--r-- | dmagick/ColorHSL.d | 110 | ||||
| -rw-r--r-- | dmagick/ColorYUV.d | 146 |
3 files changed, 259 insertions, 3 deletions
diff --git a/dmagick/ColorGray.d b/dmagick/ColorGray.d index 3d78bda..8f870ea 100644 --- a/dmagick/ColorGray.d +++ b/dmagick/ColorGray.d @@ -48,9 +48,9 @@ class ColorGray : Color */ void shade(double shade) { - pixelPacket.red = ScaleCharToQuantum(shade); - pixelPacket.green = ScaleCharToQuantum(shade); - pixelPacket.blue = ScaleCharToQuantum(shade); + pixelPacket.red = scaleDoubleToQuantum(shade); + pixelPacket.green = scaleDoubleToQuantum(shade); + pixelPacket.blue = scaleDoubleToQuantum(shade); } ///ditto double shade() diff --git a/dmagick/ColorHSL.d b/dmagick/ColorHSL.d new file mode 100644 index 0000000..cedbd99 --- /dev/null +++ b/dmagick/ColorHSL.d @@ -0,0 +1,110 @@ +/** + * Copyright: Mike Wey 2011 + * License: zlib (See accompanying LICENSE file) + * Authors: Mike Wey + */ + +module dmagick.ColorHSL; + +import dmagick.Color; + +import dmagick.c.gem; +import dmagick.c.magickType; +import dmagick.c.quantum; + +/** + * The HSL color model describes a color by using the three color components + * hue (H), saturation (S) and luminance (L). This color format is very + * popular for designing and editing (e.g. within graphics design tools) + * because it gives the user a good impression about the resulting color + * for a certain color value: Hue defines the pure color tone out of the + * color spectrum, saturation defines the mixture of the color tone with + * gray and finally luminance defines the lightness of the resulting color. + */ +class ColorHSL : Color +{ + this() + { + super(); + } + + /** + * Create a Color from the specified doubles. + */ + this(double hue, double saturation, double luminance, double opacity = 0) + { + Quantum red, green, blue; + + ConvertHSLToRGB(hue, saturation, luminance, &red, &green, &blue); + + super(red, green, blue, scaleDoubleToQuantum(opacity)); + } + + /** + * Create a Color from a X11 color specification string + */ + this(string color) + { + super(color); + } + + /** + * The value for hue as a an angle between 0 and 360 degrees. + */ + void hue(double hue) + { + double oldHue, saturation, luminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &oldHue, &saturation, &luminance); + ConvertHSLToRGB(hue, saturation, luminance, &(pixelPacket.red), &(pixelPacket.green), &(pixelPacket.blue)); + } + ///ditto + double hue() + { + double hue, saturation, luminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &hue, &saturation, &luminance); + + return hue; + } + + /** + * The value the saturation as a double in the range [0.0 .. 1.0] + */ + void saturation(double saturation) + { + double hue, oldSaturation, luminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &hue, &oldSaturation, &luminance); + ConvertHSLToRGB(hue, saturation, luminance, &(pixelPacket.red), &(pixelPacket.green), &(pixelPacket.blue)); + } + ///ditto + double saturation() + { + double hue, saturation, luminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &hue, &saturation, &luminance); + + return saturation; + } + + /** + * The value for the luminance as a double in the range [0.0 .. 1.0] + */ + void luminance(double luminance) + { + double hue, saturation, oldLuminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &hue, &saturation, &oldLuminance); + ConvertHSLToRGB(hue, saturation, luminance, &(pixelPacket.red), &(pixelPacket.green), &(pixelPacket.blue)); + } + ///ditto + double luminance() + { + double hue, saturation, luminance; + + ConvertRGBToHSL(pixelPacket.red, pixelPacket.green, pixelPacket.blue, &hue, &saturation, &luminance); + + return luminance; + } +} diff --git a/dmagick/ColorYUV.d b/dmagick/ColorYUV.d new file mode 100644 index 0000000..16bc63a --- /dev/null +++ b/dmagick/ColorYUV.d @@ -0,0 +1,146 @@ +/** + * Copyright: Mike Wey 2011 + * License: zlib (See accompanying LICENSE file) + * Authors: Mike Wey + */ + +module dmagick.ColorRGB; + +import dmagick.Color; + +import dmagick.c.magickType; +import dmagick.c.quantum; + +/** + * The YUV color format describes a color by using the color components + * luminance and chrominance. The luminance component (Y) represents the + * brightness information of a color, the chrominance components (U and V) + * contain the color differences. + * + * The YUV color format was developed for analog TV transmissions to provide + * compatibility between black-and-white television and color television: + * The luminance component is sufficient for black-and-white TV sets, + * whereas color TV sets need the additional chrominance information. + */ +class ColorRGB : Color +{ + this() + { + super(); + } + + /** + * Create a YUV Color from the specified doubles. + * + * Params: + * y = The luminance as a value between 0.0 and 1.0 + * u = The U chrominance component as a value between -0.5 and 0.5 + * v = The V chrominance component as a value between -0.5 and 0.5 + */ + this(double y, double u, double v, double opacity = 0) + { + Quantum red, green, blue; + + convertYUVToRGB(y, u, v, red, green, blue); + + super(red, green, blue, scaleDoubleToQuantum(opacity)); + } + + /** + * Create a Color from a X11 color specification string + */ + this(string color) + { + super(color); + } + + /** + * The value for the luminance in the range [0.0 .. 1.0] + */ + void y(double y) + { + double oldY, u, v; + + convertRGBToYUV(pixelPacket.red, pixelPacket.green, pixelPacket.blue, oldY, u, v); + convertYUVToRGB(y, u, v, pixelPacket.red, pixelPacket.green, pixelPacket.blue); + } + ///ditto + double y() + { + return 0.299 * scaleQuantumToDouble(pixelPacket.red) + + 0.587 * scaleQuantumToDouble(pixelPacket.green) + + 0.114 * scaleQuantumToDouble(pixelPacket.blue); + } + + /** + * The value for U chrominance component in the range [-0.5 .. 0.5] + */ + void u(double u) + { + double y, oldU, v; + + convertRGBToYUV(pixelPacket.red, pixelPacket.green, pixelPacket.blue, y, oldU, v); + convertYUVToRGB(y, u, v, pixelPacket.red, pixelPacket.green, pixelPacket.blue); + } + ///ditto + double u() + { + return -0.147 * scaleQuantumToDouble(pixelPacket.red) + + -0.289 * scaleQuantumToDouble(pixelPacket.green) + + 0.436 * scaleQuantumToDouble(pixelPacket.blue); + } + + /** + * The value for V chrominance component in the range [-0.5 .. 0.5] + */ + void v(double v) + { + double y, u, oldV; + + convertRGBToYUV(pixelPacket.red, pixelPacket.green, pixelPacket.blue, y, u, oldV); + convertYUVToRGB(y, u, v, pixelPacket.red, pixelPacket.green, pixelPacket.blue); + } + ///ditto + double v() + { + return 0.615 * scaleQuantumToDouble(pixelPacket.red) + + -0.515 * scaleQuantumToDouble(pixelPacket.green) + + -0.100 * scaleQuantumToDouble(pixelPacket.blue); + } + + /** + * Convert an RGB value to a YUV value. + */ + private void convertRGBToYUV(Quantum red, Quantum green, Quantum blue, ref double y, ref double u, ref double v) + { + // ⌈Y⌉ ⌈ 0.299 0.587 0.114⌉ ⌈R⌉ + // |U|=|-0.147 -0.289 0.436|·|G| + // ⌊V⌋ ⌊ 0.615 -0.515 -0.100⌋ ⌊B⌋ + + double r = scaleQuantumToDouble(red); + double g = scaleQuantumToDouble(green); + double b = scaleQuantumToDouble(blue); + + y = 0.299*r + 0.587*g + 0.114*b; + u = -0.147*r + -0.289*g + 0.436*b; + v = 0.615*r + -0.515*g + -0.100*b; + } + + /** + * Convert an YUV value to a RGB value. + */ + private void convertYUVToRGB(double y, double u, double v, ref Quantum red, ref Quantum green, ref Quantum blue) + { + // ⌈R⌉ ⌈ 1.000 0.000 1.140⌉ ⌈Y⌉ + // |G|=| 1.000 -0.395 -0.581|·|U| + // ⌊B⌋ ⌊ 1.000 2.032 0.000⌋ ⌊V⌋ + + double r = 1.000*y + 0.000*u + 1.140*v; + double g = 1.000*y + -0.395*u + -0.581*v; + double b = 1.000*y + 2.032*u + 0.000*v; + + red = scaleDoubleToQuantum(r); + green = scaleDoubleToQuantum(g); + blue = scaleDoubleToQuantum(b); + } +} |
