Class: NSColor

Inherits:
Object show all
Defined in:
lib/osx/sugarcube-to_s/nscolor.rb,
lib/osx/sugarcube-color/nscolor.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.blueControlColorObject



7
8
9
# File 'lib/osx/sugarcube-color/nscolor.rb', line 7

def self.blueControlColor
  NSColor.colorForControlTint(NSBlueControlTint)
end

.graphiteControlColorObject



11
12
13
# File 'lib/osx/sugarcube-color/nscolor.rb', line 11

def self.graphiteControlColor
  NSColor.colorForControlTint(NSGraphiteControlTint)
end

.rgba(r, g, b, a) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/osx/sugarcube-color/nscolor.rb', line 32

def self.rgba(r, g, b, a)
  if NSColor.respond_to?('colorWithRed:green:blue:alpha:')
    NSColor.colorWithRed(r, green: g, blue: b, alpha: a)
  else
    NSColor.colorWithCalibratedRed(r, green: g, blue: b, alpha: a)
  end
end

.systemControlColorObject



3
4
5
# File 'lib/osx/sugarcube-color/nscolor.rb', line 3

def self.systemControlColor
  NSColor.colorForControlTint(NSColor.currentControlTint)
end

Instance Method Details

#+(color) ⇒ Object

blends two colors by averaging the RGB and alpha components.

Examples:

:white.nscolor + :black.nscolor == :gray.nscolor


55
56
57
# File 'lib/osx/sugarcube-color/nscolor.rb', line 55

def +(color)
  mix_with(color.nscolor, 0.5)
end

#<<(color) ⇒ Object

blends two colors by adding the colors, with an upper maximum of 255. Adding white to any color will create white, adding black will do nothing. Also takes transparency into account; adding a transparent color has no effect, adding an opaque color has the most effect.

Examples:

:red.nscolor << :blue.nscolor == '#ff00ff'.nscolor (:magenta)
:red.nscolor << :blue.nscolor(0.5) == '#ff0080'.nscolor (pinkish)


66
67
68
69
70
71
72
73
# File 'lib/osx/sugarcube-color/nscolor.rb', line 66

def <<(color)
  r = [1.0, color.red * color.alpha + self.red].min
  g = [1.0, color.green * color.alpha + self.green].min
  b = [1.0, color.blue * color.alpha + self.blue].min
  a = self.alpha

  NSColor.rgba(r, g, b, a)
end

#alphaObject



174
175
176
177
178
# File 'lib/osx/sugarcube-color/nscolor.rb', line 174

def alpha
  alphaComponent
rescue Exception
  nil
end

#blueObject



166
167
168
169
170
171
172
# File 'lib/osx/sugarcube-color/nscolor.rb', line 166

def blue
  blueComponent
rescue NSInvalidArgumentException
  whiteComponent
rescue Exception
  nil
end

#cgcolor(alpha = nil) ⇒ Object



44
45
46
# File 'lib/osx/sugarcube-color/nscolor.rb', line 44

def cgcolor(alpha=nil)
  nscolor(alpha).CGColor
end

#css_nameObject

returns the closest css name



216
217
218
219
220
221
222
223
224
225
226
# File 'lib/osx/sugarcube-color/nscolor.rb', line 216

def css_name
  my_color = self.to_i
  css_name = nil
  Symbol.css_colors.each do |color, hex|
    if hex == my_color
      css_name = color
      break
    end
  end
  return css_name
end

#greenObject



158
159
160
161
162
163
164
# File 'lib/osx/sugarcube-color/nscolor.rb', line 158

def green
  greenComponent
rescue NSInvalidArgumentException
  whiteComponent
rescue Exception
  nil
end

#hexObject



206
207
208
209
210
211
212
213
# File 'lib/osx/sugarcube-color/nscolor.rb', line 206

def hex
  my_color = self.to_i
  if my_color
    return '#' + my_color.to_s(16).rjust(6, '0')
  else
    nil
  end
end

#invertObject

inverts the RGB channel. keeps the alpha channel unchanged

Examples:

:white.nscolor.invert == :black.nscolor


115
116
117
118
119
120
121
# File 'lib/osx/sugarcube-color/nscolor.rb', line 115

def invert
  r = 1.0 - self.red
  g = 1.0 - self.green
  b = 1.0 - self.blue
  a = self.alpha
  NSColor.rgba(r, g, b, a)
end

#mix_with(color, amount) ⇒ Object

a more generic color mixing method. mixes two colors, but a second parameter determines how much of each. 0.5 means equal parts, 0.0 means use all of the first, and 1.0 means use all of the second



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/osx/sugarcube-color/nscolor.rb', line 78

def mix_with(color, amount)
  color = color.nscolor

  # make amount between 0 and 1
  amount = [[0, amount].max, 1].min
  # start with precise amounts: 0, 0.5, and 1.
  if amount == 0 && self.alpha == color.alpha
    self
  elsif amount == 1 && self.alpha == color.alpha
    color
  elsif amount == 0.5 && self.alpha == color.alpha
    r = (self.red + color.red) / 2
    g = (self.green + color.green) / 2
    b = (self.blue + color.blue) / 2
    a = self.alpha
    NSColor.rgba(r, g, b, a)
  else
    a = (color.alpha - self.alpha) * amount + self.alpha
    return NSColor.clearColor if a == 0

    color_red = color.red * color.alpha + self.red * (1 - color.alpha)
    self_red = self.red * self.alpha + color.red * (1 - self.alpha)
    color_green = color.green * color.alpha + self.green * (1 - color.alpha)
    self_green = self.green * self.alpha + color.green * (1 - self.alpha)
    color_blue = color.blue * color.alpha + self.blue * (1 - color.alpha)
    self_blue = self.blue * self.alpha + color.blue * (1 - self.alpha)

    r = (color_red - self_red) * amount + self_red
    g = (color_green - self_green) * amount + self_green
    b = (color_blue - self_blue) * amount + self_blue
    NSColor.rgba(r, g, b, a)
  end
end

#named_color_space?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/osx/sugarcube-color/nscolor.rb', line 40

def named_color_space?
  colorSpaceName == "NSNamedColorSpace"
end

#nscolor(alpha = nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/osx/sugarcube-color/nscolor.rb', line 15

def nscolor(alpha=nil)
  if alpha
    if named_color_space?
      color = self.colorUsingColorSpace(NSColorSpace.genericRGBColorSpace)
      if color
        return color.colorWithAlphaComponent(alpha.to_f)
      end
    end
    return self.colorWithAlphaComponent(alpha.to_f)
  elsif named_color_space?
    color = self.colorUsingColorSpace(NSColorSpace.genericRGBColorSpace)
    return color if color
  end

  return self
end

#redObject

Cannot define method ‘brightness’ because no Objective-C stub was pre-compiled for types ‘d@:’. Make sure you properly link with the framework or library that defines this message. def brightness

brightnessComponent

rescue Exception

nil

end



150
151
152
153
154
155
156
# File 'lib/osx/sugarcube-color/nscolor.rb', line 150

def red
  redComponent
rescue NSInvalidArgumentException
  whiteComponent
rescue Exception
  nil
end

#skcolor(alpha = nil) ⇒ Object



48
49
50
# File 'lib/osx/sugarcube-color/nscolor.rb', line 48

def skcolor(alpha=nil)
  nscolor(alpha)
end

#system_nameObject



228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/osx/sugarcube-color/nscolor.rb', line 228

def system_name
  system_color = nil
  Symbol.nscolors.each do |color_name, method|
    color = NSColor.send(method)
    without_alpha = self.nscolor(color.alpha)
    if color == self || color == without_alpha
      system_color = method
      break
    end
  end
  return system_color
end

#to_aObject

returns the components as an array of 32 bit RGB values. alpha channel is dropped



195
196
197
198
199
200
201
202
203
204
# File 'lib/osx/sugarcube-color/nscolor.rb', line 195

def to_a
  if self.red && self.green && self.blue
    red = (self.red * 255).round
    green = (self.green * 255).round
    blue = (self.blue * 255).round
    return [red, green, blue]
  else
    return nil
  end
end

#to_iObject

returns the components OR’d together, as 32 bit RGB integer. alpha channel is dropped



182
183
184
185
186
187
188
189
190
191
# File 'lib/osx/sugarcube-color/nscolor.rb', line 182

def to_i
  if self.red && self.green && self.blue
    red = (self.red * 255).round << 16
    green = (self.green * 255).round << 8
    blue = (self.blue * 255).round
    return red + green + blue
  else
    return nil
  end
end

#to_sObject



3
4
5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/osx/sugarcube-to_s/nscolor.rb', line 3

def to_s
  return super unless self.respond_to?(:alpha)

  alpha_s = ((alpha || 1) < 1 ? "(#{alpha})" : '')
  if system_name
    return "NSColor.#{system_name}#{alpha_s.length > 0 ? '.colorWithAlphaComponent' + alpha_s : ''}"
  elsif css_name
    return ":#{css_name}.nscolor#{alpha_s}"
  elsif hex
    return "'#{hex}'.nscolor#{alpha_s}"
  else
    super
  end
end