diff options
author | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 14:39:34 +0300 |
---|---|---|
committer | shumkovnd <shumkovnd@yandex-team.com> | 2023-11-10 16:42:24 +0300 |
commit | 77eb2d3fdcec5c978c64e025ced2764c57c00285 (patch) | |
tree | c51edb0748ca8d4a08d7c7323312c27ba1a8b79a /contrib/python/matplotlib/py3/src/_ttconv.cpp | |
parent | dd6d20cadb65582270ac23f4b3b14ae189704b9d (diff) | |
download | ydb-77eb2d3fdcec5c978c64e025ced2764c57c00285.tar.gz |
KIKIMR-19287: add task_stats_drawing script
Diffstat (limited to 'contrib/python/matplotlib/py3/src/_ttconv.cpp')
-rw-r--r-- | contrib/python/matplotlib/py3/src/_ttconv.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/contrib/python/matplotlib/py3/src/_ttconv.cpp b/contrib/python/matplotlib/py3/src/_ttconv.cpp new file mode 100644 index 0000000000..72fdfba696 --- /dev/null +++ b/contrib/python/matplotlib/py3/src/_ttconv.cpp @@ -0,0 +1,96 @@ +/* -*- mode: c++; c-basic-offset: 4 -*- */ + +/* + _ttconv.c + + Python wrapper for TrueType conversion library in ../ttconv. + */ +#include "mplutils.h" + +#include <pybind11/pybind11.h> +#include "ttconv/pprdrv.h" +#include <vector> + +namespace py = pybind11; + +/** + * An implementation of TTStreamWriter that writes to a Python + * file-like object. + */ +class PythonFileWriter : public TTStreamWriter +{ + py::function _write_method; + + public: + PythonFileWriter(py::object& file_object) + : _write_method(file_object.attr("write")) {} + + virtual void write(const char *a) + { + PyObject* decoded = PyUnicode_DecodeLatin1(a, strlen(a), ""); + if (decoded == NULL) { + throw py::error_already_set(); + } + _write_method(py::handle(decoded)); + Py_DECREF(decoded); + } +}; + +static void convert_ttf_to_ps( + const char *filename, + py::object &output, + int fonttype, + py::iterable* glyph_ids) +{ + PythonFileWriter output_(output); + + std::vector<int> glyph_ids_; + if (glyph_ids) { + for (py::handle glyph_id: *glyph_ids) { + glyph_ids_.push_back(glyph_id.cast<int>()); + } + } + + if (fonttype != 3 && fonttype != 42) { + throw py::value_error( + "fonttype must be either 3 (raw Postscript) or 42 (embedded Truetype)"); + } + + try + { + insert_ttfont(filename, output_, static_cast<font_type_enum>(fonttype), glyph_ids_); + } + catch (TTException &e) + { + throw std::runtime_error(e.getMessage()); + } + catch (...) + { + throw std::runtime_error("Unknown C++ exception"); + } +} + +PYBIND11_MODULE(_ttconv, m) { + m.doc() = "Module to handle converting and subsetting TrueType " + "fonts to Postscript Type 3, Postscript Type 42 and " + "Pdf Type 3 fonts."; + m.def("convert_ttf_to_ps", &convert_ttf_to_ps, + py::arg("filename"), + py::arg("output"), + py::arg("fonttype"), + py::arg("glyph_ids") = py::none(), + "Converts the Truetype font into a Type 3 or Type 42 Postscript font, " + "optionally subsetting the font to only the desired set of characters.\n" + "\n" + "filename is the path to a TTF font file.\n" + "output is a Python file-like object with a write method that the Postscript " + "font data will be written to.\n" + "fonttype may be either 3 or 42. Type 3 is a \"raw Postscript\" font. " + "Type 42 is an embedded Truetype font. Glyph subsetting is not supported " + "for Type 42 fonts within this module (needs to be done externally).\n" + "glyph_ids (optional) is a list of glyph ids (integers) to keep when " + "subsetting to a Type 3 font. If glyph_ids is not provided or is None, " + "then all glyphs will be included. If any of the glyphs specified are " + "composite glyphs, then the component glyphs will also be included." + ); +} |