diff --git a/examples/bitmaps/NeoPixelBitmap/NeoPixelBitmap.ino b/examples/bitmaps/NeoPixelBitmap/NeoPixelBitmap.ino index 34111e8..b5bb22e 100644 --- a/examples/bitmaps/NeoPixelBitmap/NeoPixelBitmap.ino +++ b/examples/bitmaps/NeoPixelBitmap/NeoPixelBitmap.ino @@ -14,7 +14,7 @@ #include #include -const int chipSelect = D8; // make sure to set this to your SD carder reader CS +const int chipSelect = 8; // make sure to set this to your SD carder reader CS //typedef NeoGrbFeature MyPixelColorFeature; typedef NeoGrbwFeature MyPixelColorFeature; @@ -30,7 +30,7 @@ NeoPixelAnimator animations(AnimCount); // NeoPixel animation management object // our NeoBitmapFile will use the same color feature as NeoPixelBus and // we want it to use the SD File object -NeoBitmapFile image; +NeoBitmapFile image; uint16_t animState; @@ -68,7 +68,7 @@ void setup() { Serial.println("card initialized."); // open the file - File bitmapFile = SD.open("strings.bmp"); + File bitmapFile = SD.open("strings.bmp"); if (!bitmapFile) { Serial.println("File open fail, or not present"); diff --git a/examples/bitmaps/NeoPixelBufferCylon/NeoPixelBufferCylon.ino b/examples/bitmaps/NeoPixelBufferCylon/NeoPixelBufferCylon.ino index 1ba8664..59cbbe0 100644 --- a/examples/bitmaps/NeoPixelBufferCylon/NeoPixelBufferCylon.ino +++ b/examples/bitmaps/NeoPixelBufferCylon/NeoPixelBufferCylon.ino @@ -19,7 +19,7 @@ typedef NeoGrbFeature MyPixelColorFeature; // typedef NeoGrbwFeature MyPixelColorFeature; const uint16_t PixelCount = 16; // the sample images are meant for 16 pixels -const uint16_t PixelPin = 2; +const uint16_t PixelPin = 2; const uint16_t AnimCount = 1; // we only need one NeoPixelBus strip(PixelCount, PixelPin); @@ -28,11 +28,11 @@ NeoPixelBus strip(PixelCount, PixelPin); NeoPixelAnimator animations(AnimCount); // NeoPixel animation management object // sprite sheet stored in progmem using the same pixel feature as the NeoPixelBus -NeoVerticalSpriteSheet> spriteSheet( - myImageWidth, // image width and sprite width since its vertical sprite sheet - myImageHeight, // image height - 1, // sprite is only one pixel high - myImage); +NeoVerticalSpriteSheet> spriteSheet( + myImageWidth, // image width and sprite width since its vertical sprite sheet + myImageHeight, // image height + 1, // sprite is only one pixel high + myImage); uint16_t indexSprite; @@ -71,4 +71,3 @@ void loop() animations.UpdateAnimations(); strip.Show(); } - diff --git a/examples/bitmaps/NeoPixelBufferShader/NeoPixelBufferShader.ino b/examples/bitmaps/NeoPixelBufferShader/NeoPixelBufferShader.ino index a435167..112da41 100644 --- a/examples/bitmaps/NeoPixelBufferShader/NeoPixelBufferShader.ino +++ b/examples/bitmaps/NeoPixelBufferShader/NeoPixelBufferShader.ino @@ -1,7 +1,7 @@ // NeoPixelBufferShader // This example will provide a shader class to the NeoPixelBuffer that will dim and brighten -// the pixels that are in the buffer (a device dependent bitmap) -// +// the pixels that are in the buffer (a device independant bitmap) +// It is just a demonstration of using a custom shader #include @@ -14,7 +14,7 @@ NeoPixelBus strip(PixelCount, PixelPin); // the buffer object, // defined to use memory with the same feature as the strip // initialized with the same number of pixels as our strip -NeoBuffer> image(8,8,NULL); +NeoBuffer> image(8, 8, NULL); const RgbColor BrightRed(255, 0, 0); const RgbColor BrightGreen(0, 255, 0); @@ -36,53 +36,40 @@ const RgbColor White(255); const RgbColor Black(0); // define a custom shader object that provides brightness support -// based upon the NeoShaderBase -template class BrightnessShader : public NeoShaderBase +class BrightnessShader { public: - BrightnessShader(): - NeoShaderBase(), - _brightness(255) // default to full bright - {} + BrightnessShader() : + _brightness(255) // default to full bright + {} - // required for a shader object, it will be called for - // every pixel - void Apply(uint16_t index, uint8_t* pDest, const uint8_t* pSrc) - { - // we don't care what the index is so we ignore it - // - // to apply our brightness shader, - // use the source color, modify, and apply to the destination - - // for every byte in the pixel, - // scale the source value by the brightness and - // store it in the destination byte - const uint8_t* pSrcEnd = pSrc + T_COLOR_FEATURE::PixelSize; - while (pSrc != pSrcEnd) + // required for a shader object, it will be called for + // every pixel + RgbColor Apply(const RgbColor& color) { - *pDest++ = (*pSrc++ * (uint16_t(_brightness) + 1)) >> 8; + // to apply our brightness shader, + // use the source color, modify, and return it + return color.Dim(_brightness); } - } - // provide an accessor to set brightness - void setBrightness(uint8_t brightness) - { - _brightness = brightness; - Dirty(); // must call dirty when a property changes - } + // provide an accessor to set brightness + void setBrightness(uint8_t brightness) + { + _brightness = brightness; + } + + // provide an accessor to get brightness + uint8_t getBrightness() + { + return _brightness; + } - // provide an accessor to get brightness - uint8_t getBrightness() - { - return _brightness; - } - private: - uint8_t _brightness; + uint8_t _brightness; }; -// create an instance of our shader object with the same feature as our buffer -BrightnessShader shader; +// create an instance of our shader object +BrightnessShader shader; // some dimming tracking variables and settings int8_t delta; @@ -103,7 +90,7 @@ void setup() // dibs do not default to any color, // so clear it to black if you aren't going to draw // into every pixel - image.ClearTo(Black); + image.ClearTo(Black); // draw a pattern into the image uint8_t x = 0; @@ -123,7 +110,7 @@ void setup() image.SetPixelColor(x++, y, BrightCyan); image.SetPixelColor(x++, y, BrightBlue); image.SetPixelColor(x++, y, BrightPurple); - + Serial.println(); Serial.println("Running..."); @@ -132,36 +119,32 @@ void setup() void loop() { - // we increment by delta every 30ms - delay(30); - - // update the brightness in shader - // - uint8_t brightness = shader.getBrightness(); - // check if we flip directions - if (brightness == 0) - { - delta = 1; // increment - } - else if (brightness == 255) - { - delta = -1; // decrement - } - // modify and apply - brightness += delta; - shader.setBrightness(brightness); - - Serial.println(brightness); - - - // render the image using the shader and then call Show() - // these two should be called together in order - // + // we increment by delta every 30ms + delay(30); - // need to provide the type of color feature for the strip and - // the type of our custom shader - image.Render>(strip, shader); - strip.Show(); + // update the brightness in shader + // + uint8_t brightness = shader.getBrightness(); + // check if we flip directions + if (brightness == 0) + { + delta = 1; // increment + } + else if (brightness == 255) + { + delta = -1; // decrement + } + // modify and apply + brightness += delta; + shader.setBrightness(brightness); + + Serial.println(brightness); + + + // render the image using the shader and then call Show() + // these two should be called together in order + // + image.Render(strip, shader); + strip.Show(); } - diff --git a/examples/bitmaps/NeoPixelDibTest/NeoPixelDibTest.ino b/examples/bitmaps/NeoPixelDibTest/NeoPixelDibTest.ino deleted file mode 100644 index 4988aec..0000000 --- a/examples/bitmaps/NeoPixelDibTest/NeoPixelDibTest.ino +++ /dev/null @@ -1,158 +0,0 @@ -// NeoPixelDibTest -// This example will provide a shader class to the NeoPixelDib that will dim and brighten -// the pixels that are in the Dib (Device Independant Bitmap) -// - -#include - -const uint16_t PixelCount = 64; // set this to the size of your strip -const uint8_t PixelPin = 2; // make sure to set this to the correct pin, ignored for Esp8266 - -// three element GRB pixels, change to your needs -NeoPixelBus strip(PixelCount, PixelPin); - -// the DIB object, using RgbColor and initialized with the same number of pixels as our strip -NeoDib image(PixelCount); - -const RgbColor BrightRed(255, 0, 0); -const RgbColor BrightGreen(0, 255, 0); -const RgbColor BrightBlue(0, 0, 255); - -const RgbColor BrightYellow(255, 255, 0); -const RgbColor BrightCyan(0, 255, 255); -const RgbColor BrightPurple(255, 0, 255); - -const RgbColor DarkRed(32, 0, 0); -const RgbColor DarkGreen(0, 32, 0); -const RgbColor DarkBlue(0, 0, 32); - -const RgbColor DarkYellow(32, 32, 0); -const RgbColor DarkCyan(0, 32, 32); -const RgbColor DarkPurple(32, 0, 32); - -const RgbColor White(255); -const RgbColor Black(0); - -// define a custom shader object that provides brightness support -// based upon the NeoShaderBase -class BrightnessShader : public NeoShaderBase -{ -public: - BrightnessShader(): - NeoShaderBase(), - _brightness(255) // default to full bright - {} - - // required for a shader object, it will be called for - // every pixel - RgbColor Apply(uint16_t index, RgbColor original) - { - // we don't care what the index is so we ignore it - // - // to apply our brightness shader, modify the original color and return the color we want - // blend from black (_brightness == 0.0) to the original color (_brightness == 1.0) - - return RgbColor::LinearBlend(Black, original, (float)_brightness / 255.0f); - } - - // provide an accessor to set brightness - void setBrightness(uint8_t brightness) - { - _brightness = brightness; - Dirty(); // must call dirty when a property changes - } - - // provide an accessor to get brightness - uint8_t getBrightness() - { - return _brightness; - } - -private: - uint8_t _brightness; -}; - -// create an instance of our shader object -BrightnessShader shader; - -// some dimming tracking variables and settings -int8_t delta; - -void setup() -{ - Serial.begin(115200); - while (!Serial); // wait for serial attach - - Serial.println(); - Serial.println("Initializing..."); - Serial.flush(); - - // this resets all the neopixels to an off state - strip.Begin(); - strip.Show(); - - // dibs do not default to any color, - // so clear it to black if you aren't going to draw - // into every pixel - image.ClearTo(Black); - - // draw a pattern into the image - uint8_t index = 0; - image.SetPixelColor(index++, DarkRed); - image.SetPixelColor(index++, DarkYellow); - image.SetPixelColor(index++, DarkGreen); - image.SetPixelColor(index++, DarkCyan); - image.SetPixelColor(index++, DarkBlue); - image.SetPixelColor(index++, DarkPurple); - - image.SetPixelColor(index++, Black); - image.SetPixelColor(index++, Black); - - image.SetPixelColor(index++, BrightRed); - image.SetPixelColor(index++, BrightYellow); - image.SetPixelColor(index++, BrightGreen); - image.SetPixelColor(index++, BrightCyan); - image.SetPixelColor(index++, BrightBlue); - image.SetPixelColor(index++, BrightPurple); - - Serial.println(); - Serial.println("Running..."); - - delta = -1; // start by dimming downward -} - -void loop() -{ - // we increment by delta every 30ms - delay(30); - - // update the brightness in shader - // - uint8_t brightness = shader.getBrightness(); - // check if we flip directions - if (brightness == 0) - { - delta = 1; // increment - } - else if (brightness == 255) - { - delta = -1; // decrement - } - // modify and apply - brightness += delta; - shader.setBrightness(brightness); - - Serial.println(brightness); - - - // render the image using the shader and then call Show() - // these two should be called together in order - // - - // need to provide the type of color feature for the strip and - // the type of our custom shader - image.Render(strip, shader); - strip.Show(); - -} - diff --git a/src/NeoPixelBusLg.h b/src/NeoPixelBusLg.h index 22b16ec..d39c7e9 100644 --- a/src/NeoPixelBusLg.h +++ b/src/NeoPixelBusLg.h @@ -28,7 +28,7 @@ License along with NeoPixel. If not, see #include "NeoPixelBus.h" -template class LuminanceShader diff --git a/src/internal/buffers/NeoBitmapFile.h b/src/internal/buffers/NeoBitmapFile.h index d246fb9..9466496 100644 --- a/src/internal/buffers/NeoBitmapFile.h +++ b/src/internal/buffers/NeoBitmapFile.h @@ -70,7 +70,8 @@ enum BmpCompression // T_COLOR_OBJECT - one of the color objects (RgbColor, RgbwColor) // T_FILE_METHOD - any standard File object following Arduino File methods/members // -template class NeoBitmapFile +template +class NeoBitmapFile { public: NeoBitmapFile() : @@ -213,7 +214,7 @@ public: { if (readPixel(&color)) { - color = shader.Apply(indexPixel, color); + color = shader.Apply(color); xSrc++; } } diff --git a/src/internal/buffers/NeoBuffer.h b/src/internal/buffers/NeoBuffer.h index 4a60cbb..df0762f 100644 --- a/src/internal/buffers/NeoBuffer.h +++ b/src/internal/buffers/NeoBuffer.h @@ -29,7 +29,8 @@ License along with NeoPixel. If not, see // NeoBufferMethod // NeoBufferProgmemMethod // -template class NeoBuffer +template +class NeoBuffer { public: NeoBuffer(uint16_t width, @@ -155,13 +156,14 @@ public: Blt(destBuffer, xDest, yDest, 0, 0, Width(), Height(), layoutMap); } - template void Render(NeoBufferContext destBuffer, T_SHADER& shader) + template + void Render(NeoBufferContext destBuffer, T_SHADER& shader) { - uint16_t destPixelCount = destBuffer.PixelCount(); + uint16_t countPixels = destBuffer.PixelCount; - if (destPixelCount > _method.PixelCount()) + if (countPixels > _method.PixelCount()) { - destPixelCount = _method.PixelCount(); + countPixels = _method.PixelCount(); } for (uint16_t indexPixel = 0; indexPixel < countPixels; indexPixel++) diff --git a/src/internal/buffers/NeoBufferContext.h b/src/internal/buffers/NeoBufferContext.h index 52d5e32..802f285 100644 --- a/src/internal/buffers/NeoBufferContext.h +++ b/src/internal/buffers/NeoBufferContext.h @@ -28,17 +28,18 @@ License along with NeoPixel. If not, see // This is used to allow a template classes that share common buffer concept to // be able to pass that common information to functions // The template classes just need to expose a conversion operator to this type -template struct NeoBufferContext +template +struct NeoBufferContext { NeoBufferContext(T_COLOR_OBJECT* pixels, - size_t pixelsCount) : + size_t pixelCount) : Pixels(pixels), - PixelsCount(pixelsCount) + PixelCount(pixelCount) { } typedef T_COLOR_OBJECT ColorObject; T_COLOR_OBJECT* Pixels; - const size_t PixelsCount; - ; \ No newline at end of file + const size_t PixelCount; +}; \ No newline at end of file diff --git a/src/internal/buffers/NeoBufferMethods.h b/src/internal/buffers/NeoBufferMethods.h index d9f3184..13b721d 100644 --- a/src/internal/buffers/NeoBufferMethods.h +++ b/src/internal/buffers/NeoBufferMethods.h @@ -26,7 +26,8 @@ License along with NeoPixel. If not, see #pragma once -template class NeoBufferMethod +template +class NeoBufferMethod { public: NeoBufferMethod(uint16_t width, uint16_t height, PGM_VOID_P pixels = nullptr) : @@ -37,10 +38,12 @@ public: if (pixels) { + const uint8_t* pixelsSrc = static_cast(pixels); + // copy from progmem to initialize for (size_t index = 0; index < PixelCount(); index++) { - _pixels[index] = T_COLOR_OBJECT::PgmRead(pixels + T_COLOR_OBJECT::Size * indexPixel); + _pixels[index] = T_COLOR_OBJECT::PgmRead(pixelsSrc + T_COLOR_OBJECT::Size * index); } } } @@ -53,7 +56,7 @@ public: operator NeoBufferContext() { - return NeoBufferContext(Pixels(), PixelsCount()); + return NeoBufferContext(Pixels(), PixelCount()); } uint8_t* Pixels() const @@ -96,7 +99,8 @@ public: void SetPixelColor(int16_t x, int16_t y, T_COLOR_OBJECT color) { - if (x < 0 || x >= _width || y < 0 || y >= _height) + if (x < 0 || static_cast(x) >= _width || + y < 0 || static_cast(y) >= _height) { return; } diff --git a/src/internal/buffers/NeoBufferProgmemMethod.h b/src/internal/buffers/NeoBufferProgmemMethod.h index 449598b..df37927 100644 --- a/src/internal/buffers/NeoBufferProgmemMethod.h +++ b/src/internal/buffers/NeoBufferProgmemMethod.h @@ -26,7 +26,8 @@ License along with NeoPixel. If not, see #pragma once -template class NeoBufferProgmemMethod +template +class NeoBufferProgmemMethod { public: NeoBufferProgmemMethod(uint16_t width, uint16_t height, PGM_VOID_P pixels) : @@ -38,7 +39,7 @@ public: operator NeoBufferContext() { - return NeoBufferContext(Pixels(), PixelsCount()); + return NeoBufferContext(Pixels(), PixelCount()); } const uint8_t* Pixels() const @@ -80,7 +81,9 @@ public: return 0; } - return T_COLOR_OBJECT::PgmRead(_pixels + T_COLOR_OBJECT::Size * indexPixel); + const uint8_t* pixelsSrc = static_cast(_pixels); + + return T_COLOR_OBJECT::PgmRead(pixelsSrc + T_COLOR_OBJECT::Size * indexPixel); }; diff --git a/src/internal/buffers/NeoShaderNop.h b/src/internal/buffers/NeoShaderNop.h index 7425693..acf1057 100644 --- a/src/internal/buffers/NeoShaderNop.h +++ b/src/internal/buffers/NeoShaderNop.h @@ -25,7 +25,7 @@ License along with NeoPixel. If not, see -------------------------------------------------------------------------*/ #pragma once -template +template class NeoShaderNop { public: diff --git a/src/internal/buffers/NeoVerticalSpriteSheet.h b/src/internal/buffers/NeoVerticalSpriteSheet.h index 0ec9002..91e6d04 100644 --- a/src/internal/buffers/NeoVerticalSpriteSheet.h +++ b/src/internal/buffers/NeoVerticalSpriteSheet.h @@ -42,7 +42,7 @@ public: { } - operator NeoBufferContext() + operator NeoBufferContext() { return _method; } @@ -82,11 +82,11 @@ public: _method.ClearTo(color); }; - void Blt(NeoBufferContext destBuffer, + void Blt(NeoBufferContext destBuffer, uint16_t destPixelIndex, uint16_t indexSprite) { - uint16_t destPixelCount = destBuffer.PixelCount(); + uint16_t destPixelCount = destBuffer.PixelCount; // validate destPixelIndex if (destPixelIndex >= destPixelCount) { @@ -114,7 +114,7 @@ public: } } - void Blt(NeoBufferContext destBuffer, + void Blt(NeoBufferContext destBuffer, int16_t x, int16_t y, uint16_t indexSprite, @@ -135,7 +135,7 @@ public: if (indexDest < destPixelCount) { typename T_BUFFER_METHOD::ColorObject color = _method.GetPixelColor(pixelIndex(indexSprite, srcX, srcY)); - destBuffer.Pixels[destPixelIndex + indexDest] = color; + destBuffer.Pixels[indexDest] = color; } } } diff --git a/src/internal/colors/RgbColorBase.h b/src/internal/colors/RgbColorBase.h index 8b658fd..809237a 100644 --- a/src/internal/colors/RgbColorBase.h +++ b/src/internal/colors/RgbColorBase.h @@ -70,26 +70,31 @@ protected: template static T_COLOR _PgmReadByBytes(PGM_VOID_P pPixelSrc) { + T_COLOR result; const uint8_t* pSrc = reinterpret_cast(pPixelSrc); const uint8_t* pEnd = pSrc + T_COLOR::Count; uint8_t index = 0; while (pSrc < pEnd) { - color[index++] = pgm_read_byte(pSrc++); + result[index++] = pgm_read_byte(pSrc++); } + + return result; } template static T_COLOR _PgmReadByWords(PGM_VOID_P pPixelSrc) { + T_COLOR result; const uint16_t* pSrc = reinterpret_cast(pPixelSrc); const uint16_t* pEnd = pSrc + T_COLOR::Count; uint8_t index = 0; while (pSrc < pEnd) { - color[index++] = pgm_read_word(pSrc++); + result[index++] = pgm_read_word(pSrc++); } + return result; } }; \ No newline at end of file