@@ -89,12 +89,11 @@ class RendererCairo(RendererBase):
89
89
}
90
90
91
91
92
- def __init__ (self , matrix , dpi ):
92
+ def __init__ (self , dpi ):
93
93
"""width, height - the canvas width, height. Is not necessarily
94
94
the same as the surface (pixmap) width, height
95
95
"""
96
96
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
97
- self .matrix = matrix
98
97
self .dpi = dpi
99
98
self .text_ctx = cairo .Context ()
100
99
@@ -105,6 +104,9 @@ def _set_pixmap(self, pixmap):
105
104
def _set_width_height (self , width , height ):
106
105
self .width = width
107
106
self .height = height
107
+ self .matrix_flipy = cairo .Matrix (d = - 1 , ty = self .height )
108
+ # use matrix_flipy for ALL rendering?
109
+ # - problem with text? - will need to switch matrix_flipy off, or do a font transform?
108
110
109
111
def draw_arc (self , gc , rgbFace , x , y , width , height , angle1 , angle2 ):
110
112
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
@@ -141,7 +143,6 @@ def draw_image(self, x, y, im, origin, bbox):
141
143
142
144
ctx = cairo .Context ()
143
145
ctx .set_target_surface (self .surface )
144
- ctx .set_matrix (self .matrix )
145
146
146
147
rows , cols , buf = im .buffer_argb32 () # ARGB32, but colors still wrong
147
148
X = fromstring (buf , UInt8 )
@@ -178,27 +179,29 @@ def draw_line(self, gc, x1, y1, x2, y2):
178
179
ctx .stroke ()
179
180
180
181
181
- #def draw_lines(self, gc, x, y):
182
182
def draw_lines (self , gc , x , y , transform = None ):
183
183
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
184
184
185
- # guessing what needs to be done
186
185
if transform :
187
186
if transform .need_nonlinear ():
188
187
x , y = transform .nonlinear_only_numerix (x , y )
189
188
x , y = transform .numerix_x_y (x , y )
190
189
191
- y = [self .height - y for y in y ]
192
- points = zip (x ,y )
193
- x , y = points .pop (0 )
194
190
ctx = gc .ctx
191
+ matrix_old = ctx .matrix
192
+ ctx .set_matrix (self .matrix_flipy )
193
+
194
+ points = izip (x ,y )
195
+ x , y = points .next ()
195
196
ctx .new_path ()
196
197
ctx .move_to (x , y )
197
198
198
199
for x ,y in points :
199
200
ctx .line_to (x , y )
200
201
ctx .stroke ()
201
202
203
+ ctx .set_matrix (matrix_old )
204
+
202
205
203
206
def draw_markers (self , gc , path , x , y , transform ):
204
207
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
@@ -221,6 +224,7 @@ def draw_markers(self, gc, path, x, y, transform):
221
224
222
225
def generate_path (path ):
223
226
"""trace path and return fill_rgb
227
+ coords are mpl points
224
228
"""
225
229
for p in path :
226
230
code = p [0 ]
@@ -266,11 +270,14 @@ def draw_polygon(self, gc, rgbFace, points):
266
270
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
267
271
268
272
ctx = gc .ctx
273
+ matrix_old = ctx .matrix
274
+ ctx .set_matrix (self .matrix_flipy )
275
+
269
276
ctx .new_path ()
270
277
x , y = points [0 ]
271
- ctx .move_to (x , self . height - y )
278
+ ctx .move_to (x , y )
272
279
for x ,y in points [1 :]:
273
- ctx .line_to (x , self . height - y )
280
+ ctx .line_to (x , y )
274
281
ctx .close_path ()
275
282
276
283
if rgbFace :
@@ -279,7 +286,8 @@ def draw_polygon(self, gc, rgbFace, points):
279
286
ctx .fill ()
280
287
ctx .restore ()
281
288
ctx .stroke ()
282
-
289
+
290
+ ctx .set_matrix (matrix_old )
283
291
284
292
def draw_rectangle (self , gc , rgbFace , x , y , width , height ):
285
293
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
@@ -294,7 +302,8 @@ def draw_rectangle(self, gc, rgbFace, x, y, width, height):
294
302
ctx .stroke ()
295
303
296
304
297
- def draw_text (self , gc , x , y , s , prop , angle , ismath = False ):
305
+ def draw_text (self , gc , x , y , s , prop , angle , ismath = False ):
306
+ # Note: x,y are device/display coords, not user-coords, unlike other draw_* methods
298
307
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
299
308
300
309
if ismath :
@@ -375,6 +384,7 @@ def _draw_mathtext(self, gc, x, y, s, prop, angle):
375
384
def flipy (self ):
376
385
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
377
386
return True
387
+ #return False # tried - all draw objects ok except text (and images?) which comes out mirrored!
378
388
379
389
380
390
def get_canvas_width_height (self ):
@@ -416,7 +426,6 @@ def new_gc(self):
416
426
if DEBUG : print 'backend_cairo.RendererCairo.%s()' % _fn_name ()
417
427
gc = GraphicsContextCairo (renderer = self )
418
428
gc .ctx .set_target_surface (self .surface )
419
- gc .ctx .set_matrix (self .matrix )
420
429
return gc
421
430
422
431
@@ -443,12 +452,17 @@ def __init__(self, renderer):
443
452
GraphicsContextBase .__init__ (self )
444
453
self .renderer = renderer
445
454
self .ctx = cairo .Context ()
446
-
455
+ # default is 0.1, raise value to increase performance
456
+ # (and lower quality)
457
+ self .ctx .set_tolerance (0.5 )
447
458
448
459
def set_alpha (self , alpha ):
449
460
self ._alpha = alpha
450
461
self .ctx .set_alpha (alpha )
451
462
463
+ #def set_antialiased(self, b):
464
+ # enable/disable anti-aliasing is not (yet) supported by Cairo
465
+
452
466
453
467
def set_capstyle (self , cs ):
454
468
if cs in ('butt' , 'round' , 'projecting' ):
@@ -487,8 +501,8 @@ def set_dashes(self, offset, dashes):
487
501
if dashes == None :
488
502
self .ctx .set_dash ([], 0 ) # switch dashes off
489
503
else :
490
- dashes_pixels = self .renderer .points_to_pixels (asarray (dashes ))
491
- self . ctx . set_dash ( dashes_pixels , offset )
504
+ self .ctx . set_dash ( self . renderer .points_to_pixels (asarray (dashes )),
505
+ offset )
492
506
493
507
494
508
def set_foreground (self , fg , isRGB = None ):
@@ -574,7 +588,7 @@ def _save_png (figure, fileObject):
574
588
ctx = cairo .Context ()
575
589
ctx .set_target_png (fileObject , cairo .FORMAT_ARGB32 , width , height )
576
590
577
- renderer = RendererCairo (ctx . matrix , figure .dpi )
591
+ renderer = RendererCairo (figure .dpi )
578
592
renderer ._set_width_height (width , height )
579
593
renderer .surface = ctx .target_surface
580
594
figure .draw (renderer )
@@ -612,7 +626,7 @@ def _save_ps_pdf (figure, fileObject, ext, orientation):
612
626
# TODO:
613
627
# add portrait/landscape checkbox to FileChooser
614
628
615
- renderer = RendererCairo (ctx . matrix , figure .dpi )
629
+ renderer = RendererCairo (figure .dpi )
616
630
renderer ._set_width_height (width , height )
617
631
renderer .surface = ctx .target_surface
618
632
figure .draw (renderer )
0 commit comments