Loading...
Searching...
No Matches
RowOrder.hpp
1#pragma once
2#include <QtGui/private/qrhi_p.h>
3
4#include <QByteArray>
5#include <QImage>
6
7#include <cstring>
8
9namespace score::gfx
10{
29inline bool uploadReversesRows(const QRhi& rhi) noexcept
30{
31 return rhi.isYUpInNDC();
32}
33
35inline void
36copyRowsReversed(void* dst, const void* src, qsizetype rowBytes, int rows) noexcept
37{
38 auto* d = static_cast<char*>(dst);
39 auto* s = static_cast<const char*>(src) + qsizetype(rows - 1) * rowBytes;
40 for(int y = 0; y < rows; ++y, d += rowBytes, s -= rowBytes)
41 std::memcpy(d, s, rowBytes);
42}
43
46inline QByteArray
47bytesInPublishedRowOrder(const QRhi& rhi, QByteArray bytes, int rows)
48{
49 if(!uploadReversesRows(rhi) || rows <= 1 || bytes.size() % rows != 0)
50 return bytes;
51 QByteArray out(bytes.size(), Qt::Uninitialized);
52 copyRowsReversed(out.data(), bytes.constData(), bytes.size() / rows, rows);
53 return out;
54}
55
57inline QImage imageInPublishedRowOrder(const QRhi& rhi, QImage img)
58{
59 if(!uploadReversesRows(rhi) || img.height() <= 1)
60 return img;
61#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
62 return std::move(img).flipped(Qt::Vertical);
63#else
64 return std::move(img).mirrored(false, true);
65#endif
66}
67}
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
bool uploadReversesRows(const QRhi &rhi) noexcept
Definition RowOrder.hpp:29
QImage imageInPublishedRowOrder(const QRhi &rhi, QImage img)
img in the published row order: flipped where uploads reverse rows.
Definition RowOrder.hpp:57
void copyRowsReversed(void *dst, const void *src, qsizetype rowBytes, int rows) noexcept
dst = src with its rows in reverse order: one memcpy per row.
Definition RowOrder.hpp:36
QByteArray bytesInPublishedRowOrder(const QRhi &rhi, QByteArray bytes, int rows)
Definition RowOrder.hpp:47