diff options
Diffstat (limited to 'src/core/type_conversion.cpp')
-rw-r--r-- | src/core/type_conversion.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/core/type_conversion.cpp b/src/core/type_conversion.cpp index 4aff2cff6..d35426ac3 100644 --- a/src/core/type_conversion.cpp +++ b/src/core/type_conversion.cpp @@ -137,6 +137,44 @@ QImage toQImage(const gfx::ImageSkiaRep &imageSkiaRep) return image; } +SkBitmap toSkBitmap(const QImage &image) +{ + SkBitmap bitmap; + SkImageInfo imageInfo; + + switch (image.format()) { + case QImage::Format_RGB32: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kOpaque_SkAlphaType); + break; + case QImage::Format_ARGB32: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kUnpremul_SkAlphaType); + break; + case QImage::Format_ARGB32_Premultiplied: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kBGRA_8888_SkColorType, kPremul_SkAlphaType); + break; + case QImage::Format_RGBX8888: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kOpaque_SkAlphaType); + break; + case QImage::Format_RGBA8888: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); + break; + case QImage::Format_RGBA8888_Premultiplied: + imageInfo = SkImageInfo::Make(image.width(), image.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); + break; + default: + return toSkBitmap(image.convertToFormat(QImage::Format_ARGB32_Premultiplied)); + } + + bitmap.installPixels(imageInfo, (void *)image.bits(), image.bytesPerLine()); + + // Ensure we copy the pixels + SkBitmap bitmapCopy; + bitmapCopy.allocPixels(imageInfo); + bitmapCopy.writePixels(bitmap.pixmap()); + + return bitmapCopy; +} + QIcon toQIcon(const std::vector<SkBitmap> &bitmaps) { if (!bitmaps.size()) |