aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/matplotlib/py3/src/_ttconv.cpp
diff options
context:
space:
mode:
authorshumkovnd <shumkovnd@yandex-team.com>2023-11-10 14:39:34 +0300
committershumkovnd <shumkovnd@yandex-team.com>2023-11-10 16:42:24 +0300
commit77eb2d3fdcec5c978c64e025ced2764c57c00285 (patch)
treec51edb0748ca8d4a08d7c7323312c27ba1a8b79a /contrib/python/matplotlib/py3/src/_ttconv.cpp
parentdd6d20cadb65582270ac23f4b3b14ae189704b9d (diff)
downloadydb-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.cpp96
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."
+ );
+}