1 /** 2 3 This module mostly exist to have a bridge with the ggplotd code and the ggplotd.color code. That is because the ggplotd.color code might become part of phobos one day and I don't want to depend directly on ggplotd's implementation, so that it stays easy to switch to an alternative (phobos) based implementation. 4 5 */ 6 module ggplotd.colourspace; 7 8 import chsx = std.experimental.color.hsx; 9 import crgb = std.experimental.color.rgb; 10 import cxyz = std.experimental.color.xyz; 11 import cspace = std.experimental.color.colorspace; 12 import cColor = std.experimental.color; 13 14 /// HCY colourspace 15 alias HCY = chsx.HCY!double; 16 /// RGB colourspace 17 alias RGB = crgb.RGB!("rgb",double); 18 /// RGBA colourspace 19 alias RGBA = crgb.RGB!("rgba",double); 20 /// XYZ colourspace 21 alias XYZ = cxyz.XYZ!double; 22 23 /// Convert to another colour space 24 alias toColourSpace = cspace.convertColor; 25 26 /// Check whether it is a colour 27 alias isColour = cColor.isColor; 28 29 import cairo = cairo.cairo; 30 31 /// Convert to Cairo colour 32 cairo.RGBA toCairoRGBA(C)( in C from ) 33 { 34 auto rgb = toColourSpace!(RGBA,C)( from ); 35 return cairo.RGBA( 36 rgb.r, 37 rgb.g, 38 rgb.b, 39 rgb.a 40 ); 41 } 42 43 /// Convert from Cairo colour to specified type (template) 44 C fromCairoRGBA(C)( in cairo.RGBA crgb ) 45 { 46 auto rgba = RGBA( crgb.red, crgb.green, crgb.blue, crgb.alpha ); 47 return toColourSpace!C( rgba ); 48 } 49 50 /// Convert colour to a tuple holding the values 51 auto toTuple(T : HCY)( T colour ) 52 { 53 import std.typecons : Tuple; 54 return Tuple!(double, double, double)( colour.h, colour.c, colour.y ); 55 } 56 57 /// Convert colour to a tuple holding the values 58 auto toTuple(T : XYZ)( T colour ) 59 { 60 import std.typecons : Tuple; 61 return Tuple!(double, double, double)( colour.X, colour.Y, colour.Z ); 62 } 63 64 /// Convert colour to a tuple holding the values 65 auto toTuple(T)( T colour ) 66 { 67 import std.typecons : Tuple; 68 import std.typecons : Nullable; 69 import std.traits : isInstanceOf; 70 static if (isInstanceOf!(Nullable, T)) 71 return Tuple!(double, double, double)( colour.get().r, colour.get().g, colour.get().b ); 72 else 73 return Tuple!(double, double, double)( colour.r, colour.g, colour.b ); 74 }