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> Handle<Value>
Context2d::SetShadowColor(const Arguments &args) { Context2d::SetShadowColor(const Arguments &args) {
HandleScope scope; HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined(); if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]); String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str); uint32_t rgba = rgba_from_string(*str, &ok);
if (!rgba) return Undefined(); if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This()); Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->shadow = rgba_create(rgba); context->state->shadow = rgba_create(rgba);
return Undefined(); return Undefined();
@ -1011,10 +1012,11 @@ Context2d::SetShadowColor(const Arguments &args) {
Handle<Value> Handle<Value>
Context2d::SetFillColor(const Arguments &args) { Context2d::SetFillColor(const Arguments &args) {
HandleScope scope; HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined(); if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]); String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str); uint32_t rgba = rgba_from_string(*str, &ok);
if (!rgba) return Undefined(); if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This()); Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->fillPattern = NULL; context->state->fillPattern = NULL;
context->state->fill = rgba_create(rgba); context->state->fill = rgba_create(rgba);
@ -1028,10 +1030,11 @@ Context2d::SetFillColor(const Arguments &args) {
Handle<Value> Handle<Value>
Context2d::SetStrokeColor(const Arguments &args) { Context2d::SetStrokeColor(const Arguments &args) {
HandleScope scope; HandleScope scope;
short ok;
if (!args[0]->IsString()) return Undefined(); if (!args[0]->IsString()) return Undefined();
String::AsciiValue str(args[0]); String::AsciiValue str(args[0]);
uint32_t rgba = rgba_from_string(*str); uint32_t rgba = rgba_from_string(*str, &ok);
if (!rgba) return Undefined(); if (!ok) return Undefined();
Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This()); Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
context->state->strokePattern = NULL; context->state->strokePattern = NULL;
context->state->stroke = rgba_create(rgba); 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). * 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) { rgba_from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
return return
r << 24 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). * Return rgba from (r,g,b).
*/ */
int32_t static int32_t
rgba_from_rgb(uint8_t r, uint8_t g, uint8_t b) { rgba_from_rgb(uint8_t r, uint8_t g, uint8_t b) {
return rgba_from_rgba(r, g, b, 0); 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". * Return rgb from "#RRGGBB".
*/ */
int32_t static int32_t
rgba_from_hex6_string(const char *str) { rgba_from_hex6_string(const char *str) {
return rgba_from_rgb( return rgba_from_rgb(
(h(str[0]) << 4) + h(str[1]) (h(str[0]) << 4) + h(str[1])
@ -273,7 +273,7 @@ rgba_from_hex6_string(const char *str) {
* Return rgb from "#RGB" * Return rgb from "#RGB"
*/ */
int32_t static int32_t
rgba_from_hex3_string(const char *str) { rgba_from_hex3_string(const char *str) {
return rgba_from_rgb( return rgba_from_rgb(
(h(str[0]) << 4) + h(str[0]) (h(str[0]) << 4) + h(str[0])
@ -286,8 +286,8 @@ rgba_from_hex3_string(const char *str) {
* Return rgb from "rgb()" * Return rgb from "rgb()"
*/ */
int32_t static int32_t
rgba_from_rgb_string(const char *str) { rgba_from_rgb_string(const char *str, short *ok) {
if (str == strnstr(str, "rgb(", 4)) { if (str == strnstr(str, "rgb(", 4)) {
str += 4; str += 4;
WHITESPACE; WHITESPACE;
@ -295,17 +295,17 @@ rgba_from_rgb_string(const char *str) {
CHANNEL(r); CHANNEL(r);
CHANNEL(g); CHANNEL(g);
CHANNEL(b); 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()" * Return rgb from "rgba()"
*/ */
int32_t static int32_t
rgba_from_rgba_string(const char *str) { rgba_from_rgba_string(const char *str, short *ok) {
if (str == strnstr(str, "rgba(", 5)) { if (str == strnstr(str, "rgba(", 5)) {
str += 5; str += 5;
WHITESPACE; 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 static int32_t
rgba_from_hex_string(const char *str) { rgba_from_hex_string(const char *str, short *ok) {
size_t len = strlen(str); size_t len = strlen(str);
*ok = 1;
if (6 == len) return rgba_from_hex6_string(str); if (6 == len) return rgba_from_hex6_string(str);
if (3 == len) return rgba_from_hex3_string(str); if (3 == len) return rgba_from_hex3_string(str);
return 0; return *ok = 0;
} }
/* /*
* Return named color value. * Return named color value.
*/ */
int32_t static int32_t
rgba_from_name_string(const char *str) { rgba_from_name_string(const char *str, short *ok) {
int i = 0; int i = 0;
struct named_color color; struct named_color color;
while ((color = named_colors[i++]).name) { while ((color = named_colors[i++]).name) {
if (*str == *color.name && 0 == strcmp(str, color.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 int32_t
rgba_from_string(const char *str) { rgba_from_string(const char *str, short *ok) {
if ('#' == str[0]) if ('#' == str[0])
return rgba_from_hex_string(++str); return rgba_from_hex_string(++str, ok);
if (str == strnstr(str, "rgba", 4)) 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)) if (str == strnstr(str, "rgb", 3))
return rgba_from_rgb_string(str); return rgba_from_rgb_string(str, ok);
return rgba_from_name_string(str); return rgba_from_name_string(str, ok);
} }
/* /*

26
src/color.h

@ -27,32 +27,8 @@ typedef struct {
rgba_t rgba_t
rgba_create(uint32_t rgba); 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 int32_t
rgba_from_string(const char *str); rgba_from_string(const char *str, short *ok);
void void
rgba_inspect(int32_t rgba); rgba_inspect(int32_t rgba);

Loading…
Cancel
Save