summaryrefslogtreecommitdiffstats
path: root/src/gui/image
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2020-04-28 23:00:20 +0200
committerLiang Qi <liang.qi@qt.io>2020-04-28 23:00:20 +0200
commit00edd2a7e75107433b87f3929ecf7478984c7fc6 (patch)
treee9641633b5df634a4e72b57f63106435f095633c /src/gui/image
parent562d7ded3b23f7aa92cbe4f3132bec0053ed7163 (diff)
parente6a39c13bfe44719ee345419e98638e5f38fe7ee (diff)
Merge remote-tracking branch 'origin/5.15.0' into 5.15
Diffstat (limited to 'src/gui/image')
-rw-r--r--src/gui/image/qimage_conversions.cpp44
1 files changed, 33 insertions, 11 deletions
diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp
index 34d2b8d8c7..506ebc797f 100644
--- a/src/gui/image/qimage_conversions.cpp
+++ b/src/gui/image/qimage_conversions.cpp
@@ -2016,6 +2016,21 @@ static void convert_Mono_to_Indexed8(QImageData *dest, const QImageData *src, Qt
}
}
+static void copy_8bit_pixels(QImageData *dest, const QImageData *src)
+{
+ if (src->bytes_per_line == dest->bytes_per_line) {
+ memcpy(dest->data, src->data, src->bytes_per_line * src->height);
+ } else {
+ const uchar *sdata = src->data;
+ uchar *ddata = dest->data;
+ for (int y = 0; y < src->height; ++y) {
+ memcpy(ddata, sdata, src->width);
+ sdata += src->bytes_per_line;
+ ddata += dest->bytes_per_line;
+ }
+ }
+}
+
static void convert_Indexed8_to_Alpha8(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
{
Q_ASSERT(src->format == QImage::Format_Indexed8);
@@ -2031,11 +2046,15 @@ static void convert_Indexed8_to_Alpha8(QImageData *dest, const QImageData *src,
}
if (simpleCase)
- memcpy(dest->data, src->data, src->bytes_per_line * src->height);
+ copy_8bit_pixels(dest, src);
else {
- qsizetype size = src->bytes_per_line * src->height;
- for (qsizetype i = 0; i < size; ++i) {
- dest->data[i] = translate[src->data[i]];
+ const uchar *sdata = src->data;
+ uchar *ddata = dest->data;
+ for (int y = 0; y < src->height; ++y) {
+ for (int x = 0; x < src->width; ++x)
+ ddata[x] = translate[sdata[x]];
+ sdata += src->bytes_per_line;
+ ddata += dest->bytes_per_line;
}
}
}
@@ -2055,11 +2074,15 @@ static void convert_Indexed8_to_Grayscale8(QImageData *dest, const QImageData *s
}
if (simpleCase)
- memcpy(dest->data, src->data, src->bytes_per_line * src->height);
+ copy_8bit_pixels(dest, src);
else {
- qsizetype size = src->bytes_per_line * src->height;
- for (qsizetype i = 0; i < size; ++i) {
- dest->data[i] = translate[src->data[i]];
+ const uchar *sdata = src->data;
+ uchar *ddata = dest->data;
+ for (int y = 0; y < src->height; ++y) {
+ for (int x = 0; x < src->width; ++x)
+ ddata[x] = translate[sdata[x]];
+ sdata += src->bytes_per_line;
+ ddata += dest->bytes_per_line;
}
}
}
@@ -2107,7 +2130,7 @@ static void convert_Alpha8_to_Indexed8(QImageData *dest, const QImageData *src,
Q_ASSERT(src->format == QImage::Format_Alpha8);
Q_ASSERT(dest->format == QImage::Format_Indexed8);
- memcpy(dest->data, src->data, src->bytes_per_line * src->height);
+ copy_8bit_pixels(dest, src);
dest->colortable = defaultColorTables->alpha;
}
@@ -2117,8 +2140,7 @@ static void convert_Grayscale8_to_Indexed8(QImageData *dest, const QImageData *s
Q_ASSERT(src->format == QImage::Format_Grayscale8);
Q_ASSERT(dest->format == QImage::Format_Indexed8);
- memcpy(dest->data, src->data, src->bytes_per_line * src->height);
-
+ copy_8bit_pixels(dest, src);
dest->colortable = defaultColorTables->gray;
}