diff options
author | maxim-yurchuk <maxim-yurchuk@yandex-team.com> | 2024-10-09 12:29:46 +0300 |
---|---|---|
committer | maxim-yurchuk <maxim-yurchuk@yandex-team.com> | 2024-10-09 13:14:22 +0300 |
commit | 9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch) | |
tree | a8fb3181d5947c0d78cf402aa56e686130179049 /contrib/python/matplotlib/py2/src/path_cleanup.cpp | |
parent | a44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff) | |
download | ydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz |
publishFullContrib: true for ydb
<HIDDEN_URL>
commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/python/matplotlib/py2/src/path_cleanup.cpp')
-rw-r--r-- | contrib/python/matplotlib/py2/src/path_cleanup.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/contrib/python/matplotlib/py2/src/path_cleanup.cpp b/contrib/python/matplotlib/py2/src/path_cleanup.cpp new file mode 100644 index 0000000000..f9f2213b3d --- /dev/null +++ b/contrib/python/matplotlib/py2/src/path_cleanup.cpp @@ -0,0 +1,113 @@ +/* -*- mode: c++; c-basic-offset: 4 -*- */ + +#include <Python.h> +#define NO_IMPORT_ARRAY +#include "numpy/arrayobject.h" + +#include "py_converters.h" + +#include "py_adaptors.h" +#include "agg_conv_transform.h" +#include "path_converters.h" + +class PathCleanupIterator +{ + typedef agg::conv_transform<py::PathIterator> transformed_path_t; + typedef PathNanRemover<transformed_path_t> nan_removal_t; + typedef PathClipper<nan_removal_t> clipped_t; + typedef PathSnapper<clipped_t> snapped_t; + typedef PathSimplifier<snapped_t> simplify_t; + typedef Sketch<simplify_t> sketch_t; + + py::PathIterator m_path_iter; + agg::trans_affine m_transform; + transformed_path_t m_transformed; + nan_removal_t m_nan_removed; + clipped_t m_clipped; + snapped_t m_snapped; + simplify_t m_simplify; + sketch_t m_sketch; + + public: + PathCleanupIterator(PyObject *path, + agg::trans_affine trans, + bool remove_nans, + bool do_clip, + const agg::rect_base<double> &rect, + e_snap_mode snap_mode, + double stroke_width, + bool do_simplify, + double sketch_scale, + double sketch_length, + double sketch_randomness) + : m_transform(trans), + m_transformed(m_path_iter, m_transform), + m_nan_removed(m_transformed, remove_nans, m_path_iter.has_curves()), + m_clipped(m_nan_removed, do_clip && !m_path_iter.has_curves(), rect), + m_snapped(m_clipped, snap_mode, m_path_iter.total_vertices(), stroke_width), + m_simplify(m_snapped, + do_simplify && m_path_iter.should_simplify(), + m_path_iter.simplify_threshold()), + m_sketch(m_simplify, sketch_scale, sketch_length, sketch_randomness) + { + convert_path(path, &m_path_iter); + + Py_INCREF(path); + m_path_iter.rewind(0); + } + + unsigned vertex(double *x, double *y) + { + return m_simplify.vertex(x, y); + } +}; + +extern "C" { +void *get_path_iterator(PyObject *path, + PyObject *trans, + int remove_nans, + int do_clip, + double rect[4], + e_snap_mode snap_mode, + double stroke_width, + int do_simplify, + double sketch_scale, + double sketch_length, + double sketch_randomness) +{ + agg::trans_affine agg_trans; + if (!convert_trans_affine(trans, &agg_trans)) { + return NULL; + } + agg::rect_base<double> clip_rect(rect[0], rect[1], rect[2], rect[3]); + + PathCleanupIterator *pipeline = new PathCleanupIterator(path, + agg_trans, + remove_nans != 0, + do_clip != 0, + clip_rect, + snap_mode, + stroke_width, + do_simplify != 0, + sketch_scale, + sketch_length, + sketch_randomness); + + return (void *)pipeline; +} + +unsigned get_vertex(void *pipeline, double *x, double *y) +{ + PathCleanupIterator *pipeline_iter = (PathCleanupIterator *)pipeline; + + unsigned code = pipeline_iter->vertex(x, y); + return code; +} + +void free_path_iterator(void *pipeline) +{ + PathCleanupIterator *pipeline_iter = (PathCleanupIterator *)pipeline; + + delete pipeline_iter; +} +} |