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 474 of file scale8.h.

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

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: