module Snowy::CairoDriver

Public Class Methods

render(size, triangles, background, color, outline, angle) click to toggle source
# File lib/snowy/cairo.rb, line 8
def self.render(size, triangles, background, color, outline, angle)
  deg2rad = Math::PI / 180
  surface = Cairo::ImageSurface.new(Cairo::Format::ARGB32, size, size)
  Cairo::Context.new(surface) do |context|
    context.instance_eval do
      set_line_width 0.5
      set_source_color [background.get_red / 255.0, background.get_green / 255.0, background.get_blue / 255.0, background.get_alpha / 255.0]
      paint
      translate(size / 2.0, size / 2.0)
      scale(size / 32.0, size / 32.0)
      rotate(angle * deg2rad) unless deg2rad == 0
      sqrt3 = Math.sqrt(3)
      [30, 90, 150, 210, 270, 330].each do |deg|
        save do
          rotate(-deg * deg2rad)
          scale(1, sqrt3)
          triangles.each do |(x1, y1, x2, y2, x3, y3)|
            move_to(x1, y1)
            line_to(x2, y2)
            line_to(x3, y3)
            close_path
          end
        end
      end
      if outline
        set_source_rgba outline.get_red / 255.0, outline.get_green / 255.0, outline.get_blue / 255.0, 255 / 255.0
        stroke true
      end
      set_source_rgba color.get_red / 255.0, color.get_green / 255.0, color.get_blue / 255.0, 255 / 255.0
      fill
    end
  end

  buffer = "".b
  outport = Object.new
  outport.define_singleton_method(:write, ->(d) { buffer << d; d.bytesize })
  surface.write_to_png outport
  buffer
end