color 1.4.2 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjQwMTIxMzBkMGIzMmI2YmJjOWMwODE3ZDU5ZTlhYTFlNGM2YmQ0Zg==
5
+ data.tar.gz: !binary |-
6
+ M2VjNGUwNmFmOWRhMzQzZjA3OWZhMTM2MDgxYzcxMzc4NjYzOTZlZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MmYzNTFkZWZjYWM1ZTAxNjJhYzZkMTk0NGE2OTU5MTBiOGM1NWY4Mzg3NDA1
10
+ MmVjMjEzOTYzYzVkMGNkOGRmNDY0MTM0YmI0ZDc3YTYxMDAxMzE1OGZhNTNh
11
+ NmU4Y2Q5ZTY2ZjA1NDMwZThmYTA1ZDNjNTkzZTMzOGEwMzJlYmE=
12
+ data.tar.gz: !binary |-
13
+ NWIxY2I2NTVjN2RjZDQwMTc5NjQwZDRhODM5MmMwODJiMDQwMGNmM2M4Yzk3
14
+ ZDUxMzJhYjE1ODA3ZGY3NTZmMzJkODg0MmNjZTI2NzA5NjcxZjcxNTYzMzk2
15
+ YWQyZGQ3Y2RmY2RkOTc0NzkzMTYxODI1Mzg4MzA5MDA3YjEyYjQ=
@@ -0,0 +1,2 @@
1
+ ,���������>Z?)��յ�Ũ�#�]WkV��rrv��d��
2
+ �H;�'���E<��-Z7��)����<�� ��q#��Q�����|O��1efh������>QU�g��g�_���Q��+�&�:� F��� C�}��s�/9[�
data.tar.gz.sig CHANGED
@@ -1,3 +1,2 @@
1
- xn)Zn����QP���VUGO�(�%ȩ0(�i[�p�̽p�[�q��:
2
- �ۀ�)�� ���屮{�Yړ���}�:���d���E ������'I���� 2��6�;��d$�H��8ٚ�7/�먇m���=�$&`D�7�8̼�<����}U'!~dZ������ٟ�wr����ѩc2嬼�]gL��G���
3
- ���G�I@�i LDcP��Pÿ���ӣB< Y�®�(���,�;��r_�3��.��
1
+ L
2
+ ��}��+ �n{��`7~�.&JQ~�$lȊ��V��� x{�,��¼�� �(w^><���\�X�[v BC21��J�7���Δ�w4ļѾJ7a��2\r�u|eò� ���^o�p�9p��!������ )�
@@ -1,3 +1,36 @@
1
+ == 1.5.1 / 2014-01-28
2
+
3
+ * color 1.5 was a yanked release.
4
+
5
+ * Minor enhancements:
6
+ * Added new methods to Color::RGB to make it so that the default defined
7
+ colours can be looked up by hex, name, or both.
8
+ * Added a method to Color::RGB to extract colours from text by hex, name, or
9
+ both.
10
+ * Added new common methods for colour names. Converted colours do not retain
11
+ names.
12
+ * Restructured color comparisons to use protocols instead of custom
13
+ implementations. This makes it easier to implement new colour classes. To
14
+ make this work, color classes should +include+ Color only need to implement
15
+ <tt>#coerce(other)</tt>, <tt>#to_a</tt>, and supported conversion methods
16
+ (e.g., <tt>#to_rgb</tt>).
17
+ * Added @daveheitzman’s initial implementation of an RGB contrast method as
18
+ an extension file: <tt>require 'color/rgb/contrast'</tt>. This method and
19
+ the value it returns should be considered experimental; it requires further
20
+ examination to ensure that the results produced are consistent with the
21
+ contrast comparisons used in Color::Palette::MonoContrast.
22
+ * Reducing duplicated code.
23
+
24
+ * Bug Fixes:
25
+ * Moved +lib/color/rgb-colors.rb+ to +lib/color/rgb/colors.rb+. This should
26
+ have no impact in general.
27
+ * Improved the way that named colors are specified internally.
28
+ * Fixed bugs with Ruby 1.8.7 that may have been introduced in color 1.4.2.
29
+
30
+ * Tooling Changes:
31
+ * Added simplecov for test coverage analysis.
32
+ * Modernized Travis CI support.
33
+
1
34
  == 1.4.2 / 2013-06-30
2
35
 
3
36
  Maintenance:
@@ -13,7 +13,7 @@ lib/color/palette.rb
13
13
  lib/color/palette/adobecolor.rb
14
14
  lib/color/palette/gimp.rb
15
15
  lib/color/palette/monocontrast.rb
16
- lib/color/rgb-colors.rb
16
+ lib/color/rgb/colors.rb
17
17
  lib/color/rgb.rb
18
18
  lib/color/rgb/metallic.rb
19
19
  lib/color/yiq.rb
@@ -23,8 +23,20 @@ L*a*b*) are not supported because Color does not yet support colour profiles,
23
23
  giving no meaningful way to convert colours in absolute colour spaces (like
24
24
  L*a*b*, XYZ) to non-absolute colour spaces (like RGB).
25
25
 
26
- Color version 1.4.2 updates the release and install as a RubyGem to remove an
27
- unnecessary dependency, adds code climate analysis, and Travis CI support.
26
+ Color version 1.5.1 is mostly a maintenance release, fixing some bugs that may
27
+ have been introduced with the previous release on Ruby 1.8.7. New features
28
+ include an experimental contrast comparison method for RGB colours (found in
29
+ lib/color/rgb/contrast.rb) provided by Dave Heitzman, and methods suggested by
30
+ Thomas Sawyer based on the Spectrum library.
31
+
32
+ Barring bugs introduced in this release, this will be the last version of color
33
+ that supports Ruby 1.8, so make sure that your gem specification is set
34
+ properly, to <tt>~> 1.5</tt> if that matters for your application.
35
+
36
+ === Note about color 1.5
37
+
38
+ Color 1.5 was released before the documetation was complete and has been
39
+ yanked.
28
40
 
29
41
  == History
30
42
 
data/Rakefile CHANGED
@@ -3,7 +3,6 @@
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
5
 
6
- Hoe.plugin :bundler
7
6
  Hoe.plugin :doofus
8
7
  Hoe.plugin :email
9
8
  Hoe.plugin :gemspec2
@@ -12,9 +11,13 @@ Hoe.plugin :minitest
12
11
  Hoe.plugin :rubyforge
13
12
  Hoe.plugin :travis
14
13
 
15
- Hoe.spec 'color' do
16
- developer "Austin Ziegler", "austin@rubyforge.org"
17
- developer "Matt Lyon", "matt@postsomnia.com"
14
+ spec = Hoe.spec 'color' do
15
+ developer('Austin Ziegler', 'austin@rubyforge.org')
16
+ developer('Matt Lyon', 'matt@postsomnia.com')
17
+
18
+ self.need_tar = true
19
+
20
+ # self.require_ruby_version '>= 1.9.2'
18
21
 
19
22
  self.remote_rdoc_dir = '.'
20
23
  self.rsync_args << ' --exclude=statsvn/'
@@ -22,8 +25,8 @@ Hoe.spec 'color' do
22
25
  self.history_file = 'History.rdoc'
23
26
  self.readme_file = 'README.rdoc'
24
27
  self.extra_rdoc_files = FileList["*.rdoc"].to_a
28
+ self.licenses = ["MIT"]
25
29
 
26
- self.extra_dev_deps << ['hoe-bundler', '~> 1.2']
27
30
  self.extra_dev_deps << ['hoe-doofus', '~> 1.0']
28
31
  self.extra_dev_deps << ['hoe-gemspec2', '~> 1.1']
29
32
  self.extra_dev_deps << ['hoe-git', '~> 1.5']
@@ -32,3 +35,15 @@ Hoe.spec 'color' do
32
35
  self.extra_dev_deps << ['minitest', '~> 5.0']
33
36
  self.extra_dev_deps << ['rake', '~> 10.0']
34
37
  end
38
+
39
+ namespace :test do
40
+ desc "Runs test coverage. Only works Ruby 1.9+ and assumes 'simplecov' is installed."
41
+ task :coverage do
42
+ spec.test_prelude = [
43
+ 'require "simplecov"',
44
+ 'SimpleCov.start("test_frameworks") { command_name "Minitest" }',
45
+ 'gem "minitest"'
46
+ ].join('; ')
47
+ Rake::Task['test'].execute
48
+ end
49
+ end
@@ -3,10 +3,11 @@
3
3
 
4
4
  # = Colour Management with Ruby
5
5
  module Color
6
- COLOR_VERSION = '1.4.2'
6
+ COLOR_VERSION = '1.5.1'
7
7
 
8
8
  class RGB; end
9
9
  class CMYK; end
10
+ class HSL; end
10
11
  class GrayScale; end
11
12
  class YIQ; end
12
13
 
@@ -18,65 +19,115 @@ module Color
18
19
  # tolerance value of each other.
19
20
  COLOR_TOLERANCE = 1e-4
20
21
 
21
- class << self
22
- # Returns +true+ if the value is less than COLOR_EPSILON.
23
- def near_zero?(value)
24
- (value.abs <= COLOR_EPSILON)
25
- end
22
+ # Compares the +other+ colour to this one. The +other+ colour will be
23
+ # coerced to the same type as the current colour. Such converted colour
24
+ # comparisons will always be more approximate than non-converted
25
+ # comparisons.
26
+ #
27
+ # If the +other+ colour cannot be coerced to the current colour class, a
28
+ # +NoMethodError+ exception will be raised.
29
+ #
30
+ # All values are compared as floating-point values, so two colours will be
31
+ # reported equivalent if all component values are within COLOR_TOLERANCE
32
+ # of each other.
33
+ def ==(other)
34
+ Color.equivalent?(self, other)
35
+ end
26
36
 
27
- # Returns +true+ if the value is within COLOR_EPSILON of zero or less than
28
- # zero.
29
- def near_zero_or_less?(value)
30
- (value < 0.0 or near_zero?(value))
31
- end
37
+ # The primary name for the colour.
38
+ def name
39
+ names.first
40
+ end
32
41
 
33
- # Returns +true+ if the value is within COLOR_EPSILON of one.
34
- def near_one?(value)
35
- near_zero?(value - 1.0)
36
- end
42
+ # All names for the colour.
43
+ def names
44
+ self.names = nil unless defined? @names
45
+ @names
46
+ end
47
+ def names=(n) # :nodoc:
48
+ @names = Array(n).flatten.compact.map(&:to_s).map(&:downcase).sort.uniq
49
+ end
50
+ alias_method :name=, :names=
51
+ end
37
52
 
38
- # Returns +true+ if the value is within COLOR_EPSILON of one or more than
39
- # one.
40
- def near_one_or_more?(value)
41
- (value > 1.0 or near_one?(value))
42
- end
53
+ class << Color
54
+ # Returns +true+ if the value is less than COLOR_EPSILON.
55
+ def near_zero?(value)
56
+ (value.abs <= Color::COLOR_EPSILON)
57
+ end
43
58
 
44
- # Normalizes the value to the range (0.0) .. (1.0).
45
- def normalize(value)
46
- if near_zero_or_less? value
47
- 0.0
48
- elsif near_one_or_more? value
49
- 1.0
50
- else
51
- value
52
- end
53
- end
54
- alias normalize_fractional normalize
59
+ # Returns +true+ if the value is within COLOR_EPSILON of zero or less than
60
+ # zero.
61
+ def near_zero_or_less?(value)
62
+ (value < 0.0 or near_zero?(value))
63
+ end
55
64
 
56
- def normalize_to_range(value, range)
57
- range = (range.end..range.begin) if (range.end < range.begin)
65
+ # Returns +true+ if the value is within COLOR_EPSILON of one.
66
+ def near_one?(value)
67
+ near_zero?(value - 1.0)
68
+ end
58
69
 
59
- if value <= range.begin
60
- range.begin
61
- elsif value >= range.end
62
- range.end
63
- else
64
- value
65
- end
66
- end
70
+ # Returns +true+ if the value is within COLOR_EPSILON of one or more than
71
+ # one.
72
+ def near_one_or_more?(value)
73
+ (value > 1.0 or near_one?(value))
74
+ end
75
+
76
+ # Returns +true+ if the two values provided are near each other.
77
+ def near?(x, y)
78
+ (x - y).abs <= Color::COLOR_TOLERANCE
79
+ end
80
+
81
+ # Returns +true+ if the two colours are roughly equivalent. If colour
82
+ # conversions are required, this all conversions will be implemented
83
+ # using the default conversion mechanism.
84
+ def equivalent?(a, b)
85
+ a.to_a.zip(a.coerce(b).to_a).all? { |(x, y)| near?(x, y) }
86
+ end
87
+
88
+ # Coerces, if possible, the second given colour object to the first
89
+ # given colour object type. This will probably involve colour
90
+ # conversion and therefore a loss of fidelity.
91
+ def coerce(a, b)
92
+ a.coerce(b)
93
+ end
67
94
 
68
- # Normalize the value to the range (0) .. (255).
69
- def normalize_byte(value)
70
- normalize_to_range(value, 0..255).to_i
95
+ # Normalizes the value to the range (0.0) .. (1.0).
96
+ def normalize(value)
97
+ if near_zero_or_less? value
98
+ 0.0
99
+ elsif near_one_or_more? value
100
+ 1.0
101
+ else
102
+ value
71
103
  end
72
- alias normalize_8bit normalize_byte
104
+ end
105
+ alias normalize_fractional normalize
106
+
107
+ # Normalizes the value to the specified range.
108
+ def normalize_to_range(value, range)
109
+ range = (range.end..range.begin) if (range.end < range.begin)
73
110
 
74
- # Normalize the value to the range (0) .. (65535).
75
- def normalize_word(value)
76
- normalize_to_range(value, 0..65535).to_i
111
+ if value <= range.begin
112
+ range.begin
113
+ elsif value >= range.end
114
+ range.end
115
+ else
116
+ value
77
117
  end
78
- alias normalize_16bit normalize_word
79
118
  end
119
+
120
+ # Normalize the value to the range (0) .. (255).
121
+ def normalize_byte(value)
122
+ normalize_to_range(value, 0..255).to_i
123
+ end
124
+ alias normalize_8bit normalize_byte
125
+
126
+ # Normalize the value to the range (0) .. (65535).
127
+ def normalize_word(value)
128
+ normalize_to_range(value, 0..65535).to_i
129
+ end
130
+ alias normalize_16bit normalize_word
80
131
  end
81
132
 
82
133
  require 'color/rgb'
@@ -84,10 +135,10 @@ require 'color/cmyk'
84
135
  require 'color/grayscale'
85
136
  require 'color/hsl'
86
137
  require 'color/yiq'
87
- require 'color/rgb/metallic'
138
+ require 'color/css'
88
139
 
89
- module Color
90
- def self.const_missing(name) #:nodoc:
140
+ class << Color
141
+ def const_missing(name) #:nodoc:
91
142
  case name
92
143
  when "VERSION", :VERSION, "COLOR_TOOLS_VERSION", :COLOR_TOOLS_VERSION
93
144
  warn "Color::#{name} has been deprecated. Use Color::COLOR_VERSION instead."
@@ -113,7 +164,7 @@ module Color
113
164
  # Color::RGB object will be created.
114
165
  # mode = :cmyk:: +values+ must be an array of [ cyan %, magenta %, yellow
115
166
  # %, black % ]. A Color::CMYK object will be created.
116
- def self.new(values, mode = :rgb)
167
+ def new(values, mode = :rgb)
117
168
  warn "Color.new has been deprecated. Use Color::#{mode.to_s.upcase}.new instead."
118
169
  color = case mode
119
170
  when :hsl
@@ -3,56 +3,42 @@
3
3
  # would be mixed from 30% cyan, 0% magenta, 80% yellow, and 30% black.
4
4
  # Primarily used in four-colour printing processes.
5
5
  class Color::CMYK
6
+ include Color
7
+
6
8
  # The format of a DeviceCMYK colour for PDF. In color-tools 2.0 this will
7
9
  # be removed from this package and added back as a modification by the
8
10
  # PDF::Writer package.
9
11
  PDF_FORMAT_STR = "%.3f %.3f %.3f %.3f %s"
10
12
 
11
- # Compares the other colour to this one. The other colour will be
12
- # converted to CMYK before comparison, so the comparison between a CMYK
13
- # colour and a non-CMYK colour will be approximate and based on the other
14
- # colour's #to_cmyk conversion. If there is no #to_cmyk conversion, this
15
- # will raise an exception. This will report that two CMYK colours are
16
- # equivalent if all component values are within COLOR_TOLERANCE of each
17
- # other.
18
- def ==(other)
19
- other = other.to_cmyk
20
- other.kind_of?(Color::CMYK) and
21
- ((@c - other.c).abs <= Color::COLOR_TOLERANCE) and
22
- ((@m - other.m).abs <= Color::COLOR_TOLERANCE) and
23
- ((@y - other.y).abs <= Color::COLOR_TOLERANCE) and
24
- ((@k - other.k).abs <= Color::COLOR_TOLERANCE)
13
+ # Coerces the other Color object into CMYK.
14
+ def coerce(other)
15
+ other.to_cmyk
25
16
  end
26
17
 
27
- # Creates a CMYK colour object from fractional values 0..1.
28
- #
29
- # Color::CMYK.from_fraction(0.3, 0, 0.8, 0.3)
30
- def self.from_fraction(c = 0, m = 0, y = 0, k = 0)
31
- colour = Color::CMYK.new
32
- colour.c = c
33
- colour.m = m
34
- colour.y = y
35
- colour.k = k
36
- colour
37
- end
18
+ class << self
19
+ # Creates a CMYK colour object from fractional values 0..1.
20
+ #
21
+ # Color::CMYK.from_fraction(0.3, 0, 0.8, 0.3)
22
+ def from_fraction(c = 0, m = 0, y = 0, k = 0, &block)
23
+ new(c, m, y, k, 1.0, &block)
24
+ end
38
25
 
39
- # Creates a CMYK colour object from percentages. Internally, the colour is
40
- # managed as fractional values 0..1.
41
- #
42
- # Color::CMYK.new(30, 0, 80, 30)
43
- def self.from_percent(c = 0, m = 0, y = 0, k = 0)
44
- Color::CMYK.new(c, m, y, k)
26
+ # Creates a CMYK colour object from percentages. Internally, the colour is
27
+ # managed as fractional values 0..1.
28
+ #
29
+ # Color::CMYK.new(30, 0, 80, 30)
30
+ def from_percent(c = 0, m = 0, y = 0, k = 0, &block)
31
+ new(c, m, y, k, &block)
32
+ end
45
33
  end
46
34
 
47
35
  # Creates a CMYK colour object from percentages. Internally, the colour is
48
36
  # managed as fractional values 0..1.
49
37
  #
50
38
  # Color::CMYK.new(30, 0, 80, 30)
51
- def initialize(c = 0, m = 0, y = 0, k = 0)
52
- @c = c / 100.0
53
- @m = m / 100.0
54
- @y = y / 100.0
55
- @k = k / 100.0
39
+ def initialize(c = 0, m = 0, y = 0, k = 0, radix = 100.0, &block) # :yields self:
40
+ @c, @m, @y, @k = [ c, m, y, k ].map { |v| Color.normalize(v / radix) }
41
+ block.call(self) if block
56
42
  end
57
43
 
58
44
  # Present the colour as a DeviceCMYK fill colour string for PDF. This will
@@ -138,15 +124,10 @@ class Color::CMYK
138
124
  # profiles.
139
125
  def to_rgb(use_adobe_method = false)
140
126
  if use_adobe_method
141
- r = 1.0 - [1.0, @c + @k].min
142
- g = 1.0 - [1.0, @m + @k].min
143
- b = 1.0 - [1.0, @y + @k].min
127
+ Color::RGB.from_fraction(*adobe_cmyk_rgb)
144
128
  else
145
- r = 1.0 - (@c.to_f * (1.0 - @k.to_f) + @k.to_f)
146
- g = 1.0 - (@m.to_f * (1.0 - @k.to_f) + @k.to_f)
147
- b = 1.0 - (@y.to_f * (1.0 - @k.to_f) + @k.to_f)
129
+ Color::RGB.from_fraction(*standard_cmyk_rgb)
148
130
  end
149
- Color::RGB.from_fraction(r, g, b)
150
131
  end
151
132
 
152
133
  # Converts the CMYK colour to a single greyscale value. There are
@@ -264,4 +245,19 @@ class Color::CMYK
264
245
  def k=(kk)
265
246
  @k = Color.normalize(kk)
266
247
  end
248
+
249
+ def to_a
250
+ [ c, m, y, k ]
251
+ end
252
+
253
+ private
254
+ # Implements the Adobe PDF conversion of CMYK to RGB.
255
+ def adobe_cmyk_rgb
256
+ [ @c, @m, @y ].map { |v| 1.0 - [ 1.0, v + @k ].min }
257
+ end
258
+
259
+ # Implements the standard conversion of CMYK to RGB.
260
+ def standard_cmyk_rgb
261
+ [ @c, @m, @y ].map { |v| 1.0 - (v * (1.0 - k) + k) }
262
+ end
267
263
  end