Commits

Brendan Howell committed a20f351

some optimization of cairo rendering. -experiments with pango text

Comments (0)

Files changed (2)

 """
     drawing.py
-    Copyright 2009 Brendan Howell (brendan@howell-ersatz.com)
+    Copyright 2012 Brendan Howell (brendan@howell-ersatz.com)
 
     This file is part of PyCessing.
 
 
 import pygame
 import cairo
+import pangocairo
+import pango
 import numpy
 import math
-import Image
+#import Image
 import array
 
-#TODO: could add filters since we are now using PIL
-
-def bgra_surf_to_rgba_string(cairo_surface):
-    # use PIL to do this
-    img = Image.frombuffer(
-        'RGBA', (cairo_surface.get_width(),
-                 cairo_surface.get_height()),
-        cairo_surface.get_data(), 'raw', 'BGRA', 0, 1)
- 
-    return img.tostring('raw', 'RGBA', 0, 1)
 
 class Drawing:
     def __init__(self):
         height = sdl_surface.get_height()
         
         stride = width * 4
-        #pixels = pygame.surfarray.pixels2d(sdl_surface)
-        #self.surface = cairo.ImageSurface.create_for_data(bytes, cairo.FORMAT_RGBA32, width, height)
-        #self.data = numpy.empty(width * height * 4, dtype=numpy.int8)
         self.data = array.array("c",chr(0) * width * height * 4)
         self.surface = cairo.ImageSurface.create_for_data(self.data, cairo.FORMAT_ARGB32, width, height, stride)
-        #self.surface = cairo.ImageSurface.create_for_data(sdl_surface.get_buffer(), cairo.FORMAT_RGB24, width, height, stride)
         self.ctx = cairo.Context(self.surface)
+        self.pangoctx = pangocairo.CairoContext(self.ctx)
+        self.font_map = pangocairo.cairo_font_map_get_default()
+        self.families = self.font_map.list_families()
         
     def setBackground(self, red, green, blue):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.set_source_rgba(blue/255.0, green/255.0, red/255.0, 1)
-        #self.ctx.set_source_rgba(0.4, 0.4, 0.4, 1)
         self.ctx.paint()
-        #self.surface.finish()
-        self._blitToScreen()
-        #self.sdl_surface.fill((red, green, blue))
+        #self._blitToScreen()
+
         
     def setStroke(self, red, green, blue, alpha=255, width=1):
         self.setStrokeWidth(width)
         self.fill = fill
         
     def rect(self, x, y, width, height): 
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.rectangle(x, y, width, height)
         self._fillAndStroke()
     
     def circle(self, cx, cy, radius):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.arc(cx, cy, radius, 0, 2.0 * math.pi)
         self._fillAndStroke()
     
     def ellipse(self, cx, cy, width, height):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.save()
         self.ctx.translate(cx, cy)
         self.ctx.scale(width / 2.0, height / 2.0)
         self._fillAndStroke()
     
     def arc(self, cx, cy, radius, startAngle, endAngle):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.arc(cx, cy, radius, math.radians(startAngle), math.radians(endAngle))
         self._fillAndStroke()
         
     def line(self, x1, y1, x2, y2):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.move_to(x1, y1)
         self.ctx.line_to(x2, y2)
         self._fillAndStroke()
     
     def polygon(self, pointlist):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         x, y = pointlist[0]
         self.ctx.move_to(x, y)
         for point in pointlist[1:]:
         self._fillAndStroke()
                 
     def curve(self, x1, y1, cx1, cy1, cx2, cy2, x2, y2):
-        self.setSurface(self.sdl_surface)
+        #self.setSurface(self.sdl_surface)
         self.ctx.move_to(x1, y1)
         self.ctx.curve_to(cx1, cy1, cx2, cy2, x2, y2)
         self._fillAndStroke()
 
     def screenGrab(self, fileName):
-	pygame.image.save(self.sdl_surface, fileName)
+        pygame.image.save(self.sdl_surface, fileName)
+        
+    def drawText(self, x, y, txt):
+        self.ctx.save()
+        self.ctx.translate(x,y)
+        self.ctx.set_source_rgb(0, 0, 0)
+        layout = self.pangoctx.create_layout()
+        #print dir(self.families[0])
+        print self.families[0].get_name()
+        layout.set_font_description(pango.FontDescription(self.families[0].get_name() + " 25"))
+        layout.set_width(300)
+        layout.set_text(txt)
+        self.pangoctx.update_layout(layout)
+        print('ctx.POS: %s %s'%self.ctx.get_current_point())
+        self.pangoctx.show_layout(layout)
+        print('F => %s %s'%layout.get_pixel_size())
+        self.ctx.restore()
+        #self._blitToScreen()
         
     def _fillAndStroke(self):
         if(self.fill):
         else:
             self.ctx.new_path()
         #self.surface.finish()
-        self._blitToScreen()
+        #self._blitToScreen()
         
     def renderToPDF(self, fileName):
     	self.surface = cairo.PDFSurface(fileName, self.sdl_surface.get_width(), self.sdl_surface.get_height())
     pycessing.doEvents(pygame.fastevent.get())
     draw()
     pycessing.clock.tick(pycessing.framerate)
+    drawing._blitToScreen()
     pygame.display.flip()
     if(pycessing.noLoop):
         while 1: