class ShatteredMachine::Transpose

Use the transpose algorithm from pnglitch on a given png image.

Constants

ALL_FILTERS

Public Class Methods

new(options = {}) click to toggle source

@param options [Hash] options for transpose algorithm

# File lib/shattered_machine/transpose.rb, line 10
def initialize(options = {})
  @filter = define_filter(options[:filter]) || 'average'
  @transpose_force = options[:transpose_force] || 'half'
end

Public Instance Methods

call(input_image, output_image) click to toggle source

@param input_image [string] path for image @param output_image [string] path for output transposed image @return [boolean] status of transpose

# File lib/shattered_machine/transpose.rb, line 18
def call(input_image, output_image)
  PNGlitch.open(input_image) do |png|
    filtered_glitch(png, @filter).save output_image
  end
  output_image
end

Private Instance Methods

define_filter(filter_from_options) click to toggle source
# File lib/shattered_machine/transpose.rb, line 27
def define_filter(filter_from_options)
  return filter_from_options unless filter_from_options == 'random'

  ALL_FILTERS[rand(5)]
end
filtered_glitch(png, custom_filter) click to toggle source
# File lib/shattered_machine/transpose.rb, line 33
def filtered_glitch(png, custom_filter)
  png.each_scanline do |scanline|
    scanline.change_filter custom_filter
  end
  png.glitch do |data|
    transpose_data(data)
  end
end
full_transpose(data, qis) click to toggle source
# File lib/shattered_machine/transpose.rb, line 53
def full_transpose(data, qis)
  data[qis * 2, qis] + data[0, qis] + data[qis * 3..-1] + data[qis * 1, qis]
end
half_transpose(data, qis) click to toggle source
# File lib/shattered_machine/transpose.rb, line 49
def half_transpose(data, qis)
  data[0, qis] + data[qis * 2, qis] + data[qis * 1, qis] + data[qis * 3..-1]
end
transpose_data(data) click to toggle source
# File lib/shattered_machine/transpose.rb, line 42
def transpose_data(data)
  quarter_image_size = data.size / 4
  return half_transpose(data, quarter_image_size) if @transpose_force == 'half'

  full_transpose(data, quarter_image_size)
end