| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // This file is part of Desktop App Toolkit,
- // a set of libraries for developing nice desktop applications.
- //
- // For license and copyright information please follow this link:
- // https://github.com/desktop-app/legal/blob/master/LEGAL
- //
- #include "ui/effects/frame_generator.h"
- #include "ui/image/image_prepare.h"
- namespace Ui {
- ImageFrameGenerator::ImageFrameGenerator(const QByteArray &bytes)
- : _bytes(bytes) {
- }
- ImageFrameGenerator::ImageFrameGenerator(const QImage &image)
- : _image(image) {
- }
- int ImageFrameGenerator::count() {
- return 1;
- }
- double ImageFrameGenerator::rate() {
- return 1.;
- }
- FrameGenerator::Frame ImageFrameGenerator::renderNext(
- QImage storage,
- QSize size,
- Qt::AspectRatioMode mode) {
- return renderCurrent(std::move(storage), size, mode);
- }
- FrameGenerator::Frame ImageFrameGenerator::renderCurrent(
- QImage storage,
- QSize size,
- Qt::AspectRatioMode mode) {
- if (_image.isNull() && !_bytes.isEmpty()) {
- _image = Images::Read({
- .content = _bytes,
- }).image;
- _bytes = QByteArray();
- }
- if (_image.isNull()) {
- return {};
- }
- auto scaled = _image.scaled(
- size,
- mode,
- Qt::SmoothTransformation
- ).convertToFormat(QImage::Format_ARGB32_Premultiplied);
- if (scaled.size() == size) {
- return { .image = std::move(scaled) };
- }
- auto result = QImage(size, QImage::Format_ARGB32_Premultiplied);
- result.fill(Qt::transparent);
- const auto skipx = (size.width() - scaled.width()) / 2;
- const auto skipy = (size.height() - scaled.height()) / 2;
- const auto srcPerLine = scaled.bytesPerLine();
- const auto dstPerLine = result.bytesPerLine();
- const auto lineBytes = scaled.width() * 4;
- auto src = scaled.constBits();
- auto dst = result.bits() + (skipx * 4) + (skipy * srcPerLine);
- for (auto y = 0, height = scaled.height(); y != height; ++y) {
- memcpy(dst, src, lineBytes);
- src += srcPerLine;
- dst += dstPerLine;
- }
- return { .image = std::move(result), .last = true };
- }
- void ImageFrameGenerator::jumpToStart() {
- }
- } // namespace Ui
|