15 const qsizetype sstride = isstride /
sizeof(T);
16 const qsizetype dstride = idstride /
sizeof(T);
18 const int pack =
sizeof(quint32) /
sizeof(T);
20 qMin(uint((quintptr(dest) & (
sizeof(quint32)-1)) /
sizeof(T)), uint(h));
22 const int restY = (h - unaligned) %
tileSize;
23 const int unoptimizedY = restY % pack;
24 const int numTilesX = w /
tileSize + (restX > 0);
25 const int numTilesY = (h - unaligned) /
tileSize + (restY >= pack);
27 for (
int tx = 0; tx < numTilesX; ++tx) {
28 const int startx = w - tx *
tileSize - 1;
29 const int stopx = qMax(startx -
tileSize, 0);
32 for (
int x = startx; x >= stopx; --x) {
33 T *d = dest + (w - x - 1) * dstride;
34 for (
int y = 0; y < unaligned; ++y) {
35 *d++ = src[y * sstride + x];
40 for (
int ty = 0; ty < numTilesY; ++ty) {
41 const int starty = ty *
tileSize + unaligned;
42 const int stopy = qMin(starty +
tileSize, h - unoptimizedY);
44 for (
int x = startx; x >= stopx; --x) {
45 quint32 *d =
reinterpret_cast<quint32*>(dest + (w - x - 1) * dstride + starty);
46 for (
int y = starty; y < stopy; y += pack) {
47 quint32 c = src[y * sstride + x];
48 for (
int i = 1; i < pack; ++i) {
49 const int shift = (
sizeof(T) * 8 * i);
50 const T color = src[(y + i) * sstride + x];
59 const int starty = h - unoptimizedY;
60 for (
int x = startx; x >= stopx; --x) {
61 T *d = dest + (w - x - 1) * dstride + starty;
62 for (
int y = starty; y < h; ++y) {
63 *d++ = src[y * sstride + x];
73 const qsizetype sstride = isstride;
74 const qsizetype dstride = idstride;
78 for (
int tx = 0; tx < numTilesX; ++tx) {
79 const int startx = w - tx *
tileSize - 1;
80 const int stopx = qMax(startx -
tileSize, 0);
82 for (
int ty = 0; ty < numTilesY; ++ty) {
84 const int stopy = qMin(starty +
tileSize, h);
86 for (
int x = startx; x >= stopx; --x) {
87 T *d = (T *)((
char*)dest + (w - x - 1) * dstride) + starty;
88 const char *s = (
const char*)(src + x) + starty * sstride;
89 for (
int y = starty; y < stopy; ++y) {
90 *d++ = *(
const T *)(s);
101 const qsizetype sstride = isstride /
sizeof(T);
102 const qsizetype dstride = idstride /
sizeof(T);
104 const int pack =
sizeof(quint32) /
sizeof(T);
105 const int unaligned =
106 qMin(uint((quintptr(dest) & (
sizeof(quint32)-1)) /
sizeof(T)), uint(h));
108 const int restY = (h - unaligned) %
tileSize;
109 const int unoptimizedY = restY % pack;
110 const int numTilesX = w /
tileSize + (restX > 0);
111 const int numTilesY = (h - unaligned) /
tileSize + (restY >= pack);
113 for (
int tx = 0; tx < numTilesX; ++tx) {
115 const int stopx = qMin(startx +
tileSize, w);
118 for (
int x = startx; x < stopx; ++x) {
119 T *d = dest + x * dstride;
120 for (
int y = h - 1; y >= h - unaligned; --y) {
121 *d++ = src[y * sstride + x];
126 for (
int ty = 0; ty < numTilesY; ++ty) {
127 const int starty = h - 1 - unaligned - ty *
tileSize;
128 const int stopy = qMax(starty -
tileSize, unoptimizedY);
130 for (
int x = startx; x < stopx; ++x) {
131 quint32 *d =
reinterpret_cast<quint32*>(dest + x * dstride
133 for (
int y = starty; y >= stopy; y -= pack) {
134 quint32 c = src[y * sstride + x];
135 for (
int i = 1; i < pack; ++i) {
136 const int shift = (
sizeof(T) * 8 * i);
137 const T color = src[(y - i) * sstride + x];
145 const int starty = unoptimizedY - 1;
146 for (
int x = startx; x < stopx; ++x) {
147 T *d = dest + x * dstride + h - 1 - starty;
148 for (
int y = starty; y >= 0; --y) {
149 *d++ = src[y * sstride + x];
159 const qsizetype sstride = isstride;
160 const qsizetype dstride = idstride;
164 for (
int tx = 0; tx < numTilesX; ++tx) {
166 const int stopx = qMin(startx +
tileSize, w);
168 for (
int ty = 0; ty < numTilesY; ++ty) {
169 const int starty = h - 1 - ty *
tileSize;
170 const int stopy = qMax(starty -
tileSize, 0);
172 for (
int x = startx; x < stopx; ++x) {
173 T *d = (T*)((
char*)dest + x * dstride) + h - 1 - starty;
174 const char *s = (
const char*)(src + x) + starty * sstride;
175 for (
int y = starty; y >= stopy; --y) {
188 T *dest,
int dstStride)
190#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
192 static_assert(
sizeof(quint32) %
sizeof(T) == 0);
193 qt_memrotate90_tiled<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
195 qt_memrotate90_tiled_unpacked<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
202 const qsizetype sstride = isstride;
203 const qsizetype dstride = idstride;
205 const char *s = (
const char*)(src) + (h - 1) * sstride;
206 for (
int dy = 0; dy < h; ++dy) {
207 T *d =
reinterpret_cast<T*>((
char *)(dest) + dy * dstride);
208 src =
reinterpret_cast<
const T*>(s);
209 for (
int dx = 0; dx < w; ++dx) {
210 d[dx] = src[w - 1 - dx];
219 T *dest,
int dstStride)
221#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
223 static_assert(
sizeof(quint32) %
sizeof(T) == 0);
224 qt_memrotate270_tiled<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
226 qt_memrotate270_tiled_unpacked<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
230#define QT_IMPL_MEMROTATE(type) Q_GUI_EXPORT
231 void qt_memrotate90(const type *src, int w, int h, int sstride,
232 type *dest, int dstride) \
233{
234 qt_memrotate90_template(src, w, h, sstride, dest, dstride); \
235} Q_GUI_EXPORT
236 void qt_memrotate180(const type *src, int w, int h, int sstride,
237 type *dest, int dstride) \
238{
239 qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
240} Q_GUI_EXPORT
241 void qt_memrotate270(const type *src, int w, int h, int sstride,
242 type *dest, int dstride) \
243{
244 qt_memrotate270_template(src, w, h, sstride, dest, dstride); \
245}
247#define QT_IMPL_SIMPLE_MEMROTATE(type) Q_GUI_EXPORT
248 void qt_memrotate90(const type *src, int w, int h, int sstride,
249 type *dest, int dstride) \
250{
251 qt_memrotate90_tiled_unpacked(src, w, h, sstride, dest, dstride); \
252} Q_GUI_EXPORT
253 void qt_memrotate180(const type *src, int w, int h, int sstride,
254 type *dest, int dstride) \
255{
256 qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
257} Q_GUI_EXPORT
258 void qt_memrotate270(const type *src, int w, int h, int sstride,
259 type *dest, int dstride) \
260{
261 qt_memrotate270_tiled_unpacked(src, w, h, sstride, dest, dstride); \
262}
271void qt_memrotate90_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
273 qt_memrotate90(srcPixels, w, h, sbpl, destPixels, dbpl);
276void qt_memrotate180_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
278 qt_memrotate180(srcPixels, w, h, sbpl, destPixels, dbpl);
281void qt_memrotate270_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
283 qt_memrotate270(srcPixels, w, h, sbpl, destPixels, dbpl);
286void qt_memrotate90_16(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
288 qt_memrotate90((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
293 qt_memrotate180((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
298 qt_memrotate270((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
301void qt_memrotate90_24(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
303 qt_memrotate90((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
308 qt_memrotate180((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
313 qt_memrotate270((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
316void qt_memrotate90_32(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
318 qt_memrotate90((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
323 qt_memrotate180((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
328 qt_memrotate270((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
332void qt_memrotate90_64(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
334 qt_memrotate90((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
339 qt_memrotate180((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
344 qt_memrotate270((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
349 qt_memrotate90((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
354 qt_memrotate180((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
359 qt_memrotate270((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
365 {
nullptr,
nullptr,
nullptr },
366 {
nullptr,
nullptr,
nullptr },
367 {
nullptr,
nullptr,
nullptr },
368 { qt_memrotate90_8, qt_memrotate180_8, qt_memrotate270_8 },
369 { qt_memrotate90_16, qt_memrotate180_16, qt_memrotate270_16 },
370 { qt_memrotate90_24, qt_memrotate180_24, qt_memrotate270_24 },
371 { qt_memrotate90_32, qt_memrotate180_32, qt_memrotate270_32 },
372 { qt_memrotate90_64, qt_memrotate180_64, qt_memrotate270_64 },
373 { qt_memrotate90_64, qt_memrotate180_64, qt_memrotate270_64 },
374 { qt_memrotate90_128, qt_memrotate180_128, qt_memrotate270_128 },
Combined button and popup list for selecting options.
void qt_memrotate90_16(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static QT_BEGIN_NAMESPACE const int tileSize
void qt_memrotate90_128(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate270_24(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate270_64(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static void qt_memrotate270_template(const T *src, int srcWidth, int srcHeight, int srcStride, T *dest, int dstStride)
void qt_memrotate270_32(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static void qt_memrotate270_tiled(const T *src, int w, int h, int isstride, T *dest, int idstride)
void qt_memrotate180_32(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate270_16(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
#define QT_IMPL_SIMPLE_MEMROTATE(type)
static void qt_memrotate90_template(const T *src, int srcWidth, int srcHeight, int srcStride, T *dest, int dstStride)
void qt_memrotate90_24(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate180_16(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate270_128(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate180_24(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate270_8(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate90_32(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static void qt_memrotate270_tiled_unpacked(const T *src, int w, int h, int isstride, T *dest, int idstride)
void qt_memrotate90_8(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate180_8(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static void qt_memrotate180_template(const T *src, int w, int h, int isstride, T *dest, int idstride)
void qt_memrotate180_128(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
void qt_memrotate90_64(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
static void qt_memrotate90_tiled_unpacked(const T *src, int w, int h, int isstride, T *dest, int idstride)
void qt_memrotate180_64(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)
#define QT_IMPL_MEMROTATE(type)
static void qt_memrotate90_tiled(const T *src, int w, int h, int isstride, T *dest, int idstride)
MemRotateFunc qMemRotateFunctions[QPixelLayout::BPPCount][3]
void(* MemRotateFunc)(const uchar *srcPixels, int w, int h, int sbpl, uchar *destPixels, int dbpl)