def parse(value, robust=false)
return value.dup if value.is_a?(Base)
case value
when Array
case value.first
when :cmyk, :cmyka
CMYK.new(*value[1..-1])
when :hsv, :hsva
HSV.new(*value[1..-1])
else
type, *value = value if [:rgb, :rgba].include?(value.first)
RGB.new(*value)
end
when /\A#/
parse_hex_color(value)
when String, Symbol
name = Cairo.normalize_const_name(value)
begin
const_get(name).dup
rescue NameError
raise ArgumentError, "unknown color name: #{value}"
end
else
if robust
raise ArgumentError, "can't parse as color name: #{value.inspect}"
end
value
end
end