frame_generator.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #include "ui/effects/frame_generator.h"
  8. #include "ui/image/image_prepare.h"
  9. namespace Ui {
  10. ImageFrameGenerator::ImageFrameGenerator(const QByteArray &bytes)
  11. : _bytes(bytes) {
  12. }
  13. ImageFrameGenerator::ImageFrameGenerator(const QImage &image)
  14. : _image(image) {
  15. }
  16. int ImageFrameGenerator::count() {
  17. return 1;
  18. }
  19. double ImageFrameGenerator::rate() {
  20. return 1.;
  21. }
  22. FrameGenerator::Frame ImageFrameGenerator::renderNext(
  23. QImage storage,
  24. QSize size,
  25. Qt::AspectRatioMode mode) {
  26. return renderCurrent(std::move(storage), size, mode);
  27. }
  28. FrameGenerator::Frame ImageFrameGenerator::renderCurrent(
  29. QImage storage,
  30. QSize size,
  31. Qt::AspectRatioMode mode) {
  32. if (_image.isNull() && !_bytes.isEmpty()) {
  33. _image = Images::Read({
  34. .content = _bytes,
  35. }).image;
  36. _bytes = QByteArray();
  37. }
  38. if (_image.isNull()) {
  39. return {};
  40. }
  41. auto scaled = _image.scaled(
  42. size,
  43. mode,
  44. Qt::SmoothTransformation
  45. ).convertToFormat(QImage::Format_ARGB32_Premultiplied);
  46. if (scaled.size() == size) {
  47. return { .image = std::move(scaled) };
  48. }
  49. auto result = QImage(size, QImage::Format_ARGB32_Premultiplied);
  50. result.fill(Qt::transparent);
  51. const auto skipx = (size.width() - scaled.width()) / 2;
  52. const auto skipy = (size.height() - scaled.height()) / 2;
  53. const auto srcPerLine = scaled.bytesPerLine();
  54. const auto dstPerLine = result.bytesPerLine();
  55. const auto lineBytes = scaled.width() * 4;
  56. auto src = scaled.constBits();
  57. auto dst = result.bits() + (skipx * 4) + (skipy * srcPerLine);
  58. for (auto y = 0, height = scaled.height(); y != height; ++y) {
  59. memcpy(dst, src, lineBytes);
  60. src += srcPerLine;
  61. dst += dstPerLine;
  62. }
  63. return { .image = std::move(result), .last = true };
  64. }
  65. void ImageFrameGenerator::jumpToStart() {
  66. }
  67. } // namespace Ui