diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 77fb37c..63a1713 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -995,10 +995,11 @@ Context2d::SetStrokePattern(const Arguments &args) { Handle 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(args.This()); context->state->shadow = rgba_create(rgba); return Undefined(); @@ -1011,10 +1012,11 @@ Context2d::SetShadowColor(const Arguments &args) { Handle 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(args.This()); context->state->fillPattern = NULL; context->state->fill = rgba_create(rgba); @@ -1028,10 +1030,11 @@ Context2d::SetFillColor(const Arguments &args) { Handle 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(args.This()); context->state->strokePattern = NULL; context->state->stroke = rgba_create(rgba); diff --git a/src/color.cc b/src/color.cc index 0a05cbf..3536fcc 100644 --- a/src/color.cc +++ b/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); } /* diff --git a/src/color.h b/src/color.h index 60eaf54..4f7a0a6 100644 --- a/src/color.h +++ b/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);