From a6713e724f017caafc588220485baefa6a2a7d3f Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Thu, 6 Apr 2023 10:09:18 -0700 Subject: [PATCH] Use a shader (#678) expose a shader for DibRender support on NeoPixelBusLg --- src/NeoPixelBusLg.h | 84 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/src/NeoPixelBusLg.h b/src/NeoPixelBusLg.h index 67111e6..f951efb 100644 --- a/src/NeoPixelBusLg.h +++ b/src/NeoPixelBusLg.h @@ -40,42 +40,89 @@ License along with NeoPixel. If not, see template class NeoPixelBusLg : public NeoPixelBus { -private: - typename T_COLOR_FEATURE::ColorObject ConvertColor(typename T_COLOR_FEATURE::ColorObject color) +public: + class LuminanceShader { - // dim and then return gamma adjusted - color = color.Dim(_luminance); - return NeoGamma::Correct(color); - } + public: + LuminanceShader(uint8_t luminance = 255) : + _luminance(luminance) + { + } + + // our shader is always dirty, but these are needed for standard + // shader support + bool IsDirty() const + { + return true; + }; + + void Dirty() + { + }; + + void ResetDirty() + { + }; + + typename T_COLOR_FEATURE::ColorObject Apply(uint16_t, const typename T_COLOR_FEATURE::ColorObject& original) + { + // dim and then return gamma adjusted + typename T_COLOR_FEATURE::ColorObject color = original.Dim(_luminance); + return NeoGamma::Correct(color); + } + + protected: + uint8_t _luminance; + + void setLuminance(uint8_t luminance) + { + _luminance = luminance; + } + + uint8_t getLuminance() const + { + return _luminance; + } + + friend class NeoPixelBusLg; + }; + + // Exposed Shader instance for use with NeoDib.Render like + // + // image.Render(strip, strip.Shader); + // where MyBusType is defined like + // typedef NeoPixelBusLg MyBusType; + // + LuminanceShader Shader; public: NeoPixelBusLg(uint16_t countPixels, uint8_t pin) : NeoPixelBus(countPixels, pin), - _luminance(255) + Shader() { } NeoPixelBusLg(uint16_t countPixels, uint8_t pin, NeoBusChannel channel) : NeoPixelBus(countPixels, pin, channel), - _luminance(255) + Shader() { } NeoPixelBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData) : NeoPixelBus(countPixels, pinClock, pinData), - _luminance(255) + Shader() { } NeoPixelBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData, uint8_t pinLatch, uint8_t pinOutputEnable = NOT_A_PIN) : NeoPixelBus(countPixels, pinClock, pinData, pinLatch, pinOutputEnable), - _luminance(255) + Shader() { } NeoPixelBusLg(uint16_t countPixels) : NeoPixelBus(countPixels), - _luminance(255) + Shader() { } @@ -84,17 +131,17 @@ public: // does NOT affect current pixel data as there is no safe way // to reconstruct the original color values after being // modified with both luminance and gamma without storing them - _luminance = luminance; + Shader.setLuminance(luminance); } uint8_t GetLuminance() const { - return _luminance; + return Shader.getLuminance(); } void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color) { - color = ConvertColor(color); + color = Shader.Apply(indexPixel, color); NeoPixelBus::SetPixelColor(indexPixel, color); } @@ -106,13 +153,13 @@ public: void ClearTo(typename T_COLOR_FEATURE::ColorObject color) { - color = ConvertColor(color); + color = Shader.Apply(0, color); NeoPixelBus::ClearTo(color); }; void ClearTo(typename T_COLOR_FEATURE::ColorObject color, uint16_t first, uint16_t last) { - color = ConvertColor(color); + color = Shader.Apply(0, color); NeoPixelBus::ClearTo(color, first, last); } @@ -125,15 +172,12 @@ public: for (uint16_t indexPixel = 0; indexPixel < NeoPixelBus::PixelCount(); indexPixel++) { typename T_COLOR_FEATURE::ColorObject color = NeoPixelBus::GetPixelColor(indexPixel); - color = ConvertColor(color); + color = Shader.Apply(indexPixel, color); NeoPixelBus::SetPixelColor(indexPixel, color); } this->Dirty(); } } - -protected: - uint8_t _luminance; };