Module: RackResize::ColorUtils

Extended by:
ColorUtils
Included in:
ColorUtils
Defined in:
lib/rack_resize/color_utils.rb

Constant Summary collapse

CSS_COLORS =
{
  'aliceblue'            => [240, 248, 255],
  'antiquewhite'         => [250, 235, 215],
  'aqua'                 => [0, 255, 255],
  'aquamarine'           => [127, 255, 212],
  'azure'                => [240, 255, 255],
  'beige'                => [245, 245, 220],
  'bisque'               => [255, 228, 196],
  'black'                => [0, 0, 0],
  'blanchedalmond'       => [255, 235, 205],
  'blue'                 => [0, 0, 255],
  'blueviolet'           => [138, 43, 226],
  'brown'                => [165, 42, 42],
  'burlywood'            => [222, 184, 135],
  'cadetblue'            => [95, 158, 160],
  'chartreuse'           => [127, 255, 0],
  'chocolate'            => [210, 105, 30],
  'coral'                => [255, 127, 80],
  'cornflowerblue'       => [100, 149, 237],
  'cornsilk'             => [255, 248, 220],
  'crimson'              => [220, 20, 60],
  'cyan'                 => [0, 255, 255],
  'darkblue'             => [0, 0, 139],
  'darkcyan'             => [0, 139, 139],
  'darkgoldenrod'        => [184, 134, 11],
  'darkgray'             => [169, 169, 169],
  'darkgreen'            => [0, 100, 0],
  'darkgrey'             => [169, 169, 169],
  'darkkhaki'            => [189, 183, 107],
  'darkmagenta'          => [139, 0, 139],
  'darkolivegreen'       => [85, 107, 47],
  'darkorange'           => [255, 140, 0],
  'darkorchid'           => [153, 50, 204],
  'darkred'              => [139, 0, 0],
  'darksalmon'           => [233, 150, 122],
  'darkseagreen'         => [143, 188, 143],
  'darkslateblue'        => [72, 61, 139],
  'darkslategray'        => [47, 79, 79],
  'darkslategrey'        => [47, 79, 79],
  'darkturquoise'        => [0, 206, 209],
  'darkviolet'           => [148, 0, 211],
  'deeppink'             => [255, 20, 147],
  'deepskyblue'          => [0, 191, 255],
  'dimgray'              => [105, 105, 105],
  'dimgrey'              => [105, 105, 105],
  'dodgerblue'           => [30, 144, 255],
  'firebrick'            => [178, 34, 34],
  'floralwhite'          => [255, 250, 240],
  'forestgreen'          => [34, 139, 34],
  'fuchsia'              => [255, 0, 255],
  'gainsboro'            => [220, 220, 220],
  'ghostwhite'           => [248, 248, 255],
  'gold'                 => [255, 215, 0],
  'goldenrod'            => [218, 165, 32],
  'gray'                 => [128, 128, 128],
  'green'                => [0, 128, 0],
  'greenyellow'          => [173, 255, 47],
  'grey'                 => [128, 128, 128],
  'honeydew'             => [240, 255, 240],
  'hotpink'              => [255, 105, 180],
  'indianred'            => [205, 92, 92],
  'indigo'               => [75, 0, 130],
  'ivory'                => [255, 255, 240],
  'khaki'                => [240, 230, 140],
  'lavender'             => [230, 230, 250],
  'lavenderblush'        => [255, 240, 245],
  'lawngreen'            => [124, 252, 0],
  'lemonchiffon'         => [255, 250, 205],
  'lightblue'            => [173, 216, 230],
  'lightcoral'           => [240, 128, 128],
  'lightcyan'            => [224, 255, 255],
  'lightgoldenrodyellow' => [250, 250, 210],
  'lightgray'            => [211, 211, 211],
  'lightgreen'           => [144, 238, 144],
  'lightgrey'            => [211, 211, 211],
  'lightpink'            => [255, 182, 193],
  'lightsalmon'          => [255, 160, 122],
  'lightseagreen'        => [32, 178, 170],
  'lightskyblue'         => [135, 206, 250],
  'lightslategray'       => [119, 136, 153],
  'lightslategrey'       => [119, 136, 153],
  'lightsteelblue'       => [176, 196, 222],
  'lightyellow'          => [255, 255, 224],
  'lime'                 => [0, 255, 0],
  'limegreen'            => [50, 205, 50],
  'linen'                => [250, 240, 230],
  'magenta'              => [255, 0, 255],
  'maroon'               => [128, 0, 0],
  'mediumaquamarine'     => [102, 205, 170],
  'mediumblue'           => [0, 0, 205],
  'mediumorchid'         => [186, 85, 211],
  'mediumpurple'         => [147, 112, 219],
  'mediumseagreen'       => [60, 179, 113],
  'mediumslateblue'      => [123, 104, 238],
  'mediumspringgreen'    => [0, 250, 154],
  'mediumturquoise'      => [72, 209, 204],
  'mediumvioletred'      => [199, 21, 133],
  'midnightblue'         => [25, 25, 112],
  'mintcream'            => [245, 255, 250],
  'mistyrose'            => [255, 228, 225],
  'moccasin'             => [255, 228, 181],
  'navajowhite'          => [255, 222, 173],
  'navy'                 => [0, 0, 128],
  'oldlace'              => [253, 245, 230],
  'olive'                => [128, 128, 0],
  'olivedrab'            => [107, 142, 35],
  'orange'               => [255, 165, 0],
  'orangered'            => [255, 69, 0],
  'orchid'               => [218, 112, 214],
  'palegoldenrod'        => [238, 232, 170],
  'palegreen'            => [152, 251, 152],
  'paleturquoise'        => [175, 238, 238],
  'palevioletred'        => [219, 112, 147],
  'papayawhip'           => [255, 239, 213],
  'peachpuff'            => [255, 218, 185],
  'peru'                 => [205, 133, 63],
  'pink'                 => [255, 192, 203],
  'plum'                 => [221, 160, 221],
  'powderblue'           => [176, 224, 230],
  'purple'               => [128, 0, 128],
  'rebeccapurple'        => [102, 51, 153],
  'red'                  => [255, 0, 0],
  'rosybrown'            => [188, 143, 143],
  'royalblue'            => [65, 105, 225],
  'saddlebrown'          => [139, 69, 19],
  'salmon'               => [250, 128, 114],
  'sandybrown'           => [244, 164, 96],
  'seagreen'             => [46, 139, 87],
  'seashell'             => [255, 245, 238],
  'sienna'               => [160, 82, 45],
  'silver'               => [192, 192, 192],
  'skyblue'              => [135, 206, 235],
  'slateblue'            => [106, 90, 205],
  'slategray'            => [112, 128, 144],
  'slategrey'            => [112, 128, 144],
  'snow'                 => [255, 250, 250],
  'springgreen'          => [0, 255, 127],
  'steelblue'            => [70, 130, 180],
  'tan'                  => [210, 180, 140],
  'teal'                 => [0, 128, 128],
  'thistle'              => [216, 191, 216],
  'tomato'               => [255, 99, 71],
  'turquoise'            => [64, 224, 208],
  'violet'               => [238, 130, 238],
  'wheat'                => [245, 222, 179],
  'white'                => [255, 255, 255],
  'whitesmoke'           => [248, 248, 248],
  'yellow'               => [255, 255, 0],
  'yellowgreen'          => [154, 205, 50],
}.freeze

Instance Method Summary collapse

Instance Method Details

#parse_color(value) ⇒ Object

Returns [r, g, b, a] where r/g/b are 0-255 integers and a is a 0.0-1.0 float. Returns nil if the value cannot be parsed. Supported formats:

CSS named color: "red", "white", "cornflowerblue"
3-digit hex:     "#a84"
6-digit hex:     "#aa8844"
8-digit hex:     "#aa884480"  (last two digits = alpha 0-255)
decimal RGB:     "0,255,0"
decimal RGBA:    "0,255,0,0.5"  (alpha 0.0-1.0)


164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/rack_resize/color_utils.rb', line 164

def parse_color(value)
  return nil if value.nil?
  v = value.to_s.strip.downcase
  return nil if v.empty?

  if (m = v.match(/\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/))
    return [m[1].hex * 17, m[2].hex * 17, m[3].hex * 17, 1.0]
  end

  if (m = v.match(/\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/))
    return [m[1].to_i(16), m[2].to_i(16), m[3].to_i(16), 1.0]
  end

  if (m = v.match(/\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/))
    return [m[1].to_i(16), m[2].to_i(16), m[3].to_i(16), m[4].to_i(16) / 255.0]
  end

  if CSS_COLORS.key?(v)
    return CSS_COLORS[v] + [1.0]
  end

  if (m = v.match(/\A(\d+),(\d+),(\d+)(?:,(\d*\.?\d+))?\z/))
    r = m[1].to_i.clamp(0, 255)
    g = m[2].to_i.clamp(0, 255)
    b = m[3].to_i.clamp(0, 255)
    a = m[4] ? m[4].to_f.clamp(0.0, 1.0) : 1.0
    return [r, g, b, a]
  end

  nil
end

#to_hex(bg_color) ⇒ Object



196
197
198
199
# File 'lib/rack_resize/color_utils.rb', line 196

def to_hex(bg_color)
  r, g, b, _a = bg_color
  "#%02x%02x%02x" % [r, g, b]
end