class Elrio::ImageOptimizer

Public Instance Methods

optimize(image, pixel_insets) click to toggle source
# File lib/elrio/image_optimizer.rb, line 3
def optimize(image, pixel_insets)
  target = target_size(pixel_insets)

  return if target.height > image.height || target.width > image.width

  source_x = image.width - pixel_insets.right
  source_y = image.height - pixel_insets.bottom
  target_x = target.width - pixel_insets.right
  target_y = target.height - pixel_insets.bottom
  source_width = pixel_insets.left + pixel_insets.pattern_width
  source_height = pixel_insets.top + pixel_insets.pattern_height

  optimized = ChunkyPNG::Image.new(target.width, target.height)

  copy_rect(
    image,
    optimized,
    Rect.new(0, 0, source_width, source_height),
    Point.new(0, 0)
  )

  copy_rect(
    image,
    optimized,
    Rect.new(source_x, 0, pixel_insets.right, source_height),
    Point.new(target_x, 0)
  )

  copy_rect(
    image,
    optimized,
    Rect.new(0, source_y, source_width, pixel_insets.bottom),
    Point.new(0, target_y)
  )

  copy_rect(
    image,
    optimized,
    Rect.new(source_x, source_y, pixel_insets.right, pixel_insets.bottom),
    Point.new(target_x, target_y)
  )

  optimized
end

Private Instance Methods

copy_rect(src, dest, src_rect, dest_origin) click to toggle source
# File lib/elrio/image_optimizer.rb, line 50
def copy_rect(src, dest, src_rect, dest_origin)
  (0...src_rect.width).each do |x|
    (0...src_rect.height).each do |y|
      src_x = src_rect.x + x
      src_y = src_rect.y + y

      dest_x = dest_origin.x + x
      dest_y = dest_origin.y + y

      dest[dest_x, dest_y] = src[src_x, src_y]
    end
  end
end
target_size(insets) click to toggle source
# File lib/elrio/image_optimizer.rb, line 64
def target_size(insets)
  height = insets.top + insets.bottom + insets.pattern_height
  width = insets.left + insets.right + insets.pattern_width

  Size.new(width, height)
end