Add overloaded QBitmap::fromImage that takes QImage rvalue

... and use it.

[ChangeLog][QtGui][QBitmap] Add overloaded QBitmap::fromImage that takes QImage rvalue

Change-Id: Idb6e6bb1645371996700349714041cc54bb3d005
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
bb10
Anton Kudryavtsev 2018-01-30 17:44:54 +03:00 committed by Anton Kudryavtsev
parent 806c6abadd
commit aec6fae60b
3 changed files with 58 additions and 17 deletions

View File

@ -189,9 +189,7 @@ QBitmap &QBitmap::operator=(const QPixmap &pixmap)
} else if (pixmap.depth() == 1) { // 1-bit pixmap
QPixmap::operator=(pixmap); // shallow assignment
} else { // n-bit depth pixmap
QImage image;
image = pixmap.toImage(); // convert pixmap to image
*this = fromImage(image); // will dither image
*this = fromImage(pixmap.toImage()); // will dither image
}
return *this;
}
@ -223,6 +221,24 @@ QBitmap::operator QVariant() const
return QVariant(QVariant::Bitmap, this);
}
static QBitmap makeBitmap(QImage &&image, Qt::ImageConversionFlags flags)
{
// make sure image.color(0) == Qt::color0 (white)
// and image.color(1) == Qt::color1 (black)
const QRgb c0 = QColor(Qt::black).rgb();
const QRgb c1 = QColor(Qt::white).rgb();
if (image.color(0) == c0 && image.color(1) == c1) {
image.invertPixels();
image.setColor(0, c1);
image.setColor(1, c0);
}
QScopedPointer<QPlatformPixmap> data(QGuiApplicationPrivate::platformIntegration()->createPlatformPixmap(QPlatformPixmap::BitmapType));
data->fromImageInPlace(image, flags | Qt::MonoOnly);
return QPixmap(data.take());
}
/*!
Returns a copy of the given \a image converted to a bitmap using
the specified image conversion \a flags.
@ -234,22 +250,24 @@ QBitmap QBitmap::fromImage(const QImage &image, Qt::ImageConversionFlags flags)
if (image.isNull())
return QBitmap();
QImage img = image.convertToFormat(QImage::Format_MonoLSB, flags);
return makeBitmap(image.convertToFormat(QImage::Format_MonoLSB, flags), flags);
}
// make sure image.color(0) == Qt::color0 (white)
// and image.color(1) == Qt::color1 (black)
const QRgb c0 = QColor(Qt::black).rgb();
const QRgb c1 = QColor(Qt::white).rgb();
if (img.color(0) == c0 && img.color(1) == c1) {
img.invertPixels();
img.setColor(0, c1);
img.setColor(1, c0);
}
/*!
\since 5.12
\overload
QScopedPointer<QPlatformPixmap> data(QGuiApplicationPrivate::platformIntegration()->createPlatformPixmap(QPlatformPixmap::BitmapType));
Returns a copy of the given \a image converted to a bitmap using
the specified image conversion \a flags.
data->fromImage(img, flags | Qt::MonoOnly);
return QPixmap(data.take());
\sa fromData()
*/
QBitmap QBitmap::fromImage(QImage &&image, Qt::ImageConversionFlags flags)
{
if (image.isNull())
return QBitmap();
return makeBitmap(std::move(image).convertToFormat(QImage::Format_MonoLSB, flags), flags);
}
/*!
@ -277,7 +295,7 @@ QBitmap QBitmap::fromData(const QSize &size, const uchar *bits, QImage::Format m
int bytesPerLine = (size.width() + 7) / 8;
for (int y = 0; y < size.height(); ++y)
memcpy(image.scanLine(y), bits + bytesPerLine * y, bytesPerLine);
return QBitmap::fromImage(image);
return QBitmap::fromImage(std::move(image));
}
/*!

View File

@ -72,6 +72,7 @@ public:
inline void clear() { fill(Qt::color0); }
static QBitmap fromImage(const QImage &image, Qt::ImageConversionFlags flags = Qt::AutoColor);
static QBitmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor);
static QBitmap fromData(const QSize &size, const uchar *bits,
QImage::Format monoFormat = QImage::Format_MonoLSB);

View File

@ -90,6 +90,7 @@ private slots:
void mask();
void bitmapMask();
void bitmapFromImageRvalue();
void setGetMask_data();
void setGetMask();
void cacheKey();
@ -596,6 +597,27 @@ void tst_QPixmap::bitmapMask()
QVERIFY(image.pixel(1, 1));
}
void tst_QPixmap::bitmapFromImageRvalue()
{
auto makeImage = [](){
QImage image(3, 3, QImage::Format_MonoLSB);
image.setColor(0, Qt::color0);
image.setColor(1, Qt::color1);
image.fill(Qt::color0);
image.setPixel(1, 1, Qt::color1);
image.setPixel(0, 0, Qt::color1);
return image;
};
auto image1 = makeImage();
auto image2 = makeImage();
auto bitmap1 = QBitmap::fromImage(image1);
auto bitmap2 = QBitmap::fromImage(std::move(image2));
QCOMPARE(bitmap1.toImage(), bitmap2.toImage());
QVERIFY(!image1.isNull());
QVERIFY(image2.isNull());
}
void tst_QPixmap::setGetMask_data()
{
QTest::addColumn<QPixmap>("pixmap");