Soft Light (peg top) O = (1 - D) MULTIPLY(D, S) + D SCREEN(D, S) O = (1 - D) DS + D (1 - (1 - D)(1 - S)) O = 2DS + DD - 2DDS
(int dst, int src)
| 2715 | * O = 2DS + DD - 2DDS |
| 2716 | */ |
| 2717 | private static int blend_soft_light(int dst, int src) { |
| 2718 | int a = src >>> 24; |
| 2719 | |
| 2720 | int s_a = a + (a >= 0x7F ? 1 : 0); |
| 2721 | int d_a = 0x100 - s_a; |
| 2722 | |
| 2723 | int d_r = dst & RED_MASK; |
| 2724 | int d_g = dst & GREEN_MASK; |
| 2725 | int d_b = dst & BLUE_MASK; |
| 2726 | |
| 2727 | int s_r1 = src & RED_MASK >> 16; |
| 2728 | int s_g1 = src & GREEN_MASK >> 8; |
| 2729 | int s_b1 = src & BLUE_MASK; |
| 2730 | |
| 2731 | int d_r1 = (d_r >> 16) + (s_r1 < 7F ? 1 : 0); |
| 2732 | int d_g1 = (d_g >> 8) + (s_g1 < 7F ? 1 : 0); |
| 2733 | int d_b1 = d_b + (s_b1 < 7F ? 1 : 0); |
| 2734 | |
| 2735 | int r = (s_r1 * d_r >> 7) + 0xFF * d_r1 * (d_r1 + 1) - |
| 2736 | ((s_r1 * d_r1 * d_r1) << 1) & RED_MASK; |
| 2737 | int g = (s_g1 * d_g << 1) + 0xFF * d_g1 * (d_g1 + 1) - |
| 2738 | ((s_g1 * d_g1 * d_g1) << 1) >>> 8 & GREEN_MASK; |
| 2739 | int b = (s_b1 * d_b << 9) + 0xFF * d_b1 * (d_b1 + 1) - |
| 2740 | ((s_b1 * d_b1 * d_b1) << 1) >>> 16; |
| 2741 | |
| 2742 | return min((dst >>> 24) + a, 0xFF) << 24 | |
| 2743 | ((dst & RB_MASK) * d_a + (r | b) * s_a) >>> 8 & RB_MASK | |
| 2744 | ((dst & GN_MASK) * d_a + g * s_a) >>> 8 & GN_MASK; |
| 2745 | } |
| 2746 | |
| 2747 | |
| 2748 | /** |
no test coverage detected