Browse Source

rgba_from_string(const char *str, short *ok)

v1.x
Tj Holowaychuk 14 years ago
parent
commit
62fb1299a4
  1. 15
      src/CanvasRenderingContext2d.cc
  2. 49
      src/color.cc
  3. 26
      src/color.h

15
src/CanvasRenderingContext2d.cc

@ -995,10 +995,11 @@ Context2d::SetStrokePattern(const Arguments &args) {
Handle<Value>
Context2d::SetShadowColor(const Arguments &args) {
HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str);
if (!rgba) return Undefined();
uint32_t rgba = rgba_from_string(*str, &ok);
if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->shadow = rgba_create(rgba);
return Undefined();
@ -1011,10 +1012,11 @@ Context2d::SetShadowColor(const Arguments &args) {
Handle<Value>
Context2d::SetFillColor(const Arguments &args) {
HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str);
if (!rgba) return Undefined();
uint32_t rgba = rgba_from_string(*str, &ok);
if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->fillPattern = NULL;
context->state->fill = rgba_create(rgba);
@ -1028,10 +1030,11 @@ Context2d::SetFillColor(const Arguments &args) {
Handle<Value>
Context2d::SetStrokeColor(const Arguments &args) {
HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str);
if (!rgba) return Undefined();
uint32_t rgba = rgba_from_string(*str, &ok);
if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->strokePattern = NULL;
context->state->stroke = rgba_create(rgba);

49
src/color.cc

@ -238,7 +238,7 @@ rgba_create(uint32_t rgba) {
* Return rgba from (r,g,b,a).
*/
inline int32_t
static inline int32_t
rgba_from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
return
r << 24
@ -251,7 +251,7 @@ rgba_from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
* Return rgba from (r,g,b).
*/
int32_t
static int32_t
rgba_from_rgb(uint8_t r, uint8_t g, uint8_t b) {
return rgba_from_rgba(r, g, b, 0);
}
@ -260,7 +260,7 @@ rgba_from_rgb(uint8_t r, uint8_t g, uint8_t b) {
* Return rgb from "#RRGGBB".
*/
int32_t
static int32_t
rgba_from_hex6_string(const char *str) {
return rgba_from_rgb(
(h(str[0]) << 4) + h(str[1])
@ -273,7 +273,7 @@ rgba_from_hex6_string(const char *str) {
* Return rgb from "#RGB"
*/
int32_t
static int32_t
rgba_from_hex3_string(const char *str) {
return rgba_from_rgb(
(h(str[0]) << 4) + h(str[0])
@ -286,8 +286,8 @@ rgba_from_hex3_string(const char *str) {
* Return rgb from "rgb()"
*/
int32_t
rgba_from_rgb_string(const char *str) {
static int32_t
rgba_from_rgb_string(const char *str, short *ok) {
if (str == strnstr(str, "rgb(", 4)) {
str += 4;
WHITESPACE;
@ -295,17 +295,17 @@ rgba_from_rgb_string(const char *str) {
CHANNEL(r);
CHANNEL(g);
CHANNEL(b);
return rgba_from_rgb(r, g, b);
return *ok = 1, rgba_from_rgb(r, g, b);
}
return 0;
return *ok = 0;
}
/*
* Return rgb from "rgba()"
*/
int32_t
rgba_from_rgba_string(const char *str) {
static int32_t
rgba_from_rgba_string(const char *str, short *ok) {
if (str == strnstr(str, "rgba(", 5)) {
str += 5;
WHITESPACE;
@ -328,9 +328,9 @@ rgba_from_rgba_string(const char *str) {
}
}
}
return rgba_from_rgba(r, g, b, a * 255);
return *ok = 1, rgba_from_rgba(r, g, b, a * 255);
}
return 0;
return *ok = 0;
}
/*
@ -341,27 +341,28 @@ rgba_from_rgba_string(const char *str) {
*
*/
int32_t
rgba_from_hex_string(const char *str) {
static int32_t
rgba_from_hex_string(const char *str, short *ok) {
size_t len = strlen(str);
*ok = 1;
if (6 == len) return rgba_from_hex6_string(str);
if (3 == len) return rgba_from_hex3_string(str);
return 0;
return *ok = 0;
}
/*
* Return named color value.
*/
int32_t
rgba_from_name_string(const char *str) {
static int32_t
rgba_from_name_string(const char *str, short *ok) {
int i = 0;
struct named_color color;
while ((color = named_colors[i++]).name) {
if (*str == *color.name && 0 == strcmp(str, color.name))
return color.val;
return *ok = 1, color.val;
}
return 0;
return *ok = 0;
}
/*
@ -376,14 +377,14 @@ rgba_from_name_string(const char *str) {
*/
int32_t
rgba_from_string(const char *str) {
rgba_from_string(const char *str, short *ok) {
if ('#' == str[0])
return rgba_from_hex_string(++str);
return rgba_from_hex_string(++str, ok);
if (str == strnstr(str, "rgba", 4))
return rgba_from_rgba_string(str);
return rgba_from_rgba_string(str, ok);
if (str == strnstr(str, "rgb", 3))
return rgba_from_rgb_string(str);
return rgba_from_name_string(str);
return rgba_from_rgb_string(str, ok);
return rgba_from_name_string(str, ok);
}
/*

26
src/color.h

@ -27,32 +27,8 @@ typedef struct {
rgba_t
rgba_create(uint32_t rgba);
inline int32_t
rgba_from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
int32_t
rgba_from_rgb(uint8_t r, uint8_t g, uint8_t b);
int32_t
rgba_from_hex6_string(const char *str);
int32_t
rgba_from_hex3_string(const char *str);
int32_t
rgba_from_rgb_string(const char *str);
int32_t
rgba_from_rgba_string(const char *str);
int32_t
rgba_from_hex_string(const char *str);
int32_t
rgba_from_name_string(const char *str);
int32_t
rgba_from_string(const char *str);
rgba_from_string(const char *str, short *ok);
void
rgba_inspect(int32_t rgba);

Loading…
Cancel
Save