| 14590 | const uint8_t* s_uastc_to_bc1_weights[6] = { nullptr, s_uastc1_to_bc1, s_uastc2_to_bc1, s_uastc3_to_bc1, s_uastc4_to_bc1, s_uastc5_to_bc1 }; |
| 14591 | |
| 14592 | void encode_bc4(void* pDst, const uint8_t* pPixels, uint32_t stride) |
| 14593 | { |
| 14594 | uint32_t min0_v, max0_v, min1_v, max1_v,min2_v, max2_v, min3_v, max3_v; |
| 14595 | |
| 14596 | { |
| 14597 | min0_v = max0_v = pPixels[0 * stride]; |
| 14598 | min1_v = max1_v = pPixels[1 * stride]; |
| 14599 | min2_v = max2_v = pPixels[2 * stride]; |
| 14600 | min3_v = max3_v = pPixels[3 * stride]; |
| 14601 | } |
| 14602 | |
| 14603 | { |
| 14604 | uint32_t v0 = pPixels[4 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); |
| 14605 | uint32_t v1 = pPixels[5 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); |
| 14606 | uint32_t v2 = pPixels[6 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); |
| 14607 | uint32_t v3 = pPixels[7 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); |
| 14608 | } |
| 14609 | |
| 14610 | { |
| 14611 | uint32_t v0 = pPixels[8 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); |
| 14612 | uint32_t v1 = pPixels[9 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); |
| 14613 | uint32_t v2 = pPixels[10 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); |
| 14614 | uint32_t v3 = pPixels[11 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); |
| 14615 | } |
| 14616 | |
| 14617 | { |
| 14618 | uint32_t v0 = pPixels[12 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); |
| 14619 | uint32_t v1 = pPixels[13 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); |
| 14620 | uint32_t v2 = pPixels[14 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); |
| 14621 | uint32_t v3 = pPixels[15 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); |
| 14622 | } |
| 14623 | |
| 14624 | const uint32_t min_v = basisu::minimum(min0_v, min1_v, min2_v, min3_v); |
| 14625 | const uint32_t max_v = basisu::maximum(max0_v, max1_v, max2_v, max3_v); |
| 14626 | |
| 14627 | uint8_t* pDst_bytes = static_cast<uint8_t*>(pDst); |
| 14628 | pDst_bytes[0] = (uint8_t)max_v; |
| 14629 | pDst_bytes[1] = (uint8_t)min_v; |
| 14630 | |
| 14631 | if (max_v == min_v) |
| 14632 | { |
| 14633 | memset(pDst_bytes + 2, 0, 6); |
| 14634 | return; |
| 14635 | } |
| 14636 | |
| 14637 | const uint32_t delta = max_v - min_v; |
| 14638 | |
| 14639 | // min_v is now 0. Compute thresholds between values by scaling max_v. It's x14 because we're adding two x7 scale factors. |
| 14640 | const int t0 = delta * 13; |
| 14641 | const int t1 = delta * 11; |
| 14642 | const int t2 = delta * 9; |
| 14643 | const int t3 = delta * 7; |
| 14644 | const int t4 = delta * 5; |
| 14645 | const int t5 = delta * 3; |
| 14646 | const int t6 = delta * 1; |
| 14647 | |
| 14648 | // BC4 floors in its divisions, which we compensate for with the 4 bias. |
| 14649 | // This function is optimal for all possible inputs (i.e. it outputs the same results as checking all 8 values and choosing the closest one). |
no test coverage detected