Skip to content

Commit 20f3e15

Browse files
committed
Handle colour fonts
1 parent 6c6ec62 commit 20f3e15

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

lib/matplotlib/backends/backend_agg.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def draw_mathtext(self, gc, x, y, s, prop, angle):
184184
font.get_char_index(char),
185185
# The "y" parameter is upwards (per FreeType).
186186
x + dx * c - dy * s, self.height - y + dx * s + dy * c, angle,
187-
get_hinting_flag())
187+
get_hinting_flag() | LoadFlags.COLOR)
188188
# draw_text_image's y is downwards & the bitmap bottom side.
189189
self._renderer.draw_text_image(
190190
bitmap["buffer"],
@@ -218,15 +218,28 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None):
218218
if ismath:
219219
return self.draw_mathtext(gc, x, y, s, prop, angle)
220220
font = self._prepare_font(prop)
221-
font.set_text(s, 0, flags=get_hinting_flag(),
221+
font.set_text(s, 0, flags=get_hinting_flag() | LoadFlags.COLOR,
222222
features=mtext.get_fontfeatures() if mtext is not None else None,
223223
language=mtext.get_language() if mtext is not None else None)
224224
for bitmap in font._render_glyphs(x, self.height - y):
225-
self._renderer.draw_text_image(
226-
bitmap["buffer"],
227-
bitmap["left"],
228-
int(self.height) - bitmap["top"] + bitmap["buffer"].shape[0],
229-
0, gc)
225+
# glyph_index = font.get_char_index(ord(c))
226+
# glyph = font.load_glyph(glyph_index)
227+
# bitmap = font._render_glyph(
228+
# glyph_index, x, self.height - y, angle,
229+
# get_hinting_flag() | LoadFlags.COLOR)
230+
if bitmap["buffer"].ndim == 3:
231+
self._renderer.draw_image(
232+
gc,
233+
bitmap["left"],
234+
bitmap["top"] - bitmap["buffer"].shape[0],
235+
bitmap["buffer"][::-1, :, [2, 1, 0, 3]])
236+
else:
237+
self._renderer.draw_text_image(
238+
bitmap["buffer"],
239+
bitmap["left"],
240+
int(self.height) - bitmap["top"] + bitmap["buffer"].shape[0],
241+
0, gc)
242+
# x += glyph.horiAdvance / 64
230243

231244
def get_text_width_height_descent(self, s, prop, ismath):
232245
# docstring inherited

src/ft2font_wrapper.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,10 +1857,18 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used())
18571857
py::dict d;
18581858
d["left"] = face->glyph->bitmap_left;
18591859
d["top"] = face->glyph->bitmap_top;
1860-
d["buffer"] = py::array_t<uint8_t>{
1861-
{face->glyph->bitmap.rows, face->glyph->bitmap.width},
1862-
{face->glyph->bitmap.pitch, 1},
1863-
face->glyph->bitmap.buffer};
1860+
if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
1861+
d["buffer"] = py::array_t<uint8_t>{
1862+
py::array::ShapeContainer({face->glyph->bitmap.rows,
1863+
face->glyph->bitmap.width, 4}),
1864+
py::array::StridesContainer({face->glyph->bitmap.pitch, 4, 1}),
1865+
face->glyph->bitmap.buffer};
1866+
} else {
1867+
d["buffer"] = py::array_t<uint8_t>{
1868+
{face->glyph->bitmap.rows, face->glyph->bitmap.width},
1869+
{face->glyph->bitmap.pitch, 1},
1870+
face->glyph->bitmap.buffer};
1871+
}
18641872
return d;
18651873
})
18661874
.def("_render_glyphs", [](PyFT2Font *self, double x, double y) {
@@ -1872,10 +1880,17 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used())
18721880
py::dict d;
18731881
d["left"] = bg->left;
18741882
d["top"] = bg->top;
1875-
d["buffer"] = py::array_t<uint8_t>{
1876-
{bg->bitmap.rows, bg->bitmap.width},
1877-
{bg->bitmap.pitch, 1},
1878-
bg->bitmap.buffer};
1883+
if (bg->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) {
1884+
d["buffer"] = py::array_t<uint8_t>{
1885+
py::array::ShapeContainer({bg->bitmap.rows, bg->bitmap.width, 4}),
1886+
py::array::StridesContainer({bg->bitmap.pitch, 4, 1}),
1887+
bg->bitmap.buffer};
1888+
} else {
1889+
d["buffer"] = py::array_t<uint8_t>{
1890+
{bg->bitmap.rows, bg->bitmap.width},
1891+
{bg->bitmap.pitch, 1},
1892+
bg->bitmap.buffer};
1893+
}
18791894
gs.append(d);
18801895
}
18811896
return gs;

0 commit comments

Comments
 (0)