info_userpic_emoji_builder_common.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "info/userpic/info_userpic_emoji_builder_common.h"
  8. #include "ui/image/image_prepare.h"
  9. #include "ui/userpic_view.h" // ForumUserpicRadiusMultiplier.
  10. namespace UserpicBuilder {
  11. [[nodiscard]] QImage GenerateGradient(
  12. const QSize &size,
  13. const std::vector<QColor> &colors,
  14. bool circle,
  15. bool roundForumRect) {
  16. constexpr auto kRotation = int(45);
  17. auto gradient = Images::GenerateGradient(size, colors, kRotation);
  18. if (!circle && !roundForumRect) {
  19. return gradient;
  20. }
  21. const auto processModifier = [&](QImage &&i) {
  22. if (circle) {
  23. return Images::Circle(std::move(i));
  24. } else if (roundForumRect) {
  25. const auto radius = std::min(i.height(), i.width())
  26. * Ui::ForumUserpicRadiusMultiplier();
  27. return Images::Round(
  28. std::move(i),
  29. Images::CornersMask(radius / style::DevicePixelRatio()));
  30. } else {
  31. return std::move(i);
  32. }
  33. };
  34. if (style::DevicePixelRatio() == 1) {
  35. return processModifier(std::move(gradient));
  36. }
  37. auto image = QImage(
  38. size * style::DevicePixelRatio(),
  39. QImage::Format_ARGB32_Premultiplied);
  40. image.setDevicePixelRatio(style::DevicePixelRatio());
  41. image.fill(Qt::transparent);
  42. {
  43. auto p = QPainter(&image);
  44. p.drawImage(QRect(QPoint(), size), gradient);
  45. }
  46. return processModifier(std::move(image));
  47. }
  48. } // namespace UserpicBuilder