Files
klubhaus-doorbell/libraries/FastLED/src/fx/2d/scale_up.h
2026-02-12 00:45:31 -08:00

63 lines
2.2 KiB
C++

/// @file scale_up.h
/// @brief Expands a grid using bilinear interpolation and scaling up. This is
/// useful for
/// under powered devices that can't handle the full resolution of the
/// grid, or if you suddenly need to increase the size of the grid and
/// don't want to re-create new assets at the new resolution.
#pragma once
#include "fl/stdint.h"
#include "fl/upscale.h"
#include "fl/memory.h"
#include "fl/vector.h"
#include "fl/xymap.h"
#include "fx/fx2d.h"
#include "lib8tion/random8.h"
#include "noise.h"
// Optimized for 2^n grid sizes in terms of both memory and performance.
// If you are somehow running this on AVR then you probably want this if
// you can make your grid size a power of 2.
#define FASTLED_SCALE_UP_ALWAYS_POWER_OF_2 0 // 0 for always power of 2.
// Uses more memory than FASTLED_SCALE_UP_ALWAYS_POWER_OF_2 but can handle
// arbitrary grid sizes.
#define FASTLED_SCALE_UP_HIGH_PRECISION 1 // 1 for always choose high precision.
// Uses the most executable memory because both low and high precision versions
// are compiled in. If the grid size is a power of 2 then the faster version is
// used. Note that the floating point version has to be directly specified
// because in testing it offered no benefits over the integer versions.
#define FASTLED_SCALE_UP_DECIDE_AT_RUNTIME 2 // 2 for runtime decision.
#define FASTLED_SCALE_UP_FORCE_FLOATING_POINT 3 // Warning, this is slow.
#ifndef FASTLED_SCALE_UP
#define FASTLED_SCALE_UP FASTLED_SCALE_UP_DECIDE_AT_RUNTIME
#endif
namespace fl {
FASTLED_SMART_PTR(ScaleUp);
// Uses bilearn filtering to double the size of the grid.
class ScaleUp : public Fx2d {
public:
ScaleUp(const XYMap& xymap, Fx2dPtr fx);
void draw(DrawContext context) override;
void expand(const CRGB *input, CRGB *output, uint16_t width,
uint16_t height, const XYMap& mXyMap);
fl::string fxName() const override { return "scale_up"; }
private:
// No expansion needed. Also useful for debugging.
void noExpand(const CRGB *input, CRGB *output, uint16_t width,
uint16_t height);
Fx2dPtr mDelegate;
fl::vector<CRGB, fl::allocator_psram<CRGB>> mSurface;
};
} // namespace fl