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
82 lines
2.2 KiB
C++
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
|