// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "pyside_numpy.h" #include // Convert X,Y of type T data to a list of points (QPoint, PointF) template static QList xyDataToQPointHelper(const void *xData, const void *yData, qsizetype size) { auto *x = reinterpret_cast(xData); auto *y = reinterpret_cast(yData); QList result; result.reserve(size); for (auto xEnd = x + size; x < xEnd; ++x, ++y) result.append(Point(*x, *y)); return result; } // Convert X,Y of double/float type data to a list of QPoint (rounding) template static QList xyFloatDataToQPointHelper(const void *xData, const void *yData, qsizetype size) { auto *x = reinterpret_cast(xData); auto *y = reinterpret_cast(yData); QList result; result.reserve(size); for (auto xEnd = x + size; x < xEnd; ++x, ++y) result.append(QPoint(qRound(*x), qRound(*y))); return result; } namespace PySide::Numpy { QList xyDataToQPointFList(PyObject *pyXIn, PyObject *pyYIn) { auto xv = Shiboken::Numpy::View::fromPyObject(pyXIn); auto yv = Shiboken::Numpy::View::fromPyObject(pyYIn); if (!xv.sameLayout(yv)) return {}; const qsizetype size = qMin(xv.dimensions[0], yv.dimensions[0]); if (size == 0) return {}; switch (xv.type) { case Shiboken::Numpy::View::Int16: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned16: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Int: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Int64: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned64: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Float: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Double: break; } return xyDataToQPointHelper(xv.data, yv.data, size); } QList xyDataToQPointList(PyObject *pyXIn, PyObject *pyYIn) { auto xv = Shiboken::Numpy::View::fromPyObject(pyXIn); auto yv = Shiboken::Numpy::View::fromPyObject(pyYIn); if (!xv.sameLayout(yv)) return {}; const qsizetype size = qMin(xv.dimensions[0], yv.dimensions[0]); if (size == 0) return {}; switch (xv.type) { case Shiboken::Numpy::View::Int16: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned16: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Int: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Int64: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Unsigned64: return xyDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Float: return xyFloatDataToQPointHelper(xv.data, yv.data, size); case Shiboken::Numpy::View::Double: break; } return xyFloatDataToQPointHelper(xv.data, yv.data, size); } } //namespace PySide::Numpy