#pragma once #include #include #include #include #include "core/effect.hpp" namespace effector { // Writes a line (or several) over its input: a title, a caption, a watermark. // The family and the weight are chosen freely, and the text can sit on a box // filled with a colour or with a picture from disk. Like the blur and the // overlay it needs no source images of its own, so it can lead a chain; given // sources it fills the canvas from a randomly chosen one first. // // The glyphs come from Pango, so the exact pixels depend on the fonts the // machine has installed: a seed reproduces everything this effect draws, but a // machine without the chosen family renders the substitute its fontconfig // picks. class TextEffect : public Effect { public: std::string name() const override { return "text"; } std::string title() const override { return "Text"; } std::string description() const override { return "Writes text over its input in a chosen family, weight and size, optionally on a " "box filled with a colour or with a picture."; } const std::vector& params() const override; bool needsSources() const override { return false; } Image render(const std::vector& sources, int width, int height, Rng& rng, const ParamValues& values) const override; private: // The box picture is re-read on every param change otherwise, and a render // is a keystroke away in the interface. Renders can overlap, so it is // guarded. void loadBoxImage(const std::string& path, Image& image, std::vector& alpha) const; mutable std::mutex cacheMutex_; mutable std::string cachedPath_; mutable Image cached_; mutable std::vector cachedAlpha_; }; } // namespace effector