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

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

References LIB8STATIC_ALWAYS_INLINE, and scale.

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

+ Here is the caller graph for this function: