GooCanvas
May 14, 2013 15:27:07 GMT 1
Post by vovchik on May 14, 2013 15:27:07 GMT 1
Dear all,
Since using cairo's floiting point notation for color values (doubles) can be a PITA, I wrote this little function that allows you to use "named" colors (css/html). It is pretty straightforward and does some error checking. If a bad color value is supplied, it blithely returns "white", although you could make it return something awful, just so you know that your color choice was bad.
With kind regards,
vovchik
Since using cairo's floiting point notation for color values (doubles) can be a PITA, I wrote this little function that allows you to use "named" colors (css/html). It is pretty straightforward and does some error checking. If a bad color value is supplied, it blithely returns "white", although you could make it return something awful, just so you know that your color choice was bad.
With kind regards,
vovchik
' ------------------
FUNCTION HEX2RGB(STRING hex$, int byte)
' ------------------
' Author - vovchik
' converts bytes of an html/css color specification
' to rgb value suitable for cairo (decimal) ranging
' in value from 0 to 1. The # affix is needed for
' hex values. 'Named colors' can also be used, as per
' http://cloford.com/resources/colours/namedcol.htm
LOCAL rgb, tmp TYPE double
LOCAL i, name_found TYPE int
' set up list of named colours
LOCAL named$[138] TYPE STRING
named$[ 0] = "aliceblue|#F0F8FF"
named$[ 1] = "antiquewhite|#FAEBD7"
named$[ 2] = "aqua|#00FFFF"
named$[ 3] = "aquamarine|#7FFFD4"
named$[ 4] = "azure|#F0FFFF"
named$[ 5] = "beige|#F5F5DC"
named$[ 6] = "bisque|#FFE4C4"
named$[ 7] = "black|#000000"
named$[ 8] = "blanchedalmond|#FFEBCD"
named$[ 9] = "blue|#0000FF"
named$[ 10] = "blueviolet|#8A2BE2"
named$[ 11] = "brown|#A52A2A"
named$[ 12] = "burlywood|#DEB887"
named$[ 13] = "cadetblue|#5F9EA0"
named$[ 14] = "chartreuse|#7FFF00"
named$[ 15] = "chocolate|#D2691E"
named$[ 16] = "coral|#FF7F50"
named$[ 17] = "cornflowerblue|#6495ED"
named$[ 18] = "cornsilk|#FFF8DC"
named$[ 19] = "crimson|#DC143C"
named$[ 20] = "darkblue|#00008B"
named$[ 21] = "darkcyan|#008B8B"
named$[ 22] = "darkgoldenrod|#B8860B"
named$[ 23] = "darkgray|#A9A9A9"
named$[ 24] = "darkgreen|#006400"
named$[ 25] = "darkkhaki|#BDB76B"
named$[ 26] = "darkmagenta|#8B008B"
named$[ 27] = "darkolivegreen|#556B2F"
named$[ 28] = "darkorange|#FF8C00"
named$[ 29] = "darkorchid|#9932CC"
named$[ 30] = "darkred|#8B0000"
named$[ 31] = "darksalmon|#E9967A"
named$[ 32] = "darkseagreen|#8FBC8F"
named$[ 33] = "darkslateblue|#483D8B"
named$[ 34] = "darkslategray|#2F4F4F"
named$[ 35] = "darkturquoise|#00CED1"
named$[ 36] = "darkviolet|#9400D3"
named$[ 37] = "deeppink|#FF1493"
named$[ 38] = "deepskyblue|#00BFFF"
named$[ 39] = "dimgray|#696969"
named$[ 40] = "dodgerblue|#1E90FF"
named$[ 41] = "firebrick|#B22222"
named$[ 42] = "floralwhite|#FFFAF0"
named$[ 43] = "forestgreen|#228B22"
named$[ 44] = "fuchsia|#FF00FF"
named$[ 45] = "gainsboro|#DCDCDC"
named$[ 46] = "ghostwhite|#F8F8FF"
named$[ 47] = "goldenrod|#DAA520"
named$[ 48] = "gold|#FFD700"
named$[ 49] = "gray|#808080"
named$[ 50] = "green|#008000"
named$[ 51] = "greenyellow|#ADFF2F"
named$[ 52] = "honeydew|#F0FFF0"
named$[ 53] = "hotpink|#FF69B4"
named$[ 54] = "indianred|#CD5C5C"
named$[ 55] = "indigo|#4B0082"
named$[ 56] = "ivory|#FFFFF0"
named$[ 57] = "khaki|#F0E68C"
named$[ 58] = "lavenderblush|#FFF0F5"
named$[ 59] = "lavender|#E6E6FA"
named$[ 60] = "lawngreen|#7CFC00"
named$[ 61] = "lemonchiffon|#FFFACD"
named$[ 62] = "lightblue|#ADD8E6"
named$[ 63] = "lightcoral|#F08080"
named$[ 64] = "lightcyan|#E0FFFF"
named$[ 65] = "lightgoldenrodyellow|#FAFAD2"
named$[ 66] = "lightgreen|#90EE90"
named$[ 67] = "lightgrey|#D3D3D3"
named$[ 68] = "lightpink|#FFB6C1"
named$[ 69] = "lightsalmon|#FFA07A"
named$[ 70] = "lightseagreen|#20B2AA"
named$[ 71] = "lightskyblue|#87CEFA"
named$[ 72] = "lightslategray|#778899"
named$[ 73] = "lightsteelblue|#B0C4DE"
named$[ 74] = "lightyellow|#FFFFE0"
named$[ 75] = "lime|#00FF00"
named$[ 76] = "limegreen|#32CD32"
named$[ 77] = "linen|#FAF0E6"
named$[ 78] = "maroon|#800000"
named$[ 79] = "mediumaquamarine|#66CDAA"
named$[ 80] = "mediumblue|#0000CD"
named$[ 81] = "mediumorchid|#BA55D3"
named$[ 82] = "mediumpurple|#9370DB"
named$[ 83] = "mediumseagreen|#3CB371"
named$[ 84] = "mediumslateblue|#7B68EE"
named$[ 85] = "mediumspringgreen|#00FA9A"
named$[ 86] = "mediumturquoise|#48D1CC"
named$[ 87] = "mediumvioletred|#C71585"
named$[ 88] = "midnightblue|#191970"
named$[ 89] = "mintcream|#F5FFFA"
named$[ 90] = "mistyrose|#FFE4E1"
named$[ 91] = "moccasin|#FFE4B5"
named$[ 92] = "navajowhite|#FFDEAD"
named$[ 93] = "navy|#000080"
named$[ 94] = "oldlace|#FDF5E6"
named$[ 95] = "olive|#808000"
named$[ 96] = "olivedrab|#6B8E23"
named$[ 97] = "orange|#FFA500"
named$[ 98] = "orangered|#FF4500"
named$[ 99] = "orchid|#DA70D6"
named$[100] = "palegoldenrod|#EEE8AA"
named$[101] = "palegreen|#98FB98"
named$[102] = "paleturquoise|#AFEEEE"
named$[103] = "palevioletred|#DB7093"
named$[104] = "papayawhip|#FFEFD5"
named$[105] = "peachpuff|#FFDAB9"
named$[106] = "peru|#CD853F"
named$[107] = "pink|#FFC0CB"
named$[108] = "plum|#DDA0DD"
named$[109] = "powderblue|#B0E0E6"
named$[110] = "purple|#800080"
named$[111] = "red|#FF0000"
named$[112] = "rosybrown|#BC8F8F"
named$[113] = "royalblue|#4169E1"
named$[114] = "saddlebrown|#8B4513"
named$[115] = "salmon|#FA8072"
named$[116] = "sandybrown|#F4A460"
named$[117] = "seagreen|#2E8B57"
named$[118] = "seashell|#FFF5EE"
named$[119] = "sienna|#A0522D"
named$[120] = "silver|#C0C0C0"
named$[121] = "skyblue|#87CEEB"
named$[122] = "slateblue|#6A5ACD"
named$[123] = "slategray|#708090"
named$[124] = "snow|#FFFAFA"
named$[125] = "springgreen|#00FF7F"
named$[126] = "steelblue|#4682B4"
named$[127] = "tan|#D2B48C"
named$[128] = "teal|#008080"
named$[129] = "thistle|#D8BFD8"
named$[130] = "tomato|#FF6347"
named$[131] = "turquoise|#40E0D0"
named$[132] = "violet|#EE82EE"
named$[133] = "wheat|#F5DEB3"
named$[134] = "white|#FFFFFF"
named$[135] = "whitesmoke|#F5F5F5"
named$[136] = "yellow|#FFFF00"
named$[137] = "yellowgreen|#9ACD32"
' set up flag for determining whether colour was found or not
named_found = FALSE
' check whether a named color is being passed
IF MID$(hex$, 1, 1) <> "#" THEN
FOR i = 0 TO 137
IF hex$ = MID$(named$[i], 1, INSTR(named$[i], "|") - 1) THEN
hex$ = MID$(named$[i], INSTR(named$[i], "|") + 1)
name_found = TRUE
BREAK
END IF
NEXT i
' name was not found in the above table, so use default
IF ISFALSE(name_found) THEN
' if hex$ contains an invalid named color, convert it to white
PRINT "Invalid named color: ", hex$
hex$ = "#FFFFFF"
END IF
ELSE
' check whether hex$ contains a valid html/css hex colour
IF ISFALSE(REGEX(hex$, "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")) THEN
' if the hex colour is bad, convert it to white
PRINT "Invalid hex number: ", hex$
hex$ = "#FFFFFF"
END IF
END IF
' determine which RGB component (byte) was requested and
' convert the hex byte to decimal (0-255)
SELECT byte
CASE 1
tmp = DEC(MID$(hex$, 2, 2))
CASE 2
tmp = DEC(MID$(hex$, 4, 2))
CASE 3
tmp = DEC(MID$(hex$, 6, 2))
END SELECT
' now, at last, calculate the floating point value for the RGB component
' in the way cairo wants (double) and return it
rgb = tmp / 255.0
RETURN rgb
END FUNCTION
PRINT HEX2RGB("#FAFFFF", 1), " ", HEX2RGB("#0CFFFF", 2), " ", HEX2RGB("#FFFF01", 3)
PRINT HEX2RGB("yellowgreen1", 1), " ", HEX2RGB("yellowgreen", 2), " ", HEX2RGB("yellowgreen", 3)
PRINT HEX2RGB("#FAFFFF", 1), " ", HEX2RGB("#0CFFFF", 2), " ", HEX2RGB("#FFFF0X0", 3)
PRINT HEX2RGB("red", 1), " ", HEX2RGB("red", 2), " ", HEX2RGB("red", 3)