timocratic-color 1.4.1.0

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,281 @@
1
+ #--
2
+ # Color
3
+ # Colour management with Ruby
4
+ # http://rubyforge.org/projects/color
5
+ # Version 1.4.0
6
+ #
7
+ # Licensed under a MIT-style licence. See Licence.txt in the main
8
+ # distribution for full licensing information.
9
+ #
10
+ # Copyright (c) 2005 - 2007 Austin Ziegler and Matt Lyon
11
+ #
12
+ # $Id: test_all.rb 55 2007-02-03 23:29:34Z austin $
13
+ #++
14
+
15
+ # An CMYK colour object. CMYK (cyan, magenta, yellow, and black) colours are
16
+ # based on additive percentages of ink. A CMYK colour of (0.3, 0, 0.8, 0.3)
17
+ # would be mixed from 30% cyan, 0% magenta, 80% yellow, and 30% black.
18
+ # Primarily used in four-colour printing processes.
19
+ class Color::CMYK
20
+ # The format of a DeviceCMYK colour for PDF. In color-tools 2.0 this will
21
+ # be removed from this package and added back as a modification by the
22
+ # PDF::Writer package.
23
+ PDF_FORMAT_STR = "%.3f %.3f %.3f %.3f %s"
24
+
25
+ # Compares the other colour to this one. The other colour will be
26
+ # converted to CMYK before comparison, so the comparison between a CMYK
27
+ # colour and a non-CMYK colour will be approximate and based on the other
28
+ # colour's #to_cmyk conversion. If there is no #to_cmyk conversion, this
29
+ # will raise an exception. This will report that two CMYK colours are
30
+ # equivalent if all component values are within COLOR_TOLERANCE of each
31
+ # other.
32
+ def ==(other)
33
+ other = other.to_cmyk
34
+ other.kind_of?(Color::CMYK) and
35
+ ((@c - other.c).abs <= Color::COLOR_TOLERANCE) and
36
+ ((@m - other.m).abs <= Color::COLOR_TOLERANCE) and
37
+ ((@y - other.y).abs <= Color::COLOR_TOLERANCE) and
38
+ ((@k - other.k).abs <= Color::COLOR_TOLERANCE)
39
+ end
40
+
41
+ # Creates a CMYK colour object from fractional values 0..1.
42
+ #
43
+ # Color::CMYK.from_fraction(0.3, 0, 0.8, 0.3)
44
+ def self.from_fraction(c = 0, m = 0, y = 0, k = 0)
45
+ colour = Color::CMYK.new
46
+ colour.c = c
47
+ colour.m = m
48
+ colour.y = y
49
+ colour.k = k
50
+ colour
51
+ end
52
+
53
+ # Creates a CMYK colour object from percentages. Internally, the colour is
54
+ # managed as fractional values 0..1.
55
+ #
56
+ # Color::CMYK.new(30, 0, 80, 30)
57
+ def self.from_percent(c = 0, m = 0, y = 0, k = 0)
58
+ Color::CMYK.new(c, m, y, k)
59
+ end
60
+
61
+ # Creates a CMYK colour object from percentages. Internally, the colour is
62
+ # managed as fractional values 0..1.
63
+ #
64
+ # Color::CMYK.new(30, 0, 80, 30)
65
+ def initialize(c = 0, m = 0, y = 0, k = 0)
66
+ @c = c / 100.0
67
+ @m = m / 100.0
68
+ @y = y / 100.0
69
+ @k = k / 100.0
70
+ end
71
+
72
+ # Present the colour as a DeviceCMYK fill colour string for PDF. This will
73
+ # be removed from the default package in color-tools 2.0.
74
+ def pdf_fill
75
+ PDF_FORMAT_STR % [ @c, @m, @y, @k, "k" ]
76
+ end
77
+
78
+ # Present the colour as a DeviceCMYK stroke colour string for PDF. This
79
+ # will be removed from the default package in color-tools 2.0.
80
+ def pdf_stroke
81
+ PDF_FORMAT_STR % [ @c, @m, @y, @k, "K" ]
82
+ end
83
+
84
+ # Present the colour as an RGB HTML/CSS colour string (e.g., "#aabbcc").
85
+ # Note that this will perform a #to_rgb operation using the default
86
+ # conversion formula.
87
+ def html
88
+ to_rgb.html
89
+ end
90
+
91
+ # Present the colour as an RGB HTML/CSS colour string (e.g., "rgb(0%, 50%,
92
+ # 100%)"). Note that this will perform a #to_rgb operation using the
93
+ # default conversion formula.
94
+ def css_rgb
95
+ to_rgb.css_rgb
96
+ end
97
+
98
+ # Present the colour as an RGBA (with alpha) HTML/CSS colour string (e.g.,
99
+ # "rgb(0%, 50%, 100%, 1)"). Note that this will perform a #to_rgb
100
+ # operation using the default conversion formula.
101
+ def css_rgba
102
+ to_rgb.css_rgba
103
+ end
104
+
105
+ # Present the colour as an HSL HTML/CSS colour string (e.g., "hsl(180,
106
+ # 25%, 35%)"). Note that this will perform a #to_hsl operation using the
107
+ # default conversion formula.
108
+ def css_hsl
109
+ to_hsl.css_hsl
110
+ end
111
+
112
+ # Present the colour as an HSLA (with alpha) HTML/CSS colour string (e.g.,
113
+ # "hsla(180, 25%, 35%, 1)"). Note that this will perform a #to_hsl
114
+ # operation using the default conversion formula.
115
+ def css_hsla
116
+ to_hsl.css_hsla
117
+ end
118
+
119
+ # Converts the CMYK colour to RGB. Most colour experts strongly suggest
120
+ # that this is not a good idea (some even suggesting that it's a very bad
121
+ # idea). CMYK represents additive percentages of inks on white paper,
122
+ # whereas RGB represents mixed colour intensities on a black screen.
123
+ #
124
+ # However, the colour conversion can be done, and there are two different
125
+ # methods for the conversion that provide slightly different results.
126
+ # Adobe PDF conversions are done with the first form.
127
+ #
128
+ # # Adobe PDF Display Formula
129
+ # r = 1.0 - min(1.0, c + k)
130
+ # g = 1.0 - min(1.0, m + k)
131
+ # b = 1.0 - min(1.0, y + k)
132
+ #
133
+ # # Other
134
+ # r = 1.0 - (c * (1.0 - k) + k)
135
+ # g = 1.0 - (m * (1.0 - k) + k)
136
+ # b = 1.0 - (y * (1.0 - k) + k)
137
+ #
138
+ # If we have a CMYK colour of [33% 66% 83% 25%], the first method will
139
+ # give an approximate RGB colour of (107, 23, 0) or #6b1700. The second
140
+ # method will give an approximate RGB colour of (128, 65, 33) or #804121.
141
+ # Which is correct? Although the colours may seem to be drastically
142
+ # different in the RGB colour space, they are very similar colours,
143
+ # differing mostly in intensity. The first is a darker, slightly redder
144
+ # brown; the second is a lighter brown.
145
+ #
146
+ # Because of this subtlety, both methods are now offered for conversion.
147
+ # The Adobe method is not used by default; to enable it, pass +true+ to
148
+ # #to_rgb.
149
+ #
150
+ # Future versions of Color may offer other conversion mechanisms that
151
+ # offer greater colour fidelity, including recognition of ICC colour
152
+ # profiles.
153
+ def to_rgb(use_adobe_method = false)
154
+ if use_adobe_method
155
+ r = 1.0 - [1.0, @c + @k].min
156
+ g = 1.0 - [1.0, @m + @k].min
157
+ b = 1.0 - [1.0, @y + @k].min
158
+ else
159
+ r = 1.0 - (@c.to_f * (1.0 - @k.to_f) + @k.to_f)
160
+ g = 1.0 - (@m.to_f * (1.0 - @k.to_f) + @k.to_f)
161
+ b = 1.0 - (@y.to_f * (1.0 - @k.to_f) + @k.to_f)
162
+ end
163
+ Color::RGB.from_fraction(r, g, b)
164
+ end
165
+
166
+ # Converts the CMYK colour to a single greyscale value. There are
167
+ # undoubtedly multiple methods for this conversion, but only a minor
168
+ # variant of the Adobe conversion method will be used:
169
+ #
170
+ # g = 1.0 - min(1.0, 0.299 * c + 0.587 * m + 0.114 * y + k)
171
+ #
172
+ # This treats the CMY values similarly to YIQ (NTSC) values and then adds
173
+ # the level of black. This is a variant of the Adobe version because it
174
+ # uses the more precise YIQ (NTSC) conversion values for Y (intensity)
175
+ # rather than the approximates provided by Adobe (0.3, 0.59, and 0.11).
176
+ def to_grayscale
177
+ c = 0.299 * @c.to_f
178
+ m = 0.587 * @m.to_f
179
+ y = 0.114 * @y.to_f
180
+ g = 1.0 - [1.0, c + m + y + @k].min
181
+ Color::GrayScale.from_fraction(g)
182
+ end
183
+ alias to_greyscale to_grayscale
184
+
185
+ def to_cmyk
186
+ self
187
+ end
188
+
189
+ def inspect
190
+ "CMYK [%.2f%%, %.2f%%, %.2f%%, %.2f%%]" % [ cyan, magenta, yellow, black ]
191
+ end
192
+
193
+ # Converts to RGB then YIQ.
194
+ def to_yiq
195
+ to_rgb.to_yiq
196
+ end
197
+
198
+ # Converts to RGB then HSL.
199
+ def to_hsl
200
+ to_rgb.to_hsl
201
+ end
202
+
203
+ # Returns the cyan (C) component of the CMYK colour as a percentage value.
204
+ def cyan
205
+ @c * 100.0
206
+ end
207
+ # Returns the cyan (C) component of the CMYK colour as a value in the
208
+ # range 0.0 .. 1.0.
209
+ def c
210
+ @c
211
+ end
212
+ # Sets the cyan (C) component of the CMYK colour as a percentage value.
213
+ def cyan=(cc)
214
+ @c = Color.normalize(cc / 100.0)
215
+ end
216
+ # Sets the cyan (C) component of the CMYK colour as a value in the range
217
+ # 0.0 .. 1.0.
218
+ def c=(cc)
219
+ @c = Color.normalize(cc)
220
+ end
221
+
222
+ # Returns the magenta (M) component of the CMYK colour as a percentage
223
+ # value.
224
+ def magenta
225
+ @m * 100.0
226
+ end
227
+ # Returns the magenta (M) component of the CMYK colour as a value in the
228
+ # range 0.0 .. 1.0.
229
+ def m
230
+ @m
231
+ end
232
+ # Sets the magenta (M) component of the CMYK colour as a percentage value.
233
+ def magenta=(mm)
234
+ @m = Color.normalize(mm / 100.0)
235
+ end
236
+ # Sets the magenta (M) component of the CMYK colour as a value in the
237
+ # range 0.0 .. 1.0.
238
+ def m=(mm)
239
+ @m = Color.normalize(mm)
240
+ end
241
+
242
+ # Returns the yellow (Y) component of the CMYK colour as a percentage
243
+ # value.
244
+ def yellow
245
+ @y * 100.0
246
+ end
247
+ # Returns the yellow (Y) component of the CMYK colour as a value in the
248
+ # range 0.0 .. 1.0.
249
+ def y
250
+ @y
251
+ end
252
+ # Sets the yellow (Y) component of the CMYK colour as a percentage value.
253
+ def yellow=(yy)
254
+ @y = Color.normalize(yy / 100.0)
255
+ end
256
+ # Sets the yellow (Y) component of the CMYK colour as a value in the range
257
+ # 0.0 .. 1.0.
258
+ def y=(kk)
259
+ @y = Color.normalize(kk)
260
+ end
261
+
262
+ # Returns the black (K) component of the CMYK colour as a percentage
263
+ # value.
264
+ def black
265
+ @k * 100.0
266
+ end
267
+ # Returns the black (K) component of the CMYK colour as a value in the
268
+ # range 0.0 .. 1.0.
269
+ def k
270
+ @k
271
+ end
272
+ # Sets the black (K) component of the CMYK colour as a percentage value.
273
+ def black=(kk)
274
+ @k = Color.normalize(kk / 100.0)
275
+ end
276
+ # Sets the black (K) component of the CMYK colour as a value in the range
277
+ # 0.0 .. 1.0.
278
+ def k=(kk)
279
+ @k = Color.normalize(kk)
280
+ end
281
+ end
@@ -0,0 +1,30 @@
1
+ #--
2
+ # Color
3
+ # Colour management with Ruby
4
+ # http://rubyforge.org/projects/color
5
+ # Version 1.4.0
6
+ #
7
+ # Licensed under a MIT-style licence. See Licence.txt in the main
8
+ # distribution for full licensing information.
9
+ #
10
+ # Copyright (c) 2005 - 2007 Austin Ziegler and Matt Lyon
11
+ #
12
+ # $Id: test_all.rb 55 2007-02-03 23:29:34Z austin $
13
+ #++
14
+
15
+ require 'color'
16
+
17
+ # This namespace contains some CSS colour names.
18
+ module Color::CSS
19
+ # Returns the RGB colour for name or +nil+ if the name is not valid.
20
+ def self.[](name)
21
+ @colors[name.to_s.downcase.to_sym]
22
+ end
23
+
24
+ @colors = {}
25
+ Color::RGB.constants.each do |const|
26
+ next if const == "PDF_FORMAT_STR"
27
+ next if const == "Metallic"
28
+ @colors[const.downcase.to_sym] ||= Color::RGB.const_get(const)
29
+ end
30
+ end
@@ -0,0 +1,214 @@
1
+ #--
2
+ # Color
3
+ # Colour management with Ruby
4
+ # http://rubyforge.org/projects/color
5
+ # Version 1.4.0
6
+ #
7
+ # Licensed under a MIT-style licence. See Licence.txt in the main
8
+ # distribution for full licensing information.
9
+ #
10
+ # Copyright (c) 2005 - 2007 Austin Ziegler and Matt Lyon
11
+ #
12
+ # $Id: test_all.rb 55 2007-02-03 23:29:34Z austin $
13
+ #++
14
+
15
+ # A colour object representing shades of grey. Used primarily in PDF
16
+ # document creation.
17
+ class Color::GrayScale
18
+ # The format of a DeviceGrey colour for PDF. In color-tools 2.0 this will
19
+ # be removed from this package and added back as a modification by the
20
+ # PDF::Writer package.
21
+ PDF_FORMAT_STR = "%.3f %s"
22
+
23
+ # Creates a greyscale colour object from fractional values 0..1.
24
+ #
25
+ # Color::GreyScale.from_fraction(0.5)
26
+ def self.from_fraction(g = 0)
27
+ color = Color::GrayScale.new
28
+ color.g = g
29
+ color
30
+ end
31
+
32
+ # Creates a greyscale colour object from percentages 0..100.
33
+ #
34
+ # Color::GrayScale.from_percent(50)
35
+ def self.from_percent(g = 0)
36
+ Color::GrayScale.new(g)
37
+ end
38
+
39
+ # Creates a greyscale colour object from percentages 0..100.
40
+ #
41
+ # Color::GrayScale.new(50)
42
+ def initialize(g = 0)
43
+ @g = g / 100.0
44
+ end
45
+
46
+ # Compares the other colour to this one. The other colour will be
47
+ # converted to GreyScale before comparison, so the comparison between a
48
+ # GreyScale colour and a non-GreyScale colour will be approximate and
49
+ # based on the other colour's #to_greyscale conversion. If there is no
50
+ # #to_greyscale conversion, this will raise an exception. This will report
51
+ # that two GreyScale values are equivalent if they are within
52
+ # COLOR_TOLERANCE of each other.
53
+ def ==(other)
54
+ other = other.to_grayscale
55
+ other.kind_of?(Color::GrayScale) and
56
+ ((@g - other.g).abs <= Color::COLOR_TOLERANCE)
57
+ end
58
+
59
+ # Present the colour as a DeviceGrey fill colour string for PDF. This will
60
+ # be removed from the default package in color-tools 2.0.
61
+ def pdf_fill
62
+ PDF_FORMAT_STR % [ @g, "g" ]
63
+ end
64
+
65
+ # Present the colour as a DeviceGrey stroke colour string for PDF. This
66
+ # will be removed from the default package in color-tools 2.0.
67
+ def pdf_stroke
68
+ PDF_FORMAT_STR % [ @g, "G" ]
69
+ end
70
+
71
+ def to_255
72
+ [(@g * 255).round, 255].min
73
+ end
74
+ private :to_255
75
+
76
+ # Present the colour as an HTML/CSS colour string.
77
+ def html
78
+ gs = "%02x" % to_255
79
+ "##{gs * 3}"
80
+ end
81
+
82
+ # Present the colour as an RGB HTML/CSS colour string (e.g., "rgb(0%, 50%,
83
+ # 100%)").
84
+ def css_rgb
85
+ "rgb(%3.2f%%, %3.2f%%, %3.2f%%)" % [ gray, gray, gray ]
86
+ end
87
+
88
+ # Present the colour as an RGBA (with alpha) HTML/CSS colour string (e.g.,
89
+ # "rgb(0%, 50%, 100%, 1)").
90
+ def css_rgba
91
+ "rgba(%3.2f%%, %3.2f%%, %3.2f%%, %1.2f)" % [ gray, gray, gray, 1 ]
92
+ end
93
+
94
+ # Present the colour as an HSL HTML/CSS colour string (e.g., "hsl(180,
95
+ # 25%, 35%)"). Note that this will perform a #to_hsl operation.
96
+ def css_hsl
97
+ to_hsl.css_hsl
98
+ end
99
+
100
+ # Present the colour as an HSLA (with alpha) HTML/CSS colour string (e.g.,
101
+ # "hsla(180, 25%, 35%, 1)"). Note that this will perform a #to_hsl
102
+ # operation.
103
+ def css_hsla
104
+ to_hsl.css_hsla
105
+ end
106
+
107
+ # Convert the greyscale colour to CMYK.
108
+ def to_cmyk
109
+ k = 1.0 - @g.to_f
110
+ Color::CMYK.from_fraction(0, 0, 0, k)
111
+ end
112
+
113
+ # Convert the greyscale colour to RGB.
114
+ def to_rgb(ignored = true)
115
+ Color::RGB.from_fraction(g, g, g)
116
+ end
117
+
118
+ # Reflexive conversion.
119
+ def to_grayscale
120
+ self
121
+ end
122
+ alias to_greyscale to_grayscale
123
+
124
+ # Lightens the greyscale colour by the stated percent.
125
+ def lighten_by(percent)
126
+ g = [@g + (@g * (percent / 100.0)), 1.0].min
127
+ Color::GrayScale.from_fraction(g)
128
+ end
129
+
130
+ # Darken the greyscale colour by the stated percent.
131
+ def darken_by(percent)
132
+ g = [@g - (@g * (percent / 100.0)), 0.0].max
133
+ Color::GrayScale.from_fraction(g)
134
+ end
135
+
136
+ # Returns the YIQ (NTSC) colour encoding of the greyscale value. This is
137
+ # an approximation, as the values for I and Q are calculated by treating
138
+ # the greyscale value as an RGB value. The Y (intensity or brightness)
139
+ # value is the same as the greyscale value.
140
+ def to_yiq
141
+ y = @g
142
+ i = (@g * 0.596) + (@g * -0.275) + (@g * -0.321)
143
+ q = (@g * 0.212) + (@g * -0.523) + (@g * 0.311)
144
+ Color::YIQ.from_fraction(y, i, q)
145
+ end
146
+
147
+ # Returns the HSL colour encoding of the greyscale value.
148
+ def to_hsl
149
+ Color::HSL.from_fraction(0, 0, @g)
150
+ end
151
+
152
+ # Returns the brightness value for this greyscale value; this is the
153
+ # greyscale value itself.
154
+ def brightness
155
+ @g
156
+ end
157
+
158
+ # Returns the grayscale value as a percentage of white (100% gray is
159
+ # white).
160
+ def gray
161
+ @g * 100.0
162
+ end
163
+ alias grey gray
164
+ # Returns the grayscale value as a fractional value of white in the range
165
+ # 0.0 .. 1.0.
166
+ def g
167
+ @g
168
+ end
169
+ # Sets the grayscale value as a percentage of white.
170
+ def gray=(gg)
171
+ @g = Color.normalize(gg / 100.0)
172
+ end
173
+ alias grey= gray= ;
174
+ # Returns the grayscale value as a fractional value of white in the range
175
+ # 0.0 .. 1.0.
176
+ def g=(gg)
177
+ @g = Color.normalize(gg)
178
+ end
179
+
180
+ # Adds another colour to the current colour. The other colour will be
181
+ # converted to grayscale before addition. This conversion depends upon a
182
+ # #to_grayscale method on the other colour.
183
+ #
184
+ # The addition is done using the grayscale accessor methods to ensure a
185
+ # valid colour in the result.
186
+ def +(other)
187
+ other = other.to_grayscale
188
+ ng = self.dup
189
+ ng.g += other.g
190
+ ng
191
+ end
192
+
193
+ # Subtracts another colour to the current colour. The other colour will be
194
+ # converted to grayscale before subtraction. This conversion depends upon
195
+ # a #to_grayscale method on the other colour.
196
+ #
197
+ # The subtraction is done using the grayscale accessor methods to ensure a
198
+ # valid colour in the result.
199
+ def -(other)
200
+ other = other.to_grayscale
201
+ ng = self.dup
202
+ ng.g -= other.g
203
+ ng
204
+ end
205
+
206
+ def inspect
207
+ "Gray [%.2f%%]" % [ gray ]
208
+ end
209
+ end
210
+
211
+ module Color
212
+ # A synonym for Color::GrayScale.
213
+ GreyScale = GrayScale
214
+ end