From 5653dd2ff643c8c21072b61af8aaf5107b70c532 Mon Sep 17 00:00:00 2001 From: Jeff Ward Date: Sat, 30 Apr 2016 07:30:23 -0600 Subject: [PATCH 1/2] Added support for named colors, moved helpers into SVGColor class --- src/format/svg/SVGColor.hx | 195 +++++++++++++++++++++++ src/format/svg/SVGData.hx | 57 ++----- test/SvgGenerationTest.hx | 6 + test/images/fill_color_names-100x100.png | Bin 0 -> 334 bytes test/images/fill_color_names.svg | 5 + 5 files changed, 222 insertions(+), 41 deletions(-) create mode 100644 src/format/svg/SVGColor.hx create mode 100644 test/images/fill_color_names-100x100.png create mode 100644 test/images/fill_color_names.svg diff --git a/src/format/svg/SVGColor.hx b/src/format/svg/SVGColor.hx new file mode 100644 index 0000000..4b008c2 --- /dev/null +++ b/src/format/svg/SVGColor.hx @@ -0,0 +1,195 @@ +package format.svg; + +import haxe.ds.StringMap; + +class SVGColor +{ + public static var nameMap:StringMap = + [ + "maroon" => "800000", + "red" => "ff0000", + "orange" => "ffA500", + "yellow" => "ffff00", + "olive" => "808000", + "purple" => "800080", + "fuchsia" => "ff00ff", + "white" => "ffffff", + "lime" => "00ff00", + "green" => "008000", + "navy" => "000080", + "blue" => "0000ff", + "aqua" => "00ffff", + "teal" => "008080", + "black" => "000000", + "silver" => "c0c0c0", + "gray" => "808080", + "aliceblue" => "F0F8FF", + "antiquewhite" => "FAEBD7", + "aquamarine" => "7FFFD4", + "azure" => "F0FFFF", + "beige" => "F5F5DC", + "bisque" => "FFE4C4", + "blanchedalmond" => "FFEBCD", + "blueviolet" => "8A2BE2", + "brown" => "A52A2A", + "burlywood" => "DEB887", + "cadetblue" => "5F9EA0", + "chartreuse" => "7FFF00", + "chocolate" => "D2691E", + "coral" => "FF7F50", + "cornflowerblue" => "6495ED", + "cornsilk" => "FFF8DC", + "crimson" => "DC143C", + "cyan" => "00FFFF", + "darkblue" => "00008B", + "darkcyan" => "008B8B", + "darkgoldenrod" => "B8860B", + "darkgray" => "A9A9A9", + "darkgrey" => "A9A9A9", + "darkgreen" => "006400", + "darkkhaki" => "BDB76B", + "darkmagenta" => "8B008B", + "darkolivegreen" => "556B2F", + "darkorange" => "FF8C00", + "darkorchid" => "9932CC", + "darkred" => "8B0000", + "darksalmon" => "E9967A", + "darkseagreen" => "8FBC8F", + "darkslateblue" => "483D8B", + "darkslategray" => "2F4F4F", + "darkslategrey" => "2F4F4F", + "darkturquoise" => "00CED1", + "darkviolet" => "9400D3", + "deeppink" => "FF1493", + "deepskyblue" => "00BFFF", + "dimgray" => "696969", + "dimgrey" => "696969", + "dodgerblue" => "1E90FF", + "firebrick" => "B22222", + "floralwhite" => "FFFAF0", + "forestgreen" => "228B22", + "gainsboro" => "DCDCDC", + "ghostwhite" => "F8F8FF", + "gold" => "FFD700", + "goldenrod" => "DAA520", + "grey" => "808080", + "greenyellow" => "ADFF2F", + "honeydew" => "F0FFF0", + "hotpink" => "FF69B4", + "indianred" => "CD5C5C", + "indigo" => "4B0082", + "ivory" => "FFFFF0", + "khaki" => "F0E68C", + "lavender" => "E6E6FA", + "lavenderblush" => "FFF0F5", + "lawngreen" => "7CFC00", + "lemonchiffon" => "FFFACD", + "lightblue" => "ADD8E6", + "lightcoral" => "F08080", + "lightcyan" => "E0FFFF", + "lightgoldenrodyellow" => "FAFAD2", + "lightgray" => "D3D3D3", + "lightgrey" => "D3D3D3", + "lightgreen" => "90EE90", + "lightpink" => "FFB6C1", + "lightsalmon" => "FFA07A", + "lightseagreen" => "20B2AA", + "lightskyblue" => "87CEFA", + "lightslategray" => "778899", + "lightslategrey" => "778899", + "lightsteelblue" => "B0C4DE", + "lightyellow" => "FFFFE0", + "limegreen" => "32CD32", + "linen" => "FAF0E6", + "magenta" => "FF00FF", + "mediumaquamarine" => "66CDAA", + "mediumblue" => "0000CD", + "mediumorchid" => "BA55D3", + "mediumpurple" => "9370D8", + "mediumseagreen" => "3CB371", + "mediumslateblue" => "7B68EE", + "mediumspringgreen" => "00FA9A", + "mediumturquoise" => "48D1CC", + "mediumvioletred" => "C71585", + "midnightblue" => "191970", + "mintcream" => "F5FFFA", + "mistyrose" => "FFE4E1", + "moccasin" => "FFE4B5", + "navajowhite" => "FFDEAD", + "oldlace" => "FDF5E6", + "olivedrab" => "6B8E23", + "orangered" => "FF4500", + "orchid" => "DA70D6", + "palegoldenrod" => "EEE8AA", + "palegreen" => "98FB98", + "paleturquoise" => "AFEEEE", + "palevioletred" => "D87093", + "papayawhip" => "FFEFD5", + "peachpuff" => "FFDAB9", + "peru" => "CD853F", + "pink" => "FFC0CB", + "plum" => "DDA0DD", + "powderblue" => "B0E0E6", + "rosybrown" => "BC8F8F", + "royalblue" => "4169E1", + "saddlebrown" => "8B4513", + "salmon" => "FA8072", + "sandybrown" => "F4A460", + "seagreen" => "2E8B57", + "seashell" => "FFF5EE", + "sienna" => "A0522D", + "skyblue" => "87CEEB", + "slateblue" => "6A5ACD", + "slategray" => "708090", + "slategrey" => "708090", + "snow" => "FFFAFA", + "springgreen" => "00FF7F", + "steelblue" => "4682B4", + "tan" => "D2B48C", + "thistle" => "D8BFD8", + "tomato" => "FF6347", + "turquoise" => "40E0D0", + "violet" => "EE82EE", + "wheat" => "F5DEB3", + "whitesmoke" => "F5F5F5", + "yellowgreen" => "9ACD32" + ]; + + public static function parseHex(hex:String):Int + { + // Support 3-character hex color shorthand + // e.g. #RGB -> #RRGGBB + if (hex.length == 3) { + hex = hex.substr(0,1) + hex.substr(0,1) + + hex.substr(1,1) + hex.substr(1,1) + + hex.substr(2,1) + hex.substr(2,1); + } + + return Std.parseInt ("0x" + hex); + } + + public static function parseRGBMatch(rgbMatch:EReg):Int + { + // CSS2 rgb color definition, matches 0-255 or 0-100% + // e.g. rgb(255,127,0) == rgb(100%,50%,0) + + inline function range(val:Float):Int { + // constrain to Int 0-255 + if (val < 0) { val = 0; } + if (val > 255) { val = 255; } + return Std.int( val ); + } + + var r = Std.parseFloat(rgbMatch.matched (1)); + if (rgbMatch.matched(2)=='%') { r = r * 255 / 100; } + + var g = Std.parseFloat(rgbMatch.matched (3)); + if (rgbMatch.matched(4)=='%') { g = g * 255 / 100; } + + var b = Std.parseFloat(rgbMatch.matched (5)); + if (rgbMatch.matched(6)=='%') { b = b * 255 / 100; } + + return ( range(r)<<16 ) | ( range(g)<<8 ) | range(b); + } + +} diff --git a/src/format/svg/SVGData.hx b/src/format/svg/SVGData.hx index 6f82a34..68b695c 100644 --- a/src/format/svg/SVGData.hx +++ b/src/format/svg/SVGData.hx @@ -172,7 +172,7 @@ class SVGData extends Group { if (s.charAt (0) == '#') { - return parseHex(s.substr(1)); + return SVGColor.parseHex(s.substr(1)); } @@ -193,13 +193,13 @@ class SVGData extends Group { if (s.charAt (0) == '#') { - return FillSolid (parseHex(s.substr(1))); + return FillSolid (SVGColor.parseHex(s.substr(1))); } if (mRGBMatch.match (s)) { - return FillSolid ( parseRGBMatch(mRGBMatch) ); + return FillSolid ( SVGColor.parseRGBMatch(mRGBMatch) ); } @@ -222,6 +222,12 @@ class SVGData extends Group { throw ("Unknown url:" + url); } + + if (SVGColor.nameMap.exists( s.toLowerCase() )) + { + return FillSolid ( SVGColor.parseHex(SVGColor.nameMap.get( s.toLowerCase() )) ); + } + throw ("Unknown fill string:" + s); @@ -283,7 +289,7 @@ class SVGData extends Group { if (mRGBMatch.match (s)) { - return parseRGBMatch(mRGBMatch); + return SVGColor.parseRGBMatch(mRGBMatch); } @@ -292,10 +298,15 @@ class SVGData extends Group { return null; } + + if (SVGColor.nameMap.exists( s.toLowerCase() )) + { + return SVGColor.parseHex(SVGColor.nameMap.get( s.toLowerCase() )); + } if (s.charAt (0) == '#') { - return parseHex(s.substr(1)); + return SVGColor.parseHex(s.substr(1)); } @@ -724,40 +735,4 @@ class SVGData extends Group { } - private static inline function parseHex(hex:String):Int - { - // Support 3-character hex color shorthand - // e.g. #RGB -> #RRGGBB - if (hex.length == 3) { - hex = hex.substr(0,1) + hex.substr(0,1) + - hex.substr(1,1) + hex.substr(1,1) + - hex.substr(2,1) + hex.substr(2,1); - } - - return Std.parseInt ("0x" + hex); - } - - private static inline function parseRGBMatch(rgbMatch:EReg):Int - { - // CSS2 rgb color definition, matches 0-255 or 0-100% - // e.g. rgb(255,127,0) == rgb(100%,50%,0) - - inline function range(val:Float):Int { - // constrain to Int 0-255 - if (val < 0) { val = 0; } - if (val > 255) { val = 255; } - return Std.int( val ); - } - - var r = Std.parseFloat(rgbMatch.matched (1)); - if (rgbMatch.matched(2)=='%') { r = r * 255 / 100; } - - var g = Std.parseFloat(rgbMatch.matched (3)); - if (rgbMatch.matched(4)=='%') { g = g * 255 / 100; } - - var b = Std.parseFloat(rgbMatch.matched (5)); - if (rgbMatch.matched(6)=='%') { b = b * 255 / 100; } - - return ( range(r)<<16 ) | ( range(g)<<8 ) | range(b); - } } diff --git a/test/SvgGenerationTest.hx b/test/SvgGenerationTest.hx index 49d2c92..8770a93 100644 --- a/test/SvgGenerationTest.hx +++ b/test/SvgGenerationTest.hx @@ -72,6 +72,12 @@ class SvgGenerationTest { generateAndCompare("fill_rgb.svg", 100, 100); } + + @Test + public function fillColorNames() + { + generateAndCompare("fill_color_names.svg", 100, 100); + } @BeforeClass public function cleanPreviousTestRunResults() { diff --git a/test/images/fill_color_names-100x100.png b/test/images/fill_color_names-100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..fe46c0ba62efafe8e0bb41d05fe06297024f1534 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^DIm< z>&pIsMUGdNSM2hZJwTzio-U3d6}R5rb>wX}5NUW=8X~|{wn9`!ft5XY(-$K~QW0|HMyY + + + + From 7009a6b8bbe475284a716d9e314a858765171a41 Mon Sep 17 00:00:00 2001 From: Jeff Ward Date: Sat, 30 Apr 2016 07:41:46 -0600 Subject: [PATCH 2/2] Fixed tabs --- src/format/svg/SVGColor.hx | 296 ++++++++++++++++++------------------- 1 file changed, 148 insertions(+), 148 deletions(-) diff --git a/src/format/svg/SVGColor.hx b/src/format/svg/SVGColor.hx index 4b008c2..3fce153 100644 --- a/src/format/svg/SVGColor.hx +++ b/src/format/svg/SVGColor.hx @@ -4,167 +4,167 @@ import haxe.ds.StringMap; class SVGColor { - public static var nameMap:StringMap = - [ + public static var nameMap:StringMap = + [ "maroon" => "800000", "red" => "ff0000", "orange" => "ffA500", "yellow" => "ffff00", "olive" => "808000", "purple" => "800080", - "fuchsia" => "ff00ff", - "white" => "ffffff", - "lime" => "00ff00", - "green" => "008000", - "navy" => "000080", - "blue" => "0000ff", - "aqua" => "00ffff", - "teal" => "008080", - "black" => "000000", - "silver" => "c0c0c0", - "gray" => "808080", - "aliceblue" => "F0F8FF", - "antiquewhite" => "FAEBD7", - "aquamarine" => "7FFFD4", - "azure" => "F0FFFF", - "beige" => "F5F5DC", - "bisque" => "FFE4C4", - "blanchedalmond" => "FFEBCD", - "blueviolet" => "8A2BE2", - "brown" => "A52A2A", - "burlywood" => "DEB887", - "cadetblue" => "5F9EA0", - "chartreuse" => "7FFF00", - "chocolate" => "D2691E", - "coral" => "FF7F50", - "cornflowerblue" => "6495ED", - "cornsilk" => "FFF8DC", - "crimson" => "DC143C", - "cyan" => "00FFFF", - "darkblue" => "00008B", - "darkcyan" => "008B8B", - "darkgoldenrod" => "B8860B", - "darkgray" => "A9A9A9", - "darkgrey" => "A9A9A9", - "darkgreen" => "006400", - "darkkhaki" => "BDB76B", - "darkmagenta" => "8B008B", - "darkolivegreen" => "556B2F", - "darkorange" => "FF8C00", - "darkorchid" => "9932CC", - "darkred" => "8B0000", - "darksalmon" => "E9967A", - "darkseagreen" => "8FBC8F", - "darkslateblue" => "483D8B", - "darkslategray" => "2F4F4F", - "darkslategrey" => "2F4F4F", - "darkturquoise" => "00CED1", - "darkviolet" => "9400D3", - "deeppink" => "FF1493", - "deepskyblue" => "00BFFF", - "dimgray" => "696969", - "dimgrey" => "696969", - "dodgerblue" => "1E90FF", - "firebrick" => "B22222", - "floralwhite" => "FFFAF0", - "forestgreen" => "228B22", - "gainsboro" => "DCDCDC", - "ghostwhite" => "F8F8FF", - "gold" => "FFD700", - "goldenrod" => "DAA520", - "grey" => "808080", - "greenyellow" => "ADFF2F", - "honeydew" => "F0FFF0", - "hotpink" => "FF69B4", - "indianred" => "CD5C5C", - "indigo" => "4B0082", - "ivory" => "FFFFF0", - "khaki" => "F0E68C", - "lavender" => "E6E6FA", - "lavenderblush" => "FFF0F5", - "lawngreen" => "7CFC00", - "lemonchiffon" => "FFFACD", - "lightblue" => "ADD8E6", - "lightcoral" => "F08080", - "lightcyan" => "E0FFFF", - "lightgoldenrodyellow" => "FAFAD2", - "lightgray" => "D3D3D3", - "lightgrey" => "D3D3D3", - "lightgreen" => "90EE90", - "lightpink" => "FFB6C1", - "lightsalmon" => "FFA07A", - "lightseagreen" => "20B2AA", - "lightskyblue" => "87CEFA", - "lightslategray" => "778899", - "lightslategrey" => "778899", - "lightsteelblue" => "B0C4DE", - "lightyellow" => "FFFFE0", - "limegreen" => "32CD32", - "linen" => "FAF0E6", - "magenta" => "FF00FF", - "mediumaquamarine" => "66CDAA", - "mediumblue" => "0000CD", - "mediumorchid" => "BA55D3", - "mediumpurple" => "9370D8", - "mediumseagreen" => "3CB371", - "mediumslateblue" => "7B68EE", - "mediumspringgreen" => "00FA9A", - "mediumturquoise" => "48D1CC", - "mediumvioletred" => "C71585", - "midnightblue" => "191970", - "mintcream" => "F5FFFA", - "mistyrose" => "FFE4E1", - "moccasin" => "FFE4B5", - "navajowhite" => "FFDEAD", - "oldlace" => "FDF5E6", - "olivedrab" => "6B8E23", - "orangered" => "FF4500", - "orchid" => "DA70D6", - "palegoldenrod" => "EEE8AA", - "palegreen" => "98FB98", - "paleturquoise" => "AFEEEE", - "palevioletred" => "D87093", - "papayawhip" => "FFEFD5", - "peachpuff" => "FFDAB9", - "peru" => "CD853F", - "pink" => "FFC0CB", - "plum" => "DDA0DD", - "powderblue" => "B0E0E6", - "rosybrown" => "BC8F8F", - "royalblue" => "4169E1", - "saddlebrown" => "8B4513", - "salmon" => "FA8072", - "sandybrown" => "F4A460", - "seagreen" => "2E8B57", - "seashell" => "FFF5EE", - "sienna" => "A0522D", - "skyblue" => "87CEEB", - "slateblue" => "6A5ACD", - "slategray" => "708090", - "slategrey" => "708090", - "snow" => "FFFAFA", - "springgreen" => "00FF7F", - "steelblue" => "4682B4", - "tan" => "D2B48C", - "thistle" => "D8BFD8", - "tomato" => "FF6347", - "turquoise" => "40E0D0", - "violet" => "EE82EE", - "wheat" => "F5DEB3", - "whitesmoke" => "F5F5F5", - "yellowgreen" => "9ACD32" - ]; + "fuchsia" => "ff00ff", + "white" => "ffffff", + "lime" => "00ff00", + "green" => "008000", + "navy" => "000080", + "blue" => "0000ff", + "aqua" => "00ffff", + "teal" => "008080", + "black" => "000000", + "silver" => "c0c0c0", + "gray" => "808080", + "aliceblue" => "F0F8FF", + "antiquewhite" => "FAEBD7", + "aquamarine" => "7FFFD4", + "azure" => "F0FFFF", + "beige" => "F5F5DC", + "bisque" => "FFE4C4", + "blanchedalmond" => "FFEBCD", + "blueviolet" => "8A2BE2", + "brown" => "A52A2A", + "burlywood" => "DEB887", + "cadetblue" => "5F9EA0", + "chartreuse" => "7FFF00", + "chocolate" => "D2691E", + "coral" => "FF7F50", + "cornflowerblue" => "6495ED", + "cornsilk" => "FFF8DC", + "crimson" => "DC143C", + "cyan" => "00FFFF", + "darkblue" => "00008B", + "darkcyan" => "008B8B", + "darkgoldenrod" => "B8860B", + "darkgray" => "A9A9A9", + "darkgrey" => "A9A9A9", + "darkgreen" => "006400", + "darkkhaki" => "BDB76B", + "darkmagenta" => "8B008B", + "darkolivegreen" => "556B2F", + "darkorange" => "FF8C00", + "darkorchid" => "9932CC", + "darkred" => "8B0000", + "darksalmon" => "E9967A", + "darkseagreen" => "8FBC8F", + "darkslateblue" => "483D8B", + "darkslategray" => "2F4F4F", + "darkslategrey" => "2F4F4F", + "darkturquoise" => "00CED1", + "darkviolet" => "9400D3", + "deeppink" => "FF1493", + "deepskyblue" => "00BFFF", + "dimgray" => "696969", + "dimgrey" => "696969", + "dodgerblue" => "1E90FF", + "firebrick" => "B22222", + "floralwhite" => "FFFAF0", + "forestgreen" => "228B22", + "gainsboro" => "DCDCDC", + "ghostwhite" => "F8F8FF", + "gold" => "FFD700", + "goldenrod" => "DAA520", + "grey" => "808080", + "greenyellow" => "ADFF2F", + "honeydew" => "F0FFF0", + "hotpink" => "FF69B4", + "indianred" => "CD5C5C", + "indigo" => "4B0082", + "ivory" => "FFFFF0", + "khaki" => "F0E68C", + "lavender" => "E6E6FA", + "lavenderblush" => "FFF0F5", + "lawngreen" => "7CFC00", + "lemonchiffon" => "FFFACD", + "lightblue" => "ADD8E6", + "lightcoral" => "F08080", + "lightcyan" => "E0FFFF", + "lightgoldenrodyellow" => "FAFAD2", + "lightgray" => "D3D3D3", + "lightgrey" => "D3D3D3", + "lightgreen" => "90EE90", + "lightpink" => "FFB6C1", + "lightsalmon" => "FFA07A", + "lightseagreen" => "20B2AA", + "lightskyblue" => "87CEFA", + "lightslategray" => "778899", + "lightslategrey" => "778899", + "lightsteelblue" => "B0C4DE", + "lightyellow" => "FFFFE0", + "limegreen" => "32CD32", + "linen" => "FAF0E6", + "magenta" => "FF00FF", + "mediumaquamarine" => "66CDAA", + "mediumblue" => "0000CD", + "mediumorchid" => "BA55D3", + "mediumpurple" => "9370D8", + "mediumseagreen" => "3CB371", + "mediumslateblue" => "7B68EE", + "mediumspringgreen" => "00FA9A", + "mediumturquoise" => "48D1CC", + "mediumvioletred" => "C71585", + "midnightblue" => "191970", + "mintcream" => "F5FFFA", + "mistyrose" => "FFE4E1", + "moccasin" => "FFE4B5", + "navajowhite" => "FFDEAD", + "oldlace" => "FDF5E6", + "olivedrab" => "6B8E23", + "orangered" => "FF4500", + "orchid" => "DA70D6", + "palegoldenrod" => "EEE8AA", + "palegreen" => "98FB98", + "paleturquoise" => "AFEEEE", + "palevioletred" => "D87093", + "papayawhip" => "FFEFD5", + "peachpuff" => "FFDAB9", + "peru" => "CD853F", + "pink" => "FFC0CB", + "plum" => "DDA0DD", + "powderblue" => "B0E0E6", + "rosybrown" => "BC8F8F", + "royalblue" => "4169E1", + "saddlebrown" => "8B4513", + "salmon" => "FA8072", + "sandybrown" => "F4A460", + "seagreen" => "2E8B57", + "seashell" => "FFF5EE", + "sienna" => "A0522D", + "skyblue" => "87CEEB", + "slateblue" => "6A5ACD", + "slategray" => "708090", + "slategrey" => "708090", + "snow" => "FFFAFA", + "springgreen" => "00FF7F", + "steelblue" => "4682B4", + "tan" => "D2B48C", + "thistle" => "D8BFD8", + "tomato" => "FF6347", + "turquoise" => "40E0D0", + "violet" => "EE82EE", + "wheat" => "F5DEB3", + "whitesmoke" => "F5F5F5", + "yellowgreen" => "9ACD32" + ]; public static function parseHex(hex:String):Int { // Support 3-character hex color shorthand - // e.g. #RGB -> #RRGGBB + // e.g. #RGB -> #RRGGBB if (hex.length == 3) { hex = hex.substr(0,1) + hex.substr(0,1) + - hex.substr(1,1) + hex.substr(1,1) + - hex.substr(2,1) + hex.substr(2,1); + hex.substr(1,1) + hex.substr(1,1) + + hex.substr(2,1) + hex.substr(2,1); } - + return Std.parseInt ("0x" + hex); }