@@ -101,70 +101,69 @@ class MathtextBackendAgg(MathtextBackend):
101
101
Render glyphs and rectangles to an FTImage buffer, which is later
102
102
transferred to the Agg image by the Agg backend.
103
103
"""
104
- def __init__ (self ):
105
- self .ox = 0
106
- self .oy = 0
107
- self .image = None
108
- self .mode = 'bbox'
109
- self .bbox = [0 , 0 , 0 , 0 ]
110
- super ().__init__ ()
111
-
112
- def _update_bbox (self , x1 , y1 , x2 , y2 ):
113
- self .bbox = [min (self .bbox [0 ], x1 ),
114
- min (self .bbox [1 ], y1 ),
115
- max (self .bbox [2 ], x2 ),
116
- max (self .bbox [3 ], y2 )]
117
104
118
- def set_canvas_size (self , w , h , d ):
119
- super ().set_canvas_size (w , h , d )
120
- if self .mode != 'bbox' :
121
- self .image = FT2Image (np .ceil (w ), np .ceil (h + max (d , 0 )))
105
+ def __init__ (self ):
106
+ MathtextBackend .__init__ (self )
107
+ self ._xmin = self ._ymin = np .inf
108
+ self ._xmax = self ._ymax = - np .inf
109
+ self ._glyphs = []
110
+ self ._rects = []
111
+
112
+ ox = cbook .deprecated ("3.4" )(property (lambda self : 0 ))
113
+ oy = cbook .deprecated ("3.4" )(property (lambda self : 0 ))
114
+ mode = cbook .deprecated ("3.4" )(property (lambda self : "bbox" ))
115
+ image = cbook .deprecated ("3.4" )(property (lambda self : None ))
116
+ bbox = cbook .deprecated ("3.4" )(property (
117
+ lambda self : [self ._xmin , self ._ymin , self ._xmax , self ._ymax ]))
122
118
123
119
def render_glyph (self , ox , oy , info ):
124
- if self .mode == 'bbox' :
125
- self ._update_bbox (ox + info .metrics .xmin ,
126
- oy - info .metrics .ymax ,
127
- ox + info .metrics .xmax ,
128
- oy - info .metrics .ymin )
129
- else :
130
- info .font .draw_glyph_to_bitmap (
131
- self .image , ox , oy - info .metrics .iceberg , info .glyph ,
132
- antialiased = rcParams ['text.antialiased' ])
120
+ self ._glyphs .append ((ox , oy , info ))
121
+ metrics = info .metrics
122
+ self ._xmin = min (self ._xmin , ox + metrics .xmin )
123
+ self ._ymin = min (self ._ymin , self .height - oy + metrics .ymin )
124
+ self ._xmax = max (self ._xmax , ox + metrics .xmax )
125
+ self ._ymax = max (self ._ymax , self .height - oy + metrics .ymax )
133
126
134
127
def render_rect_filled (self , x1 , y1 , x2 , y2 ):
135
- if self .mode == 'bbox' :
136
- self ._update_bbox (x1 , y1 , x2 , y2 )
137
- else :
128
+ self ._rects .append ((x1 , y1 , x2 , y2 ))
129
+ self ._xmin = min (self ._xmin , x1 )
130
+ self ._xmax = max (self ._xmax , x2 )
131
+ self ._ymin = min (self ._ymin , y1 )
132
+ self ._ymax = max (self ._ymax , y2 )
133
+
134
+ def get_results (self , box , used_characters ):
135
+ orig_height = box .height
136
+ orig_depth = box .depth
137
+ _mathtext .ship (0 , 0 , box )
138
+ xmin = np .floor (self ._xmin )
139
+ xmax = np .ceil (self ._xmax )
140
+ ymin = np .floor (self ._ymin )
141
+ ymax = np .ceil (self ._ymax )
142
+ dxmin = self ._xmin - xmin
143
+ dymin = self ._ymin - ymin
144
+ image = FT2Image (np .ceil (xmax - xmin ) + 1 , np .ceil (ymax - ymin ) + 1 )
145
+
146
+ for ox , oy , info in self ._glyphs :
147
+ info .font .draw_glyph_to_bitmap (
148
+ image , ox + dxmin , oy - info .metrics .iceberg + dymin ,
149
+ info .glyph , antialiased = rcParams ['text.antialiased' ])
150
+ for x1 , y1 , x2 , y2 in self ._rects :
151
+ x1 += dxmin
152
+ x2 += dymin
153
+ y1 += dxmin
154
+ y2 += dymin
138
155
height = max (int (y2 - y1 ) - 1 , 0 )
139
156
if height == 0 :
140
- center = (y2 + y1 ) / 2.0
141
- y = int (center - (height + 1 ) / 2.0 )
157
+ center = (y2 + y1 ) / 2
158
+ y = int (center - (height + 1 ) / 2 )
142
159
else :
143
160
y = int (y1 )
144
- self . image .draw_rect_filled (int (x1 ), y , np .ceil (x2 ), y + height )
161
+ image .draw_rect_filled (int (x1 ), y , np .ceil (x2 ), y + height )
145
162
146
- def get_results (self , box , used_characters ):
147
- self .mode = 'bbox'
148
- orig_height = box .height
149
- orig_depth = box .depth
150
- _mathtext .ship (0 , 0 , box )
151
- bbox = self .bbox
152
- bbox = [bbox [0 ] - 1 , bbox [1 ] - 1 , bbox [2 ] + 1 , bbox [3 ] + 1 ]
153
- self .mode = 'render'
154
- self .set_canvas_size (
155
- bbox [2 ] - bbox [0 ],
156
- (bbox [3 ] - bbox [1 ]) - orig_depth ,
157
- (bbox [3 ] - bbox [1 ]) - orig_height )
158
- _mathtext .ship (- bbox [0 ], - bbox [1 ], box )
159
- result = (self .ox ,
160
- self .oy ,
161
- self .width ,
162
- self .height + self .depth ,
163
- self .depth ,
164
- self .image ,
165
- used_characters )
166
- self .image = None
167
- return result
163
+ return (0 , 0 ,
164
+ np .ceil (xmax - xmin ), np .ceil (ymax - ymin ), - ymin ,
165
+ image ,
166
+ used_characters )
168
167
169
168
def get_hinting_type (self ):
170
169
from matplotlib .backends import backend_agg
0 commit comments