Changeset View
Changeset View
Standalone View
Standalone View
src/kiconengine.cpp
Show First 20 Lines • Show All 74 Lines • ▼ Show 20 Line(s) | |||||
75 | #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) | 75 | #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) | ||
76 | const qreal dpr = painter->device()->devicePixelRatioF(); | 76 | const qreal dpr = painter->device()->devicePixelRatioF(); | ||
77 | #else | 77 | #else | ||
78 | const qreal dpr = painter->device()->devicePixelRatio(); | 78 | const qreal dpr = painter->device()->devicePixelRatio(); | ||
79 | #endif | 79 | #endif | ||
80 | painter->drawPixmap(rect, pixmap(rect.size() * dpr, mode, state)); | 80 | painter->drawPixmap(rect, pixmap(rect.size() * dpr, mode, state)); | ||
81 | } | 81 | } | ||
82 | 82 | | |||
83 | QPixmap KIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) | 83 | QPixmap KIconEngine::createPixmap(const QSize &size, qreal scale, QIcon::Mode mode, QIcon::State state) | ||
84 | { | 84 | { | ||
85 | Q_UNUSED(state) | 85 | Q_UNUSED(state) | ||
86 | 86 | | |||
87 | if (scale < 1) { | ||||
88 | scale = 1; | ||||
89 | } | ||||
90 | | ||||
87 | if (size.isEmpty()) { | 91 | if (size.isEmpty()) { | ||
88 | return QPixmap(); | 92 | return QPixmap(); | ||
89 | } | 93 | } | ||
90 | 94 | | |||
95 | QSize scaledSize = size / scale; | ||||
96 | | ||||
91 | if (!mIconLoader) { | 97 | if (!mIconLoader) { | ||
92 | QPixmap pm(size); | 98 | QPixmap pm(size); | ||
99 | pm.setDevicePixelRatio(scale); | ||||
93 | pm.fill(Qt::transparent); | 100 | pm.fill(Qt::transparent); | ||
94 | return pm; | 101 | return pm; | ||
95 | } | 102 | } | ||
96 | 103 | | |||
97 | | ||||
98 | const int kstate = qIconModeToKIconState(mode); | 104 | const int kstate = qIconModeToKIconState(mode); | ||
99 | const int iconSize = qMin(size.width(), size.height()); | 105 | const int iconSize = qMin(scaledSize.width(), scaledSize.height()); | ||
100 | QPixmap pix = mIconLoader.data()->loadIcon(mIconName, KIconLoader::Desktop, iconSize, kstate, mOverlays); | 106 | QPixmap pix = mIconLoader.data()->loadIcon(mIconName, KIconLoader::Desktop, scale, iconSize, kstate, mOverlays); | ||
101 | 107 | | |||
102 | if (pix.size() == size) { | 108 | if (pix.size() == size) { | ||
103 | return pix; | 109 | return pix; | ||
104 | } | 110 | } | ||
105 | 111 | | |||
106 | QPixmap pix2(size); | 112 | // FIXME this stuff down here is broken, either X "Maximum allowed requested length exceeded" with dpr >= 3 | ||
113 | // or the pixmap is just broken (too small, wrongly positioned etc) | ||||
114 | QPixmap pix2(size * scale); | ||||
115 | pix2.setDevicePixelRatio(scale); | ||||
107 | pix2.fill(QColor(0, 0, 0, 0)); | 116 | pix2.fill(QColor(0, 0, 0, 0)); | ||
108 | 117 | | |||
109 | QPainter painter(&pix2); | 118 | QPainter painter(&pix2); | ||
110 | painter.drawPixmap(QPoint((pix2.width() - pix.width()) / 2, (pix2.height() - pix.height()) / 2), pix); | 119 | painter.drawPixmap(QPoint((pix2.width() - pix.width()) / 2, (pix2.height() - pix.height()) / 2), pix); | ||
111 | 120 | | |||
112 | return pix2; | 121 | return pix2; | ||
113 | } | 122 | } | ||
114 | 123 | | |||
124 | QPixmap KIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) | ||||
125 | { | ||||
126 | return createPixmap(size, 1, mode, state); | ||||
127 | } | ||||
128 | | ||||
115 | QString KIconEngine::iconName() const | 129 | QString KIconEngine::iconName() const | ||
116 | { | 130 | { | ||
117 | if (!mIconLoader || !mIconLoader->hasIcon(mIconName)) { | 131 | if (!mIconLoader || !mIconLoader->hasIcon(mIconName)) { | ||
118 | return QString(); | 132 | return QString(); | ||
119 | } | 133 | } | ||
120 | return mIconName; | 134 | return mIconName; | ||
121 | } | 135 | } | ||
122 | 136 | | |||
Show All 38 Lines | |||||
161 | { | 175 | { | ||
162 | #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0) | 176 | #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0) | ||
163 | if (id == QIconEngine::IsNullHook) { | 177 | if (id == QIconEngine::IsNullHook) { | ||
164 | #else | 178 | #else | ||
165 | if (id == 3) { | 179 | if (id == 3) { | ||
166 | #endif | 180 | #endif | ||
167 | *reinterpret_cast<bool*>(data) = !mIconLoader || !mIconLoader->hasIcon(mIconName); | 181 | *reinterpret_cast<bool*>(data) = !mIconLoader || !mIconLoader->hasIcon(mIconName); | ||
168 | } | 182 | } | ||
183 | #if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) | ||||
184 | if (id == QIconEngine::ScaledPixmapHook) { | ||||
185 | auto *info = reinterpret_cast<ScaledPixmapArgument *>(data); | ||||
186 | info->pixmap = createPixmap(info->size, info->scale, info->mode, info->state); | ||||
187 | return; | ||||
188 | } | ||||
189 | #endif | ||||
169 | QIconEngine::virtual_hook(id, data); | 190 | QIconEngine::virtual_hook(id, data); | ||
170 | } | 191 | } |