mirror of
https://github.com/DrKLO/Telegram.git
synced 2024-12-22 14:35:03 +01:00
Update to 8.3.0
This commit is contained in:
parent
dcf1c6d4c3
commit
3477d72367
9 changed files with 131 additions and 21 deletions
|
@ -51,7 +51,7 @@ typedef struct LottieInfo {
|
||||||
volatile uint32_t framesAvailableInCache = 0;
|
volatile uint32_t framesAvailableInCache = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_create(JNIEnv *env, jclass clazz, jstring src, jstring json, jint w, jint h, jintArray data, jboolean precache, jintArray colorReplacement, jboolean limitFps) {
|
JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_create(JNIEnv *env, jclass clazz, jstring src, jstring json, jint w, jint h, jintArray data, jboolean precache, jintArray colorReplacement, jboolean limitFps, jint fitzModifier) {
|
||||||
auto info = new LottieInfo();
|
auto info = new LottieInfo();
|
||||||
|
|
||||||
std::map<int32_t, int32_t> *colors = nullptr;
|
std::map<int32_t, int32_t> *colors = nullptr;
|
||||||
|
@ -71,16 +71,35 @@ JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_create(JNIEnv *e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FitzModifier modifier = FitzModifier::None;
|
||||||
|
switch (fitzModifier) {
|
||||||
|
case 12:
|
||||||
|
modifier = FitzModifier::Type12;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
modifier = FitzModifier::Type3;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
modifier = FitzModifier::Type4;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
modifier = FitzModifier::Type5;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
modifier = FitzModifier::Type6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
char const *srcString = env->GetStringUTFChars(src, nullptr);
|
char const *srcString = env->GetStringUTFChars(src, nullptr);
|
||||||
info->path = srcString;
|
info->path = srcString;
|
||||||
if (json != nullptr) {
|
if (json != nullptr) {
|
||||||
char const *jsonString = env->GetStringUTFChars(json, nullptr);
|
char const *jsonString = env->GetStringUTFChars(json, nullptr);
|
||||||
if (jsonString) {
|
if (jsonString) {
|
||||||
info->animation = rlottie::Animation::loadFromData(jsonString, info->path, colors);
|
info->animation = rlottie::Animation::loadFromData(jsonString, info->path, colors, modifier);
|
||||||
env->ReleaseStringUTFChars(json, jsonString);
|
env->ReleaseStringUTFChars(json, jsonString);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
info->animation = rlottie::Animation::loadFromFile(info->path, colors);
|
info->animation = rlottie::Animation::loadFromFile(info->path, colors, modifier);
|
||||||
}
|
}
|
||||||
if (srcString) {
|
if (srcString) {
|
||||||
env->ReleaseStringUTFChars(src, srcString);
|
env->ReleaseStringUTFChars(src, srcString);
|
||||||
|
|
|
@ -52,6 +52,15 @@ struct LOTLayerNode;
|
||||||
|
|
||||||
namespace rlottie {
|
namespace rlottie {
|
||||||
|
|
||||||
|
enum class FitzModifier {
|
||||||
|
None,
|
||||||
|
Type12,
|
||||||
|
Type3,
|
||||||
|
Type4,
|
||||||
|
Type5,
|
||||||
|
Type6
|
||||||
|
};
|
||||||
|
|
||||||
struct Color {
|
struct Color {
|
||||||
Color() = default;
|
Color() = default;
|
||||||
Color(float r, float g , float b):_r(r), _g(g), _b(b){}
|
Color(float r, float g , float b):_r(r), _g(g), _b(b){}
|
||||||
|
@ -258,7 +267,7 @@ public:
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
static std::unique_ptr<Animation>
|
static std::unique_ptr<Animation>
|
||||||
loadFromFile(const std::string &path, std::map<int32_t, int32_t> *colorReplacement);
|
loadFromFile(const std::string &path, std::map<int32_t, int32_t> *colorReplacement, FitzModifier fitzModifier);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Constructs an animation object from JSON string data.
|
* @brief Constructs an animation object from JSON string data.
|
||||||
|
@ -273,7 +282,7 @@ public:
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
static std::unique_ptr<Animation>
|
static std::unique_ptr<Animation>
|
||||||
loadFromData(std::string jsonData, const std::string &key, std::map<int32_t, int32_t> *colorReplacement, const std::string &resourcePath="");
|
loadFromData(std::string jsonData, const std::string &key, std::map<int32_t, int32_t> *colorReplacement, FitzModifier fitzModifier = FitzModifier::None, const std::string &resourcePath="");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns default framerate of the Lottie resource.
|
* @brief Returns default framerate of the Lottie resource.
|
||||||
|
|
|
@ -125,6 +125,7 @@ void AnimationImpl::init(const std::shared_ptr<LOTModel> &model)
|
||||||
std::unique_ptr<Animation> Animation::loadFromData(
|
std::unique_ptr<Animation> Animation::loadFromData(
|
||||||
std::string jsonData, const std::string &key,
|
std::string jsonData, const std::string &key,
|
||||||
std::map<int32_t, int32_t> *colorReplacement,
|
std::map<int32_t, int32_t> *colorReplacement,
|
||||||
|
FitzModifier fitzModifier,
|
||||||
const std::string &resourcePath)
|
const std::string &resourcePath)
|
||||||
{
|
{
|
||||||
if (jsonData.empty()) {
|
if (jsonData.empty()) {
|
||||||
|
@ -135,7 +136,7 @@ std::unique_ptr<Animation> Animation::loadFromData(
|
||||||
LottieLoader loader;
|
LottieLoader loader;
|
||||||
if (loader.loadFromData(std::move(jsonData), key,
|
if (loader.loadFromData(std::move(jsonData), key,
|
||||||
colorReplacement,
|
colorReplacement,
|
||||||
(resourcePath.empty() ? " " : resourcePath))) {
|
(resourcePath.empty() ? " " : resourcePath), fitzModifier)) {
|
||||||
auto animation = std::unique_ptr<Animation>(new Animation);
|
auto animation = std::unique_ptr<Animation>(new Animation);
|
||||||
animation->colorMap = colorReplacement;
|
animation->colorMap = colorReplacement;
|
||||||
animation->d->init(loader.model());
|
animation->d->init(loader.model());
|
||||||
|
@ -145,7 +146,7 @@ std::unique_ptr<Animation> Animation::loadFromData(
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Animation> Animation::loadFromFile(const std::string &path, std::map<int32_t, int32_t> *colorReplacement)
|
std::unique_ptr<Animation> Animation::loadFromFile(const std::string &path, std::map<int32_t, int32_t> *colorReplacement, FitzModifier fitzModifier)
|
||||||
{
|
{
|
||||||
if (path.empty()) {
|
if (path.empty()) {
|
||||||
vWarning << "File path is empty";
|
vWarning << "File path is empty";
|
||||||
|
@ -153,7 +154,7 @@ std::unique_ptr<Animation> Animation::loadFromFile(const std::string &path, std:
|
||||||
}
|
}
|
||||||
|
|
||||||
LottieLoader loader;
|
LottieLoader loader;
|
||||||
if (loader.load(path, colorReplacement)) {
|
if (loader.load(path, colorReplacement, fitzModifier)) {
|
||||||
auto animation = std::unique_ptr<Animation>(new Animation);
|
auto animation = std::unique_ptr<Animation>(new Animation);
|
||||||
animation->colorMap = colorReplacement;
|
animation->colorMap = colorReplacement;
|
||||||
animation->d->init(loader.model());
|
animation->d->init(loader.model());
|
||||||
|
|
|
@ -75,7 +75,7 @@ static std::string dirname(const std::string &path)
|
||||||
return std::string(path, 0, len);
|
return std::string(path, 0, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LottieLoader::load(const std::string &path, std::map<int32_t, int32_t> *colorReplacement)
|
bool LottieLoader::load(const std::string &path, std::map<int32_t, int32_t> *colorReplacement, rlottie::FitzModifier fitzModifier)
|
||||||
{
|
{
|
||||||
mModel = LottieFileCache::instance().find(path);
|
mModel = LottieFileCache::instance().find(path);
|
||||||
if (mModel) return true;
|
if (mModel) return true;
|
||||||
|
@ -95,7 +95,7 @@ bool LottieLoader::load(const std::string &path, std::map<int32_t, int32_t> *col
|
||||||
if (content.empty()) return false;
|
if (content.empty()) return false;
|
||||||
|
|
||||||
const char *str = content.c_str();
|
const char *str = content.c_str();
|
||||||
LottieParser parser(const_cast<char *>(str), dirname(path).c_str(), colorReplacement);
|
LottieParser parser(const_cast<char *>(str), dirname(path).c_str(), colorReplacement, fitzModifier);
|
||||||
if (parser.hasParsingError()) {
|
if (parser.hasParsingError()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -111,12 +111,12 @@ bool LottieLoader::load(const std::string &path, std::map<int32_t, int32_t> *col
|
||||||
|
|
||||||
bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key,
|
bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key,
|
||||||
std::map<int32_t, int32_t> *colorReplacement,
|
std::map<int32_t, int32_t> *colorReplacement,
|
||||||
const std::string &resourcePath)
|
const std::string &resourcePath, rlottie::FitzModifier fitzModifier)
|
||||||
{
|
{
|
||||||
mModel = LottieFileCache::instance().find(key);
|
mModel = LottieFileCache::instance().find(key);
|
||||||
if (mModel) return true;
|
if (mModel) return true;
|
||||||
|
|
||||||
LottieParser parser(const_cast<char *>(jsonData.c_str()), resourcePath.c_str(), colorReplacement);
|
LottieParser parser(const_cast<char *>(jsonData.c_str()), resourcePath.c_str(), colorReplacement, fitzModifier);
|
||||||
mModel = parser.model();
|
mModel = parser.model();
|
||||||
|
|
||||||
if (!mModel) return false;
|
if (!mModel) return false;
|
||||||
|
|
|
@ -22,13 +22,14 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <rlottie.h>
|
||||||
|
|
||||||
class LOTModel;
|
class LOTModel;
|
||||||
class LottieLoader
|
class LottieLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool load(const std::string &filePath, std::map<int32_t, int32_t> *colorReplacement);
|
bool load(const std::string &filePath, std::map<int32_t, int32_t> *colorReplacement, rlottie::FitzModifier fitzModifier);
|
||||||
bool loadFromData(std::string &&jsonData, const std::string &key, std::map<int32_t, int32_t> *colorReplacement, const std::string &resourcePath);
|
bool loadFromData(std::string &&jsonData, const std::string &key, std::map<int32_t, int32_t> *colorReplacement, const std::string &resourcePath, rlottie::FitzModifier fitzModifier);
|
||||||
std::shared_ptr<LOTModel> model();
|
std::shared_ptr<LOTModel> model();
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<LOTModel> mModel;
|
std::shared_ptr<LOTModel> mModel;
|
||||||
|
|
|
@ -182,8 +182,8 @@ protected:
|
||||||
|
|
||||||
class LottieParserImpl : protected LookaheadParserHandler {
|
class LottieParserImpl : protected LookaheadParserHandler {
|
||||||
public:
|
public:
|
||||||
LottieParserImpl(char *str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement)
|
LottieParserImpl(char *str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement, rlottie::FitzModifier fitzModifier)
|
||||||
: LookaheadParserHandler(str), mDirPath(dir_path), colorMap(colorReplacement)
|
: LookaheadParserHandler(str), mDirPath(dir_path), colorMap(colorReplacement), mFitzModifier(fitzModifier)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,6 +270,9 @@ public:
|
||||||
void parseShapeProperty(LOTAnimatable<LottieShapeData> &obj);
|
void parseShapeProperty(LOTAnimatable<LottieShapeData> &obj);
|
||||||
void parseDashProperty(LOTDashProperty &dash);
|
void parseDashProperty(LOTDashProperty &dash);
|
||||||
|
|
||||||
|
void parseFitzColorReplacements();
|
||||||
|
void parseFitzColorReplacement();
|
||||||
|
|
||||||
std::shared_ptr<VInterpolator> interpolator(VPointF, VPointF, std::string);
|
std::shared_ptr<VInterpolator> interpolator(VPointF, VPointF, std::string);
|
||||||
|
|
||||||
LottieColor toColor(const char *str);
|
LottieColor toColor(const char *str);
|
||||||
|
@ -279,6 +282,7 @@ public:
|
||||||
bool hasParsingError();
|
bool hasParsingError();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
const rlottie::FitzModifier mFitzModifier;
|
||||||
std::unordered_map<std::string, std::shared_ptr<VInterpolator>>
|
std::unordered_map<std::string, std::shared_ptr<VInterpolator>>
|
||||||
mInterpolatorCache;
|
mInterpolatorCache;
|
||||||
std::shared_ptr<LOTCompositionData> mComposition;
|
std::shared_ptr<LOTCompositionData> mComposition;
|
||||||
|
@ -611,6 +615,8 @@ void LottieParserImpl::parseComposition() {
|
||||||
parseAssets(comp);
|
parseAssets(comp);
|
||||||
} else if (0 == strcmp(key, "layers")) {
|
} else if (0 == strcmp(key, "layers")) {
|
||||||
parseLayers(comp);
|
parseLayers(comp);
|
||||||
|
} else if (0 == strcmp(key, "fitz")) {
|
||||||
|
parseFitzColorReplacements();
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEBUG_PARSER
|
#ifdef DEBUG_PARSER
|
||||||
vWarning << "Composition Attribute Skipped : " << key;
|
vWarning << "Composition Attribute Skipped : " << key;
|
||||||
|
@ -659,6 +665,79 @@ void LottieParserImpl::parseAssets(LOTCompositionData *composition) {
|
||||||
// update the precomp layers with the actual layer object
|
// update the precomp layers with the actual layer object
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LottieParserImpl::parseFitzColorReplacements()
|
||||||
|
{
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kArrayType);
|
||||||
|
EnterArray();
|
||||||
|
while (NextArrayValue()) {
|
||||||
|
parseFitzColorReplacement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LottieParserImpl::parseFitzColorReplacement()
|
||||||
|
{
|
||||||
|
uint32_t original = 0;
|
||||||
|
uint32_t type12 = 0;
|
||||||
|
uint32_t type3 = 0;
|
||||||
|
uint32_t type4 = 0;
|
||||||
|
uint32_t type5 = 0;
|
||||||
|
uint32_t type6 = 0;
|
||||||
|
|
||||||
|
EnterObject();
|
||||||
|
while (const char *key = NextObjectKey()) {
|
||||||
|
if (0 == strcmp(key, "o")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
original = GetInt();
|
||||||
|
} else if (0 == strcmp(key, "f12")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
type12 = GetInt();
|
||||||
|
} else if (0 == strcmp(key, "f3")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
type3 = GetInt();
|
||||||
|
} else if (0 == strcmp(key, "f4")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
type4 = GetInt();
|
||||||
|
} else if (0 == strcmp(key, "f5")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
type5 = GetInt();
|
||||||
|
} else if (0 == strcmp(key, "f6")) {
|
||||||
|
RAPIDJSON_ASSERT(PeekType() == kNumberType);
|
||||||
|
type6 = GetInt();
|
||||||
|
} else {
|
||||||
|
Skip(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t replacedType = 0;
|
||||||
|
|
||||||
|
switch (mFitzModifier) {
|
||||||
|
case rlottie::FitzModifier::None:
|
||||||
|
break;
|
||||||
|
case rlottie::FitzModifier::Type12:
|
||||||
|
replacedType = type12;
|
||||||
|
break;
|
||||||
|
case rlottie::FitzModifier::Type3:
|
||||||
|
replacedType = type3;
|
||||||
|
break;
|
||||||
|
case rlottie::FitzModifier::Type4:
|
||||||
|
replacedType = type4;
|
||||||
|
break;
|
||||||
|
case rlottie::FitzModifier::Type5:
|
||||||
|
replacedType = type5;
|
||||||
|
break;
|
||||||
|
case rlottie::FitzModifier::Type6:
|
||||||
|
replacedType = type6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (replacedType != 0) {
|
||||||
|
if (colorMap == NULL) {
|
||||||
|
colorMap = new std::map<int32_t, int32_t>();
|
||||||
|
}
|
||||||
|
colorMap->insert(std::pair<int32_t, int32_t>(original, replacedType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr const unsigned char B64index[256] = {
|
static constexpr const unsigned char B64index[256] = {
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
@ -2654,8 +2733,8 @@ LottieParser::~LottieParser()
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
LottieParser::LottieParser(char *str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement)
|
LottieParser::LottieParser(char *str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement, rlottie::FitzModifier fitzModifier)
|
||||||
: d(new LottieParserImpl(str, dir_path, colorReplacement))
|
: d(new LottieParserImpl(str, dir_path, colorReplacement, fitzModifier))
|
||||||
{
|
{
|
||||||
d->parseComposition();
|
d->parseComposition();
|
||||||
if (d->hasParsingError()) {
|
if (d->hasParsingError()) {
|
||||||
|
|
|
@ -21,12 +21,13 @@
|
||||||
|
|
||||||
#include "lottiemodel.h"
|
#include "lottiemodel.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <rlottie.h>
|
||||||
|
|
||||||
class LottieParserImpl;
|
class LottieParserImpl;
|
||||||
class LottieParser {
|
class LottieParser {
|
||||||
public:
|
public:
|
||||||
~LottieParser();
|
~LottieParser();
|
||||||
LottieParser(char* str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement);
|
LottieParser(char* str, const char *dir_path, std::map<int32_t, int32_t> *colorReplacement, rlottie::FitzModifier fitzModifier = rlottie::FitzModifier::None);
|
||||||
std::shared_ptr<LOTModel> model();
|
std::shared_ptr<LOTModel> model();
|
||||||
bool hasParsingError();
|
bool hasParsingError();
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -989,7 +989,7 @@ auth_Authorization *auth_Authorization::TLdeserialize(NativeByteBuffer *stream,
|
||||||
case 0x44747e9a:
|
case 0x44747e9a:
|
||||||
result = new TL_auth_authorizationSignUpRequired();
|
result = new TL_auth_authorizationSignUpRequired();
|
||||||
break;
|
break;
|
||||||
case 0xcd050916:
|
case 0x33fb7bb8:
|
||||||
result = new TL_auth_authorization();
|
result = new TL_auth_authorization();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -680,7 +680,7 @@ public:
|
||||||
class TL_auth_authorization : public auth_Authorization {
|
class TL_auth_authorization : public auth_Authorization {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const uint32_t constructor = 0xcd050916;
|
static const uint32_t constructor = 0x33fb7bb8;
|
||||||
|
|
||||||
int32_t flags;
|
int32_t flags;
|
||||||
int32_t tmp_sessions;
|
int32_t tmp_sessions;
|
||||||
|
|
Loading…
Reference in a new issue