Files
tdesktop/Telegram/lib_lottie/lottie/lottie_common.cpp
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
init
2026-02-16 15:50:16 +03:00

82 lines
2.2 KiB
C++

// 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 "lottie/lottie_common.h"
#include "base/algorithm.h"
#include <QFile>
namespace Lottie {
namespace {
QByteArray ReadFile(const QString &filepath) {
auto f = QFile(filepath);
return (f.size() <= kMaxFileSize && f.open(QIODevice::ReadOnly))
? f.readAll()
: QByteArray();
}
} // namespace
QSize FrameRequest::size(
const QSize &original,
int sizeRounding) const {
Expects(!empty());
Expects(sizeRounding != 0);
const auto result = original.scaled(box, Qt::KeepAspectRatio);
const auto skipw = result.width() % sizeRounding;
const auto skiph = result.height() % sizeRounding;
return QSize(
std::max(result.width() - skipw, sizeRounding),
std::max(result.height() - skiph, sizeRounding));
}
QByteArray ReadContent(const QByteArray &data, const QString &filepath) {
return data.isEmpty() ? ReadFile(filepath) : base::duplicate(data);
}
std::string ReadUtf8(const QByteArray &data) {
//00 00 FE FF UTF-32BE
//FF FE 00 00 UTF-32LE
//FE FF UTF-16BE
//FF FE UTF-16LE
//EF BB BF UTF-8
if (data.size() < 4) {
return data.toStdString();
}
const auto bom = uint32(uint8(data[0]))
| (uint32(uint8(data[1])) << 8)
| (uint32(uint8(data[2])) << 16)
| (uint32(uint8(data[3])) << 24);
const auto skip = ((bom == 0xFFFE0000U) || (bom == 0x0000FEFFU))
? 4
: (((bom & 0xFFFFU) == 0xFFFEU) || ((bom & 0xFFFFU) == 0xFEFFU))
? 2
: ((bom & 0xFFFFFFU) == 0xBFBBEFU)
? 3
: 0;
const auto bytes = data.data() + skip;
const auto length = data.size() - skip;
// Old RapidJSON didn't convert encoding, just skipped BOM.
// We emulate old behavior here, so don't convert as well.
return std::string(bytes, length);
}
bool GoodStorageForFrame(const QImage &storage, QSize size) {
return !storage.isNull()
&& (storage.format() == kImageFormat)
&& (storage.size() == size)
&& storage.isDetached();
}
QImage CreateFrameStorage(QSize size) {
return QImage(size, kImageFormat);
}
} // namespace Lottie