Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Colour/Color Parser?

Bloodsong Termagant
Manic Artist
Join date: 22 Jan 2007
Posts: 615
09-02-2008 07:22
heyas;

has anybody put together a colour parser they'd like to share in the library or such? i mean, i own a few items that allow you to select or say a colour name and get a colour, and they have huge lists of colours like blue, sky blue, navy, cyan, dark teal, light teal, cerulean... blah blah blah.

i would kind of like to
1: have the commonly accapted vector settings for widely used colours (i can skip puce, thanks).
and
2: not have to do all the tedious work of assigning a lookup function between names and vectors. :X


if you dont have a free one, is there one i can buy a license to use?
_____________________
Why Johnny Can't Rotate:
http://forums.secondlife.com/showthread.php?t=94705
Hewee Zetkin
Registered User
Join date: 20 Jul 2006
Posts: 2,702
09-02-2008 10:49
This 'stringToRGB()' function (and its helper values and functions) accepts the HTML4/CSS2 '#rgb', '#rrggbb', and keyword values. Rather than the 'rgb(r,g,b)' syntax, it converts the standard LSL vector representation '<r,g,b>'. It wouldn't be terribly difficult to also/instead support the HTML/CSS 'rgb(r,g,b)' syntax if you really want it, so I'll leave that as an exercise for the reader.

CODE

list KEYWORD_COLORS =
[
"aqua", <0.0, 1.0, 1.0>,
"black", <0.0, 0.0, 0.0>,
"blue", <0.0, 0.0, 1.0>,
"fuchsia", <1.0, 0.0, 1.0>,
"gray", <0.5, 0.5, 0.5>,
"green", <0.0, 0.5, 0.0>,
"lime", <0.0, 1.0, 0.0>,
"maroon", <0.5, 0.5, 0.5>,
"navy", <0.0, 0.0, 0.5>,
"olive", <0.5, 0.5, 0.0>,
"purple", <0.5, 0.0, 0.5>,
"red", <1.0, 0.0, 0.0>,
"silver", <0.75, 0.75, 0.75>,
"teal", <0.0, 0.5, 0.5>,
"white", <1.0, 1.0, 1.0>,
"yellow", <1.0, 1.0, 0.0>
];

float channelStrToFloat(string str)
{
integer strLen = llStringLength(str);

integer intVal;
if (strLen == 1)
{
intVal = (integer)("0x"+str+str);
} else if (strLen == 2)
{
intVal = (integer)("0x"+str);
} else
{
return 0.0;
}

if (intVal == 0xff)
{
return 1.0;
} else
{
return ((float)intVal)/256.0;
}
}

vector hexToRGB(string hexString)
{
integer charsPerChannel;
if (llStringLength(hexString) == 3)
{
charsPerChannel = 1;
} else if (llStringLength(hexString) == 6)
{
charsPerChannel = 2;
} else
{
return ZERO_VECTOR;
}

float red =
channelStrToFloat(
llGetSubString(hexString, 0, charsPerChannel-1));
float green =
channelStrToFloat(
llGetSubString(hexString, charsPerChannel, 2*charsPerChannel-1));
float blue =
channelStrToFloat(
llGetSubString(hexString, 2*charsPerChannel, 3*charsPerChannel-1));

return <red, green, blue>;
}

vector stringToRGB(string str)
{
str = llToLower(llStringTrim(str, STRING_TRIM));
if (str == "")
{
return ZERO_VECTOR;
}

integer index = llListFindList(KEYWORD_COLORS, [ str ]);
if (index >= 0)
{
return llList2Vector(KEYWORD_COLORS, index+1);
} else if (llGetSubString(str, 0, 0) == "#")
{
return hexToRGB(llGetSubString(str, 1, -1));
} else
{
return (vector)str;
}
}
Tyken Hightower
Automagical
Join date: 15 Feb 2006
Posts: 472
09-02-2008 11:53
From: Hewee Zetkin
...so I'll leave that as an exercise for the reader.

While I accept that learning is part of the goal of this forum.. you sound like an O'Reilly book.
_____________________
Hewee Zetkin
Registered User
Join date: 20 Jul 2006
Posts: 2,702
09-02-2008 12:27
From: Tyken Hightower
While I accept that learning is part of the goal of this forum.. you sound like an O'Reilly book.

LOL. Why thank you? I've actually considered applying to work for O'Reilly. I like their style and the location can't be beat. So maybe the forums are a good warm-up. ;)
Alicia Sautereau
if (!social) hide;
Join date: 20 Feb 2007
Posts: 3,125
09-02-2008 12:29
I have no idea who made this script and tbh i can`t even remember where i got it from but the opening note is that it is reeased for the public so here goes

CODE

// This code is public domain.
// masa was here 20050302

integer CHANNEL = 3; // channel to listen for commands on
integer OWNER_ONLY = TRUE; // only owner can control
integer USE_IMS = TRUE; // send IMs instead of using chat
string COMMAND_CHANGE_COLOR = "trim"; // command to change color
string COMMAND_LIST_COLORS = "listcolors"; // command to list colors
integer MAX_CHAT_LENGTH = 255; // max size for one message
string PREFIX_HEX = "#"; // prefix to specify hex code
string PREFIX_VECTOR = "<"; // prefix to specify vector code
list LINKS_TO_SET = [LINK_SET, ALL_SIDES]; // [link number, link face, ...]

list COLORS;

// the list is too big to set at once :o
// note that you may get syntax errors and need to rearrange this list
// if you change the script much.
set_colors() {
COLORS = [
// http://halflife.ukrpack.net/csfiles/help/colors.shtml
"steelblue", "#4682B4", "royalblue", "#041690", "cornflowerblue", "#6495ED",
"lightsteelblue", "#B0C4DE", "mediumslateblue", "#7B68EE", "slateblue", "#6A5ACD",
"darkslateblue", "#483D8B", "midnightblue", "#191970", "navy", "#000080",
"darkblue", "#00008B", "mediumblue", "#0000CD", "blue", "#0000FF",
"dodgerblue", "#1E90FF", "deepskyblue", "#00BFFF", "lightskyblue", "#87CEFA",
"skyblue", "#87CEEB", "lightblue", "#ADD8E6", "powderblue", "#B0E0E6",
"azure", "#F0FFFF", "lightcyan", "#E0FFFF", "paleturquoise", "#AFEEEE",
"mediumturquoise", "#48D1CC", "lightseagreen", "#20B2AA", "darkcyan", "#008B8B",
"teal", "#008080", "cadetblue", "#5F9EA0", "darkturquoise", "#00CED1",
"aqua", "#00FFFF", "cyan", "#00FFFF", "turquoise", "#40E0D0",
"aquamarine", "#7FFFD4", "mediumaquamarine", "#66CDAA", "darkseagreen", "#8FBC8F"
] + [
"mediumseagreen", "#3CB371", "seagreen", "#2E8B57", "darkgreen", "#006400",
"green", "#008000", "forestgreen", "#228B22", "limegreen", "#32CD32",
"lime", "#00FF00", "chartreuse", "#7FFF00", "lawngreen", "#7CFC00",
"greenyellow", "#ADFF2F", "yellowgreen", "#9ACD32", "palegreen", "#98FB98",
"lightgreen", "#90EE90", "springgreen", "#00FF7F", "mediumspringgreen", "#00FA9A",
"darkolivegreen", "#556B2F", "olivedrab", "#6B8E23", "olive", "#808000",
"darkkhaki", "#BDB76B", "darkgoldenrod", "#B8860B", "goldenrod", "#DAA520",
"gold", "#FFD700", "yellow", "#FFFF00", "khaki", "#F0E68C", "palegoldenrod", "#EEE8AA",
"blanchedalmond", "#FFEBCD", "moccasin", "#FFE4B5", "wheat", "#F5DEB3",
"navajowhite", "#FFDEAD", "burlywood", "#DEB887", "tan", "#D2B48C"
] + [
"rosybrown", "#BC8F8F", "sienna", "#A0522D", "saddlebrown", "#8B4513",
"chocolate", "#D2691E", "peru", "#CD853F", "sandybrown", "#F4A460",
"darkred", "#8B0000", "maroon", "#800000", "brown", "#A52A2A",
"firebrick", "#B22222", "indianred", "#CD5C5C", "lightcoral", "#F08080",
"salmon", "#FA8072", "darksalmon", "#E9967A", "lightsalmon", "#FFA07A",
"coral", "#FF7F50", "tomato", "#FF6347", "darkorange", "#FF8C00",
"orange", "#FFA500", "orangered", "#FF4500", "crimson", "#DC143C",
"red", "#FF0000", "deeppink", "#FF1493", "fuchsia", "#FF00FF",
"magenta", "#FF00FF", "hotpink", "#FF69B4", "lightpink", "#FFB6C1",
"pink", "#FFC0CB", "palevioletred", "#DB7093", "mediumvioletred", "#C71585"
] + [
"purple", "#800080", "darkmagenta", "#8B008B", "mediumpurple", "#9370DB",
"blueviolet", "#8A2BE2", "indigo", "#4B0082", "darkviolet", "#9400D3",
"darkorchid", "#9932CC", "mediumorchid", "#BA55D3", "orchid", "#DA70D6",
"violet", "#EE82EE", "plum", "#DDA0DD", "thistle", "#D8BFD8",
"lavender", "#E6E6FA", "ghostwhite", "#F8F8FF", "aliceblue", "#F0F8FF",
"mintcream", "#F5FFFA", "honeydew", "#F0FFF0", "lightgoldenrodyellow", "#FAFAD2",
"lemonchiffon", "#FFFACD", "cornsilk", "#FFF8DC", "lightyellow", "#FFFFE0",
"ivory", "#FFFFF0", "floralwhite", "#FFFAF0", "linen", "#FAF0E6",
"oldlace", "#FDF5E6", "antiquewhite", "#FAEBD7", "bisque", "#FFE4C4 ",
"peachpuff", "#FFDAB9", "papayawhip", "#FFEFD5", "beige", "#F5F5DC"
] + [
"seashell", "#FFF5EE", "lavenderblush", "#FFF0F5", "mistyrose", "#FFE4E1",
"snow", "#FFFAFA", "white", "#FFFFFF", "whitesmoke", "#F5F5F5",
"gainsboro", "#DCDCDC", "lightgrey", "#D3D3D3", "silver", "#C0C0C0",
"darkgray", "#A9A9A9", "gray", "#808080", "lightslategray", "#778899",
"slategray", "#708090", "dimgray", "#696969", "darkslategray", "#2F4F4F",
"black", "#000000"
] + [
// :o
"carnationpink", "#FA7FC1"
];
}

say(key id, string str) {
if ( USE_IMS ) llInstantMessage( id, str );
else llWhisper(0, str);
}

vector color_from_hex(string str) {
return <(integer)("0x" + llGetSubString(str,1,2)),
(integer)("0x" + llGetSubString(str,3,4)),
(integer)("0x" + llGetSubString(str,5,6))> / 255;
}

vector color_from_vector(string vec) {
// caveat: 1,1,1 will be treated as #ffffff, not #010101
list l = llParseString2List(vec, [" ", ",", "<", ">"], []);
vector v;

v.x = (float)llList2String(l, 0);
v.y = (float)llList2String(l, 1);
v.z = (float)llList2String(l, 2);

if ( v.x > 1 || v.y > 1 || v.z > 1 ) v /= 255;

return v;
}

vector color_from_name(string name) {
// vv strip spaces and force lowercase vv
integer x = llListFindList(COLORS, [ llToLower(llDumpList2String(llParseString2List(name, [" "], []), "")) ]);
if ( x == -1 ) return <-1,-1,-1>;
return color_from_hex( llList2String(COLORS, x+1) );
}

set_color(key id, string str) {
vector color;
integer i;
if ( llGetSubString(str, 0, 0) == PREFIX_HEX ) // hex code
color = color_from_hex( str );
else if ( llGetSubString(str, 0, 0) == PREFIX_VECTOR ) // vector
color = color_from_vector( str );
else
color = color_from_name( str );

if ( color.x < 0 || color.x > 1 || color.y < 0 || color.y > 1 || color.z < 0 || color.z > 1 ) {
say( id, "Invalid color specified: " + str );
return;
}

llSetColor(color,ALL_SIDES);
}

list_colors(key id) {
string str = "";
string nstr = "";
integer i;

for ( i = 0; i < llGetListLength( COLORS ); i += 2 ) {
nstr = str + llList2String(COLORS, i) + ", ";

if ( llStringLength(nstr) > MAX_CHAT_LENGTH ) {
say(id, str);
str = llList2String(COLORS, i);
} else {
str = nstr;
}
}
if ( str != "" ) say(id, str);
}

default {

on_rez(integer bla)
{
llResetScript();
}

state_entry()
{
set_colors();
llListen( CHANNEL, "", llGetOwner(), "" );
}

listen(integer channel, string name, key id, string msg) {
string command;
string argument;
list l;

if (OWNER_ONLY && id != llGetOwner()) return;

l = llParseStringKeepNulls( msg, [" "], [] );
command = llList2String(l, 0);
argument = llDumpList2String( llList2List(l, 1, -1), " " );

if ( command == COMMAND_CHANGE_COLOR )
set_color(id, argument);
else if ( command == COMMAND_LIST_COLORS )
list_colors(id);

}
}


if anyone knows the creator, please add his/her name to the wiki or in this thread so i can give them the propper credits :)

https://wiki.secondlife.com/wiki/Color_script
Robin Peel
Registered User
Join date: 8 Feb 2005
Posts: 163
09-03-2008 01:53
while this may not be what the first poster really wanted, this script has come in so handy in the past for getting colors for scripts that i felt it worth posting. this was found in these forums a long time back. no idea who posted it. but thanks to who ever did.
change the color of the object this is in to get the RGB value for the color
CODE

vector float_color;

default
{
state_entry()
{
llSetTexture("5748decc-f629-461c-9a36-a35a221fe21f",ALL_SIDES); //set to blank
}

changed(integer ch)
{
if (ch & 2) // 2 = CHANGED_COLOR
{
float_color = llGetColor(ALL_SIDES);
llSetText((string)float_color + "\n current color",float_color,1);
llOwnerSay((string)float_color);
}
}
}

Bloodsong Termagant
Manic Artist
Join date: 22 Jan 2007
Posts: 615
09-03-2008 10:20
heyas;

thanks everyone on the forums and in-world who sent colours :)


sidenote: i have a list of names and vectors for 140 colours. when i put it in my script, i collided the stack heap. eep!

best bet is to pass link message to a colour picker that uses a huge list like these, and send the vector back. ;)
Hewee Zetkin
Registered User
Join date: 20 Jul 2006
Posts: 2,702
09-03-2008 10:24
From: Bloodsong Termagant
sidenote: i have a list of names and vectors for 140 colours. when i put it in my script, i collided the stack heap. eep!

Did you try compiling to MONO using the Release Candidate viewer? Depending on the rest of the script, you MIGHT have enough memory for that size list there.