Module: Vic::Color
Constant Summary collapse
- SYSTEM_COLORS =
System colors (0-15)
[ [0x00, 0x00, 0x00], [0x80, 0x00, 0x00], [0x00, 0x80, 0x00], [0x80, 0x80, 0x00], [0x00, 0x00, 0x80], [0x80, 0x00, 0x80], [0x00, 0x80, 0x80], [0xc0, 0xc0, 0xc0], [0x80, 0x80, 0x80], [0xff, 0x00, 0x00], [0x00, 0xff, 0x00], [0xff, 0xff, 0x00], [0x00, 0x00, 0xff], [0xff, 0x00, 0xff], [0x00, 0xff, 0xff], [0xff, 0xff, 0xff] ]
- RGB_COLORS =
RGB colors (16 - 231)
[0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff].repeated_permutation(3).to_a
- GRAYSCALE_COLORS =
Grayscale colors (232 - 255)
(0x08..0xee).step(0x0a).to_a.map {|v| Array.new(3).fill(v) }
- COLORS_256 =
All 256 colors of the rainbow. Organized from 0 to 255.
SYSTEM_COLORS + RGB_COLORS + GRAYSCALE_COLORS
Instance Method Summary collapse
-
#hex_to_256(hex) ⇒ FixNum
Takes a hexidecimal color and returns is closest 256 color match.
-
#hex_to_rgb(hex) ⇒ Array
Convert hexidecimal color to an Array of RGB values.
-
#is_hexadecimal?(subject) ⇒ Match
Checks if the subjec is a valid hexidecimal color.
Instance Method Details
#hex_to_256(hex) ⇒ FixNum
Takes a hexidecimal color and returns is closest 256 color match.
Credit goes to Micheal Elliot for the algorithm which was originally written in Python.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/vic/color.rb', line 48 def hex_to_256(hex) parts = hex_to_rgb(hex) # If the hex is a member of the 256 colors club, we'll just return it's 256 # color value. No sense in doing extra work, right? return COLORS_256.index(parts) if COLORS_256.include?(parts) increments = 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff # For each part we need to check if it's between any two of the increments. # If it is we'll determine the closest match, change it's value, break, # and move on to the next part. parts.map! do |part| closest = nil for i in (0..(increments.length - 1)) lower = increments[i] upper = increments[i + 1] next unless (lower <= part) && (part <= upper) distance_from_lower = (lower - part).abs distance_from_upper = (upper - part).abs closest = distance_from_lower < distance_from_upper ? lower : upper break end closest end # Return the index of the color COLORS_256.index(parts) end |
#hex_to_rgb(hex) ⇒ Array
Convert hexidecimal color to an Array of RGB values.
36 37 38 |
# File 'lib/vic/color.rb', line 36 def hex_to_rgb(hex) hex.match(/#?(..)(..)(..)/)[1..4].to_a.map {|v| v.to_i(16) } end |
#is_hexadecimal?(subject) ⇒ Match
Checks if the subjec is a valid hexidecimal color.
82 83 84 85 |
# File 'lib/vic/color.rb', line 82 def is_hexadecimal?(subject) return false unless subject.respond_to? :match subject.match(/#?[\da-f]{6}/i) ? true : false end |