Commit eb153df1 by Aaron Leung

Implementing adjust-hue.

parent e8192e00
...@@ -101,6 +101,7 @@ namespace Sass { ...@@ -101,6 +101,7 @@ namespace Sass {
// HSL Functions // HSL Functions
register_function(hsla_descriptor, hsla); register_function(hsla_descriptor, hsla);
register_function(hsl_descriptor, hsl); register_function(hsl_descriptor, hsl);
register_function(adjust_hue_descriptor, adjust_hue);
register_function(invert_descriptor, invert); register_function(invert_descriptor, invert);
// Opacity Functions // Opacity Functions
register_function(alpha_descriptor, alpha); register_function(alpha_descriptor, alpha);
......
...@@ -131,33 +131,40 @@ namespace Sass { ...@@ -131,33 +131,40 @@ namespace Sass {
b = b/255.0; b = b/255.0;
double v, m, vm, r2, g2, b2; double v, m, vm, r2, g2, b2;
double h = 0, s = 0, l = 0; double h = 0, s = 0, l = 0;
v = r > g ? r : g; v = r > g ? r : g;
v = v > b ? v : b; v = v > b ? v : b;
m = r < g ? r : g; m = r < g ? r : g;
m = m < b ? m : b; m = m < b ? m : b;
l = (m + v)/2.0; l = (m + v)/2.0;
if (l <= 0.0) return new_Node("", 0, h, s, l); if (l <= 0.0) return new_Node("", 0, h, s, l);
vm = v - m; vm = v - m;
s = vm; s = vm;
if (s > 0.0) s /= (l <= 0.5) ? (v + m) : (2.0 - v - m); if (s > 0.0) s /= (l <= 0.5) ? (v + m) : (2.0 - v - m);
else return new_Node("", 0, h, s, l); else return new_Node("", 0, h, s, l);
r2 = (v - r)/vm; r2 = (v - r)/vm;
g2 = (v - g)/vm; g2 = (v - g)/vm;
b2 = (v - b)/vm; b2 = (v - b)/vm;
if (r == v) h = (g == m ? 5.0 + b2 : 1.0 - g2); if (r == v) h = (g == m ? 5.0 + b2 : 1.0 - g2);
else if (g == v) h = (b == m ? 1.0 + r2 : 3.0 - b2); else if (g == v) h = (b == m ? 1.0 + r2 : 3.0 - b2);
else h = (r == m ? 3.0 + g2 : 5.0 - r2); else h = (r == m ? 3.0 + g2 : 5.0 - r2);
h /= 6.0; h /= 6.0;
return new_Node("", 0, h, s, l); return new_Node("", 0, h, s, l);
} }
Function_Descriptor adjust_color_descriptor = // Function_Descriptor adjust_color_descriptor =
{ "adjust_color 1", "$color", 0 } // { "adjust_color 1", "$color", 0 }
Function_Descriptor adjust_color_2_descriptor = // Function_Descriptor adjust_color_2_descriptor =
{ "adjust_color 2", "$color", "2") // { "adjust_color 2", "$color", "2")
Node adjust_color_impl(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node) { // Node adjust_color_impl(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node) {
blah; // blah;
} // }
double h_to_rgb(double m1, double m2, double h) { double h_to_rgb(double m1, double m2, double h) {
if (h < 0) ++h; if (h < 0) ++h;
...@@ -217,7 +224,25 @@ namespace Sass { ...@@ -217,7 +224,25 @@ namespace Sass {
// color.line() = bindings[parameters[0].token()].line(); // color.line() = bindings[parameters[0].token()].line();
return color; return color;
} }
Function_Descriptor adjust_hue_descriptor =
{ "adjust-hue", "$color", "$degrees", 0 };
Node adjust_hue(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node) {
Node rgb_col(bindings[parameters[0].token()]);
Node degrees(bindings[parameters[1].token()]);
if (rgb_col.type() != Node::numeric_color) throw_eval_error("first argument to adjust-hue must be a color", rgb_col.path(), rgb_col.line());
if (!degrees.is_numeric()) throw_eval_error("second argument to adjust-hue must be numeric", degrees.path(), degrees.line());
Node hsl_col(rgb_to_hsl(rgb_col[0].numeric_value(),
rgb_col[1].numeric_value(),
rgb_col[2].numeric_value(),
new_Node));
return hsla_impl(hsl_col[0].numeric_value() + degrees.numeric_value(),
hsl_col[1].numeric_value(),
hsl_col[2].numeric_value(),
rgb_col[3].numeric_value(),
new_Node);
}
Function_Descriptor invert_descriptor = Function_Descriptor invert_descriptor =
{ "invert", "$color", 0 }; { "invert", "$color", 0 };
Node invert(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node) { Node invert(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node) {
......
...@@ -101,6 +101,9 @@ namespace Sass { ...@@ -101,6 +101,9 @@ namespace Sass {
extern Function_Descriptor hsl_descriptor; extern Function_Descriptor hsl_descriptor;
Node hsl(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node); Node hsl(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node);
extern Function_Descriptor adjust_hue_descriptor;
Node adjust_hue(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node);
extern Function_Descriptor invert_descriptor; extern Function_Descriptor invert_descriptor;
Node invert(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node); Node invert(const Node parameters, map<Token, Node>& bindings, Node_Factory& new_Node);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment