diff options
Diffstat (limited to 'VMProtect/app_icon.mm')
-rw-r--r-- | VMProtect/app_icon.mm | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/VMProtect/app_icon.mm b/VMProtect/app_icon.mm new file mode 100644 index 0000000..03c193d --- /dev/null +++ b/VMProtect/app_icon.mm @@ -0,0 +1,137 @@ +#include <QtGui/QIcon> +#include <AppKit/AppKit.h> + +/* + Helper class that automates refernce counting for CFtypes. + After constructing the QCFType object, it can be copied like a + value-based type. + + Note that you must own the object you are wrapping. + This is typically the case if you get the object from a Core + Foundation function with the word "Create" or "Copy" in it. If + you got the object from a "Get" function, either retain it or use + constructFromGet(). One exception to this rule is the + HIThemeGet*Shape functions, which in reality are "Copy" functions. +*/ +template <typename T> +class QCFType +{ +public: + inline QCFType(const T &t = 0) : type(t) {} + inline QCFType(const QCFType &helper) : type(helper.type) { if (type) CFRetain(type); } + inline ~QCFType() { if (type) CFRelease(type); } + inline operator T() { return type; } + inline QCFType operator =(const QCFType &helper) + { + if (helper.type) + CFRetain(helper.type); + CFTypeRef type2 = type; + type = helper.type; + if (type2) + CFRelease(type2); + return *this; + } + inline T *operator&() { return &type; } + template <typename X> X as() const { return reinterpret_cast<X>(type); } + static QCFType constructFromGet(const T &t) + { + CFRetain(t); + return QCFType<T>(t); + } +protected: + T type; +}; + +CGColorSpaceRef qt_mac_genericColorSpace() +{ + CGDirectDisplayID displayID = CGMainDisplayID(); + CGColorSpaceRef colorSpace = CGDisplayCopyColorSpace(displayID); + if (colorSpace == 0) + colorSpace = CGColorSpaceCreateDeviceRGB(); + + return colorSpace; +} + +static void qt_mac_deleteImage(void *image, const void *, size_t) +{ + delete static_cast<QImage *>(image); +} + +// Creates a CGDataProvider with the data from the given image. +// The data provider retains a copy of the image. +CGDataProviderRef qt_mac_CGDataProvider(const QImage &image) +{ + return CGDataProviderCreateWithData(new QImage(image), image.bits(), + image.byteCount(), qt_mac_deleteImage); +} + +CGImageRef qt_mac_toCGImage(const QImage &inImage) +{ + if (inImage.isNull()) + return 0; + + QImage image = inImage; + + uint cgflags = kCGImageAlphaNone; + switch (image.format()) { + case QImage::Format_ARGB32: + cgflags = kCGImageAlphaFirst | kCGBitmapByteOrder32Host; + break; + case QImage::Format_RGB32: + cgflags = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host; + break; + case QImage::Format_RGB888: + cgflags = kCGImageAlphaNone | kCGBitmapByteOrder32Big; + break; + case QImage::Format_RGBA8888_Premultiplied: + cgflags = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big; + break; + case QImage::Format_RGBA8888: + cgflags = kCGImageAlphaLast | kCGBitmapByteOrder32Big; + break; + case QImage::Format_RGBX8888: + cgflags = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big; + break; + default: + // Everything not recognized explicitly is converted to ARGB32_Premultiplied. + image = inImage.convertToFormat(QImage::Format_ARGB32_Premultiplied); + // no break; + case QImage::Format_ARGB32_Premultiplied: + cgflags = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host; + break; + } + + QCFType<CGDataProviderRef> dataProvider = qt_mac_CGDataProvider(image); + return CGImageCreate(image.width(), image.height(), 8, 32, + image.bytesPerLine(), + qt_mac_genericColorSpace(), + cgflags, dataProvider, 0, false, kCGRenderingIntentDefault); +} + +NSImage *qt_mac_create_nsimage(const QIcon &icon) +{ + if (icon.isNull()) + return nil; + + NSImage *nsImage = [[NSImage alloc] init]; + foreach (QSize size, icon.availableSizes()) { + QPixmap pm = icon.pixmap(size); + QImage image = pm.toImage(); + CGImageRef cgImage = qt_mac_toCGImage(image); + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage]; + [nsImage addRepresentation:imageRep]; + [imageRep release]; + CGImageRelease(cgImage); + } + return nsImage; +} + +void qt_mac_set_app_icon(const QIcon &icon) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSImage *image = qt_mac_create_nsimage(icon); + [NSApp setApplicationIconImage:image]; + [image release]; + [pool release]; +} + |