14 const qsizetype sstride = isstride /
sizeof(T);
15 const qsizetype dstride = idstride /
sizeof(T);
17 const int pack =
sizeof(quint32) /
sizeof(T);
19 qMin(uint((quintptr(dest) & (
sizeof(quint32)-1)) /
sizeof(T)), uint(h));
21 const int restY = (h - unaligned) %
tileSize;
22 const int unoptimizedY = restY % pack;
23 const int numTilesX = w /
tileSize + (restX > 0);
24 const int numTilesY = (h - unaligned) /
tileSize + (restY >= pack);
26 for (
int tx = 0; tx < numTilesX; ++tx) {
27 const int startx = w - tx *
tileSize - 1;
28 const int stopx = qMax(startx -
tileSize, 0);
31 for (
int x = startx; x >= stopx; --x) {
32 T *d = dest + (w - x - 1) * dstride;
33 for (
int y = 0; y < unaligned; ++y) {
34 *d++ = src[y * sstride + x];
39 for (
int ty = 0; ty < numTilesY; ++ty) {
40 const int starty = ty *
tileSize + unaligned;
41 const int stopy = qMin(starty +
tileSize, h - unoptimizedY);
43 for (
int x = startx; x >= stopx; --x) {
44 quint32 *d =
reinterpret_cast<quint32*>(dest + (w - x - 1) * dstride + starty);
45 for (
int y = starty; y < stopy; y += pack) {
46 quint32 c = src[y * sstride + x];
47 for (
int i = 1; i < pack; ++i) {
48 const int shift = (
sizeof(T) * 8 * i);
49 const T color = src[(y + i) * sstride + x];
58 const int starty = h - unoptimizedY;
59 for (
int x = startx; x >= stopx; --x) {
60 T *d = dest + (w - x - 1) * dstride + starty;
61 for (
int y = starty; y < h; ++y) {
62 *d++ = src[y * sstride + x];
72 const qsizetype sstride = isstride;
73 const qsizetype dstride = idstride;
77 for (
int tx = 0; tx < numTilesX; ++tx) {
78 const int startx = w - tx *
tileSize - 1;
79 const int stopx = qMax(startx -
tileSize, 0);
81 for (
int ty = 0; ty < numTilesY; ++ty) {
83 const int stopy = qMin(starty +
tileSize, h);
85 for (
int x = startx; x >= stopx; --x) {
86 T *d = (T *)((
char*)dest + (w - x - 1) * dstride) + starty;
87 const char *s = (
const char*)(src + x) + starty * sstride;
88 for (
int y = starty; y < stopy; ++y) {
89 *d++ = *(
const T *)(s);
100 const qsizetype sstride = isstride /
sizeof(T);
101 const qsizetype dstride = idstride /
sizeof(T);
103 const int pack =
sizeof(quint32) /
sizeof(T);
104 const int unaligned =
105 qMin(uint((quintptr(dest) & (
sizeof(quint32)-1)) /
sizeof(T)), uint(h));
107 const int restY = (h - unaligned) %
tileSize;
108 const int unoptimizedY = restY % pack;
109 const int numTilesX = w /
tileSize + (restX > 0);
110 const int numTilesY = (h - unaligned) /
tileSize + (restY >= pack);
112 for (
int tx = 0; tx < numTilesX; ++tx) {
114 const int stopx = qMin(startx +
tileSize, w);
117 for (
int x = startx; x < stopx; ++x) {
118 T *d = dest + x * dstride;
119 for (
int y = h - 1; y >= h - unaligned; --y) {
120 *d++ = src[y * sstride + x];
125 for (
int ty = 0; ty < numTilesY; ++ty) {
126 const int starty = h - 1 - unaligned - ty *
tileSize;
127 const int stopy = qMax(starty -
tileSize, unoptimizedY);
129 for (
int x = startx; x < stopx; ++x) {
130 quint32 *d =
reinterpret_cast<quint32*>(dest + x * dstride
132 for (
int y = starty; y >= stopy; y -= pack) {
133 quint32 c = src[y * sstride + x];
134 for (
int i = 1; i < pack; ++i) {
135 const int shift = (
sizeof(T) * 8 * i);
136 const T color = src[(y - i) * sstride + x];
144 const int starty = unoptimizedY - 1;
145 for (
int x = startx; x < stopx; ++x) {
146 T *d = dest + x * dstride + h - 1 - starty;
147 for (
int y = starty; y >= 0; --y) {
148 *d++ = src[y * sstride + x];
158 const qsizetype sstride = isstride;
159 const qsizetype dstride = idstride;
163 for (
int tx = 0; tx < numTilesX; ++tx) {
165 const int stopx = qMin(startx +
tileSize, w);
167 for (
int ty = 0; ty < numTilesY; ++ty) {
168 const int starty = h - 1 - ty *
tileSize;
169 const int stopy = qMax(starty -
tileSize, 0);
171 for (
int x = startx; x < stopx; ++x) {
172 T *d = (T*)((
char*)dest + x * dstride) + h - 1 - starty;
173 const char *s = (
const char*)(src + x) + starty * sstride;
174 for (
int y = starty; y >= stopy; --y) {
187 T *dest,
int dstStride)
189#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
191 static_assert(
sizeof(quint32) %
sizeof(T) == 0);
192 qt_memrotate90_tiled<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
194 qt_memrotate90_tiled_unpacked<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
201 const qsizetype sstride = isstride;
202 const qsizetype dstride = idstride;
204 const char *s = (
const char*)(src) + (h - 1) * sstride;
205 for (
int dy = 0; dy < h; ++dy) {
206 T *d =
reinterpret_cast<T*>((
char *)(dest) + dy * dstride);
207 src =
reinterpret_cast<
const T*>(s);
208 for (
int dx = 0; dx < w; ++dx) {
209 d[dx] = src[w - 1 - dx];
218 T *dest,
int dstStride)
220#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
222 static_assert(
sizeof(quint32) %
sizeof(T) == 0);
223 qt_memrotate270_tiled<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
225 qt_memrotate270_tiled_unpacked<T>(src, srcWidth, srcHeight, srcStride, dest, dstStride);
229#define QT_IMPL_MEMROTATE(type) Q_GUI_EXPORT
230 void qt_memrotate90(const type *src, int w, int h, int sstride,
231 type *dest, int dstride) \
232{
233 qt_memrotate90_template(src, w, h, sstride, dest, dstride); \
234} Q_GUI_EXPORT
235 void qt_memrotate180(const type *src, int w, int h, int sstride,
236 type *dest, int dstride) \
237{
238 qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
239} Q_GUI_EXPORT
240 void qt_memrotate270(const type *src, int w, int h, int sstride,
241 type *dest, int dstride) \
242{
243 qt_memrotate270_template(src, w, h, sstride, dest, dstride); \
244}
246#define QT_IMPL_SIMPLE_MEMROTATE(type) Q_GUI_EXPORT
247 void qt_memrotate90(const type *src, int w, int h, int sstride,
248 type *dest, int dstride) \
249{
250 qt_memrotate90_tiled_unpacked(src, w, h, sstride, dest, dstride); \
251} Q_GUI_EXPORT
252 void qt_memrotate180(const type *src, int w, int h, int sstride,
253 type *dest, int dstride) \
254{
255 qt_memrotate180_template(src, w, h, sstride, dest, dstride); \
256} Q_GUI_EXPORT
257 void qt_memrotate270(const type *src, int w, int h, int sstride,
258 type *dest, int dstride) \
259{
260 qt_memrotate270_tiled_unpacked(src, w, h, sstride, dest, dstride); \
261}
270void qt_memrotate90_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
272 qt_memrotate90(srcPixels, w, h, sbpl, destPixels, dbpl);
275void qt_memrotate180_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
277 qt_memrotate180(srcPixels, w, h, sbpl, destPixels, dbpl);
280void qt_memrotate270_8(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
282 qt_memrotate270(srcPixels, w, h, sbpl, destPixels, dbpl);
285void qt_memrotate90_16(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
287 qt_memrotate90((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
292 qt_memrotate180((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
297 qt_memrotate270((
const ushort *)srcPixels, w, h, sbpl, (ushort *)destPixels, dbpl);
300void qt_memrotate90_24(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
302 qt_memrotate90((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
307 qt_memrotate180((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
312 qt_memrotate270((
const quint24 *)srcPixels, w, h, sbpl, (quint24 *)destPixels, dbpl);
315void qt_memrotate90_32(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
317 qt_memrotate90((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
322 qt_memrotate180((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
327 qt_memrotate270((
const uint *)srcPixels, w, h, sbpl, (uint *)destPixels, dbpl);
331void qt_memrotate90_64(
const uchar *srcPixels,
int w,
int h,
int sbpl, uchar *destPixels,
int dbpl)
333 qt_memrotate90((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
338 qt_memrotate180((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
343 qt_memrotate270((
const quint64 *)srcPixels, w, h, sbpl, (quint64 *)destPixels, dbpl);
348 qt_memrotate90((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
353 qt_memrotate180((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
358 qt_memrotate270((
const QRgbaFloat32 *)srcPixels, w, h, sbpl, (QRgbaFloat32 *)destPixels, dbpl);
364 {
nullptr,
nullptr,
nullptr },
365 {
nullptr,
nullptr,
nullptr },
366 {
nullptr,
nullptr,
nullptr },
367 { qt_memrotate90_8, qt_memrotate180_8, qt_memrotate270_8 },
368 { qt_memrotate90_16, qt_memrotate180_16, qt_memrotate270_16 },
369 { qt_memrotate90_24, qt_memrotate180_24, qt_memrotate270_24 },
370 { qt_memrotate90_32, qt_memrotate180_32, qt_memrotate270_32 },
371 { qt_memrotate90_64, qt_memrotate180_64, qt_memrotate270_64 },
372 { qt_memrotate90_64, qt_memrotate180_64, qt_memrotate270_64 },
373 { 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)