diff --git a/examples/EffectDropShadow.cpp b/examples/EffectDropShadow.cpp new file mode 100644 index 00000000..492aee1b --- /dev/null +++ b/examples/EffectDropShadow.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2024 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "Example.h" + +/************************************************************************/ +/* ThorVG Drawing Contents */ +/************************************************************************/ + +struct UserExample : tvgexam::Example +{ + tvg::Scene* pScene1 = nullptr; + tvg::Scene* pScene2 = nullptr; + tvg::Scene* pScene3 = nullptr; + + bool content(tvg::Canvas* canvas, uint32_t w, uint32_t h) override + { + if (!canvas) return false; + + //background + auto bg = tvg::Shape::gen(); + bg->appendRect(0, 0, w, h); + bg->fill(255, 255, 255); + canvas->push(std::move(bg)); + + float pw, ph; + + //Prepare a scene for post effects + { + auto scene = tvg::Scene::gen(); + pScene1 = scene.get(); + + auto picture = tvg::Picture::gen(); + picture->load(EXAMPLE_DIR"/svg/LottieFiles_logo.svg"); + + picture->size(&pw, &ph); + picture->size(pw * 0.5f, ph * 0.5f); + picture->translate(pw * 0.175f, 0.0f); + + scene->push(std::move(picture)); + canvas->push(std::move(scene)); + } + + //Prepare a scene for post effects + { + auto scene = tvg::Scene::gen(); + pScene2 = scene.get(); + + auto picture = tvg::Picture::gen(); + picture->load(EXAMPLE_DIR"/svg/152932619-bd3d6921-72df-4f09-856b-f9743ae32a14.svg"); + + picture->size(&pw, &ph); + picture->translate(pw * 0.45f, ph * 0.45f); + picture->size(pw * 0.75f, ph * 0.75f); + + scene->push(std::move(picture)); + canvas->push(std::move(scene)); + } + + //Prepare a scene for post effects + { + auto scene = tvg::Scene::gen(); + pScene3 = scene.get(); + + auto picture = tvg::Picture::gen(); + picture->load(EXAMPLE_DIR"/svg//circles1.svg"); + + picture->size(&pw, &ph); + picture->translate(w * 0.3f, h * 0.65f); + picture->size(pw * 0.75f, ph * 0.75f); + + scene->push(std::move(picture)); + canvas->push(std::move(scene)); + } + + return true; + } + + bool update(tvg::Canvas* canvas, uint32_t elapsed) override + { + if (!canvas) return false; + + canvas->clear(false); + + auto progress = tvgexam::progress(elapsed, 2.5f, true); //2.5 seconds + + //Clear the previously applied effects + pScene1->push(tvg::SceneEffect::ClearAll); + //Apply DropShadow post effect (r, g, b, a, angle, distance, sigma of blurness, quality) + pScene1->push(tvg::SceneEffect::DropShadow, 0, 0, 0, 125, 120.0f, 20.0f * progress, 3.0f, 100); + + pScene2->push(tvg::SceneEffect::ClearAll); + pScene2->push(tvg::SceneEffect::DropShadow, 65, 143, 222, (int)(255.0f * progress), 135.0f, 10.0f, 3.0f, 100); + + pScene3->push(tvg::SceneEffect::ClearAll); + pScene3->push(tvg::SceneEffect::DropShadow, 0, 0, 0, 125, 360.0f * progress, 20.0f, 3.0f, 100); + + canvas->update(); + + return true; + } + +}; + + +/************************************************************************/ +/* Entry Point */ +/************************************************************************/ + +int main(int argc, char **argv) +{ + return tvgexam::main(new UserExample, argc, argv, 800, 800, 4, true); +} \ No newline at end of file diff --git a/examples/SceneEffect.cpp b/examples/EffectGaussianBlur.cpp similarity index 100% rename from examples/SceneEffect.cpp rename to examples/EffectGaussianBlur.cpp diff --git a/examples/meson.build b/examples/meson.build index 821b6626..bdc1eeb9 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -27,6 +27,8 @@ source_file = [ 'DataLoad.cpp', 'DirectUpdate.cpp', 'Duplicate.cpp', + 'EffectGaussianBlur.cpp', + 'EffectDropShadow.cpp', 'FillRule.cpp', 'FillSpread.cpp', 'GifSaver.cpp', @@ -59,7 +61,6 @@ source_file = [ 'SceneBlending.cpp', 'SceneTransform.cpp', 'Shapes.cpp', - 'SceneEffect.cpp', 'Stroke.cpp', 'StrokeLine.cpp', 'StrokeMiterlimit.cpp',