MCPcopy Create free account
hub / github.com/KhronosGroup/KTX-Software / encode_bc4

Function encode_bc4

external/basisu/transcoder/basisu_transcoder.cpp:14592–14710  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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).

Callers 3

transcode_uastc_to_bc3Function · 0.85
transcode_uastc_to_bc4Function · 0.85
transcode_uastc_to_bc5Function · 0.85

Calls 2

minimumFunction · 0.70
maximumFunction · 0.70

Tested by

no test coverage detected