Scale a 16-bit unsigned value by an 8-bit value, which is treated as the numerator of a fraction whose denominator is 256.
478 {
480 return 0;
481
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
496 " mul %A[i], %[scale] \n\t"
497 " add r0, %A[i] \n\t"
498
499
500 " adc %A[result], r1 \n\t"
501
502
503 " mul %B[i], %[scale] \n\t"
504 " add %A[result], r0 \n\t"
505 " adc %B[result], r1 \n\t"
506
507
508 " clr __zero_reg__ \n\t"
509
510
511 " add %A[result], %B[i] \n\t"
512 " adc %B[result], __zero_reg__ \n\t"
513
514 : [result] "+r"(result)
516 : "r0", "r1");
517 return result;
518#else
519 uint16_t result = 0;
520 asm volatile(
521
522 " mul %A[i], %[scale] \n\t"
523 " mov %A[result], r1 \n\t"
524
525
526
527 " mul %B[i], %[scale] \n\t"
528 " add %A[result], r0 \n\t"
529 " adc %B[result], r1 \n\t"
530
531
532 " clr __zero_reg__ \n\t"
533
534 : [result] "+r"(result)
536 : "r0", "r1");
537 return result;
538#endif
539#else
540#error "No implementation for scale16by8 available."
541#endif
542}