forked from Tencent/libpag
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImageReplacement.cpp
More file actions
102 lines (93 loc) · 3.82 KB
/
ImageReplacement.cpp
File metadata and controls
102 lines (93 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Tencent is pleased to support the open source community by making libpag available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// unless required by applicable law or agreed to in writing, software distributed under the
// license is distributed on an "as is" basis, without warranties or conditions of any kind,
// either express or implied. see the license for the specific language governing permissions
// and limitations under the license.
//
/////////////////////////////////////////////////////////////////////////////////////////////////
#include "ImageReplacement.h"
#include "base/utils/MatrixUtil.h"
#include "rendering/caches/RenderCache.h"
#include "rendering/graphics/Recorder.h"
namespace pag {
ImageReplacement::ImageReplacement(PAGFile* pagFile, ImageLayer* imageLayer,
std::shared_ptr<PAGImage> 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;
}
}
}
}
auto imageFillRule = imageLayer->imageFillRule;
if (imageFillRule) {
defaultScaleMode = imageFillRule->scaleMode;
}
contentWidth = imageLayer->imageBytes->width;
contentHeight = imageLayer->imageBytes->height;
}
void ImageReplacement::measureBounds(tgfx::Rect* bounds) {
tgfx::Rect contentBounds = {};
auto graphic = pagImage->getGraphic(contentFrame);
graphic->measureBounds(&contentBounds);
auto contentMatrix = pagImage->getContentMatrix(defaultScaleMode, contentWidth, contentHeight);
ToTGFX(contentMatrix).mapRect(&contentBounds);
bounds->setXYWH(0, 0, static_cast<float>(contentWidth), static_cast<float>(contentHeight));
if (!bounds->intersect(contentBounds)) {
bounds->setEmpty();
}
}
void ImageReplacement::draw(Recorder* recorder) {
recorder->saveClip(0, 0, static_cast<float>(contentWidth), static_cast<float>(contentHeight));
auto contentMatrix = pagImage->getContentMatrix(defaultScaleMode, contentWidth, contentHeight);
recorder->concat(ToTGFX(contentMatrix));
recorder->drawGraphic(pagImage->getGraphic(contentFrame));
recorder->restore();
}
tgfx::Point ImageReplacement::getScaleFactor() const {
// TODO((domrjchen):
// 当PAGImage的适配模式或者matrix发生改变时,需要补充一个通知机制让上层重置scaleFactor。
auto contentMatrix = pagImage->getContentMatrix(defaultScaleMode, contentWidth, contentHeight);
return GetScaleFactor(ToTGFX(contentMatrix));
}
std::shared_ptr<PAGImage> ImageReplacement::getImage() {
return pagImage;
}
bool ImageReplacement::setContentTime(int64_t time) {
auto currentFrame = pagImage->getContentFrame(time);
if (currentFrame == contentFrame) {
return false;
}
contentFrame = currentFrame;
return true;
}
std::shared_ptr<Graphic> ImageReplacement::getGraphic() {
return pagImage->getGraphic(contentFrame);
}
} // namespace pag