Compile optimisations, code reduction.

2D peek resize.
This commit is contained in:
Blaž Kristan 2022-08-03 14:23:24 +02:00
parent f58ff68f3c
commit c5f3e76b21
7 changed files with 237 additions and 282 deletions

View File

@ -550,10 +550,10 @@ typedef struct Segment {
uint16_t virtualLength(void);
void setPixelColor(int n, uint32_t c); // set relative pixel within segment with color
void setPixelColor(int n, byte r, byte g, byte b, byte w = 0) { setPixelColor(n, RGBW32(r,g,b,w)); } // automatically inline
void setPixelColor(int n, CRGB c) { setPixelColor(n, c.red, c.green, c.blue); } // automatically inline
void setPixelColor(int n, CRGB c) { setPixelColor(n, RGBW32(c.r,c.g,c.b,0)); } // automatically inline
void setPixelColor(float i, uint32_t c, bool aa = true);
void setPixelColor(float i, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0, bool aa = true) { setPixelColor(i, RGBW32(r,g,b,w), aa); }
void setPixelColor(float i, CRGB c, bool aa = true) { setPixelColor(i, c.red, c.green, c.blue, 0, aa); }
void setPixelColor(float i, CRGB c, bool aa = true) { setPixelColor(i, RGBW32(c.r,c.g,c.b,0), aa); }
uint32_t getPixelColor(uint16_t i);
// 1D support functions (some implement 2D as well)
void blur(uint8_t);
@ -561,10 +561,10 @@ typedef struct Segment {
void fade_out(uint8_t r);
void fadeToBlackBy(uint8_t fadeBy);
void blendPixelColor(int n, uint32_t color, uint8_t blend);
void blendPixelColor(int n, CRGB c, uint8_t blend) { blendPixelColor(n, RGBW32(c.red, c.green, c.blue, 0), blend); }
void blendPixelColor(int n, CRGB c, uint8_t blend) { blendPixelColor(n, RGBW32(c.r,c.g,c.b,0), blend); }
void addPixelColor(int n, uint32_t color);
void addPixelColor(int n, byte r, byte g, byte b, byte w = 0) { addPixelColor(n, RGBW32(r,g,b,w)); } // automatically inline
void addPixelColor(int n, CRGB c) { addPixelColor(n, RGBW32(c.red, c.green, c.blue, 0)); } // automatically inline
void addPixelColor(int n, CRGB c) { addPixelColor(n, RGBW32(c.r,c.g,c.b,0)); } // automatically inline
void fadePixelColor(uint16_t n, uint8_t fade);
uint8_t get_random_wheel_index(uint8_t pos);
uint32_t color_from_palette(uint16_t, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri = 255);
@ -573,39 +573,69 @@ typedef struct Segment {
// 2D matrix
uint16_t virtualWidth(void);
uint16_t virtualHeight(void);
#ifndef WLED_DISABLE_2D
uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment (for leds[])
void setPixelColorXY(int x, int y, uint32_t c); // set relative pixel within segment with color
void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline
void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, RGBW32(c.red, c.green, c.blue, 0)); } // automatically inline
void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); } // automatically inline
void setPixelColorXY(float x, float y, uint32_t c, bool aa = true);
void setPixelColorXY(float x, float y, byte r, byte g, byte b, byte w = 0, bool aa = true) { setPixelColorXY(x, y, RGBW32(r,g,b,w), aa); }
void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColorXY(x, y, c.red, c.green, c.blue, 0, aa); }
void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), aa); }
uint32_t getPixelColorXY(uint16_t x, uint16_t y);
// 2D support functions
void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend);
void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t blend) { blendPixelColorXY(x, y, RGBW32(c.red, c.green, c.blue,0), blend); }
void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t blend) { blendPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0), blend); }
void addPixelColorXY(int x, int y, uint32_t color);
void addPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { addPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline
void addPixelColorXY(int x, int y, CRGB c) { addPixelColorXY(x, y, RGBW32(c.red, c.green, c.blue,0)); }
void addPixelColorXY(int x, int y, CRGB c) { addPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); }
void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade);
void box_blur(uint16_t i, bool vertical, fract8 blur_amount); // 1D box blur (with weight)
void blur1d(CRGB* leds, fract8 blur_amount);
void blur2d(CRGB* leds, fract8 blur_amount);
void blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr);
void blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr);
void moveX(int8_t delta);
void moveY(int8_t delta);
void move(uint8_t dir, uint8_t delta);
void fill_solid(CRGB* leds, CRGB c);
void fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c);
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c);
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c) { drawLine(x0, y0, x1, y1, RGBW32(c.r,c.g,c.b,0)); } // automatic inline
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color);
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c) { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0)); } // automatic inline
void wu_pixel(uint32_t x, uint32_t y, CRGB c);
// obsolete
void blur1d(CRGB* leds, fract8 blur_amount);
void blur2d(CRGB* leds, fract8 blur_amount);
void fill_solid(CRGB* leds, CRGB c);
void fadeToBlackBy(CRGB* leds, uint8_t fadeBy);
void nscale8(CRGB* leds, uint8_t scale);
void setPixels(CRGB* leds);
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c);
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds = nullptr);
void wu_pixel(uint32_t x, uint32_t y, CRGB c);
inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) { drawLine(x0, y0, x1, y1, CRGB(byte(c>>16), byte(c>>8), byte(c))); }
inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t c) { drawCharacter(chr, x, y, w, h, CRGB(byte(c>>16), byte(c>>8), byte(c))); }
#else
uint16_t XY(uint16_t x, uint16_t y) { return x; }
void setPixelColorXY(int x, int y, uint32_t c) { setPixelColor(x, c); }
void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColor(x, RGBW32(r,g,b,w)); }
void setPixelColorXY(int x, int y, CRGB c) { setPixelColor(x, RGBW32(c.r,c.g,c.b,0)); }
void setPixelColorXY(float x, float y, uint32_t c, bool aa = true) { setPixelColor(x, c, aa); }
void setPixelColorXY(float x, float y, byte r, byte g, byte b, byte w = 0, bool aa = true) { setPixelColor(x, RGBW32(r,g,b,w), aa); }
void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColor(x, RGBW32(c.r,c.g,c.b,0), aa); }
uint32_t getPixelColorXY(uint16_t x, uint16_t y) { return getPixelColor(x); }
void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t c, uint8_t blend) { blendPixelColor(x, c, blend); }
void blendPixelColorXY(uint16_t x, uint16_t y, CRGB c, uint8_t blend) { blendPixelColor(x, RGBW32(c.r,c.g,c.b,0), blend); }
void addPixelColorXY(int x, int y, uint32_t color) { addPixelColor(x, color); }
void addPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { addPixelColor(x, RGBW32(r,g,b,w)); }
void addPixelColorXY(int x, int y, CRGB c) { addPixelColor(x, RGBW32(c.r,c.g,c.b,0)); }
void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { fadePixelColor(x, fade); }
void box_blur(uint16_t i, bool vertical, fract8 blur_amount) {}
void blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr) {}
void blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr) {}
void moveX(int8_t delta) {}
void moveY(int8_t delta) {}
void move(uint8_t dir, uint8_t delta) {}
void fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c) {}
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {}
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c) {}
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color) {}
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color) {}
void wu_pixel(uint32_t x, uint32_t y, CRGB c) {}
#endif
} segment;
//static int i = sizeof(Segment);
@ -778,10 +808,10 @@ class WS2812FX { // 96 bytes
const char **
getModeDataSrc(void) { return &(_modeData[0]); } // vectors use arrays for underlying data
Segment& getSegment(uint8_t id);
Segment& getSegment(uint8_t id);
inline Segment& getFirstSelectedSeg(void) { return _segments[getFirstSelectedSegId()]; }
inline Segment& getMainSegment(void) { return _segments[getMainSegmentId()]; }
inline Segment* getSegments(void) { return &(_segments[0]); }
inline Segment& getMainSegment(void) { return _segments[getMainSegmentId()]; }
inline Segment* getSegments(void) { return &(_segments[0]); }
// 2D support (panels)
bool
@ -800,11 +830,10 @@ class WS2812FX { // 96 bytes
matrixHeight;
typedef struct panel_bitfield_t {
unsigned char
bottomStart : 1, // starts at bottom?
rightStart : 1, // starts on right?
vertical : 1, // is vertical?
serpentine : 1; // is serpentine?
bool bottomStart : 1; // starts at bottom?
bool rightStart : 1; // starts on right?
bool vertical : 1; // is vertical?
bool serpentine : 1; // is serpentine?
} Panel;
Panel
matrix,
@ -817,7 +846,7 @@ class WS2812FX { // 96 bytes
// outsmart the compiler :) by correctly overloading
inline void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline
inline void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, c.red, c.green, c.blue); }
inline void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); }
uint32_t
getPixelColorXY(uint16_t, uint16_t);

View File

@ -138,20 +138,17 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
// Segment:: routines
///////////////////////////////////////////////////////////
#ifndef WLED_DISABLE_2D
// XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element)
uint16_t IRAM_ATTR Segment::XY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D
uint16_t width = virtualWidth(); // segment width in logical pixels
uint16_t height = virtualHeight(); // segment height in logical pixels
return (x%width) + (y%height) * width;
#else
return x;
#endif
}
void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col)
{
#ifndef WLED_DISABLE_2D
if (!strip.isMatrix) return; // not a matrix set-up
if (leds) leds[XY(x,y)] = col;
@ -193,15 +190,11 @@ void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col)
}
}
}
#else
setPixelColor(x, col);
#endif
}
// anti-aliased version of setPixelColorXY()
void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
{
#ifndef WLED_DISABLE_2D
if (!strip.isMatrix) return; // not a matrix set-up
if (x<0.0f || x>1.0f || y<0.0f || y>1.0f) return; // not normalized
@ -241,12 +234,10 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
} else {
setPixelColorXY(uint16_t(roundf(fX)), uint16_t(roundf(fY)), col);
}
#endif
}
// returns RGBW values of pixel
uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D
if (leds) return RGBW32(leds[XY(x,y)].r, leds[XY(x,y)].g, leds[XY(x,y)].b, 0);
if (getOption(SEG_OPTION_REVERSED) ) x = virtualWidth() - x - 1;
if (getOption(SEG_OPTION_REVERSED_Y)) y = virtualHeight() - y - 1;
@ -255,41 +246,25 @@ uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) {
y *= groupLength(); // expand to physical pixels
if (x >= width() || y >= height()) return 0;
return strip.getPixelColorXY(start + x, startY + y);
#else
return getPixelColor(x);
#endif
}
// Blends the specified color with the existing pixel color.
void Segment::blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) {
#ifndef WLED_DISABLE_2D
setPixelColorXY(x, y, color_blend(getPixelColorXY(x,y), color, blend));
#else
setPixelColor(x, color_blend(getPixelColor(x), color, blend));
#endif
}
// Adds the specified color with the existing pixel color perserving color balance.
void Segment::addPixelColorXY(int x, int y, uint32_t color) {
#ifndef WLED_DISABLE_2D
setPixelColorXY(x, y, color_add(getPixelColorXY(x,y), color));
#else
setPixelColor(x, color_add(getPixelColor(x), color));
#endif
}
void Segment::fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) {
#ifndef WLED_DISABLE_2D
CRGB pix = CRGB(getPixelColorXY(x,y)).nscale8_video(fade);
setPixelColor(x, y, pix);
#else
setPixelColor(x, CRGB(getPixelColor(x)).nscale8_video(fade));
#endif
}
// blurRow: perform a blur on a row of a rectangular matrix
void Segment::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
@ -313,12 +288,10 @@ void Segment::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) {
else setPixelColorXY(x, row, cur);
carryover = part;
}
#endif
}
// blurCol: perform a blur on a column of a rectangular matrix
void Segment::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
@ -342,33 +315,10 @@ void Segment::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) {
else setPixelColorXY(col, i, cur);
carryover = part;
}
#endif
}
// blur1d: one-dimensional blur filter. Spreads light to 2 line neighbors.
// blur2d: two-dimensional blur filter. Spreads light to 8 XY neighbors.
//
// 0 = no spread at all
// 64 = moderate spreading
// 172 = maximum smooth, even spreading
//
// 173..255 = wider spreading, but increasing flicker
//
// Total light is NOT entirely conserved, so many repeated
// calls to 'blur' will also result in the light fading,
// eventually all the way to black; this is by design so that
// it can be used to (slowly) clear the LEDs to black.
void Segment::blur1d(CRGB* leds, fract8 blur_amount) {
#ifndef WLED_DISABLE_2D
const uint16_t rows = virtualHeight();
for (uint16_t y = 0; y < rows; y++) blurRow(y, blur_amount, leds);
#endif
}
// 1D Box blur (with added weight - blur_amount: [0=no blur, 255=max blur])
void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
const uint16_t dim1 = vertical ? rows : cols;
@ -399,20 +349,35 @@ void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
uint16_t y = vertical ? j : i;
setPixelColorXY(x, y, tmp[j]);
}
#endif
}
// blur1d: one-dimensional blur filter. Spreads light to 2 line neighbors.
// blur2d: two-dimensional blur filter. Spreads light to 8 XY neighbors.
//
// 0 = no spread at all
// 64 = moderate spreading
// 172 = maximum smooth, even spreading
//
// 173..255 = wider spreading, but increasing flicker
//
// Total light is NOT entirely conserved, so many repeated
// calls to 'blur' will also result in the light fading,
// eventually all the way to black; this is by design so that
// it can be used to (slowly) clear the LEDs to black.
void Segment::blur1d(CRGB* leds, fract8 blur_amount) {
const uint16_t rows = virtualHeight();
for (uint16_t y = 0; y < rows; y++) blurRow(y, blur_amount, leds);
}
void Segment::blur2d(CRGB* leds, fract8 blur_amount) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount, leds); // blur all rows
for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount, leds); // blur all columns
#endif
}
void Segment::moveX(int8_t delta) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
if (!delta) return;
@ -427,11 +392,9 @@ void Segment::moveX(int8_t delta) {
setPixelColorXY(x, y, getPixelColorXY(x + delta, y));
}
}
#endif
}
void Segment::moveY(int8_t delta) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
if (!delta) return;
@ -446,14 +409,12 @@ void Segment::moveY(int8_t delta) {
setPixelColorXY(x, y, getPixelColorXY(x, y + delta));
}
}
#endif
}
// move() - move all pixels in desired direction delta number of pixels
// @param dir direction: 0=left, 1=left-up, 2=up, 3=right-up, 4=right, 5=right-down, 6=down, 7=left-down
// @param delta number of pixels to move
void Segment::move(uint8_t dir, uint8_t delta) {
#ifndef WLED_DISABLE_2D
if (delta==0) return;
switch (dir) {
case 0: moveX( delta); break;
@ -465,7 +426,20 @@ void Segment::move(uint8_t dir, uint8_t delta) {
case 6: moveY(-delta); break;
case 7: moveX( delta); moveY(-delta); break;
}
#endif
}
// by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs
void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (int16_t y = -radius; y <= radius; y++) {
for (int16_t x = -radius; x <= radius; x++) {
if (x * x + y * y <= radius * radius &&
int16_t(cx)+x>=0 && int16_t(cy)+y>=0 &&
int16_t(cx)+x<cols && int16_t(cy)+y<rows)
setPixelColorXY(cx + x, cy + y, col);
}
}
}
void Segment::fill_solid(CRGB* leds, CRGB color) {
@ -477,50 +451,27 @@ void Segment::fill_solid(CRGB* leds, CRGB color) {
}
}
// by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs
void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (int16_t y = -radius; y <= radius; y++) {
for (int16_t x = -radius; x <= radius; x++) {
if (x * x + y * y <= radius * radius &&
int16_t(cx)+x>=0 && int16_t(cy)+y>=0 &&
int16_t(cx)+x<cols && int16_t(cy)+y<rows)
setPixelColorXY(cx + x, cy + y, col);
}
}
#endif
}
void Segment::fadeToBlackBy(CRGB* leds, uint8_t fadeBy) {
#ifndef WLED_DISABLE_2D
nscale8(leds, 255 - fadeBy);
#endif
}
void Segment::nscale8(CRGB* leds, uint8_t scale) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) {
if (leds) leds[XY(x,y)].nscale8(scale);
else setPixelColorXY(x, y, CRGB(getPixelColorXY(x, y)).nscale8(scale));
}
#endif
}
void Segment::setPixels(CRGB* leds) {
#ifndef WLED_DISABLE_2D
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) setPixelColorXY(x, y, leds[XY(x,y)]);
#endif
}
//line function
void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c) {
#ifndef WLED_DISABLE_2D
void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
if (x0 >= cols || x1 >= cols || y0 >= rows || y1 >= rows) return;
@ -534,10 +485,8 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB
if (e2 >-dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
#endif
}
#ifndef WLED_DISABLE_2D
// font curtesy of https://github.com/idispatch/raster-fonts
static const unsigned char console_font_6x8[] PROGMEM = {
@ -6688,12 +6637,10 @@ static const unsigned char console_font_5x8[] PROGMEM = {
0x00, /* 00000 */
0x00, /* 00000 */
};
#endif
// draws a raster font character on canvas
// only supports 5x8 and 6x8 fonts ATM
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds) {
#ifndef WLED_DISABLE_2D
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color) {
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
@ -6710,17 +6657,14 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
for (uint8_t j = 0; j<w; j++) { // character width
int16_t x0 = x + (w-1) - j;
if ((x0 >= 0 || x0 < cols) && ((bits>>(j+(8-w))) & 0x01)) { // bit set & drawing on-screen
if (leds) leds[XY(x0,y0)] = color;
else setPixelColorXY(x0, y0, color);
setPixelColorXY(x0, y0, color);
}
}
}
#endif
}
#define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8))
void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel procedure by reddit u/sutaburosu
#ifndef WLED_DISABLE_2D
// extract the fractional parts and derive their inverses
uint8_t xx = x & 0xff, yy = y & 0xff, ix = 255 - xx, iy = 255 - yy;
// calculate the intensities for each affected pixel
@ -6734,6 +6678,7 @@ void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel
led.b = qadd8(led.b, c.b * wu[i] >> 8);
setPixelColorXY(int((x >> 8) + (i & 1)), int((y >> 8) + ((i >> 1) & 1)), led);
}
#endif
}
#undef WU_WEIGHT
#endif // WLED_DISABLE_2D

View File

@ -1,110 +1,81 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta charset="utf-8">
<meta name="theme-color" content="#222222">
<title>WLED Live Preview</title>
<style>
body {
margin: 0;
}
</style>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta charset="utf-8">
<meta name="theme-color" content="#222222">
<title>WLED Live Preview</title>
<style>
body {
margin: 0;
}
</style>
</head>
<body>
<canvas id="liveviewCanvas">LiveView</canvas>
<script>
var c = document.getElementById('liveviewCanvas');
c.width = window.innerWidth * 0.98; //remove scroll bars
c.height = window.innerHeight * 0.98; //remove scroll bars
var leds = "";
var mW = 0;
var mH = 0;
var pPL = 0;
var lOf = 0;
// Check for canvas support
if (c.getContext) {
// Access the rendering context
var ctx = c.getContext('2d');
//In case of pixels
// // ImageData object
// var imageData = ctx.getImageData(0, 0, c.width, c.height);
// // One-dimensional array containing the data in the RGBA order
// var data = imageData.data;
// function drawLedPixels(x, y, r, g, b, a) { //old
// // console.log(x, y, r, g, b, a);
// for (right = 0; right < pPL; right++) {
// for (down = 0; down < pPL; down++) {
// ff = (x * pPL + right + (y * pPL + down) * mW * pPL) * 4;
// // if (x==15 && y==15)
// // console.log("ff=" + x + " * " + pPL + " +" + right + " + (" + y + " * " + pPL + " +" + down + ") * " + mW + ") * 4 = " + ff, data.length); //(5*10+1 + (12*10+1) * 16) * 4 = (51 + 121*16) * 4
// data[ff + 0] = r;
// data[ff + 1] = g;
// data[ff + 2] = b;
// data[ff + 3] = a;
// }
// }
// }
function drawLedCircles(x, y, r, g, b, a) {
ctx.fillStyle = `rgb(${r},${g},${b})`;
ctx.beginPath();
ctx.arc(x*pPL+pPL*0.5+lOf, y*pPL+pPL*0.5, pPL*0.4, 0, 2 * Math.PI);
ctx.fill();
}
function paintLeds() {
// data represents the Uint8ClampedArray containing the data
// in the RGBA order [r0, g0, b0, a0, r1, g1, b1, a1, ..., rn, gn, bn, an]
for (i = 4; i < leds.length; i+=3) {
let ff = (i-4)/3;
drawLedCircles(ff%mW, Math.floor(ff/mW), leds[i], leds[i+1], leds[i+2], 255)
}
// ctx.putImageData(imageData, 0, 0); //in case of drawLedPixels
}
}
function updatePreview(ledsp) {
leds = ledsp;
mW = leds[2];
mH = leds[3];
pPL = Math.min(c.width / mW, c.height / mH);
lOf = Math.floor((c.width - pPL*mW)/2);
paintLeds();
}
function getLiveJson(e) {
try {
if (toString.call(e.data) === '[object ArrayBuffer]') {
let leds = new Uint8Array(event.data);
if (leds[0] != 76) return; //'L', set in ws.cpp
updatePreview(leds);
}
}
catch (err) {
console.error("Peek WS error:",err);
}
}
var ws;
try {
ws = top.window.ws;
} catch (e) {}
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send("{'lv':true}");
} else {
ws = new WebSocket((window.location.protocol == "https:"?"wss":"ws")+"://"+document.location.host+"/ws");
ws.onopen = function () {
ws.send("{'lv':true}");
}
}
ws.binaryType = "arraybuffer";
ws.addEventListener('message',getLiveJson);
</script>
<canvas id="liveviewCanvas">LiveView</canvas>
<script>
var c = document.getElementById('liveviewCanvas');
var leds = "";
var mW = 0, mH = 0, pPL = 0, lOf = 0;
var throttled = false;
function setCanvas() {
c.width = window.innerWidth * 0.98; //remove scroll bars
c.height = window.innerHeight * 0.98; //remove scroll bars
}
setCanvas();
// Check for canvas support
if (c.getContext) {
// Access the rendering context
var ctx = c.getContext('2d');
function drawCircle(x, y, r, g, b, a) {
ctx.fillStyle = `rgb(${r},${g},${b})`;
ctx.beginPath();
ctx.arc(x*pPL+pPL*0.5+lOf, y*pPL+pPL*0.5, pPL*0.4, 0, 2 * Math.PI);
ctx.fill();
}
// use parent WS or open new
var ws;
try {
ws = top.window.ws;
} catch (e) {}
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send("{'lv':true}");
} else {
ws = new WebSocket((window.location.protocol == "https:"?"wss":"ws")+"://"+document.location.host+"/ws");
ws.onopen = ()=>{
ws.send("{'lv':true}");
}
}
ws.binaryType = "arraybuffer";
ws.addEventListener('message',(e)=>{
try {
if (toString.call(e.data) === '[object ArrayBuffer]') {
let leds = new Uint8Array(event.data);
if (leds[0] != 76) return; //'L', set in ws.cpp
mW = leds[2]; // matrix width
mH = leds[3]; // matrix height
pPL = Math.min(c.width / mW, c.height / mH); // pixels per LED (width of circle)
lOf = Math.floor((c.width - pPL*mW)/2); //left offeset (to center matrix)
for (i = 4; i < leds.length; i+=3) {
let ff = (i-4)/3; // pixel index
drawCircle(ff%mW, Math.floor(ff/mW), leds[i], leds[i+1], leds[i+2], 255);
}
}
} catch (err) {
console.error("Peek WS error:",err);
}
});
}
// window.resize event listener
window.addEventListener('resize', (e)=>{
if (!throttled) { // only run if we're not throttled
setCanvas(); // actual callback action
throttled = true; // we're throttled!
setTimeout(()=>{ // set a timeout to un-throttle
throttled = false;
}, 250);
}
});
</script>
</body>
</html>

View File

@ -282,63 +282,63 @@ const uint8_t PAGE_liveviewws[] PROGMEM = {
// Autogenerated from wled00/data/liveviewws2D.htm, do not edit!!
const uint16_t PAGE_liveviewws2D_length = 865;
const uint16_t PAGE_liveviewws2D_length = 878;
const uint8_t PAGE_liveviewws2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x6d, 0x54, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0xfe, 0xee, 0x5f, 0xa1, 0x72, 0x5d, 0x2b, 0xc6, 0xb4, 0xe4, 0x3a, 0xc9, 0x96, 0xd9, 0x92,
0x8b, 0x35, 0x35, 0x90, 0x0e, 0xde, 0x62, 0xc0, 0xdd, 0x8c, 0x21, 0x08, 0x50, 0x5a, 0x3a, 0x5b,
0x6c, 0x25, 0x52, 0x20, 0x69, 0xab, 0x86, 0xa1, 0xff, 0xbe, 0x23, 0xed, 0x38, 0x5e, 0x36, 0x7d,
0x20, 0xc5, 0xe3, 0xbd, 0x3c, 0xf7, 0xdc, 0xf1, 0x92, 0x57, 0x1f, 0xef, 0x6f, 0x3f, 0xff, 0x3d,
0x9b, 0x04, 0x85, 0xad, 0xca, 0x71, 0x72, 0x5c, 0x81, 0xe7, 0xe3, 0xa4, 0x02, 0xcb, 0x03, 0xc9,
0x2b, 0x48, 0xc9, 0x56, 0x40, 0x53, 0x2b, 0x6d, 0x49, 0xd0, 0xc9, 0x94, 0xb4, 0x20, 0x6d, 0x4a,
0x1a, 0x91, 0xdb, 0x22, 0xcd, 0x61, 0x2b, 0x32, 0xe8, 0xf9, 0x03, 0x13, 0x52, 0x58, 0xc1, 0xcb,
0x9e, 0xc9, 0x78, 0x09, 0xe9, 0x3b, 0x56, 0xa1, 0xa0, 0xda, 0x54, 0x4f, 0x67, 0x72, 0xf4, 0xd9,
0xc9, 0x0a, 0xae, 0x0d, 0xa0, 0x8f, 0x8d, 0x5d, 0xf5, 0x6e, 0xc8, 0xbf, 0x42, 0xd9, 0x02, 0x2a,
0xe8, 0x65, 0xaa, 0x54, 0x9a, 0x04, 0xa7, 0x60, 0x3f, 0x0c, 0xfc, 0x87, 0xaa, 0x56, 0xd8, 0x12,
0xc6, 0x9d, 0xc5, 0x74, 0xf2, 0x31, 0x98, 0x8a, 0x2d, 0x04, 0x33, 0x0d, 0x0e, 0x5e, 0x12, 0x1f,
0x6e, 0x12, 0x63, 0x77, 0xb8, 0x2d, 0x55, 0xbe, 0xdb, 0x57, 0x5c, 0xaf, 0x85, 0x1c, 0xf6, 0xdb,
0x24, 0x3e, 0x48, 0x93, 0xf8, 0x90, 0x9a, 0xbb, 0x1d, 0x27, 0x19, 0x97, 0x5b, 0x6e, 0x82, 0x8e,
0xc8, 0x53, 0x52, 0xa2, 0x2b, 0xe7, 0xe6, 0xd6, 0xcb, 0xc8, 0xd8, 0xb9, 0xfe, 0xcb, 0xbb, 0x3d,
0x68, 0xa1, 0xdf, 0x4c, 0x8b, 0xda, 0x8e, 0x3b, 0x5b, 0xae, 0x83, 0x2c, 0xcd, 0x55, 0xb6, 0xa9,
0x10, 0x5a, 0xb4, 0x06, 0x3b, 0x29, 0xc1, 0xfd, 0x7e, 0xd8, 0x7d, 0xca, 0xc3, 0x97, 0x8e, 0xe8,
0x28, 0x8b, 0x0e, 0x4c, 0x45, 0xbf, 0xdc, 0x5c, 0x34, 0x42, 0xe6, 0xaa, 0x89, 0x84, 0x94, 0xa0,
0x17, 0x9e, 0xb2, 0x2c, 0x2a, 0x40, 0xac, 0x0b, 0xfb, 0x9f, 0xeb, 0x3b, 0x2f, 0x1e, 0xb9, 0x68,
0x8d, 0x61, 0x25, 0xe4, 0x26, 0x25, 0x84, 0x55, 0x8b, 0xb4, 0xcf, 0xaa, 0x3b, 0x5c, 0xea, 0xd9,
0x14, 0xd7, 0xf2, 0x7e, 0x95, 0xf6, 0x47, 0x62, 0x15, 0x66, 0x0e, 0xc8, 0xad, 0xa3, 0xeb, 0xbb,
0xa5, 0x7b, 0x8f, 0xd1, 0x7e, 0x4f, 0xcf, 0xa5, 0x21, 0x19, 0xe4, 0x08, 0x67, 0xb5, 0x91, 0x99,
0x15, 0x4a, 0x06, 0xb9, 0xe6, 0xcd, 0x14, 0xf2, 0x5b, 0xa1, 0xb3, 0x12, 0x4c, 0x08, 0xcc, 0x32,
0xc1, 0x24, 0xd3, 0x4c, 0xd1, 0x3d, 0xda, 0x46, 0x2b, 0x51, 0x96, 0x73, 0xc7, 0x5a, 0xfa, 0x45,
0xaf, 0x97, 0xe1, 0xeb, 0xbd, 0x68, 0xd9, 0xeb, 0xbd, 0x74, 0x8b, 0x6e, 0xe9, 0x17, 0xe6, 0x74,
0x96, 0x80, 0xfc, 0xce, 0xb8, 0x2d, 0x42, 0xea, 0xcf, 0x5c, 0x67, 0x21, 0x5c, 0x20, 0xb4, 0x6e,
0x74, 0xed, 0x37, 0xc4, 0xc7, 0xec, 0x99, 0x80, 0x45, 0x57, 0x7e, 0xeb, 0xb3, 0xc1, 0xc5, 0xef,
0x68, 0x17, 0xcd, 0x3e, 0x1d, 0x2c, 0x5d, 0xb4, 0x90, 0xb6, 0x27, 0x74, 0x35, 0x17, 0xd2, 0x22,
0x3c, 0x13, 0xd2, 0xfd, 0x4a, 0xe9, 0x50, 0xa4, 0x57, 0x23, 0x91, 0x38, 0x1a, 0xa2, 0x12, 0xe4,
0xda, 0x16, 0x23, 0xd1, 0x4d, 0x2f, 0xe9, 0xbe, 0x04, 0x1b, 0x40, 0x1a, 0x8a, 0xde, 0x15, 0x8d,
0x2f, 0x47, 0x2f, 0x73, 0xfa, 0xb1, 0x5a, 0x30, 0x1f, 0x66, 0x55, 0x2a, 0x74, 0x02, 0x71, 0xb5,
0xa0, 0x9e, 0xcb, 0x07, 0xf1, 0x78, 0xdc, 0xbb, 0xef, 0x4e, 0x7f, 0x83, 0x47, 0x36, 0xb8, 0xbe,
0xa6, 0x6d, 0xfb, 0x0c, 0x63, 0x53, 0xe7, 0xdc, 0xc2, 0xb1, 0xc5, 0x42, 0xa0, 0x7b, 0x2c, 0x40,
0xe8, 0x8b, 0x01, 0xf4, 0x01, 0xf5, 0xb1, 0x14, 0xde, 0xf8, 0xf2, 0xd1, 0x17, 0xc4, 0xc7, 0xc2,
0xae, 0x0f, 0x8f, 0x45, 0xc7, 0x78, 0xa7, 0x0a, 0xc7, 0xd5, 0x1d, 0xf5, 0xf5, 0x3a, 0x03, 0xf4,
0xa4, 0xd7, 0x43, 0xe3, 0x0b, 0xc4, 0x16, 0x0f, 0x28, 0x3b, 0xcb, 0xfc, 0x19, 0x07, 0x96, 0xd1,
0x75, 0xe4, 0x6f, 0x46, 0x49, 0x87, 0xc2, 0xea, 0xdd, 0x1e, 0x8b, 0x4e, 0x1e, 0xd4, 0xf2, 0x2b,
0x64, 0x36, 0xf8, 0x55, 0x6b, 0xbe, 0xfb, 0xb0, 0x59, 0xad, 0x40, 0x3f, 0x92, 0x34, 0x4d, 0xad,
0x9a, 0x5b, 0x2d, 0xe4, 0x3a, 0xc2, 0x87, 0x57, 0x86, 0x10, 0x61, 0x12, 0x9c, 0x3e, 0x91, 0x25,
0xa1, 0x09, 0xfe, 0xc4, 0x18, 0x37, 0xde, 0x2a, 0x84, 0xad, 0x6b, 0x63, 0xaf, 0xe1, 0x1a, 0xe9,
0xe7, 0x9f, 0x5e, 0xa5, 0xf0, 0xd0, 0x7f, 0xa4, 0x1a, 0xec, 0x46, 0xcb, 0xd1, 0x4b, 0x06, 0xda,
0x36, 0xe3, 0x36, 0x2b, 0x1c, 0x0a, 0x7c, 0x9d, 0x46, 0x95, 0x10, 0x81, 0xd6, 0x98, 0x0b, 0x99,
0x01, 0x7c, 0x0b, 0x16, 0xf3, 0xc0, 0x1f, 0x87, 0x84, 0x39, 0x5d, 0x07, 0xb4, 0x31, 0x88, 0xa7,
0x8e, 0x8e, 0xcd, 0xdd, 0x98, 0x67, 0x07, 0x6d, 0x63, 0xde, 0xbc, 0x69, 0x4c, 0xa4, 0xf1, 0x51,
0xee, 0xe6, 0x16, 0xe3, 0x20, 0xf6, 0x05, 0x2c, 0xe7, 0x2a, 0xfb, 0x06, 0x36, 0xba, 0x9f, 0x4d,
0xfe, 0x78, 0x8f, 0xd7, 0x06, 0x24, 0x3e, 0xac, 0xfd, 0xdb, 0x72, 0xfb, 0x76, 0x68, 0xf5, 0x06,
0x5a, 0x42, 0x87, 0x21, 0x7a, 0x75, 0x89, 0x9c, 0xb4, 0xc3, 0x90, 0x14, 0xd6, 0xd6, 0x66, 0x88,
0xf9, 0x1f, 0x43, 0x95, 0x0a, 0x23, 0x21, 0x7b, 0x51, 0xad, 0x95, 0x55, 0x38, 0x52, 0xde, 0x93,
0xc6, 0x18, 0x32, 0xc4, 0x95, 0xd0, 0x2e, 0x19, 0xc6, 0x31, 0xe9, 0x9e, 0xde, 0xf1, 0x49, 0xb9,
0x50, 0xc6, 0x76, 0x49, 0xec, 0x74, 0x68, 0xa4, 0xa4, 0xaa, 0x41, 0xa6, 0x4f, 0x75, 0xc0, 0x66,
0xfc, 0x7f, 0x3c, 0x2d, 0x43, 0xf9, 0x52, 0x48, 0xae, 0x77, 0x9f, 0x77, 0x35, 0x8e, 0x31, 0xee,
0xb8, 0x5d, 0xfa, 0x8a, 0x10, 0x77, 0xc7, 0xf3, 0x7c, 0xe2, 0x88, 0x9e, 0x0a, 0x83, 0x13, 0x0d,
0x90, 0xae, 0x0a, 0x8c, 0xe1, 0x6b, 0x20, 0xec, 0xac, 0xb6, 0xb4, 0x83, 0x93, 0xea, 0x30, 0x67,
0x92, 0xf8, 0x30, 0xa4, 0x62, 0x3f, 0x92, 0xff, 0x01, 0x26, 0xf5, 0x85, 0x4c, 0xa8, 0x05, 0x00,
0x00
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x6d, 0x54, 0x6d, 0x73, 0xda, 0x46,
0x10, 0xfe, 0xce, 0xaf, 0x90, 0xaf, 0x69, 0xa2, 0x33, 0x42, 0xc2, 0xd8, 0x6e, 0x5d, 0xe0, 0xc8,
0x34, 0x0e, 0x33, 0xce, 0x8c, 0x13, 0x33, 0x83, 0x5b, 0xa6, 0xc3, 0x78, 0x26, 0x87, 0xb4, 0xa0,
0x6b, 0xa4, 0x3b, 0xe6, 0x6e, 0x41, 0xa6, 0x44, 0xff, 0xbd, 0x2b, 0x09, 0x13, 0xd2, 0x94, 0x0f,
0x2b, 0xee, 0x76, 0xf7, 0xd9, 0xbd, 0x67, 0x5f, 0x86, 0x67, 0xef, 0x1f, 0x6e, 0x1f, 0xff, 0x9a,
0x8c, 0xbd, 0x14, 0xf3, 0x6c, 0x34, 0x3c, 0x48, 0x90, 0xc9, 0x68, 0x98, 0x03, 0x4a, 0x4f, 0xcb,
0x1c, 0x04, 0xdb, 0x2a, 0x28, 0xd6, 0xc6, 0x22, 0xf3, 0x5a, 0xb1, 0xd1, 0x08, 0x1a, 0x05, 0x2b,
0x54, 0x82, 0xa9, 0x48, 0x60, 0xab, 0x62, 0xe8, 0xd4, 0x87, 0x40, 0x69, 0x85, 0x4a, 0x66, 0x1d,
0x17, 0xcb, 0x0c, 0xc4, 0x45, 0x90, 0xd3, 0x45, 0xbe, 0xc9, 0x5f, 0xce, 0xec, 0x80, 0xd9, 0x8a,
0x53, 0x69, 0x1d, 0x10, 0xc6, 0x06, 0x97, 0x9d, 0x1b, 0xf6, 0x5d, 0x28, 0x4c, 0x21, 0x87, 0x4e,
0x6c, 0x32, 0x63, 0x99, 0x77, 0x0c, 0xf6, 0x53, 0xaf, 0xfe, 0x91, 0x29, 0x2a, 0xcc, 0x60, 0xd4,
0x9a, 0xdd, 0x8f, 0xdf, 0x7b, 0xf7, 0x6a, 0x0b, 0xde, 0xc4, 0x42, 0x95, 0xde, 0x30, 0x6a, 0x34,
0x43, 0x87, 0x3b, 0xfa, 0x2c, 0x4c, 0xb2, 0xdb, 0xe7, 0xd2, 0xae, 0x94, 0xee, 0x77, 0xcb, 0x61,
0xd4, 0xdc, 0x0e, 0xa3, 0xe6, 0x69, 0x95, 0x76, 0x34, 0x8c, 0xa5, 0xde, 0x4a, 0xe7, 0xb5, 0x54,
0x22, 0x58, 0x46, 0x50, 0x15, 0xcc, 0x6d, 0x7d, 0xc7, 0x46, 0x15, 0xf4, 0x9f, 0x35, 0x6c, 0x63,
0x45, 0xb8, 0xb1, 0x55, 0x6b, 0x1c, 0xb5, 0xb6, 0xd2, 0x7a, 0xb1, 0x48, 0x4c, 0xbc, 0xc9, 0x29,
0xb5, 0x70, 0x05, 0x38, 0xce, 0xa0, 0xfa, 0xfb, 0x6e, 0xf7, 0x21, 0xf1, 0xff, 0x0b, 0xc4, 0x83,
0x0c, 0x12, 0x27, 0x18, 0x0b, 0xf2, 0x99, 0xe8, 0x06, 0xf9, 0x1d, 0x89, 0xf5, 0xe4, 0x9e, 0x64,
0xf6, 0xb0, 0x24, 0x89, 0xa9, 0x35, 0x48, 0x79, 0x27, 0xe2, 0xec, 0x62, 0xb0, 0xdc, 0xe8, 0x18,
0x95, 0xd1, 0x1e, 0x91, 0xd3, 0xf8, 0xfb, 0x7c, 0x1f, 0x87, 0x0d, 0xd3, 0xe1, 0x6f, 0x37, 0xe7,
0x85, 0xd2, 0x89, 0x29, 0x42, 0xa5, 0x35, 0xd8, 0x59, 0x4d, 0x79, 0x1c, 0xa6, 0xa0, 0x56, 0x29,
0xfe, 0xa0, 0xbe, 0xab, 0xaf, 0x4b, 0xb5, 0xf4, 0x4f, 0xc0, 0xc8, 0x9c, 0xf2, 0xbd, 0xad, 0x58,
0x7d, 0x46, 0xbe, 0xaf, 0x9e, 0x52, 0xb8, 0x20, 0xc6, 0x67, 0x71, 0xaa, 0xf0, 0x59, 0x2f, 0x61,
0xfc, 0x5b, 0x36, 0x89, 0x95, 0xc5, 0xad, 0xb2, 0x71, 0x06, 0x3e, 0x06, 0x10, 0xd8, 0x40, 0x05,
0x3a, 0x30, 0x94, 0x19, 0x3e, 0x87, 0x4b, 0x95, 0x65, 0xd3, 0x8a, 0x5b, 0xf1, 0xd9, 0xae, 0x16,
0xfe, 0xab, 0xbd, 0x2d, 0x83, 0x57, 0x7b, 0x55, 0x09, 0x5d, 0xf2, 0xcf, 0x15, 0x76, 0xb8, 0x00,
0xaa, 0xc2, 0x44, 0x62, 0x5a, 0x25, 0x40, 0x67, 0x69, 0x63, 0x1f, 0xcf, 0x89, 0x85, 0x76, 0x78,
0x5d, 0x7f, 0x88, 0x8a, 0x00, 0x4e, 0x2e, 0x82, 0xf0, 0xaa, 0xfe, 0x74, 0x83, 0xde, 0xf9, 0x47,
0xf2, 0x0b, 0x27, 0x1f, 0x1a, 0xcf, 0x2a, 0x9a, 0xcf, 0x4b, 0xb4, 0xbb, 0x7d, 0xe1, 0x04, 0x9a,
0x75, 0x78, 0x78, 0x72, 0xe1, 0xca, 0x58, 0x62, 0x9c, 0xfa, 0xf4, 0xaa, 0xb2, 0x70, 0xaf, 0x5f,
0x17, 0x2e, 0xb4, 0x54, 0xea, 0xdd, 0x14, 0x25, 0x82, 0x10, 0x62, 0x06, 0x8b, 0xa9, 0x89, 0xbf,
0x00, 0x86, 0x0f, 0x93, 0xf1, 0xa7, 0xb7, 0xa4, 0x76, 0xa0, 0xa9, 0x5c, 0xfb, 0x37, 0xd9, 0xf6,
0x4d, 0x1f, 0xed, 0x06, 0x4a, 0xc6, 0xfb, 0x3e, 0xa1, 0x6a, 0x28, 0xbc, 0xa3, 0xb5, 0xef, 0xb3,
0x14, 0x71, 0xed, 0xfa, 0x4c, 0x88, 0x43, 0xa8, 0xcc, 0x50, 0x24, 0xa2, 0x25, 0x5c, 0x53, 0xe5,
0x0c, 0x35, 0xea, 0x5b, 0x56, 0x38, 0xc7, 0xfa, 0x24, 0x19, 0x6f, 0xb3, 0x7e, 0x14, 0xb1, 0xf6,
0xb1, 0x3b, 0x8e, 0xc6, 0xa9, 0x71, 0xd8, 0x66, 0x51, 0x65, 0xc3, 0x43, 0xa3, 0xcd, 0x1a, 0xb4,
0xf0, 0xb9, 0x18, 0xed, 0xff, 0x3f, 0x93, 0x32, 0xa0, 0xfb, 0x85, 0xd2, 0xd2, 0xee, 0x1e, 0x77,
0x6b, 0x1a, 0x0b, 0x69, 0xad, 0xdc, 0x2d, 0x36, 0xcb, 0x25, 0x58, 0x56, 0xe9, 0x64, 0x92, 0x8c,
0xb7, 0x14, 0xe1, 0x5e, 0x39, 0x9a, 0x10, 0xb0, 0x3e, 0xcb, 0xc1, 0x39, 0xb9, 0x02, 0x16, 0x20,
0xa1, 0x56, 0x0c, 0x51, 0xe9, 0xd9, 0xdc, 0x2c, 0xfe, 0x86, 0x18, 0xbd, 0xdf, 0x2b, 0xf7, 0x77,
0xb5, 0xfb, 0x13, 0x3d, 0x85, 0xa8, 0x9b, 0xa2, 0x55, 0x7a, 0x15, 0xd2, 0x64, 0x66, 0x3e, 0x86,
0x89, 0x44, 0xc9, 0xf9, 0x3e, 0x03, 0xf4, 0xb0, 0x66, 0xe0, 0x0f, 0xa5, 0xf1, 0xa6, 0xf6, 0xf2,
0xa1, 0x8a, 0xd3, 0x58, 0x0c, 0x08, 0xf3, 0xd7, 0x5f, 0xce, 0x04, 0xce, 0xbb, 0x4f, 0xdc, 0x02,
0x6e, 0xac, 0x1e, 0x2c, 0x8d, 0xf5, 0xa9, 0xb7, 0x71, 0xde, 0x7b, 0xaa, 0xda, 0x1b, 0xe7, 0x97,
0x4f, 0x75, 0x87, 0xd7, 0x85, 0xa3, 0x0d, 0xe0, 0x1f, 0x1a, 0x38, 0xca, 0x67, 0xc7, 0x6e, 0x8d,
0xf2, 0x3b, 0x5e, 0x0f, 0x40, 0x6d, 0xb4, 0xcc, 0x0c, 0x61, 0xbc, 0xd8, 0x75, 0xc8, 0xf9, 0x3c,
0x9f, 0xf1, 0xa8, 0xc7, 0x03, 0x25, 0xae, 0x06, 0x6a, 0x48, 0x34, 0x82, 0x5e, 0x61, 0x3a, 0x50,
0x6d, 0x71, 0xd9, 0x24, 0x09, 0xc2, 0x57, 0x9d, 0x2b, 0x1e, 0x5d, 0x0e, 0x4e, 0x9a, 0x13, 0x7e,
0xa6, 0x10, 0x27, 0x88, 0x40, 0x21, 0x79, 0x80, 0x73, 0xf5, 0x54, 0x89, 0xf6, 0x45, 0xf3, 0xa1,
0x34, 0x7b, 0xd7, 0xd7, 0xbc, 0x2c, 0xbf, 0x75, 0x0c, 0xad, 0x19, 0x67, 0x32, 0x08, 0xc1, 0x5a,
0x72, 0x63, 0x13, 0x80, 0x2f, 0xde, 0x6c, 0xea, 0xd5, 0xc7, 0x3e, 0x11, 0x4a, 0xc6, 0xbc, 0x3c,
0x94, 0xff, 0x47, 0xe2, 0x2d, 0x38, 0xf5, 0xcf, 0x0b, 0xef, 0x2f, 0xe3, 0xfc, 0xf5, 0xeb, 0x77,
0x73, 0x77, 0x32, 0xe6, 0xdd, 0x80, 0x14, 0x8f, 0x2a, 0x07, 0xb3, 0xa1, 0xf6, 0xe2, 0xa7, 0x4e,
0xb4, 0x03, 0x4a, 0x4a, 0xae, 0xcb, 0x79, 0xc9, 0x5b, 0xb4, 0xb3, 0x9a, 0x8d, 0x33, 0x8c, 0x9a,
0x75, 0x15, 0xd5, 0xcb, 0xf9, 0x5f, 0x15, 0xdf, 0xc4, 0xda, 0xb2, 0x05, 0x00, 0x00
};

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208011
#define VERSION 2208031
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG

View File

@ -103,6 +103,7 @@ void initServer()
request->send(response);
//request->send_P(200, "text/html", PAGE_liveviewws);
});
#ifndef WLED_DISABLE_2D
server.on("/liveview2D", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_liveviewws2D, PAGE_liveviewws2D_length);
@ -111,6 +112,7 @@ void initServer()
request->send(response);
//request->send_P(200, "text/html", PAGE_liveviewws);
});
#endif
#else
server.on("/liveview", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;

View File

@ -138,7 +138,11 @@ void sendDataWs(AsyncWebSocketClient * client)
releaseJSONBufferLock();
}
#define MAX_LIVE_LEDS_WS 1024
#ifndef WLED_DISABLE_2D
#define MAX_LIVE_LEDS_WS 1024
#else
#define MAX_LIVE_LEDS_WS 256
#endif
bool sendLiveLedsWs(uint32_t wsClient)
{
@ -153,10 +157,14 @@ bool sendLiveLedsWs(uint32_t wsClient)
uint8_t* buffer = wsBuf->get();
buffer[0] = 'L';
buffer[1] = 1; //version
#ifndef WLED_DISABLE_2D
buffer[2] = strip.matrixWidth;
buffer[3] = strip.matrixHeight;
uint16_t pos = 4;
#else
uint16_t pos = 2;
#endif
for (uint16_t i= 0; pos < bufSize -2; i += n)
{
uint32_t c = strip.getPixelColor(i);