class UnderOs::Image::Filter

Attributes

image[R]

Public Class Methods

context() click to toggle source

shared EAGL context

# File lib/under_os/image/filter.rb, line 150
def self.context
  @context ||= begin
    gl_context = EAGLContext.alloc.initWithAPI(KEAGLRenderingAPIOpenGLES2)
    options    = {KCIContextWorkingColorSpace => nil}
    CIContext.contextWithEAGLContext(gl_context, options:options)
  end
end
new(params={}) click to toggle source
# File lib/under_os/image/filter.rb, line 6
def initialize(params={})
  self.params = params
end

Private Class Methods

filter_for(name, params) click to toggle source
# File lib/under_os/image/filter.rb, line 185
def self.filter_for(name, params)
  @filters_cache ||= {}
  @filters_cache[name] ||= CIFilter.filterWithName(name.to_s)

  filter = @filters_cache[name]
  filter.setDefaults

  params.each do |key, value|
    filter.setValue(value, forKey: key.to_s)
  end

  filter
end

Public Instance Methods

apply() click to toggle source
# File lib/under_os/image/filter.rb, line 20
def apply
  UnderOs::Image.new(render)
end
apply_to(image) click to toggle source
# File lib/under_os/image/filter.rb, line 10
def apply_to(image)
  self.image = image
  apply
end
aspect_ratio=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 118
def aspect_ratio=(value)
  add_filter :CILanczosScaleTransform, inputAspectRatio: value
end
brightness=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 42
def brightness=(value) # 0.0 +/- 0.25
  add_filter :CIColorControls, inputBrightness: value
end
contrast=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 46
def contrast=(value) # 1.0 +/- 0.25
  add_filter :CIColorControls, inputContrast: value
end
crop=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 122
def crop=(value)
  add_filter :CICrop, inputRectangle: value
end
exposure=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 50
def exposure=(value) # 0.0 +/- 0.25
  add_filter :CIExposureAdjust, inputEV: value
end
highlights=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 66
def highlights=(value) # 0 +/- 1.0
  add_filter :CIToneCurve, inputPoint3: CIVector.vectorWithX(0.75, Y: 0.75 + (0.25 * value))
end
image=(image) click to toggle source
# File lib/under_os/image/filter.rb, line 15
def image=(image)
  @image = CIImage.alloc.initWithImage(
    image.is_a?(UnderOs::Image) ? image._ : image)
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/under_os/image/filter.rb, line 131
def method_missing(name, *args, &block)
  if respond_to?("#{name}=")
    @params[name.to_sym]
  else
    super
  end
end
midtone=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 62
def midtone=(value) # 0 +/- 1.0
  add_filter :CIToneCurve, inputPoint2: CIVector.vectorWithX(0.5, Y: 0.5 + (0.25 * value))
end
mono_color=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 102
def mono_color=(value) # CIColor.colorWithRed(value, green:value, blue:value, alpha:1.0)
  add_filter :CIColorMonochrome, inputColor: value
end
mono_intensity=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 106
def mono_intensity=(value)
  add_filter :CIColorMonochrome, inputIntensity: value
end
params() click to toggle source
# File lib/under_os/image/filter.rb, line 24
def params
  @params ||= {}
end
params=(params) click to toggle source
# File lib/under_os/image/filter.rb, line 28
def params=(params)
  @params  = {} # original param values
  @filters = {}

  params.each do |key, value|
    @params[key.to_sym]  = value
    self.__send__ "#{key}=", value
  end
end
pixellate_center=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 98
def pixellate_center=(value)
  add_filter :CIPixellate, inputCenter: value
end
pixellate_scale=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 94
def pixellate_scale=(value)
  add_filter :CIPixellate, inputScale: value
end
posterize=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 110
def posterize=(value)
  add_filter :CIColorPosterize, inputLevels: value
end
render(image=@image) click to toggle source
# File lib/under_os/image/filter.rb, line 139
def render(image=@image)
  image     = CIImage.alloc.initWithImage(image.is_a?(UnderOs::Image) ? image._ : image) if image != @image
  image     = apply_filters_to(image)
  cg_image  = UnderOs::Image::Filter.context.createCGImage(image, fromRect:image.extent)
  new_image = UIImage.imageWithCGImage(cg_image)
  CGImageRelease(cg_image)

  new_image
end
saturation=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 38
def saturation=(value) # 1.0 +/- 0.25
  add_filter :CIColorControls, inputSaturation: value
end
scale=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 114
def scale=(value)
  add_filter :CILanczosScaleTransform, inputScale: value
end
sepia=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 82
def sepia=(value)
  add_filter :CISepiaTone, inputIntensity: value
end
shadows=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 58
def shadows=(value) # 0 +/- 1.0
  add_filter :CIToneCurve, inputPoint1: CIVector.vectorWithX(0.2, Y: 0.2 + (0.25 * value))
end
sharpen=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 70
def sharpen=(value) # 0.5 +/- 0.5
  add_filter :CIUnsharpMask, inputRadius: 1.5, inputIntensity: value
end
straighten=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 126
def straighten=(value)
  add_filter :CIStraightenFilter, inputAngle: value
end
temperature=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 74
def temperature=(value) # 6500 +/- 1500
  add_filter :CITemperatureAndTint, inputTargetNeutral: CIVector.vectorWithX(value, Y:0)
end
tint=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 78
def tint=(value) # 0.0 +/- 50
  add_filter :CITemperatureAndTint, inputNeutral: CIVector.vectorWithX(6500, Y:-(value))
end
vibrance=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 54
def vibrance=(value) # 0.0 +/- 0.25
  add_filter :CIVibrance, inputAmount: value
end
vignette_intensity=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 90
def vignette_intensity=(value) # 1.0 +/- 1.0
  add_filter :CIVignette, inputIntensity: value
end
vignette_radius=(value) click to toggle source
# File lib/under_os/image/filter.rb, line 86
def vignette_radius=(value) # 1.0 +/- 0.5
  add_filter :CIVignette, inputRadius: value
end

Protected Instance Methods

apply_filters_to(image) click to toggle source
# File lib/under_os/image/filter.rb, line 160
def apply_filters_to(image)
  @filters.each do |name, filter|
    if filter.is_a?(Proc)
      image = instance_exec image, &filter
    else
      filter = self.class.filter_for(name, filter)
      filter.setValue(image, forKey: 'inputImage')
      image = filter.outputImage
      filter.setValue(nil, forKey: 'inputImage')
    end
  end

  image
end

Private Instance Methods

add_filter(name, values={}) click to toggle source
# File lib/under_os/image/filter.rb, line 177
def add_filter(name, values={})
  @filters[name] ||= {}

  values.each do |key, value|
    @filters[name][key] = value
  end
end