diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/painting/qcoregraphics.mm | 47 | ||||
-rw-r--r-- | src/gui/painting/qcoregraphics_p.h | 3 |
2 files changed, 33 insertions, 17 deletions
diff --git a/src/gui/painting/qcoregraphics.mm b/src/gui/painting/qcoregraphics.mm index b5620535fb..94ba004c93 100644 --- a/src/gui/painting/qcoregraphics.mm +++ b/src/gui/painting/qcoregraphics.mm @@ -151,32 +151,47 @@ QT_END_NAMESPACE return [nsImage autorelease]; } -@end -QT_BEGIN_NAMESPACE ++ (instancetype)imageFromQIcon:(const QIcon &)icon +{ + return [NSImage imageFromQIcon:icon withSize:0]; +} -NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize) ++ (instancetype)imageFromQIcon:(const QIcon &)icon withSize:(int)size { if (icon.isNull()) return nil; - NSImage *nsImage = [[NSImage alloc] init]; - QList<QSize> availableSizes = icon.availableSizes(); - if (availableSizes.isEmpty() && defaultSize > 0) - availableSizes << QSize(defaultSize, defaultSize); + auto nsImage = [[NSImage alloc] initWithSize:NSZeroSize]; + + auto availableSizes = icon.availableSizes(); + if (availableSizes.isEmpty() && size > 0) + availableSizes << QSize(size, size); + for (QSize size : qAsConst(availableSizes)) { - QPixmap pm = icon.pixmap(size); - if (pm.isNull()) + QImage image = icon.pixmap(size).toImage(); + if (image.isNull()) + continue; + + QCFType<CGImageRef> cgImage = image.toCGImage(); + if (!cgImage) continue; - QImage image = pm.toImage(); - CGImageRef cgImage = qt_mac_toCGImage(image); - NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage]; - [nsImage addRepresentation:imageRep]; - [imageRep release]; - CGImageRelease(cgImage); + + auto *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage]; + imageRep.size = (image.size() / image.devicePixelRatioF()).toCGSize(); + [nsImage addRepresentation:[imageRep autorelease]]; } - return nsImage; + + [nsImage setTemplate:icon.isMask()]; + + if (size) + nsImage.size = CGSizeMake(size, size); + + return [nsImage autorelease]; } +@end + +QT_BEGIN_NAMESPACE QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size) { diff --git a/src/gui/painting/qcoregraphics_p.h b/src/gui/painting/qcoregraphics_p.h index e1697b0f38..db012d3cda 100644 --- a/src/gui/painting/qcoregraphics_p.h +++ b/src/gui/painting/qcoregraphics_p.h @@ -69,12 +69,13 @@ QT_BEGIN_NAMESPACE Q_GUI_EXPORT CGBitmapInfo qt_mac_bitmapInfoForImage(const QImage &image); #ifdef HAVE_APPKIT -Q_GUI_EXPORT NSImage *qt_mac_create_nsimage(const QIcon &icon, int defaultSize = 0); Q_GUI_EXPORT QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size); QT_END_NAMESPACE @interface NSImage (QtExtras) + (instancetype)imageFromQImage:(const QT_PREPEND_NAMESPACE(QImage) &)image; ++ (instancetype)imageFromQIcon:(const QT_PREPEND_NAMESPACE(QIcon) &)icon; ++ (instancetype)imageFromQIcon:(const QT_PREPEND_NAMESPACE(QIcon) &)icon withSize:(int)size; @end QT_BEGIN_NAMESPACE |