@@ -1428,6 +1428,8 @@ void WS2812FX::service() {
14281428 unsigned h = seg.virtualHeight ();
14291429 unsigned dw = p * w / 0xFFFFU + 1 ;
14301430 unsigned dh = p * h / 0xFFFFU + 1 ;
1431+ unsigned orgBS = blendingStyle;
1432+ if (w*h == 1 ) blendingStyle = BLEND_STYLE_FADE; // disable belending for single pixel segments (use fade instead)
14311433 switch (blendingStyle) {
14321434 case BLEND_STYLE_FAIRY_DUST: // fairy dust (must set entire segment, see isPixelXYClipped())
14331435 Segment::setClippingRect (0 , w, 0 , h);
@@ -1473,9 +1475,8 @@ void WS2812FX::service() {
14731475 Segment::setClippingRect (0 , dw, h - dh, h);
14741476 break ;
14751477 }
1476- }
1477- delay = (*_mode[seg.currentMode ()])(); // run new/current mode
1478- if (seg.isInTransition ()) {
1478+ delay = (*_mode[seg.currentMode ()])(); // run new/current mode
1479+ // now run old/previous mode
14791480 Segment::tmpsegd_t _tmpSegData;
14801481 Segment::modeBlend (true ); // set semaphore
14811482 seg.swapSegenv (_tmpSegData); // temporarily store new mode state (and swap it with transitional state)
@@ -1491,10 +1492,10 @@ void WS2812FX::service() {
14911492 seg.restoreSegenv (_tmpSegData); // restore mode state (will also update transitional state)
14921493 delay = MIN (delay,d2); // use shortest delay
14931494 Segment::modeBlend (false ); // unset semaphore
1494- }
1495- #else
1496- delay = (*_mode[seg.mode ])(); // run effect mode
1495+ blendingStyle = orgBS; // restore blending style if it was modified for single pixel segment
1496+ } else
14971497#endif
1498+ delay = (*_mode[seg.mode ])(); // run effect mode (not in transition)
14981499 seg.call ++;
14991500 if (seg.isInTransition () && delay > FRAMETIME) delay = FRAMETIME; // force faster updates during transition
15001501 BusManager::setSegmentCCT (oldCCT); // restore old CCT for ABL adjustments
0 commit comments