summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-06-06 22:21:49 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-06-06 22:21:49 +0000
commit26a04d153da54e1716ddecef5f2db0989ae3c0f3 (patch)
tree93b1fb3a8777ecad1127b67859c3136f0e01f8ef /examples
parentedb54df2ef7f92519860ea867bc8a9318e33e8c3 (diff)
downloadpygtk-26a04d153da54e1716ddecef5f2db0989ae3c0f3.tar.gz
pygtk + cairo \!\!
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile.am1
-rw-r--r--examples/gtk/widget.py44
-rw-r--r--examples/pango/pangocairo-simple.py58
3 files changed, 92 insertions, 11 deletions
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))