Skip to content

Commit be99f28

Browse files
committed
Merge pull request #1449 from xzyfer/fix/color-function-arg-bounds
Fixes to Sass colour functions.
2 parents 1ebed7a + af67faf commit be99f28

File tree

1 file changed

+36
-21
lines changed

1 file changed

+36
-21
lines changed

src/functions.cpp

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -236,37 +236,45 @@ namespace Sass {
236236

237237
inline double color_num(Number* n) {
238238
if (n->unit() == "%") {
239-
return std::min(std::max(n->value(), 0.0), 100.0) * 2.55;
239+
return std::min(std::max(n->value() * 255 / 100.0, 0.0), 255.0);
240240
} else {
241241
return std::min(std::max(n->value(), 0.0), 255.0);
242242
}
243243
}
244244

245+
inline double alpha_num(Number* n) {
246+
if (n->unit() == "%") {
247+
return std::min(std::max(n->value(), 0.0), 100.0);
248+
} else {
249+
return std::min(std::max(n->value(), 0.0), 1.0);
250+
}
251+
}
252+
245253
Signature rgb_sig = "rgb($red, $green, $blue)";
246254
BUILT_IN(rgb)
247255
{
248256
return new (ctx.mem) Color(pstate,
249-
color_num(ARGR("$red", Number, 0, 255)),
250-
color_num(ARGR("$green", Number, 0, 255)),
251-
color_num(ARGR("$blue", Number, 0, 255)));
257+
color_num(ARG("$red", Number)),
258+
color_num(ARG("$green", Number)),
259+
color_num(ARG("$blue", Number)));
252260
}
253261

254262
Signature rgba_4_sig = "rgba($red, $green, $blue, $alpha)";
255263
BUILT_IN(rgba_4)
256264
{
257265
return new (ctx.mem) Color(pstate,
258-
color_num(ARGR("$red", Number, 0, 255)),
259-
color_num(ARGR("$green", Number, 0, 255)),
260-
color_num(ARGR("$blue", Number, 0, 255)),
261-
ARGR("$alpha", Number, 0, 1)->value());
266+
color_num(ARG("$red", Number)),
267+
color_num(ARG("$green", Number)),
268+
color_num(ARG("$blue", Number)),
269+
alpha_num(ARG("$alpha", Number)));
262270
}
263271

264272
Signature rgba_2_sig = "rgba($color, $alpha)";
265273
BUILT_IN(rgba_2)
266274
{
267275
Color* c_arg = ARG("$color", Color);
268276
Color* new_c = new (ctx.mem) Color(*c_arg);
269-
new_c->a(ARGR("$alpha", Number, 0, 1)->value());
277+
new_c->a(alpha_num(ARG("$alpha", Number)));
270278
new_c->disp("");
271279
return new_c;
272280
}
@@ -382,8 +390,8 @@ namespace Sass {
382390
BUILT_IN(hsl)
383391
{
384392
return hsla_impl(ARG("$hue", Number)->value(),
385-
ARGR("$saturation", Number, 0, 100)->value(),
386-
ARGR("$lightness", Number, 0, 100)->value(),
393+
ARG("$saturation", Number)->value(),
394+
ARG("$lightness", Number)->value(),
387395
1.0,
388396
ctx,
389397
pstate);
@@ -393,9 +401,9 @@ namespace Sass {
393401
BUILT_IN(hsla)
394402
{
395403
return hsla_impl(ARG("$hue", Number)->value(),
396-
ARGR("$saturation", Number, 0, 100)->value(),
397-
ARGR("$lightness", Number, 0, 100)->value(),
398-
ARGR("$alpha", Number, 0, 1)->value(),
404+
ARG("$saturation", Number)->value(),
405+
ARG("$lightness", Number)->value(),
406+
ARG("$alpha", Number)->value(),
399407
ctx,
400408
pstate);
401409
}
@@ -680,18 +688,25 @@ namespace Sass {
680688
error("cannot specify both RGB and HSL values for `adjust-color`", pstate);
681689
}
682690
if (rgb) {
691+
double rr = r ? ARGR("$red", Number, -255, 255)->value() : 0;
692+
double gg = g ? ARGR("$green", Number, -255, 255)->value() : 0;
693+
double bb = b ? ARGR("$blue", Number, -255, 255)->value() : 0;
694+
double aa = a ? ARGR("$alpha", Number, -1, 1)->value() : 0;
683695
return new (ctx.mem) Color(pstate,
684-
color->r() + (r ? r->value() : 0),
685-
color->g() + (g ? g->value() : 0),
686-
color->b() + (b ? b->value() : 0),
687-
color->a() + (a ? a->value() : 0));
696+
color->r() + rr,
697+
color->g() + gg,
698+
color->b() + bb,
699+
color->a() + aa);
688700
}
689701
if (hsl) {
690702
HSL hsl_struct = rgb_to_hsl(color->r(), color->g(), color->b());
703+
double ss = s ? ARGR("$saturation", Number, -100, 100)->value() : 0;
704+
double ll = l ? ARGR("$lightness", Number, -100, 100)->value() : 0;
705+
double aa = a ? ARGR("$alpha", Number, -1, 1)->value() : 0;
691706
return hsla_impl(hsl_struct.h + (h ? h->value() : 0),
692-
hsl_struct.s + (s ? s->value() : 0),
693-
hsl_struct.l + (l ? l->value() : 0),
694-
color->a() + (a ? a->value() : 0),
707+
hsl_struct.s + ss,
708+
hsl_struct.l + ll,
709+
color->a() + aa,
695710
ctx,
696711
pstate);
697712
}

0 commit comments

Comments
 (0)