userpic_view.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 "ui/userpic_view.h"
  8. #include "ui/empty_userpic.h"
  9. #include "ui/image/image_prepare.h"
  10. namespace Ui {
  11. float64 ForumUserpicRadiusMultiplier() {
  12. return 0.3;
  13. }
  14. bool PeerUserpicLoading(const PeerUserpicView &view) {
  15. return view.cloud && view.cloud->isNull();
  16. }
  17. void ValidateUserpicCache(
  18. PeerUserpicView &view,
  19. const QImage *cloud,
  20. const EmptyUserpic *empty,
  21. int size,
  22. bool forum) {
  23. Expects(cloud != nullptr || empty != nullptr);
  24. const auto full = QSize(size, size);
  25. const auto version = style::PaletteVersion();
  26. const auto forumValue = forum ? 1 : 0;
  27. const auto regenerate = (view.cached.size() != QSize(size, size))
  28. || (view.forum != forumValue)
  29. || (cloud && !view.empty.null())
  30. || (empty && empty != view.empty.get())
  31. || (empty && view.paletteVersion != version);
  32. if (!regenerate) {
  33. return;
  34. }
  35. view.empty = empty;
  36. view.forum = forumValue;
  37. view.paletteVersion = version;
  38. if (cloud) {
  39. view.cached = cloud->scaled(
  40. full,
  41. Qt::IgnoreAspectRatio,
  42. Qt::SmoothTransformation);
  43. if (forum) {
  44. view.cached = Images::Round(
  45. std::move(view.cached),
  46. Images::CornersMask(size
  47. * Ui::ForumUserpicRadiusMultiplier()
  48. / style::DevicePixelRatio()));
  49. } else {
  50. view.cached = Images::Circle(std::move(view.cached));
  51. }
  52. } else {
  53. if (view.cached.size() != full) {
  54. view.cached = QImage(full, QImage::Format_ARGB32_Premultiplied);
  55. }
  56. view.cached.fill(Qt::transparent);
  57. auto p = QPainter(&view.cached);
  58. if (forum) {
  59. empty->paintRounded(
  60. p,
  61. 0,
  62. 0,
  63. size,
  64. size,
  65. size * Ui::ForumUserpicRadiusMultiplier());
  66. } else {
  67. empty->paintCircle(p, 0, 0, size, size);
  68. }
  69. }
  70. }
  71. } // namespace Ui