323QList<QSize> QAppleIconEngine::availableIconSizes(
double aspectRatio)
325 const qreal devicePixelRatio = qGuiApp->devicePixelRatio();
326 const QList<QSize> sizes = {
327 {qRound(16 * devicePixelRatio), qRound(16. * devicePixelRatio / aspectRatio)},
328 {qRound(32 * devicePixelRatio), qRound(32. * devicePixelRatio / aspectRatio)},
329 {qRound(64 * devicePixelRatio), qRound(64. * devicePixelRatio / aspectRatio)},
330 {qRound(128 * devicePixelRatio), qRound(128. * devicePixelRatio / aspectRatio)},
331 {qRound(256 * devicePixelRatio), qRound(256. * devicePixelRatio / aspectRatio)},
342QSize QAppleIconEngine::actualSize(
const QSize &size, QIcon::Mode , QIcon::State )
344 const double inputAspectRatio = isNull() ? 1.0 : m_image.size.width / m_image.size.height;
345 const double outputAspectRatio = size.width() / size.height();
347 if (outputAspectRatio > inputAspectRatio)
348 result.rwidth() = result.height() * inputAspectRatio;
350 result.rheight() = result.width() / inputAspectRatio;
354QPixmap QAppleIconEngine::pixmap(
const QSize &size, QIcon::Mode mode, QIcon::State state)
356 return scaledPixmap(size, mode, state, 1.0);
398QPixmap QAppleIconEngine::scaledPixmap(
const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale)
400 const CacheKey key(mode, state, size, scale);
401 QPixmap pixmap = m_cache.value(key);
402 if (pixmap.isNull()) {
403 const QSize paintSize = actualSize(size, mode, state);
404 const QSize paintOffset = paintSize != size
405 ? (QSizeF(size - paintSize) * 0.5).toSize()
408 pixmap = QPixmap(size * scale);
409 pixmap.setDevicePixelRatio(scale);
410 pixmap.fill(Qt::transparent);
412 if (!pixmap.isNull()) {
413 QPainter painter(&pixmap);
414 paint(&painter, QRect(paintOffset.width(), paintOffset.height(),
415 paintSize.width(), paintSize.height()), mode, state);
416 m_cache.insert(key, pixmap);
422void QAppleIconEngine::paint(QPainter *painter,
const QRect &rect, QIcon::Mode mode, QIcon::State state)
427 const QPalette palette;
430 color = palette.color(QPalette::Inactive, QPalette::Text);
432 case QIcon::Disabled:
433 color = palette.color(QPalette::Disabled, QPalette::Text);
436 color = palette.color(QPalette::Active, QPalette::Text);
438 case QIcon::Selected:
439 color = palette.color(QPalette::Active, QPalette::HighlightedText);
442 const auto *image = configuredImage(m_image, color);
444 QMacCGContext ctx(painter);
446#if defined(Q_OS_MACOS)
447 NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithCGContext:ctx flipped:YES];
448 [NSGraphicsContext saveGraphicsState];
449 [NSGraphicsContext setCurrentContext:gc];
451 const NSSize pixmapSize = NSMakeSize(rect.width(), rect.height());
452 [image setSize:pixmapSize];
453 const NSRect sourceRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
454 const NSRect iconRect = NSMakeRect(rect.x(), rect.y(), pixmapSize.width, pixmapSize.height);
456 [image drawInRect:iconRect fromRect:sourceRect operation:NSCompositingOperationSourceOver
457 fraction:1.0 respectFlipped:YES hints:@{
458 NSImageHintUserInterfaceLayoutDirection: painter->layoutDirection() == Qt::RightToLeft ?
459 @(NSUserInterfaceLayoutDirectionRightToLeft) : @(NSUserInterfaceLayoutDirectionLeftToRight)
461 [NSGraphicsContext restoreGraphicsState];
462#elif defined(QT_PLATFORM_UIKIT)
463 auto *layoutDirectionTrait = [UITraitCollection traitCollectionWithLayoutDirection:
464 painter->layoutDirection() == Qt::RightToLeft ?
465 UITraitEnvironmentLayoutDirectionRightToLeft :
466 UITraitEnvironmentLayoutDirectionLeftToRight];
468 image = [image imageWithConfiguration:layoutDirectionTrait.imageConfiguration];
470 UIGraphicsPushContext(ctx);
471 const CGRect cgrect = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
472 [image drawInRect:cgrect];
473 UIGraphicsPopContext();