From 332adb58b50533942c917b04a72d6b980cc2ad54 Mon Sep 17 00:00:00 2001 From: markffan Date: Tue, 18 Feb 2025 20:26:44 +0800 Subject: [PATCH 1/6] Fix the issue that the imageScaleModes is not effective with editable image --- src/rendering/editing/ImageReplacement.cpp | 28 ++++++++++++++++++++-- src/rendering/editing/ImageReplacement.h | 2 +- src/rendering/layers/PAGImageLayer.cpp | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/rendering/editing/ImageReplacement.cpp b/src/rendering/editing/ImageReplacement.cpp index 87aabf12fb..ca28887d58 100644 --- a/src/rendering/editing/ImageReplacement.cpp +++ b/src/rendering/editing/ImageReplacement.cpp @@ -22,10 +22,34 @@ #include "rendering/graphics/Recorder.h" namespace pag { -ImageReplacement::ImageReplacement(ImageLayer* imageLayer, std::shared_ptr pagImage) +ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, std::shared_ptr pagImage) : pagImage(std::move(pagImage)) { + defaultScaleMode = PAGScaleMode::LetterBox; + if (pagFile != nullptr) { + auto file = pagFile->getFile(); + if (file != nullptr && file->imageScaleModes != nullptr && !file->imageScaleModes->empty()) { + auto editableImages = pagFile->getEditableIndices(LayerType::Image); + for (size_t i = 0; i < editableImages.size(); i++) { + bool found = false; + auto imageLayers = file->getImageAt(editableImages.at(i)); + for (size_t j = 0; j < imageLayers.size(); j++) { + auto tmpImageLayer = imageLayers.at(j); + if (imageLayer == tmpImageLayer) { + defaultScaleMode = file->imageScaleModes->at(i); + found = true; + break; + } + } + if (found) { + break; + } + } + } + } auto imageFillRule = imageLayer->imageFillRule; - defaultScaleMode = imageFillRule ? imageFillRule->scaleMode : PAGScaleMode::LetterBox; + if (imageFillRule != nullptr) { + defaultScaleMode = imageFillRule->scaleMode; + } contentWidth = imageLayer->imageBytes->width; contentHeight = imageLayer->imageBytes->height; } diff --git a/src/rendering/editing/ImageReplacement.h b/src/rendering/editing/ImageReplacement.h index 49787dc354..7f01d49154 100644 --- a/src/rendering/editing/ImageReplacement.h +++ b/src/rendering/editing/ImageReplacement.h @@ -22,7 +22,7 @@ namespace pag { class ImageReplacement : public Content { public: - ImageReplacement(ImageLayer* imageLayer, std::shared_ptr pagImage); + ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, std::shared_ptr pagImage); void measureBounds(tgfx::Rect* bounds) override; void draw(Recorder* recorder) override; diff --git a/src/rendering/layers/PAGImageLayer.cpp b/src/rendering/layers/PAGImageLayer.cpp index 7c1a141e5d..4bc3604b78 100644 --- a/src/rendering/layers/PAGImageLayer.cpp +++ b/src/rendering/layers/PAGImageLayer.cpp @@ -202,7 +202,7 @@ void PAGImageLayer::setImageInternal(std::shared_ptr image) { } delete replacement; if (image != nullptr) { - replacement = new ImageReplacement(static_cast(layer), image); + replacement = new ImageReplacement(rootFile, static_cast(layer), image); } else { replacement = nullptr; } From 16bd12186ef48761bbb386d27fc1c8d6a4337b7c Mon Sep 17 00:00:00 2001 From: markffan Date: Wed, 19 Feb 2025 10:26:50 +0800 Subject: [PATCH 2/6] Fix some code format problems which prompts by clang-format --- src/rendering/editing/ImageReplacement.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/rendering/editing/ImageReplacement.cpp b/src/rendering/editing/ImageReplacement.cpp index ca28887d58..1971c2ff3e 100644 --- a/src/rendering/editing/ImageReplacement.cpp +++ b/src/rendering/editing/ImageReplacement.cpp @@ -22,12 +22,13 @@ #include "rendering/graphics/Recorder.h" namespace pag { -ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, std::shared_ptr pagImage) +ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, + std::shared_ptr pagImage) : pagImage(std::move(pagImage)) { defaultScaleMode = PAGScaleMode::LetterBox; - if (pagFile != nullptr) { + if (pagFile) { auto file = pagFile->getFile(); - if (file != nullptr && file->imageScaleModes != nullptr && !file->imageScaleModes->empty()) { + if (file && file->imageScaleModes && !file->imageScaleModes->empty()) { auto editableImages = pagFile->getEditableIndices(LayerType::Image); for (size_t i = 0; i < editableImages.size(); i++) { bool found = false; @@ -47,7 +48,7 @@ ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, std } } auto imageFillRule = imageLayer->imageFillRule; - if (imageFillRule != nullptr) { + if (imageFillRule) { defaultScaleMode = imageFillRule->scaleMode; } contentWidth = imageLayer->imageBytes->width; From c5fd1ac326695bbbce3f7e587443b1e205eff8fa Mon Sep 17 00:00:00 2001 From: markffan Date: Wed, 19 Feb 2025 11:22:10 +0800 Subject: [PATCH 3/6] Simplify the process of obtaining the index of imageScaleModes corresponding to imageLayer --- src/rendering/editing/ImageReplacement.cpp | 25 +++++----------------- src/rendering/editing/ImageReplacement.h | 2 +- src/rendering/layers/PAGImageLayer.cpp | 2 +- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/rendering/editing/ImageReplacement.cpp b/src/rendering/editing/ImageReplacement.cpp index 1971c2ff3e..5d4078deb5 100644 --- a/src/rendering/editing/ImageReplacement.cpp +++ b/src/rendering/editing/ImageReplacement.cpp @@ -22,29 +22,14 @@ #include "rendering/graphics/Recorder.h" namespace pag { -ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, +ImageReplacement::ImageReplacement(File* file, ImageLayer* imageLayer, std::shared_ptr pagImage) : pagImage(std::move(pagImage)) { defaultScaleMode = PAGScaleMode::LetterBox; - if (pagFile) { - auto file = pagFile->getFile(); - if (file && file->imageScaleModes && !file->imageScaleModes->empty()) { - auto editableImages = pagFile->getEditableIndices(LayerType::Image); - for (size_t i = 0; i < editableImages.size(); i++) { - bool found = false; - auto imageLayers = file->getImageAt(editableImages.at(i)); - for (size_t j = 0; j < imageLayers.size(); j++) { - auto tmpImageLayer = imageLayers.at(j); - if (imageLayer == tmpImageLayer) { - defaultScaleMode = file->imageScaleModes->at(i); - found = true; - break; - } - } - if (found) { - break; - } - } + if (file && file->imageScaleModes && !file->imageScaleModes->empty()) { + int index = file->getEditableIndex(imageLayer); + if (index >= 0) { + defaultScaleMode = file->imageScaleModes->at(index); } } auto imageFillRule = imageLayer->imageFillRule; diff --git a/src/rendering/editing/ImageReplacement.h b/src/rendering/editing/ImageReplacement.h index 7f01d49154..362e6aeb28 100644 --- a/src/rendering/editing/ImageReplacement.h +++ b/src/rendering/editing/ImageReplacement.h @@ -22,7 +22,7 @@ namespace pag { class ImageReplacement : public Content { public: - ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer, std::shared_ptr pagImage); + ImageReplacement(File* file, ImageLayer* imageLayer, std::shared_ptr pagImage); void measureBounds(tgfx::Rect* bounds) override; void draw(Recorder* recorder) override; diff --git a/src/rendering/layers/PAGImageLayer.cpp b/src/rendering/layers/PAGImageLayer.cpp index 4bc3604b78..d41eb2b671 100644 --- a/src/rendering/layers/PAGImageLayer.cpp +++ b/src/rendering/layers/PAGImageLayer.cpp @@ -202,7 +202,7 @@ void PAGImageLayer::setImageInternal(std::shared_ptr image) { } delete replacement; if (image != nullptr) { - replacement = new ImageReplacement(rootFile, static_cast(layer), image); + replacement = new ImageReplacement(file.get(), static_cast(layer), image); } else { replacement = nullptr; } From 6b431d2cbb9b490080fdb2d0f5ded3e864bfd6da Mon Sep 17 00:00:00 2001 From: markffan Date: Wed, 19 Feb 2025 15:19:01 +0800 Subject: [PATCH 4/6] Simplify the process of obtaining the index of imageScaleModes corresponding to imageLayer --- include/pag/pag.h | 1 + src/rendering/editing/ImageReplacement.cpp | 18 ++++-------------- src/rendering/editing/ImageReplacement.h | 2 +- src/rendering/layers/PAGImageLayer.cpp | 17 ++++++++++++++++- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/pag/pag.h b/include/pag/pag.h index c8850efdd0..af838dcfbb 100644 --- a/include/pag/pag.h +++ b/include/pag/pag.h @@ -808,6 +808,7 @@ class PAG_API PAGImageLayer : public PAGLayer { Frame getFrameFromTimeRemap(Frame value); void measureBounds(tgfx::Rect* bounds) override; int64_t contentDurationInternal(); + int getDefaultScaleMode(); friend class RenderCache; diff --git a/src/rendering/editing/ImageReplacement.cpp b/src/rendering/editing/ImageReplacement.cpp index 5d4078deb5..dd3e5cbd4d 100644 --- a/src/rendering/editing/ImageReplacement.cpp +++ b/src/rendering/editing/ImageReplacement.cpp @@ -22,22 +22,12 @@ #include "rendering/graphics/Recorder.h" namespace pag { -ImageReplacement::ImageReplacement(File* file, ImageLayer* imageLayer, +ImageReplacement::ImageReplacement(int scaleMode, ImageBytes* bytes, std::shared_ptr pagImage) : pagImage(std::move(pagImage)) { - defaultScaleMode = PAGScaleMode::LetterBox; - if (file && file->imageScaleModes && !file->imageScaleModes->empty()) { - int index = file->getEditableIndex(imageLayer); - if (index >= 0) { - defaultScaleMode = file->imageScaleModes->at(index); - } - } - auto imageFillRule = imageLayer->imageFillRule; - if (imageFillRule) { - defaultScaleMode = imageFillRule->scaleMode; - } - contentWidth = imageLayer->imageBytes->width; - contentHeight = imageLayer->imageBytes->height; + defaultScaleMode = scaleMode; + contentWidth = bytes->width; + contentHeight = bytes->height; } void ImageReplacement::measureBounds(tgfx::Rect* bounds) { diff --git a/src/rendering/editing/ImageReplacement.h b/src/rendering/editing/ImageReplacement.h index 362e6aeb28..dbc2f5cb94 100644 --- a/src/rendering/editing/ImageReplacement.h +++ b/src/rendering/editing/ImageReplacement.h @@ -22,7 +22,7 @@ namespace pag { class ImageReplacement : public Content { public: - ImageReplacement(File* file, ImageLayer* imageLayer, std::shared_ptr pagImage); + ImageReplacement(int scaleMode, ImageBytes* bytes, std::shared_ptr pagImage); void measureBounds(tgfx::Rect* bounds) override; void draw(Recorder* recorder) override; diff --git a/src/rendering/layers/PAGImageLayer.cpp b/src/rendering/layers/PAGImageLayer.cpp index d41eb2b671..090c120adb 100644 --- a/src/rendering/layers/PAGImageLayer.cpp +++ b/src/rendering/layers/PAGImageLayer.cpp @@ -202,7 +202,8 @@ void PAGImageLayer::setImageInternal(std::shared_ptr image) { } delete replacement; if (image != nullptr) { - replacement = new ImageReplacement(file.get(), static_cast(layer), image); + replacement = new ImageReplacement(getDefaultScaleMode(), + static_cast(layer)->imageBytes, image); } else { replacement = nullptr; } @@ -676,4 +677,18 @@ int64_t PAGImageLayer::contentDurationInternal() { return FrameToTime(maxFrame + 1, frameRate); } +int PAGImageLayer::getDefaultScaleMode() { + int defaultScaleMode = PAGScaleMode::LetterBox; + int index = editableIndex(); + if (index >= 0 && file && file->imageScaleModes && !file->imageScaleModes->empty()) { + defaultScaleMode = file->imageScaleModes->at(index); + } + auto imageLayer = static_cast(layer); + if (imageLayer && imageLayer->imageFillRule) { + defaultScaleMode = imageLayer->imageFillRule->scaleMode; + } + + return defaultScaleMode; +} + } // namespace pag From 77a96a3ae43aeb6451dc406febcabf10a310e358 Mon Sep 17 00:00:00 2001 From: markffan Date: Wed, 19 Feb 2025 15:47:22 +0800 Subject: [PATCH 5/6] Simplify the process of obtaining the index of imageScaleModes corresponding to imageLayer --- src/rendering/layers/PAGImageLayer.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/rendering/layers/PAGImageLayer.cpp b/src/rendering/layers/PAGImageLayer.cpp index 090c120adb..ad66341e4d 100644 --- a/src/rendering/layers/PAGImageLayer.cpp +++ b/src/rendering/layers/PAGImageLayer.cpp @@ -678,17 +678,16 @@ int64_t PAGImageLayer::contentDurationInternal() { } int PAGImageLayer::getDefaultScaleMode() { - int defaultScaleMode = PAGScaleMode::LetterBox; - int index = editableIndex(); - if (index >= 0 && file && file->imageScaleModes && !file->imageScaleModes->empty()) { - defaultScaleMode = file->imageScaleModes->at(index); - } auto imageLayer = static_cast(layer); if (imageLayer && imageLayer->imageFillRule) { - defaultScaleMode = imageLayer->imageFillRule->scaleMode; + return imageLayer->imageFillRule->scaleMode; + } + int index = editableIndex(); + if (index >= 0 && file && file->imageScaleModes && !file->imageScaleModes->empty()) { + return file->imageScaleModes->at(index); } - return defaultScaleMode; + return PAGScaleMode::LetterBox; } } // namespace pag From 471ef8758fc3a29338551650d43e15f1e388c323 Mon Sep 17 00:00:00 2001 From: markffan Date: Wed, 19 Feb 2025 16:21:20 +0800 Subject: [PATCH 6/6] Simplify the process of obtaining the index of imageScaleModes corresponding to imageLayer --- src/rendering/editing/ImageReplacement.cpp | 10 ++++------ src/rendering/editing/ImageReplacement.h | 2 +- src/rendering/layers/PAGImageLayer.cpp | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/rendering/editing/ImageReplacement.cpp b/src/rendering/editing/ImageReplacement.cpp index dd3e5cbd4d..bc9352e875 100644 --- a/src/rendering/editing/ImageReplacement.cpp +++ b/src/rendering/editing/ImageReplacement.cpp @@ -22,12 +22,10 @@ #include "rendering/graphics/Recorder.h" namespace pag { -ImageReplacement::ImageReplacement(int scaleMode, ImageBytes* bytes, - std::shared_ptr pagImage) - : pagImage(std::move(pagImage)) { - defaultScaleMode = scaleMode; - contentWidth = bytes->width; - contentHeight = bytes->height; +ImageReplacement::ImageReplacement(std::shared_ptr pagImage, int scaleMode, + ImageBytes* imageBytes) + : pagImage(std::move(pagImage)), defaultScaleMode(scaleMode), contentWidth(imageBytes->width), + contentHeight(imageBytes->height) { } void ImageReplacement::measureBounds(tgfx::Rect* bounds) { diff --git a/src/rendering/editing/ImageReplacement.h b/src/rendering/editing/ImageReplacement.h index dbc2f5cb94..1fd1b70b43 100644 --- a/src/rendering/editing/ImageReplacement.h +++ b/src/rendering/editing/ImageReplacement.h @@ -22,7 +22,7 @@ namespace pag { class ImageReplacement : public Content { public: - ImageReplacement(int scaleMode, ImageBytes* bytes, std::shared_ptr pagImage); + ImageReplacement(std::shared_ptr pagImage, int scaleMode, ImageBytes* imageBytes); void measureBounds(tgfx::Rect* bounds) override; void draw(Recorder* recorder) override; diff --git a/src/rendering/layers/PAGImageLayer.cpp b/src/rendering/layers/PAGImageLayer.cpp index ad66341e4d..40636644b8 100644 --- a/src/rendering/layers/PAGImageLayer.cpp +++ b/src/rendering/layers/PAGImageLayer.cpp @@ -202,8 +202,8 @@ void PAGImageLayer::setImageInternal(std::shared_ptr image) { } delete replacement; if (image != nullptr) { - replacement = new ImageReplacement(getDefaultScaleMode(), - static_cast(layer)->imageBytes, image); + replacement = new ImageReplacement(image, getDefaultScaleMode(), + static_cast(layer)->imageBytes); } else { replacement = nullptr; }