rgb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +54 -0
- data/lib/rgb.rb +1 -0
- data/lib/rgb/color.rb +146 -0
- metadata +81 -0
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
rgb
|
2
|
+
===
|
3
|
+
|
4
|
+
A simple Ruby library built to handle the easy conversion and manipulation of colors. Inspired by compass-colors https://github.com/chriseppstein/compass-colors and jColour.js https://github.com/lingo/jcolour.
|
5
|
+
|
6
|
+
Example
|
7
|
+
===
|
8
|
+
|
9
|
+
require "rgb"
|
10
|
+
|
11
|
+
# Supported input data color formas:
|
12
|
+
color = RGB::Color.from_rgb_hex("#333333")
|
13
|
+
color = RGB::Color.from_rgb_hex(0xFF0000)
|
14
|
+
color = RGB::Color.from_rgb(115, 38, 38)
|
15
|
+
color = RGB::Color.from_fractions(0, 1.0, 0.5) # HSL
|
16
|
+
|
17
|
+
# Supported color manipulations:
|
18
|
+
color.darken(20)
|
19
|
+
color.darken_percent(10)
|
20
|
+
color.darken!(20)
|
21
|
+
color.darken_percent!(10)
|
22
|
+
color.lighten(20)
|
23
|
+
color.lighten_percent(20)
|
24
|
+
color.lighten!(20)
|
25
|
+
color.lighten_percent!(20)
|
26
|
+
color.saturate(20)
|
27
|
+
color.saturate_percent(20)
|
28
|
+
color.saturate!(20)
|
29
|
+
color.saturate_percent!(20)
|
30
|
+
color.desaturate(20)
|
31
|
+
color.desaturate_percent(20)
|
32
|
+
color.desaturate!(20)
|
33
|
+
color.desaturate_percent!(20)
|
34
|
+
|
35
|
+
# Also you can adjust color hue, saturation, and lightness values manually:
|
36
|
+
color.h = 0.1
|
37
|
+
color.s = 0.2
|
38
|
+
color.l = 0.3
|
39
|
+
|
40
|
+
# Supported output formats:
|
41
|
+
color.to_rgb_hex
|
42
|
+
=> "#732626"
|
43
|
+
color.to_hsl
|
44
|
+
=> [0, 1.0, 0.5]
|
45
|
+
color.to_rgb
|
46
|
+
=> [115, 38, 38]
|
47
|
+
|
48
|
+
|
49
|
+
Resources
|
50
|
+
===
|
51
|
+
|
52
|
+
* GitHub Source: https://github.com/plashchynski/rgb
|
53
|
+
|
54
|
+
Copyright (c) 2013 Dmitry Plashchynski. Released under the MIT open source license.
|
data/lib/rgb.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "rgb/color"
|
data/lib/rgb/color.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
module RGB
|
2
|
+
class Color
|
3
|
+
attr_reader :h, :s, :l
|
4
|
+
|
5
|
+
def self.from_rgb_hex(color)
|
6
|
+
color = "#%.6x" % color if color.is_a? Integer
|
7
|
+
rgb = color[1,7].scan(/.{2}/).map{|component| component.to_i(16)}
|
8
|
+
from_rgb(*rgb)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.from_rgb(*rgb)
|
12
|
+
rgb.map!{|c| c / 255.0}
|
13
|
+
min_rgb = rgb.min
|
14
|
+
max_rgb = rgb.max
|
15
|
+
delta = max_rgb - min_rgb
|
16
|
+
|
17
|
+
lightness = (max_rgb + min_rgb) / 2.0
|
18
|
+
|
19
|
+
if delta < 1e-5
|
20
|
+
hue = 0
|
21
|
+
saturation = 0
|
22
|
+
else
|
23
|
+
saturation = if ( lightness < 0.5 )
|
24
|
+
delta / ( max_rgb + min_rgb )
|
25
|
+
else
|
26
|
+
delta / ( 2 - max_rgb - min_rgb )
|
27
|
+
end
|
28
|
+
|
29
|
+
deltas = rgb.map{|c| (((max_rgb - c) / 6.0) + (delta / 2.0)) / delta}
|
30
|
+
|
31
|
+
hue = if (rgb[0] - max_rgb).abs < 1e-5
|
32
|
+
deltas[2] - deltas[1]
|
33
|
+
elsif (rgb[1] - max_rgb).abs < 1e-5
|
34
|
+
( 1.0 / 3.0 ) + deltas[0] - deltas[2]
|
35
|
+
else
|
36
|
+
( 2.0 / 3.0 ) + deltas[1] - deltas[0]
|
37
|
+
end
|
38
|
+
hue += 1 if hue < 0
|
39
|
+
hue -= 1 if hue > 1
|
40
|
+
end
|
41
|
+
from_fractions(hue, saturation, lightness)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.from_fractions(hue, saturation, lightness)
|
45
|
+
new(360 * hue, saturation, lightness)
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize(*hsl)
|
49
|
+
self.h, self.s, self.l = hsl
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_rgb
|
53
|
+
m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s
|
54
|
+
m1 = l * 2 - m2
|
55
|
+
[hue_to_rgb(m1, m2, hp + 1.0/3), hue_to_rgb(m1, m2, hp), hue_to_rgb(m1, m2, hp - 1.0/3)].map { |c| (c * 0xff).round }
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_hsl
|
59
|
+
[h,s,l]
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_rgb_hex
|
63
|
+
"#" + to_rgb.map {|c| "%02X" % c }.join
|
64
|
+
end
|
65
|
+
|
66
|
+
def h=(hue)
|
67
|
+
@h = hue % 360
|
68
|
+
end
|
69
|
+
|
70
|
+
def s=(saturation)
|
71
|
+
@s = if saturation < 0
|
72
|
+
0.0
|
73
|
+
elsif saturation > 1
|
74
|
+
1.0
|
75
|
+
else
|
76
|
+
saturation
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def l=(lightness)
|
81
|
+
@l = if lightness < 0
|
82
|
+
0.0
|
83
|
+
elsif lightness > 1
|
84
|
+
1.0
|
85
|
+
else
|
86
|
+
lightness
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def lighten!(amount)
|
91
|
+
@l += amount / 100.0
|
92
|
+
end
|
93
|
+
|
94
|
+
def lighten_percent!(percentage)
|
95
|
+
@l += (1 - @l) * (percentage / 100.0)
|
96
|
+
end
|
97
|
+
|
98
|
+
def darken!(amount)
|
99
|
+
@l -= (amount / 100.0)
|
100
|
+
end
|
101
|
+
|
102
|
+
def darken_percent!(percentage)
|
103
|
+
@l *= 1.0 - (percentage / 100.0)
|
104
|
+
end
|
105
|
+
|
106
|
+
def saturate!(amount)
|
107
|
+
@s += amount / 100.0
|
108
|
+
end
|
109
|
+
|
110
|
+
def saturate_percent!(percentage)
|
111
|
+
@s += (1 - @s) * (percentage / 100.0)
|
112
|
+
end
|
113
|
+
|
114
|
+
def desaturate!(amount)
|
115
|
+
@s -= amount / 100.0
|
116
|
+
end
|
117
|
+
|
118
|
+
def desaturate_percent!(percentage)
|
119
|
+
@s *= (1.0 - (percentage / 100.0))
|
120
|
+
end
|
121
|
+
|
122
|
+
# define non-bang methods
|
123
|
+
[:darken, :darken_percent, :lighten, :lighten_percent, :saturate, :saturate_percent, :desaturate,
|
124
|
+
:desaturate_percent].each do |method_name|
|
125
|
+
define_method method_name do |*args|
|
126
|
+
dup.tap { |color| color.send(:"#{method_name}!", *args) }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
#hue as a percentage
|
132
|
+
def hp
|
133
|
+
h / 360.0
|
134
|
+
end
|
135
|
+
|
136
|
+
# helper for making rgb
|
137
|
+
def hue_to_rgb(m1, m2, h)
|
138
|
+
h += 1 if h < 0
|
139
|
+
h -= 1 if h > 1
|
140
|
+
return m1 + (m2 - m1) * h * 6 if h * 6 < 1
|
141
|
+
return m2 if h * 2 < 1
|
142
|
+
return m1 + (m2 - m1) * (2.0/3 - h) * 6 if h * 3 < 2
|
143
|
+
return m1
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rgb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dmitry Plashchynski
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: A library built to handle the easy conversion, comparison and manipulation
|
47
|
+
of colors with CSS-style hex color notation.
|
48
|
+
email: plashchynski@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- README.md
|
54
|
+
- lib/rgb.rb
|
55
|
+
- lib/rgb/color.rb
|
56
|
+
homepage: https://github.com/plashchynski/rgb
|
57
|
+
licenses: []
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.8.25
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: A library built to handle the easy conversion, comparison and manipulation
|
80
|
+
of colors with CSS-style hex color notation.
|
81
|
+
test_files: []
|