| 22 | } |
| 23 | |
| 24 | void ValidateUserpicCache( |
| 25 | PeerUserpicView &view, |
| 26 | const QImage *cloud, |
| 27 | const EmptyUserpic *empty, |
| 28 | int size, |
| 29 | PeerUserpicShape shape) { |
| 30 | Expects(cloud != nullptr || empty != nullptr); |
| 31 | |
| 32 | const auto full = QSize(size, size); |
| 33 | const auto version = style::PaletteVersion(); |
| 34 | const auto shapeValue = static_cast<uint32>(shape) & 3; |
| 35 | const auto regenerate = (view.cached.size() != QSize(size, size)) |
| 36 | || (view.shape != shapeValue) |
| 37 | || (cloud && !view.empty.null()) |
| 38 | || (empty && empty != view.empty.get()) |
| 39 | || (empty && view.paletteVersion != version); |
| 40 | if (!regenerate) { |
| 41 | return; |
| 42 | } |
| 43 | view.empty = empty; |
| 44 | view.shape = shapeValue; |
| 45 | view.paletteVersion = version; |
| 46 | |
| 47 | if (cloud) { |
| 48 | view.cached = cloud->scaled( |
| 49 | full, |
| 50 | Qt::IgnoreAspectRatio, |
| 51 | Qt::SmoothTransformation); |
| 52 | if (shape == PeerUserpicShape::Monoforum) { |
| 53 | view.cached = Ui::ApplyMonoforumShape(std::move(view.cached)); |
| 54 | } else if (shape == PeerUserpicShape::Forum) { |
| 55 | view.cached = Images::Round( |
| 56 | std::move(view.cached), |
| 57 | Images::CornersMask(size |
| 58 | * Ui::ForumUserpicRadiusMultiplier() |
| 59 | / style::DevicePixelRatio())); |
| 60 | } else { |
| 61 | view.cached = Images::Circle(std::move(view.cached)); |
| 62 | } |
| 63 | } else { |
| 64 | if (view.cached.size() != full) { |
| 65 | view.cached = QImage(full, QImage::Format_ARGB32_Premultiplied); |
| 66 | } |
| 67 | view.cached.fill(Qt::transparent); |
| 68 | |
| 69 | auto p = QPainter(&view.cached); |
| 70 | if (shape == PeerUserpicShape::Monoforum) { |
| 71 | empty->paintMonoforum(p, 0, 0, size, size); |
| 72 | } else if (shape == PeerUserpicShape::Forum) { |
| 73 | empty->paintRounded( |
| 74 | p, |
| 75 | 0, |
| 76 | 0, |
| 77 | size, |
| 78 | size, |
| 79 | size * Ui::ForumUserpicRadiusMultiplier()); |
| 80 | } else { |
| 81 | empty->paintCircle(p, 0, 0, size, size); |
no test coverage detected