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