#!/usr/bin/python3

import png
import gif
import sys

if len (sys.argv) < 3:
    print ('Usage: gif2png [input.gif] [output.png]')
    exit (1)

reader = gif.Reader ()
reader.feed (open (sys.argv[1], 'rb').read ())

if not reader.has_screen_descriptor ():
    print ('Not a valid GIF file')
    exit (1)

writer = png.Writer (reader.width, reader.height, greyscale = False)
rows = []
for y in range (reader.height):
  rows.append ([0] * reader.width * 3);

transparent_color = None
have_image = False
for block in reader.blocks:
    if isinstance (block, gif.GraphicControlExtension):
        if block.has_transparent:
            transparent_color = block.transparent_color
        else:
            transparent_color = None
	# Only render the first frame
        if have_image and block.delay_time > 0:
            break
    elif isinstance (block, gif.Image):
        have_image = True
        indexes = block.get_pixels ()
        x = block.left
        y = block.top
        for i in indexes:
            if len (block.color_table) > 0:
                color = block.color_table[i]
            else:
                color = reader.color_table[i]
            (red, green, blue) = color
            if i != transparent_color:
                rows[y][x * 3 + 0] = red
                rows[y][x * 3 + 1] = green
                rows[y][x * 3 + 2] = blue
            x += 1
            if x >= block.left + block.width:
                x = block.left
                y += 1
                if y >= block.top + block.height:
                    break

writer.write (open (sys.argv[2], 'wb'), rows)
