You've already forked libopenshot
mirror of
https://github.com/OpenShot/libopenshot.git
synced 2026-03-02 08:53:52 -08:00
108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
|
|
/**
|
|||
|
|
* @file
|
|||
|
|
* @brief Unit tests for Lens Flare effect
|
|||
|
|
* @author Jonathan Thomas <jonathan@openshot.org>
|
|||
|
|
*
|
|||
|
|
* @ref License
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// Copyright (c) 2008-2025 OpenShot Studios, LLC
|
|||
|
|
//
|
|||
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|||
|
|
|
|||
|
|
#include <memory>
|
|||
|
|
#include <QImage>
|
|||
|
|
#include <QColor>
|
|||
|
|
#include "Frame.h"
|
|||
|
|
#include "effects/LensFlare.h"
|
|||
|
|
#include "openshot_catch.h"
|
|||
|
|
|
|||
|
|
using namespace openshot;
|
|||
|
|
|
|||
|
|
// Allow Catch2 to print QColor on failure
|
|||
|
|
static std::ostream& operator<<(std::ostream& os, QColor const& c)
|
|||
|
|
{
|
|||
|
|
os << "QColor(" << c.red() << "," << c.green()
|
|||
|
|
<< "," << c.blue() << "," << c.alpha() << ")";
|
|||
|
|
return os;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Create a small 5×5 grayscale frame
|
|||
|
|
static std::shared_ptr<Frame> makeGrayFrame()
|
|||
|
|
{
|
|||
|
|
QImage img(5, 5, QImage::Format_ARGB32);
|
|||
|
|
img.fill(QColor(100, 100, 100, 255));
|
|||
|
|
auto frame = std::make_shared<Frame>();
|
|||
|
|
*frame->GetImage() = img;
|
|||
|
|
return frame;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TEST_CASE("LensFlare brightens center pixel", "[effect][lensflare]")
|
|||
|
|
{
|
|||
|
|
LensFlare effect;
|
|||
|
|
effect.x = Keyframe(0.0);
|
|||
|
|
effect.y = Keyframe(0.0);
|
|||
|
|
effect.brightness = Keyframe(1.0);
|
|||
|
|
effect.size = Keyframe(1.0);
|
|||
|
|
effect.spread = Keyframe(0.0);
|
|||
|
|
|
|||
|
|
auto frame = makeGrayFrame();
|
|||
|
|
QColor before = frame->GetImage()->pixelColor(2, 2);
|
|||
|
|
|
|||
|
|
auto out = effect.GetFrame(frame, 1);
|
|||
|
|
QColor after = out->GetImage()->pixelColor(2, 2);
|
|||
|
|
|
|||
|
|
CHECK(after != before);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TEST_CASE("LensFlare size controls area of effect", "[effect][lensflare]")
|
|||
|
|
{
|
|||
|
|
LensFlare small, large;
|
|||
|
|
small.x = Keyframe(0.0);
|
|||
|
|
large.x = Keyframe(0.0);
|
|||
|
|
small.y = Keyframe(0.0);
|
|||
|
|
large.y = Keyframe(0.0);
|
|||
|
|
small.brightness = Keyframe(1.0);
|
|||
|
|
large.brightness = Keyframe(1.0);
|
|||
|
|
small.spread = Keyframe(0.0);
|
|||
|
|
large.spread = Keyframe(0.0);
|
|||
|
|
small.size = Keyframe(0.2);
|
|||
|
|
large.size = Keyframe(1.0);
|
|||
|
|
|
|||
|
|
auto frameSmall = makeGrayFrame();
|
|||
|
|
auto frameLarge = makeGrayFrame();
|
|||
|
|
QColor beforeSmall = frameSmall->GetImage()->pixelColor(2, 2);
|
|||
|
|
QColor beforeLarge = frameLarge->GetImage()->pixelColor(2, 2);
|
|||
|
|
|
|||
|
|
auto outSmall = small.GetFrame(frameSmall, 1);
|
|||
|
|
auto outLarge = large.GetFrame(frameLarge, 1);
|
|||
|
|
QColor afterSmall = outSmall->GetImage()->pixelColor(2, 2);
|
|||
|
|
QColor afterLarge = outLarge->GetImage()->pixelColor(2, 2);
|
|||
|
|
|
|||
|
|
CHECK(afterSmall == beforeSmall);
|
|||
|
|
CHECK(afterLarge != beforeLarge);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TEST_CASE("LensFlare brightness scales intensity", "[effect][lensflare]")
|
|||
|
|
{
|
|||
|
|
LensFlare low, high;
|
|||
|
|
low.x = Keyframe(0.0);
|
|||
|
|
high.x = Keyframe(0.0);
|
|||
|
|
low.y = Keyframe(0.0);
|
|||
|
|
high.y = Keyframe(0.0);
|
|||
|
|
low.size = Keyframe(1.0);
|
|||
|
|
high.size = Keyframe(1.0);
|
|||
|
|
low.spread = Keyframe(0.0);
|
|||
|
|
high.spread = Keyframe(0.0);
|
|||
|
|
low.brightness = Keyframe(0.2);
|
|||
|
|
high.brightness= Keyframe(1.0);
|
|||
|
|
|
|||
|
|
auto frameLow = makeGrayFrame();
|
|||
|
|
auto frameHigh = makeGrayFrame();
|
|||
|
|
auto outLow = low.GetFrame(frameLow, 1);
|
|||
|
|
auto outHigh = high.GetFrame(frameHigh, 1);
|
|||
|
|
QColor cLow = outLow->GetImage()->pixelColor(2, 2);
|
|||
|
|
QColor cHigh = outHigh->GetImage()->pixelColor(2, 2);
|
|||
|
|
|
|||
|
|
CHECK(cLow.red() < cHigh.red());
|
|||
|
|
}
|