From 26a04d153da54e1716ddecef5f2db0989ae3c0f3 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Mon, 6 Jun 2005 22:21:49 +0000 Subject: pygtk + cairo \!\! --- examples/Makefile.am | 1 + examples/gtk/widget.py | 44 +++++++++++++++++++++------- examples/pango/pangocairo-simple.py | 58 +++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 examples/pango/pangocairo-simple.py (limited to 'examples') diff --git a/examples/Makefile.am b/examples/Makefile.am index 1802c2dc..0a05edf1 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -54,6 +54,7 @@ EXTRA_DIST = \ neil/notebook.py \ neil/question.xpm \ pango/utf8-demo.py \ + pango/pangocairo-simple.py \ simple/README \ simple/dnd.py \ simple/dndpixmap.py \ diff --git a/examples/gtk/widget.py b/examples/gtk/widget.py index 9bb27986..51e187e3 100644 --- a/examples/gtk/widget.py +++ b/examples/gtk/widget.py @@ -5,6 +5,10 @@ import gobject import pango import gtk from gtk import gdk +try: + import cairo +except ImportError: + pass if gtk.pygtk_version < (2,3,93): print "PyGtk 2.3.93 or later required for this example" @@ -21,7 +25,6 @@ class PyGtkWidget(gtk.Widget): } def __init__(self): gtk.Widget.__init__(self) - self.draw_gc = None self.layout = self.create_pango_layout(TEXT) self.layout.set_font_description(pango.FontDescription("sans serif 16")) @@ -34,10 +37,11 @@ class PyGtkWidget(gtk.Widget): window_type=gdk.WINDOW_CHILD, wclass=gdk.INPUT_OUTPUT, event_mask=self.get_events() | gdk.EXPOSURE_MASK) - self.draw_gc = gdk.GC(self.window, - line_width=5, - line_style=gdk.SOLID, - join_style=gdk.JOIN_ROUND) + if not hasattr(self.window, "cairo_create"): + self.draw_gc = gdk.GC(self.window, + line_width=5, + line_style=gdk.SOLID, + join_style=gdk.JOIN_ROUND) self.window.set_user_data(self) self.style.attach(self.window) self.style.set_background(self.window, gtk.STATE_NORMAL) @@ -53,9 +57,7 @@ class PyGtkWidget(gtk.Widget): if self.flags() & gtk.REALIZED: self.window.move_resize(*allocation) - def do_expose_event(self, event): - self.chain(event) - + def _expose_gdk(self, event): x, y, w, h = self.allocation self.window.draw_rectangle(self.draw_gc, False, BORDER_WIDTH, BORDER_WIDTH, @@ -65,14 +67,34 @@ class PyGtkWidget(gtk.Widget): event.area, self, "label", (w - fontw) / 2, (h - fonth) / 2, self.layout) - -gobject.type_register(PyGtkWidget) + + def _expose_cairo(self, event, cr): + x, y, w, h = self.allocation + cr.set_source_color(self.style.fg[self.state]) + cr.rectangle(BORDER_WIDTH, BORDER_WIDTH, + w - 2*BORDER_WIDTH, h - 2*BORDER_WIDTH) + cr.set_line_width(5.0) + cr.set_line_join(cairo.LINE_JOIN_ROUND) + cr.stroke() + fontw, fonth = self.layout.get_pixel_size() + cr.move_to((w - fontw)/2, (h - fonth)/2) + cr.update_layout(self.layout) + cr.show_layout(self.layout) + + def do_expose_event(self, event): + self.chain(event) + try: + cr = self.window.cairo_create() + except AttributeError: + return self._expose_gdk(event) + return self._expose_cairo(event, cr) + win = gtk.Window() win.set_title(TEXT) win.connect('delete-event', gtk.main_quit) -frame = gtk.Frame("Show me a bug") +frame = gtk.Frame("Example frame") win.add(frame) w = PyGtkWidget() diff --git a/examples/pango/pangocairo-simple.py b/examples/pango/pangocairo-simple.py new file mode 100644 index 00000000..c38b8611 --- /dev/null +++ b/examples/pango/pangocairo-simple.py @@ -0,0 +1,58 @@ +#! /usr/bin/env python +import sys +import math +import pango +import cairo +import pangocairo + +RADIUS = 150 + +def draw_text(cr): + N_WORDS = 10 + FONT = "Sans Bold 27" + + # Center coordinates on the middle of the region we are drawing + cr.translate(RADIUS, RADIUS); + + # Create a PangoLayout, set the font and text */ + layout = cr.create_layout() + + layout.set_text("Text") + layout.set_font_description(pango.FontDescription(FONT)) + + # Draw the layout N_WORDS times in a circle + for i in range(N_WORDS): + angle = (360 * i) / N_WORDS; + cr.save() + + # Gradient from red at angle == 60 to blue at angle == 300 + red = (1 + math.cos((angle - 60)*math.pi/180))/2 + cr.set_source_rgb(red, 0, 1 - red) + cr.rotate(angle*math.pi/180) + + # Inform Pango to re-layout the text with the new transformation */ + cr.update_layout(layout) + + width, height = layout.get_size() + cr.move_to(-width/pango.SCALE/2, -RADIUS) + cr.show_layout(layout) + + cr.restore() + +def main(argv): + if len(argv) != 2: + print >> sys.stderr, "Usage: cairosimple OUTPUT_FILENAME.png\n" + return 1 + + filename = argv[1] + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 2*RADIUS, 2*RADIUS) + cr = pangocairo.CairoContext(cairo.Context(surface)) + cr.set_source_rgb(1.0, 1.0, 1.0) + cr.rectangle(0, 0, 2*RADIUS, 2*RADIUS) + cr.fill() + draw_text(cr) + + surface.write_to_png(filename) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) -- cgit v1.2.1