diff options
Diffstat (limited to 'src/gui/image/qimage.cpp')
-rw-r--r-- | src/gui/image/qimage.cpp | 119 |
1 files changed, 26 insertions, 93 deletions
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 9e911bdcea..7e0922a90a 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -4489,7 +4489,8 @@ QImage QImage::smoothScaled(int w, int h) const { return src; } -static QImage rotated90(const QImage &image) { +static QImage rotated90(const QImage &image) +{ QImage out(image.height(), image.width(), image.format()); out.setDotsPerMeterX(image.dotsPerMeterY()); out.setDotsPerMeterY(image.dotsPerMeterX()); @@ -4497,49 +4498,10 @@ static QImage rotated90(const QImage &image) { out.setColorTable(image.colorTable()); int w = image.width(); int h = image.height(); - switch (image.format()) { - case QImage::Format_RGB32: - case QImage::Format_ARGB32: - case QImage::Format_ARGB32_Premultiplied: - case QImage::Format_RGBX8888: - case QImage::Format_RGBA8888: - case QImage::Format_RGBA8888_Premultiplied: - case QImage::Format_BGR30: - case QImage::Format_A2BGR30_Premultiplied: - case QImage::Format_RGB30: - case QImage::Format_A2RGB30_Premultiplied: - qt_memrotate270(reinterpret_cast<const quint32*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint32*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_RGB666: - case QImage::Format_ARGB6666_Premultiplied: - case QImage::Format_ARGB8565_Premultiplied: - case QImage::Format_ARGB8555_Premultiplied: - case QImage::Format_RGB888: - qt_memrotate270(reinterpret_cast<const quint24*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint24*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_RGB555: - case QImage::Format_RGB16: - case QImage::Format_ARGB4444_Premultiplied: - qt_memrotate270(reinterpret_cast<const quint16*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint16*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_Alpha8: - case QImage::Format_Grayscale8: - case QImage::Format_Indexed8: - qt_memrotate270(reinterpret_cast<const quint8*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint8*>(out.bits()), - out.bytesPerLine()); - break; - default: + const MemRotateFunc memrotate = qMemRotateFunctions[qPixelLayouts[image.format()].bpp][2]; + if (memrotate) { + memrotate(image.constBits(), w, h, image.bytesPerLine(), out.bits(), out.bytesPerLine()); + } else { for (int y=0; y<h; ++y) { if (image.colorCount()) for (int x=0; x<w; ++x) @@ -4548,18 +4510,29 @@ static QImage rotated90(const QImage &image) { for (int x=0; x<w; ++x) out.setPixel(h-y-1, x, image.pixel(x, y)); } - break; } return out; } +static QImage rotated180(const QImage &image) +{ + const MemRotateFunc memrotate = qMemRotateFunctions[qPixelLayouts[image.format()].bpp][1]; + if (!memrotate) + return image.mirrored(true, true); -static QImage rotated180(const QImage &image) { - return image.mirrored(true, true); + QImage out(image.width(), image.height(), image.format()); + out.setDotsPerMeterX(image.dotsPerMeterY()); + out.setDotsPerMeterY(image.dotsPerMeterX()); + if (image.colorCount() > 0) + out.setColorTable(image.colorTable()); + int w = image.width(); + int h = image.height(); + memrotate(image.constBits(), w, h, image.bytesPerLine(), out.bits(), out.bytesPerLine()); + return out; } - -static QImage rotated270(const QImage &image) { +static QImage rotated270(const QImage &image) +{ QImage out(image.height(), image.width(), image.format()); out.setDotsPerMeterX(image.dotsPerMeterY()); out.setDotsPerMeterY(image.dotsPerMeterX()); @@ -4567,49 +4540,10 @@ static QImage rotated270(const QImage &image) { out.setColorTable(image.colorTable()); int w = image.width(); int h = image.height(); - switch (image.format()) { - case QImage::Format_RGB32: - case QImage::Format_ARGB32: - case QImage::Format_ARGB32_Premultiplied: - case QImage::Format_RGBX8888: - case QImage::Format_RGBA8888: - case QImage::Format_RGBA8888_Premultiplied: - case QImage::Format_BGR30: - case QImage::Format_A2BGR30_Premultiplied: - case QImage::Format_RGB30: - case QImage::Format_A2RGB30_Premultiplied: - qt_memrotate90(reinterpret_cast<const quint32*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint32*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_RGB666: - case QImage::Format_ARGB6666_Premultiplied: - case QImage::Format_ARGB8565_Premultiplied: - case QImage::Format_ARGB8555_Premultiplied: - case QImage::Format_RGB888: - qt_memrotate90(reinterpret_cast<const quint24*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint24*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_RGB555: - case QImage::Format_RGB16: - case QImage::Format_ARGB4444_Premultiplied: - qt_memrotate90(reinterpret_cast<const quint16*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint16*>(out.bits()), - out.bytesPerLine()); - break; - case QImage::Format_Alpha8: - case QImage::Format_Grayscale8: - case QImage::Format_Indexed8: - qt_memrotate90(reinterpret_cast<const quint8*>(image.bits()), - w, h, image.bytesPerLine(), - reinterpret_cast<quint8*>(out.bits()), - out.bytesPerLine()); - break; - default: + const MemRotateFunc memrotate = qMemRotateFunctions[qPixelLayouts[image.format()].bpp][0]; + if (memrotate) { + memrotate(image.constBits(), w, h, image.bytesPerLine(), out.bits(), out.bytesPerLine()); + } else { for (int y=0; y<h; ++y) { if (image.colorCount()) for (int x=0; x<w; ++x) @@ -4618,7 +4552,6 @@ static QImage rotated270(const QImage &image) { for (int x=0; x<w; ++x) out.setPixel(y, w-x-1, image.pixel(x, y)); } - break; } return out; } |