Scale a 16-bit unsigned value by an 8-bit value, which is treated as the numerator of a fraction whose denominator is 256.
474 {
476 return 0;
477
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
492 " mul %A[i], %[scale] \n\t"
493 " add r0, %A[i] \n\t"
494
495
496 " adc %A[result], r1 \n\t"
497
498
499 " mul %B[i], %[scale] \n\t"
500 " add %A[result], r0 \n\t"
501 " adc %B[result], r1 \n\t"
502
503
504 " clr __zero_reg__ \n\t"
505
506
507 " add %A[result], %B[i] \n\t"
508 " adc %B[result], __zero_reg__ \n\t"
509
510 : [result] "+r"(result)
512 : "r0", "r1");
513 return result;
514#else
515 uint16_t result = 0;
516 asm volatile(
517
518 " mul %A[i], %[scale] \n\t"
519 " mov %A[result], r1 \n\t"
520
521
522
523 " mul %B[i], %[scale] \n\t"
524 " add %A[result], r0 \n\t"
525 " adc %B[result], r1 \n\t"
526
527
528 " clr __zero_reg__ \n\t"
529
530 : [result] "+r"(result)
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)