Lumitronix_Iflex_Pro_Workshop
Library to interact with the iFlexPro
LumitronixIFlexBusLg.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2 LumitronixIFlexBus library wrapper template class that provides luminance and gamma control
3 
4 Written by Michael C. Miller.
5 
6 I invest time and resources providing this open source code,
7 please support me by dontating (see https://github.com/Makuna)
8 
9 -------------------------------------------------------------------------
10 This file is part of the LUMITRONIX_iFlex_Workshop library.
11 
12 LumitronixIFlexBus is free software: you can redistribute it and/or modify
13 it under the terms of the GNU Lesser General Public License as
14 published by the Free Software Foundation, either version 3 of
15 the License, or (at your option) any later version.
16 
17 LumitronixIFlexBus is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU Lesser General Public License for more details.
21 
22 You should have received a copy of the GNU Lesser General Public
23 License along with LumitronixIFlex. If not, see
24 <http://www.gnu.org/licenses/>.
25 -------------------------------------------------------------------------*/
26 
27 #pragma once
28 
29 #include "LumitronixIFlexBus.h"
30 
31 //
32 //
33 // T_GAMMA -
34 // NeoGammaEquationMethod
35 // NeoGammaCieLabEquationMethod
36 // NeoGammaTableMethod
37 // NeoGammaNullMethod
38 // NeoGammaInvert<one of the above>
39 
40 template<typename T_COLOR_FEATURE, typename T_METHOD, typename T_GAMMA = NeoGammaEquationMethod> class LumitronixIFlexBusLg :
41  public LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>
42 {
43 public:
45  {
46  public:
47  LuminanceShader(uint8_t luminance = 255) :
48  _luminance(luminance)
49  {
50  }
51 
52  // our shader is always dirty, but these are needed for standard
53  // shader support
54  bool IsDirty() const
55  {
56  return true;
57  };
58 
59  void Dirty()
60  {
61  };
62 
63  void ResetDirty()
64  {
65  };
66 
67  typename T_COLOR_FEATURE::ColorObject Apply(uint16_t, const typename T_COLOR_FEATURE::ColorObject& original)
68  {
69  // dim and then return gamma adjusted
70  typename T_COLOR_FEATURE::ColorObject color = original.Dim(_luminance);
71  return NeoGamma<T_GAMMA>::Correct(color);
72  }
73 
74  protected:
75  uint8_t _luminance;
76 
77  void setLuminance(uint8_t luminance)
78  {
79  _luminance = luminance;
80  }
81 
82  uint8_t getLuminance() const
83  {
84  return _luminance;
85  }
86 
87  friend class LumitronixIFlexBusLg;
88  };
89 
90  // Exposed Shader instance for use with NeoDib.Render like
91  //
92  // image.Render<NeoGrbFeature, MyBusType::LuminanceShader>(strip, strip.Shader);
93  // where MyBusType is defined like
94  // typedef LumitronixIFlexBusLg<NeoGrbFeature, NeoWs2812xMethod> MyBusType;
95  //
97 
98 public:
99  LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pin) :
100  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pin),
101  Shader()
102  {
103  }
104 
105  LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pin, NeoBusChannel channel) :
106  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pin, channel),
107  Shader()
108  {
109  }
110 
111  LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData) :
112  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pinClock, pinData),
113  Shader()
114  {
115  }
116 
117  LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData, uint8_t pinLatch, uint8_t pinOutputEnable = NOT_A_PIN) :
118  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pinClock, pinData, pinLatch, pinOutputEnable),
119  Shader()
120  {
121  }
122 
123  LumitronixIFlexBusLg(uint16_t countPixels) :
124  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels),
125  Shader()
126  {
127  }
128 
130  {
131  }
132 
133  void SetLuminance(uint8_t luminance)
134  {
135  // does NOT affect current pixel data as there is no safe way
136  // to reconstruct the original color values after being
137  // modified with both luminance and gamma without storing them
138  Shader.setLuminance(luminance);
139  }
140 
141  uint8_t GetLuminance() const
142  {
143  return Shader.getLuminance();
144  }
145 
146  void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
147  {
148  color = Shader.Apply(indexPixel, color);
150  }
151 
152  /*
153  GetPixelColor is not overloaded as the original will be used
154  to just return the fully adjusted color value directly with
155  no reverse conversion since it is fraught with inaccuracy
156  */
157 
158  void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
159  {
160  color = Shader.Apply(0, color);
162  };
163 
164  void ClearTo(typename T_COLOR_FEATURE::ColorObject color, uint16_t first, uint16_t last)
165  {
166  color = Shader.Apply(0, color);
168  }
169 
170  // if the Pixels buffer is manipulated directly, then this can be called
171  // to apply the luminance and gamma correction to those changes
173  {
174  if (this->IsDirty())
175  {
176  for (uint16_t indexPixel = 0; indexPixel < LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>::PixelCount(); indexPixel++)
177  {
178  typename T_COLOR_FEATURE::ColorObject color = LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>::GetPixelColor(indexPixel);
179  color = Shader.Apply(indexPixel, color);
181  }
182  this->Dirty();
183  }
184  }
185 };
186 
187 
NeoBusChannel
Definition: NeoBusChannel.h:12
Definition: LumitronixIFlexBusLg.h:45
void ResetDirty()
Definition: LumitronixIFlexBusLg.h:63
LuminanceShader(uint8_t luminance=255)
Definition: LumitronixIFlexBusLg.h:47
uint8_t _luminance
Definition: LumitronixIFlexBusLg.h:75
void setLuminance(uint8_t luminance)
Definition: LumitronixIFlexBusLg.h:77
void Dirty()
Definition: LumitronixIFlexBusLg.h:59
bool IsDirty() const
Definition: LumitronixIFlexBusLg.h:54
T_COLOR_FEATURE::ColorObject Apply(uint16_t, const typename T_COLOR_FEATURE::ColorObject &original)
Definition: LumitronixIFlexBusLg.h:67
uint8_t getLuminance() const
Definition: LumitronixIFlexBusLg.h:82
Definition: LumitronixIFlexBusLg.h:42
LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pin, NeoBusChannel channel)
Definition: LumitronixIFlexBusLg.h:105
void ApplyPostAdjustments()
Definition: LumitronixIFlexBusLg.h:172
LumitronixIFlexBusLg(uint16_t countPixels)
Definition: LumitronixIFlexBusLg.h:123
~LumitronixIFlexBusLg()
Definition: LumitronixIFlexBusLg.h:129
uint8_t GetLuminance() const
Definition: LumitronixIFlexBusLg.h:141
void ClearTo(typename T_COLOR_FEATURE::ColorObject color, uint16_t first, uint16_t last)
Definition: LumitronixIFlexBusLg.h:164
LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pin)
Definition: LumitronixIFlexBusLg.h:99
LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData, uint8_t pinLatch, uint8_t pinOutputEnable=NOT_A_PIN)
Definition: LumitronixIFlexBusLg.h:117
void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBusLg.h:146
void SetLuminance(uint8_t luminance)
Definition: LumitronixIFlexBusLg.h:133
void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBusLg.h:158
LumitronixIFlexBusLg(uint16_t countPixels, uint8_t pinClock, uint8_t pinData)
Definition: LumitronixIFlexBusLg.h:111
LuminanceShader Shader
Definition: LumitronixIFlexBusLg.h:96
Definition: LumitronixIFlexBus.h:47
bool IsDirty() const
Definition: LumitronixIFlexBus.h:141
void Dirty()
Definition: LumitronixIFlexBus.h:146
T_COLOR_FEATURE::ColorObject GetPixelColor(uint16_t indexPixel) const
Definition: LumitronixIFlexBus.h:185
void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBus.h:176
void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBus.h:199
static RgbColor Correct(const RgbColor &original)
Definition: NeoGamma.h:40