Sha256: 5f1ecaf322d3aa35af7e5468940a981867168f6a14305b304fa6d92e4cfca625

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

class ASE
  module Writer
    def to_file(file)
      @file = file
      write!
    end

    def write!
      raise "Must specify an output file" if @file.nil?
      @file = File.new(@file, 'wb')

      palette_count = @palettes.keys.length
      color_count = @palettes.values.map{ |p| p.size }.inject { |sum, i| sum + i }

      # Signature
      @file.write "ASEF"

      # Version
      @file.write_ushort 1, 0

      # Number of blocks
      @file.write_ulong(color_count + (palette_count * 2))

      @palettes.each do |palette_name, palette|
        # Block start
        @file.write_ushort 0xC001

        # Block length (title is UTF-16 encoded)
        @file.write_ulong 4 + (palette_name.length * 2)

        # Palette name
        @file.write_string palette_name

        palette.colors.each do |name, color|
          # Color start
          @file.write_ushort 1

          # Block length
          @file.write_ulong 22 + (name.length * 2)

          # Color name
          @file.write_string name

          # Color mode
          @file.write 'RGB '

          # Colors
          rgb = color.to_rgb.map { |c| c.to_f / 255 }
          rgb.each { |c| @file.write [c].pack('F').reverse }
          
          # End of colors
          @file.write_null_byte
        end

        @file.write_ushort 0xC002 # Group end
        @file.write_ulong 0 # Group end block
      end

      @file.close
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ase-1.0.3 lib/ase/writer.rb