summaryrefslogtreecommitdiff
path: root/examples/pygtk-demo/demos/pixbufs.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pygtk-demo/demos/pixbufs.py')
-rw-r--r--examples/pygtk-demo/demos/pixbufs.py200
1 files changed, 0 insertions, 200 deletions
diff --git a/examples/pygtk-demo/demos/pixbufs.py b/examples/pygtk-demo/demos/pixbufs.py
deleted file mode 100644
index c29d1dd8..00000000
--- a/examples/pygtk-demo/demos/pixbufs.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python
-'''Pixbufs
-
-A GdkPixbuf represents an image, normally in RGB or RGBA format.
-Pixbufs are normally used to load files from disk and perform image scaling.
-This demo is not all that educational, but looks cool. It was written by
-Extreme Pixbuf Hacker Federico Mena Quintero. It also shows off how to use
-GtkDrawingArea to do a simple animation.
-Look at the Image demo for additional pixbuf usage examples.'''
-# pygtk version: Maik Hertha <maik.hertha@berlin.de>
-
-import os
-import math
-import gobject
-import gtk
-
-FRAME_DELAY = 50
-CYCLE_LEN = 60
-IMAGE_DIR = os.path.join(os.path.dirname(__file__), 'images')
-BACKGROUND_NAME = "background.jpg"
-
-image_names = [
- "apple-red.png",
- "gnome-applets.png",
- "gnome-calendar.png",
- "gnome-foot.png",
- "gnome-gmush.png",
- "gnome-gimp.png",
- "gnome-gsame.png",
- "gnu-keys.png"
-]
-
-class PixbufsDemo(gtk.Window):
- frame = None # frame of the background image
- background = None # background-pixbuf
- images = [] # list of pixbufs
- back_width = 0 # width of background image
- back_height = 0 # height of background image
- timeout_id = 0 # timeout id
- frame_num = 0 # number of the current frame
- timeout_id = None
-
- def __init__(self, parent=None):
- gtk.Window.__init__(self)
- try:
- self.set_screen(parent.get_screen())
- except AttributeError:
- self.connect("destroy", lambda *w: gtk.main_quit())
- self.connect("destroy", self.cleanup_callback)
- self.set_title(self.__class__.__name__)
- self.set_resizable(False)
-
- if not self.load_pixbufs():
- dialog = gtk.MessageDialog(self,
- gtk.DIALOG_DESTROY_WITH_PARENT,
- gtk.MESSAGE_ERROR,
- gtk.BUTTONS_CLOSE,
- "Failed to load an image")
- dialog.connect("response", lambda d, r: d.destroy())
- dialog.show()
-
- else:
- self.set_size_request(self.back_width, self.back_height)
-
- self.frame = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8,
- self.back_width, self.back_height)
-
- da = gtk.DrawingArea()
- da.connect("expose_event", self.expose_cb)
- self.add(da)
-
- self.timeout_id = gtk.timeout_add(FRAME_DELAY, self.timeout)
-
- self.show_all()
-
- def load_pixbufs(self):
- ''' Loads the images for the demo and returns whether the
- operation succeeded.
- '''
- if self.background is not None:
- return True # already loaded earlier
-
- # look in the the current directory where the file is installed
- try:
- self.background = gtk.gdk.pixbuf_new_from_file(
- os.path.join(IMAGE_DIR, BACKGROUND_NAME))
- except gobject.GError, error:
- return False
-
- self.back_width = self.background.get_width()
- self.back_height = self.background.get_height()
-
- for filename in image_names:
- try:
- self.images.append(gtk.gdk.pixbuf_new_from_file(
- os.path.join(IMAGE_DIR, filename)))
- except gobject.GError, error:
- return False
-
- return True
-
- def expose_cb(self, draw_area, event):
- ''' Expose callback for the drawing area. '''
- rowstride = self.frame.get_rowstride()
-
- # FIXME: what should be the result, string guchar an integer result?
- #pixels = frame.get_pixels() + rowstride * event.area.y + event.area.x * 3
- #pixels = frame.get_pixels()[len(frame.get_pixels()) + rowstride * event.area.y + event.area.x * 3]
- pixels = self.frame.get_pixels()
-
- draw_area.window.draw_rgb_image(
- draw_area.style.black_gc,
- event.area.x, event.area.y,
- event.area.width, event.area.height,
- 'normal',
- pixels, rowstride,
- event.area.x, event.area.y)
-
- return True
-
- def cleanup_callback(self, win):
- if self.timeout_id is not None:
- gtk.timeout_remove(self.timeout_id)
- self.timeout_id = None
-
- def timeout(self):
- ''' Timeout handler to regenerate the frame. '''
- self.background.copy_area(0, 0, self.back_width, self.back_height,
- self.frame, 0, 0)
-
- f = float(self.frame_num % CYCLE_LEN) / float(CYCLE_LEN)
-
- xmid = self.back_width / 2.0
- ymid = self.back_height / 2.0
-
- radius = min(xmid, ymid) / 2.0
-
- N_IMAGES = len(image_names)
- for i_name in image_names:
- i = image_names.index(i_name)
-
- ang = 2.0 * math.pi * i / N_IMAGES - f * 2.0 * math.pi
-
- iw = self.images[i].get_width()
- ih = self.images[i].get_height()
-
- r = radius +(radius / 3.0) * math.sin(f * 2.0 * math.pi)
-
- xpos = math.floor(xmid + r * math.cos(ang) - iw / 2.0 + 0.5)
- ypos = math.floor(ymid + r * math.sin(ang) - ih / 2.0 + 0.5)
-
- if i % 2 == 0:
- k = math.cos(f * 2.0 * math.pi)
- else:
- k = math.sin(f * 2.0 * math.pi)
- k = 2.0 * k * k
- k = max(0.25, k)
-
- # satisfy the c-source
- r1 = gtk.gdk.Rectangle()
- r1.x = int(xpos)
- r1.y = int(ypos)
- r1.width = iw * k
- r1.height = ih * k
-
- r2 = gtk.gdk.Rectangle()
- r2.x = 0
- r2.y = 0
- r2.width = self.back_width
- r2.height = self.back_height
-
- dest = r1.intersect(r2)
- if dest is not None:
- if i % 2 == 0:
- alpha = int(
- max(127, math.fabs(255 * math.cos(f * 2.0 * math.pi))))
- else:
- alpha = int(
- max(127, math.fabs(255 * math.sin(f * 2.0 * math.pi))))
- self.images[i].composite(
- self.frame,
- dest.x, dest.y,
- dest.width, dest.height,
- xpos, ypos,
- k, k,
- gtk.gdk.INTERP_NEAREST,
- alpha)
-
- if self is not None:
- self.queue_draw()
-
- self.frame_num += 1
- return True
-
-def main():
- PixbufsDemo()
- gtk.main()
-
-if __name__ == '__main__':
- main()