| 265 | } |
| 266 | |
| 267 | void VenuesController::rowPaintIcon( |
| 268 | QPainter &p, |
| 269 | int x, |
| 270 | int y, |
| 271 | int size, |
| 272 | const QString &icon) { |
| 273 | auto i = _icons.find(icon); |
| 274 | if (i == end(_icons)) { |
| 275 | i = _icons.emplace(icon, VenueIcon{ |
| 276 | .document = _session->data().venueIconDocument(icon), |
| 277 | }).first; |
| 278 | i->second.media = i->second.document->createMediaView(); |
| 279 | i->second.document->forceToCache(true); |
| 280 | i->second.document->save({}, QString(), LoadFromCloudOrLocal, true); |
| 281 | } |
| 282 | auto &data = i->second; |
| 283 | const auto version = uint32(style::PaletteVersion()); |
| 284 | const auto loaded = (!data.media || data.media->loaded()) ? 1 : 0; |
| 285 | const auto prepare = data.image.isNull() |
| 286 | || (data.iconLoaded != loaded) |
| 287 | || (data.paletteVersion != version); |
| 288 | if (prepare) { |
| 289 | const auto skip = st::pickLocationIconSkip; |
| 290 | const auto inner = size - skip * 2; |
| 291 | const auto ratio = style::DevicePixelRatio(); |
| 292 | |
| 293 | if (loaded && data.media) { |
| 294 | const auto bytes = base::take(data.media)->bytes(); |
| 295 | data.icon = Images::Read({ .content = bytes }).image; |
| 296 | if (!data.icon.isNull()) { |
| 297 | data.icon = data.icon.scaled( |
| 298 | QSize(inner, inner) * ratio, |
| 299 | Qt::IgnoreAspectRatio, |
| 300 | Qt::SmoothTransformation); |
| 301 | if (!data.icon.isNull()) { |
| 302 | data.icon = data.icon.convertToFormat( |
| 303 | QImage::Format_ARGB32_Premultiplied); |
| 304 | } |
| 305 | } |
| 306 | } |
| 307 | |
| 308 | const auto full = QSize(size, size) * ratio; |
| 309 | auto image = (data.image.size() == full) |
| 310 | ? base::take(data.image) |
| 311 | : QImage(full, QImage::Format_ARGB32_Premultiplied); |
| 312 | image.fill(Qt::transparent); |
| 313 | image.setDevicePixelRatio(ratio); |
| 314 | |
| 315 | const auto bg = EmptyUserpic::UserpicColor( |
| 316 | EmptyUserpic::ColorIndex(UniqueRowIdFromString(icon))); |
| 317 | auto p = QPainter(&image); |
| 318 | auto hq = PainterHighQualityEnabler(p); |
| 319 | { |
| 320 | auto gradient = QLinearGradient(0, 0, 0, size); |
| 321 | gradient.setStops({ |
| 322 | { 0., bg.color1->c }, |
| 323 | { 1., bg.color2->c } |
| 324 | }); |
no test coverage detected