import gtk
import numpy
import base64

IMAGE = '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'


# http://www.pygtk.org/pygtk2tutorial/ch-GettingStarted.html
class Base:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(200, 200)
        self.window.connect("destroy", self.destroy)
        self.window.connect("activate-focus", self.invert_colors)

        self.image = gtk.Image()
        open("/tmp/chaos.jpg", 'w').write(base64.b64decode(IMAGE))
        self.image.set_from_file("/tmp/chaos.jpg")
        self.image.show()

        self.window.add(self.image)

        self.window.show()

    def main(self):
        gtk.main()

    def invert_colors(self, *args):
        # http://www.pygtk.org/pygtk2tutorial/sec-Images.html
        temp_pix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 200, 200)
        self.pixbuf = self.image.get_pixbuf()
        temp_pix = self.sugar_paint_invert_colors(self.pixbuf)
        self.image.set_from_pixbuf(temp_pix)

    def sugar_paint_invert_colors(self, temp_pix):
        # http://git.sugarlabs.org/paint/mainline/blobs/master/Area.py#line1033
        def proc_invert_color(temp_pix):
            pix_manip2 = temp_pix.get_pixels_array()
            pix_manip = numpy.ones(pix_manip2.shape, dtype=numpy.uint8) \
                        * 255
            pix_manip2 = pix_manip - pix_manip2
            temp_pix = gtk.gdk.pixbuf_new_from_array(pix_manip2,
                                                     gtk.gdk.COLORSPACE_RGB, 8)
            return temp_pix
        return proc_invert_color(temp_pix)

    # Another callback
    def destroy(self, widget, data=None):
        gtk.main_quit()

if __name__ == "__main__":
    base = Base()
    base.main()
