@@ -189,7 +189,7 @@ def draw_mathtext(self, gc, x, y, s, prop, angle):
189189 round (0x40 * (self .height - y + dx * sin + dy * cos ))]
190190 )
191191 bitmap = font ._render_glyph (
192- glyph_index , get_hinting_flag (),
192+ glyph_index , get_hinting_flag () | LoadFlags . COLOR ,
193193 RenderMode .NORMAL if gc .get_antialiased () else RenderMode .MONO )
194194 buffer = np .asarray (bitmap .buffer )
195195 if not gc .get_antialiased ():
@@ -221,20 +221,38 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None):
221221 if ismath :
222222 return self .draw_mathtext (gc , x , y , s , prop , angle )
223223 font = self ._prepare_font (prop )
224- font .set_text (s , angle , flags = get_hinting_flag (),
225- features = mtext .get_fontfeatures () if mtext is not None else None ,
226- language = mtext .get_language () if mtext is not None else None )
227- for bitmap in font ._render_glyphs (
228- x , self .height - y ,
229- RenderMode .NORMAL if gc .get_antialiased () else RenderMode .MONO ,
230- ):
224+ cos = math .cos (math .radians (angle ))
225+ sin = math .sin (math .radians (angle ))
226+ load_flags = get_hinting_flag () | LoadFlags .COLOR | LoadFlags .NO_SVG
227+ items = font ._layout (
228+ s , flags = load_flags ,
229+ features = mtext .get_fontfeatures () if mtext is not None else None ,
230+ language = mtext .get_language () if mtext is not None else None )
231+ for item in items :
232+ hf = item .ft_object ._hinting_factor
233+ item .ft_object ._set_transform (
234+ [[round (0x10000 * cos / hf ), round (0x10000 * - sin )],
235+ [round (0x10000 * sin / hf ), round (0x10000 * cos )]],
236+ [round (0x40 * (x + item .x * cos - item .y * sin )),
237+ # FreeType's y is upwards.
238+ round (0x40 * (self .height - y + item .x * sin + item .y * cos ))]
239+ )
240+ bitmap = item .ft_object ._render_glyph (
241+ item .glyph_index , load_flags ,
242+ RenderMode .NORMAL if gc .get_antialiased () else RenderMode .MONO )
231243 buffer = bitmap .buffer
232244 if not gc .get_antialiased ():
233245 buffer *= 0xff
234- self ._renderer .draw_text_image (
235- buffer ,
236- bitmap .left , int (self .height ) - bitmap .top + buffer .shape [0 ],
237- 0 , gc )
246+ if buffer .ndim == 3 :
247+ self ._renderer .draw_image (
248+ gc ,
249+ bitmap .left , bitmap .top - buffer .shape [0 ],
250+ buffer [::- 1 , :, [2 , 1 , 0 , 3 ]])
251+ else :
252+ self ._renderer .draw_text_image (
253+ buffer ,
254+ bitmap .left , int (self .height ) - bitmap .top + buffer .shape [0 ],
255+ 0 , gc )
238256
239257 def get_text_width_height_descent (self , s , prop , ismath ):
240258 # docstring inherited
0 commit comments