@@ -705,7 +705,8 @@ const char *PyFT2Font_set_text__doc__ = R"""(
705705
706706static py::array_t <double >
707707PyFT2Font_set_text (PyFT2Font *self, std::u32string_view text, double angle = 0.0 ,
708- std::variant<LoadFlags, FT_Int32> flags_or_int = LoadFlags::FORCE_AUTOHINT)
708+ std::variant<LoadFlags, FT_Int32> flags_or_int = LoadFlags::FORCE_AUTOHINT,
709+ py::object language_obj = py::none())
709710{
710711 std::vector<double > xys;
711712 LoadFlags flags;
@@ -725,7 +726,29 @@ PyFT2Font_set_text(PyFT2Font *self, std::u32string_view text, double angle = 0.0
725726 throw py::type_error (" flags must be LoadFlags or int" );
726727 }
727728
728- self->x ->set_text (text, angle, static_cast <FT_Int32>(flags), xys);
729+ FT2Font::LanguageType languages;
730+ if (py::isinstance<std::string>(language_obj)) {
731+ languages = std::vector<FT2Font::LanguageRange>{
732+ FT2Font::LanguageRange{language_obj.cast <std::string>(), 0 , text.size ()}
733+ };
734+ } else if (py::isinstance<py::list>(language_obj)) {
735+ languages = std::vector<FT2Font::LanguageRange>{};
736+
737+ for (py::handle lang_range_obj : language_obj.cast <py::list>()) {
738+ if (!py::isinstance<py::tuple>(lang_range_obj)) {
739+ throw py::type_error (" languages must be str or list of tuple" );
740+ }
741+
742+ auto lang_range = lang_range_obj.cast <py::tuple>();
743+ auto lang_str = lang_range[0 ].cast <std::string>();
744+ auto start = lang_range[1 ].cast <size_t >();
745+ auto end = lang_range[2 ].cast <size_t >();
746+
747+ languages->emplace_back (lang_str, start, end);
748+ }
749+ }
750+
751+ self->x ->set_text (text, angle, static_cast <FT_Int32>(flags), languages, xys);
729752
730753 py::ssize_t dims[] = { static_cast <py::ssize_t >(xys.size ()) / 2 , 2 };
731754 py::array_t <double > result (dims);
@@ -1752,6 +1775,7 @@ PYBIND11_MODULE(ft2font, m, py::mod_gil_not_used())
17521775 PyFT2Font_get_kerning__doc__)
17531776 .def (" set_text" , &PyFT2Font_set_text,
17541777 " string" _a, " angle" _a=0.0 , " flags" _a=LoadFlags::FORCE_AUTOHINT,
1778+ " language" _a=py::none (),
17551779 PyFT2Font_set_text__doc__)
17561780 .def (" _get_fontmap" , &PyFT2Font_get_fontmap, " string" _a,
17571781 PyFT2Font_get_fontmap__doc__)
0 commit comments