Skip to content

Commit bef31de

Browse files
authored
Fix GradientOverlayFilter double-scaling issue when layer has scale transform. (#3527)
1 parent a388d5f commit bef31de

5 files changed

Lines changed: 21 additions & 7 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:8bdf7ba8cae24a4c9e51dc734416c44cc67a5867fe56c2f22554c7d30229bb56
3+
size 270

src/rendering/filters/layerstyle/GradientOverlayFilter.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ GradientOverlayFilter::GradientOverlayFilter(GradientOverlayStyle* layerStyle)
2727
: layerStyle(layerStyle) {
2828
}
2929

30-
void GradientOverlayFilter::update(Frame layerFrame, const tgfx::Point& filterScale,
31-
const tgfx::Point&) {
30+
void GradientOverlayFilter::update(Frame layerFrame, const tgfx::Point&, const tgfx::Point&) {
3231
opacity = layerStyle->opacity->getValueAt(layerFrame);
3332
colors = layerStyle->colors->getValueAt(layerFrame);
3433
angle = layerStyle->angle->getValueAt(layerFrame);
@@ -37,7 +36,6 @@ void GradientOverlayFilter::update(Frame layerFrame, const tgfx::Point& filterSc
3736
scale = layerStyle->scale->getValueAt(layerFrame) / 100.f;
3837
offset = layerStyle->offset->getValueAt(layerFrame);
3938
blendMode = layerStyle->blendMode->getValueAt(layerFrame);
40-
_filterScale = filterScale;
4139
}
4240

4341
bool GradientOverlayFilter::draw(Canvas* canvas, std::shared_ptr<tgfx::Image> source) {
@@ -82,10 +80,7 @@ bool GradientOverlayFilter::draw(Canvas* canvas, std::shared_ptr<tgfx::Image> so
8280
tgfx::Paint paint;
8381
paint.setShader(shader);
8482
auto rect = tgfx::Rect::MakeWH(width, height);
85-
canvas->save();
86-
canvas->scale(1.f / _filterScale.x, 1.f / _filterScale.y);
8783
canvas->drawRect(rect, paint);
88-
canvas->restore();
8984
return true;
9085
}
9186

src/rendering/filters/layerstyle/GradientOverlayFilter.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,5 @@ class GradientOverlayFilter : public LayerStyleFilter {
4040
bool reverse = false;
4141
float scale = 1.0;
4242
Point offset = Point::Zero();
43-
tgfx::Point _filterScale = tgfx::Point::Make(1.0f, 1.0f);
4443
};
4544
} // namespace pag

test/baseline/version.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8334,6 +8334,7 @@
83348334
"GaussianBlur_NoRepeat_Clip": "60a88e548",
83358335
"Glow": "60a88e548",
83368336
"GradientOverlayFilter": "60a88e548",
8337+
"GradientOverlayFilter_Scale": "432167b87",
83378338
"GradientOverlayFilter_Star": "60a88e548",
83388339
"HueSaturation": "60a88e548",
83398340
"LevelsIndividualFilter": "60a88e548",

test/src/PAGFilterTest.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,22 @@ PAG_TEST(PAGFilterTest, GradientOverlayFilter_Star) {
344344
EXPECT_TRUE(Baseline::Compare(pagSurface, "PAGFilterTest/GradientOverlayFilter_Star"));
345345
}
346346

347+
/**
348+
* 用例描述: GradientOverlayFilter_Scale
349+
*/
350+
PAG_TEST(PAGFilterTest, GradientOverlayFilter_Scale) {
351+
auto pagFile = LoadPAGFile("resources/filter/GradientOverlayScale.pag");
352+
ASSERT_NE(pagFile, nullptr);
353+
auto pagSurface = OffscreenSurface::Make(pagFile->width(), pagFile->height());
354+
ASSERT_NE(pagSurface, nullptr);
355+
auto pagPlayer = std::make_shared<PAGPlayer>();
356+
pagPlayer->setSurface(pagSurface);
357+
pagPlayer->setComposition(pagFile);
358+
pagPlayer->setProgress(0.0);
359+
pagPlayer->flush();
360+
EXPECT_TRUE(Baseline::Compare(pagSurface, "PAGFilterTest/GradientOverlayFilter_Scale"));
361+
}
362+
347363
/**
348364
* 用例描述: FeatherMask
349365
*/

0 commit comments

Comments
 (0)