Skip to content

Commit 41e792d

Browse files
committed
Handle colour fonts
1 parent 8527c83 commit 41e792d

File tree

2 files changed

+47
-15
lines changed

2 files changed

+47
-15
lines changed

lib/matplotlib/backends/backend_agg.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,11 @@ def draw_mathtext(self, gc, x, y, s, prop, angle):
188188
# FreeType's y is upwards.
189189
round(0x40 * (self.height - y + dx * sin + dy * cos))]
190190
)
191-
bitmap = font._render_glyph(glyph_index, get_hinting_flag())
191+
bitmap = font._render_glyph(
192+
glyph_index,
193+
# The "y" parameter is upwards (per FreeType).
194+
x + dx * c - dy * s, self.height - y + dx * s + dy * c, angle,
195+
get_hinting_flag() | LoadFlags.COLOR)
192196
# draw_text_image's y is downwards & the bitmap bottom side.
193197
self._renderer.draw_text_image(
194198
bitmap["buffer"],
@@ -222,15 +226,28 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None):
222226
if ismath:
223227
return self.draw_mathtext(gc, x, y, s, prop, angle)
224228
font = self._prepare_font(prop)
225-
font.set_text(s, angle, flags=get_hinting_flag(),
229+
font.set_text(s, angle, flags=get_hinting_flag() | LoadFlags.COLOR,
226230
features=mtext.get_fontfeatures() if mtext is not None else None,
227231
language=mtext.get_language() if mtext is not None else None)
228232
for bitmap in font._render_glyphs(x, self.height - y):
229-
self._renderer.draw_text_image(
230-
bitmap["buffer"],
231-
bitmap["left"],
232-
int(self.height) - bitmap["top"] + bitmap["buffer"].shape[0],
233-
0, gc)
233+
# glyph_index = font.get_char_index(ord(c))
234+
# glyph = font.load_glyph(glyph_index)
235+
# bitmap = font._render_glyph(
236+
# glyph_index, x, self.height - y, angle,
237+
# get_hinting_flag() | LoadFlags.COLOR)
238+
if bitmap["buffer"].ndim == 3:
239+
self._renderer.draw_image(
240+
gc,
241+
bitmap["left"],
242+
bitmap["top"] - bitmap["buffer"].shape[0],
243+
bitmap["buffer"][::-1, :, [2, 1, 0, 3]])
244+
else:
245+
self._renderer.draw_text_image(
246+
bitmap["buffer"],
247+
bitmap["left"],
248+
int(self.height) - bitmap["top"] + bitmap["buffer"].shape[0],
249+
0, gc)
250+
# x += glyph.horiAdvance / 64
234251

235252
def get_text_width_height_descent(self, s, prop, ismath):
236253
# docstring inherited

src/ft2font_wrapper.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,10 +1847,18 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used())
18471847
py::dict d;
18481848
d["left"] = face->glyph->bitmap_left;
18491849
d["top"] = face->glyph->bitmap_top;
1850-
d["buffer"] = py::array_t<uint8_t>{
1851-
{face->glyph->bitmap.rows, face->glyph->bitmap.width},
1852-
{face->glyph->bitmap.pitch, 1},
1853-
face->glyph->bitmap.buffer};
1850+
if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
1851+
d["buffer"] = py::array_t<uint8_t>{
1852+
py::array::ShapeContainer({face->glyph->bitmap.rows,
1853+
face->glyph->bitmap.width, 4}),
1854+
py::array::StridesContainer({face->glyph->bitmap.pitch, 4, 1}),
1855+
face->glyph->bitmap.buffer};
1856+
} else {
1857+
d["buffer"] = py::array_t<uint8_t>{
1858+
{face->glyph->bitmap.rows, face->glyph->bitmap.width},
1859+
{face->glyph->bitmap.pitch, 1},
1860+
face->glyph->bitmap.buffer};
1861+
}
18541862
return d;
18551863
})
18561864
.def("_render_glyphs", [](PyFT2Font *self, double x, double y) {
@@ -1862,10 +1870,17 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used())
18621870
py::dict d;
18631871
d["left"] = bg->left;
18641872
d["top"] = bg->top;
1865-
d["buffer"] = py::array_t<uint8_t>{
1866-
{bg->bitmap.rows, bg->bitmap.width},
1867-
{bg->bitmap.pitch, 1},
1868-
bg->bitmap.buffer};
1873+
if (bg->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
1874+
d["buffer"] = py::array_t<uint8_t>{
1875+
py::array::ShapeContainer({bg->bitmap.rows, bg->bitmap.width, 4}),
1876+
py::array::StridesContainer({bg->bitmap.pitch, 4, 1}),
1877+
bg->bitmap.buffer};
1878+
} else {
1879+
d["buffer"] = py::array_t<uint8_t>{
1880+
{bg->bitmap.rows, bg->bitmap.width},
1881+
{bg->bitmap.pitch, 1},
1882+
bg->bitmap.buffer};
1883+
}
18691884
gs.append(d);
18701885
}
18711886
return gs;

0 commit comments

Comments
 (0)