FastLED 3.9.15
Loading...
Searching...
No Matches

◆ scale16by8()

LIB8STATIC_ALWAYS_INLINE uint16_t scale16by8 ( uint16_t i,
fract8 scale )

Scale a 16-bit unsigned value by an 8-bit value, which is treated as the numerator of a fraction whose denominator is 256.

In other words, it computes i * (scale / 256)

Parameters
iinput value to scale
scalescale factor, in n/256 units
Returns
scaled value

Definition at line 468 of file scale8.h.

468 {
469 if (scale == 0) {
470 return 0; // Fixes non zero output when scale == 0 and
471 // FASTLED_SCALE8_FIXED==1
472 }
473#if SCALE16BY8_C == 1
474 uint16_t result;
475#if FASTLED_SCALE8_FIXED == 1
476 result = (((uint32_t)(i) * (1 + ((uint32_t)scale))) >> 8);
477#else
478 result = (i * scale) / 256;
479#endif
480 return result;
481#elif SCALE16BY8_AVRASM == 1
482#if FASTLED_SCALE8_FIXED == 1
483 uint16_t result = 0;
484 asm volatile(
485 // result.A = HighByte( (i.A x scale) + i.A )
486 " mul %A[i], %[scale] \n\t"
487 " add r0, %A[i] \n\t"
488 // " adc r1, [zero] \n\t"
489 // " mov %A[result], r1 \n\t"
490 " adc %A[result], r1 \n\t"
491
492 // result.A-B += i.B x scale
493 " mul %B[i], %[scale] \n\t"
494 " add %A[result], r0 \n\t"
495 " adc %B[result], r1 \n\t"
496
497 // cleanup r1
498 " clr __zero_reg__ \n\t"
499
500 // result.A-B += i.B
501 " add %A[result], %B[i] \n\t"
502 " adc %B[result], __zero_reg__ \n\t"
503
504 : [result] "+r"(result)
505 : [i] "r"(i), [scale] "r"(scale)
506 : "r0", "r1");
507 return result;
508#else
509 uint16_t result = 0;
510 asm volatile(
511 // result.A = HighByte(i.A x j )
512 " mul %A[i], %[scale] \n\t"
513 " mov %A[result], r1 \n\t"
514 //" clr %B[result] \n\t"
515
516 // result.A-B += i.B x j
517 " mul %B[i], %[scale] \n\t"
518 " add %A[result], r0 \n\t"
519 " adc %B[result], r1 \n\t"
520
521 // cleanup r1
522 " clr __zero_reg__ \n\t"
523
524 : [result] "+r"(result)
525 : [i] "r"(i), [scale] "r"(scale)
526 : "r0", "r1");
527 return result;
528#endif
529#else
530#error "No implementation for scale16by8 available."
531#endif
532}
UISlider scale("Scale", 4,.1, 4,.1)

References LIB8STATIC_ALWAYS_INLINE, and scale.

Referenced by fl::__builtin_five_bit_hd_gamma_bitshift(), fl::five_bit_bitshift(), fl::five_bit_hd_gamma_function(), lerp15by8(), lerp16by8(), and PixelController< RGB_ORDER, LANES, MASK >::loadAndScale_WS2816_HD().

+ Here is the caller graph for this function: