24 using namespace DirectX::PackedVector;
42 pColor->r = (float) ((w565 >> 11) & 31) * (1.0f / 31.0f);
43 pColor->g = (float) ((w565 >> 5) & 63) * (1.0f / 63.0f);
44 pColor->b = (float) ((w565 >> 0) & 31) * (1.0f / 31.0f);
52 Color.
r = (pColor->r < 0.0f) ? 0.0f : (pColor->r > 1.0f) ? 1.0f : pColor->r;
53 Color.
g = (pColor->g < 0.0f) ? 0.0f : (pColor->g > 1.0f) ? 1.0f : pColor->g;
54 Color.
b = (pColor->b < 0.0f) ? 0.0f : (pColor->b > 1.0f) ? 1.0f : pColor->b;
58 w = (uint16_t) ((static_cast<int32_t>(Color.
r * 31.0f + 0.5f) << 11) |
59 (static_cast<int32_t>(Color.
g * 63.0f + 0.5f) << 5) |
60 (static_cast<int32_t>(Color.
b * 31.0f + 0.5f) << 0));
70 static const float fEpsilon = (0.25f / 64.0f) * (0.25f / 64.0f);
71 static const float pC3[] = { 2.0f/2.0f, 1.0f/2.0f, 0.0f/2.0f };
72 static const float pD3[] = { 0.0f/2.0f, 1.0f/2.0f, 2.0f/2.0f };
73 static const float pC4[] = { 3.0f/3.0f, 2.0f/3.0f, 1.0f/3.0f, 0.0f/3.0f };
74 static const float pD4[] = { 0.0f/3.0f, 1.0f/3.0f, 2.0f/3.0f, 3.0f/3.0f };
76 const float *pC = (3 == cSteps) ? pC3 : pC4;
77 const float *pD = (3 == cSteps) ? pD3 : pD4;
86 if(pPoints[iPoint].
a > 0.0f)
87 #endif // COLOR_WEIGHTS
89 if(pPoints[iPoint].r < X.
r)
90 X.
r = pPoints[iPoint].r;
92 if(pPoints[iPoint].g < X.
g)
93 X.
g = pPoints[iPoint].g;
95 if(pPoints[iPoint].
b < X.
b)
96 X.
b = pPoints[iPoint].b;
98 if(pPoints[iPoint].r > Y.
r)
99 Y.
r = pPoints[iPoint].r;
101 if(pPoints[iPoint].g > Y.
g)
102 Y.
g = pPoints[iPoint].g;
104 if(pPoints[iPoint].
b > Y.
b)
105 Y.
b = pPoints[iPoint].b;
116 float fAB = AB.
r * AB.
r + AB.
g * AB.
g + AB.
b * AB.
b;
121 pX->r = X.
r; pX->g = X.
g; pX->b = X.
b;
122 pY->r = Y.
r; pY->g = Y.
g; pY->b = Y.
b;
127 float fABInv = 1.0f / fAB;
130 Dir.
r = AB.
r * fABInv;
131 Dir.
g = AB.
g * fABInv;
132 Dir.
b = AB.
b * fABInv;
135 Mid.
r = (X.
r + Y.
r) * 0.5f;
136 Mid.
g = (X.
g + Y.
g) * 0.5f;
137 Mid.
b = (X.
b + Y.
b) * 0.5f;
140 fDir[0] = fDir[1] = fDir[2] = fDir[3] = 0.0f;
146 Pt.
r = (pPoints[iPoint].r - Mid.
r) * Dir.
r;
147 Pt.
g = (pPoints[iPoint].g - Mid.
g) * Dir.
g;
148 Pt.
b = (pPoints[iPoint].b - Mid.
b) * Dir.
b;
153 f = Pt.
r + Pt.
g + Pt.
b;
154 fDir[0] += pPoints[iPoint].a * f * f;
156 f = Pt.
r + Pt.
g - Pt.
b;
157 fDir[1] += pPoints[iPoint].a * f * f;
159 f = Pt.
r - Pt.
g + Pt.
b;
160 fDir[2] += pPoints[iPoint].a * f * f;
162 f = Pt.
r - Pt.
g - Pt.
b;
163 fDir[3] += pPoints[iPoint].a * f * f;
165 f = Pt.
r + Pt.
g + Pt.
b;
168 f = Pt.
r + Pt.
g - Pt.
b;
171 f = Pt.
r - Pt.
g + Pt.
b;
174 f = Pt.
r - Pt.
g - Pt.
b;
179 float fDirMax = fDir[0];
182 for(
size_t iDir = 1; iDir < 4; iDir++)
184 if(fDir[iDir] > fDirMax)
186 fDirMax = fDir[iDir];
193 float f = X.
g; X.
g = Y.
g; Y.
g = f;
198 float f = X.
b; X.
b = Y.
b; Y.
b = f;
203 if(fAB < 1.0f / 4096.0f)
205 pX->r = X.
r; pX->g = X.
g; pX->b = X.
b;
206 pY->r = Y.
r; pY->g = Y.
g; pY->b = Y.
b;
212 float fSteps = (float) (cSteps - 1);
214 for(
size_t iIteration = 0; iIteration < 8; iIteration++)
219 for(
size_t iStep = 0; iStep < cSteps; iStep++)
221 pSteps[iStep].
r = X.
r * pC[iStep] + Y.
r * pD[iStep];
222 pSteps[iStep].
g = X.
g * pC[iStep] + Y.
g * pD[iStep];
223 pSteps[iStep].
b = X.
b * pC[iStep] + Y.
b * pD[iStep];
232 float fLen = (Dir.
r * Dir.
r + Dir.
g * Dir.
g + Dir.
b * Dir.
b);
234 if(fLen < (1.0f / 4096.0f))
237 float fScale = fSteps / fLen;
247 d2X = d2Y = dX.
r = dX.
g = dX.
b = dY.
r = dY.
g = dY.
b = 0.0f;
251 float fDot = (pPoints[iPoint].r - X.
r) * Dir.
r +
252 (pPoints[iPoint].g - X.
g) * Dir.
g +
253 (pPoints[iPoint].b - X.
b) * Dir.
b;
259 else if(fDot >= fSteps)
262 iStep =
static_cast<size_t>(fDot + 0.5f);
266 Diff.
r = pSteps[iStep].
r - pPoints[iPoint].r;
267 Diff.
g = pSteps[iStep].
g - pPoints[iPoint].g;
268 Diff.
b = pSteps[iStep].
b - pPoints[iPoint].b;
271 float fC = pC[iStep] * pPoints[iPoint].a * (1.0f / 8.0f);
272 float fD = pD[iStep] * pPoints[iPoint].a * (1.0f / 8.0f);
274 float fC = pC[iStep] * (1.0f / 8.0f);
275 float fD = pD[iStep] * (1.0f / 8.0f);
276 #endif // COLOR_WEIGHTS
278 d2X += fC * pC[iStep];
283 d2Y += fD * pD[iStep];
293 float f = -1.0f / d2X;
302 float f = -1.0f / d2Y;
309 if((dX.
r * dX.
r < fEpsilon) && (dX.
g * dX.
g <
fEpsilon) && (dX.
b * dX.
b < fEpsilon) &&
316 pX->r = X.
r; pX->g = X.
g; pX->b = X.
b;
317 pY->r = Y.
r; pY->g = Y.
g; pY->b = Y.
b;
325 static_assert(
sizeof(
D3DX_BC1) == 8,
"D3DX_BC1 should be 8 bytes" );
327 static XMVECTORF32 s_Scale = { 1.f/31.f, 1.f/63.f, 1.f/31.f, 1.f };
329 XMVECTOR clr0 = XMLoadU565( reinterpret_cast<const XMU565*>(&pBC->rgb[0]) );
330 XMVECTOR clr1 = XMLoadU565( reinterpret_cast<const XMU565*>(&pBC->rgb[1]) );
332 clr0 = XMVectorMultiply( clr0, s_Scale );
333 clr1 = XMVectorMultiply( clr1, s_Scale );
335 clr0 = XMVectorSwizzle<2, 1, 0, 3>( clr0 );
336 clr1 = XMVectorSwizzle<2, 1, 0, 3>( clr1 );
338 clr0 = XMVectorSelect( g_XMIdentityR3, clr0, g_XMSelect1110 );
339 clr1 = XMVectorSelect( g_XMIdentityR3, clr1, g_XMSelect1110 );
342 if ( isbc1 && (pBC->rgb[0] <= pBC->rgb[1]) )
344 clr2 = XMVectorLerp( clr0, clr1, 0.5f );
345 clr3 = XMVectorZero();
349 clr2 = XMVectorLerp( clr0, clr1, 1.f/3.f );
350 clr3 = XMVectorLerp( clr0, clr1, 2.f/3.f );
353 uint32_t dw = pBC->bitmap;
355 for(
size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i, dw >>= 2)
359 case 0: pColor[i] = clr0;
break;
360 case 1: pColor[i] = clr1;
break;
361 case 2: pColor[i] = clr2;
break;
364 default: pColor[i] = clr3;
break;
373 _In_
bool bColorKey, _In_
float alphaRef, _In_ DWORD
flags)
376 static_assert(
sizeof(
D3DX_BC1) == 8,
"D3DX_BC1 should be 8 bytes" );
383 size_t uColorKey = 0;
387 if(pColor[i].
a < alphaRef)
391 if(NUM_PIXELS_PER_BLOCK == uColorKey)
393 pBC->rgb[0] = 0x0000;
394 pBC->rgb[1] = 0xffff;
395 pBC->bitmap = 0xffffffff;
399 uSteps = (uColorKey > 0) ? 3 : 4;
423 if (flags & BC_FLAGS_DITHER_RGB)
430 Color[i].
r = (float) static_cast<int32_t>(Clr.
r * 31.0f + 0.5f) * (1.0f / 31.0f);
431 Color[i].
g = (float) static_cast<int32_t>(Clr.
g * 63.0f + 0.5f) * (1.0f / 63.0f);
432 Color[i].
b = (float) static_cast<int32_t>(Clr.
b * 31.0f + 0.5f) * (1.0f / 31.0f);
435 Color[i].
a = pColor[i].a;
438 #endif // COLOR_WEIGHTS
440 if (flags & BC_FLAGS_DITHER_RGB)
443 Diff.
r = Color[i].
a * (Clr.
r - Color[i].
r);
444 Diff.
g = Color[i].
a * (Clr.
g - Color[i].
g);
445 Diff.
b = Color[i].
a * (Clr.
b - Color[i].
b);
450 _Analysis_assume_( i < 15 );
451 Error[i + 1].
r += Diff.
r * (7.0f / 16.0f);
452 Error[i + 1].
g += Diff.
g * (7.0f / 16.0f);
453 Error[i + 1].
b += Diff.
b * (7.0f / 16.0f);
460 Error[i + 3].
r += Diff.
r * (3.0f / 16.0f);
461 Error[i + 3].
g += Diff.
g * (3.0f / 16.0f);
462 Error[i + 3].
b += Diff.
b * (3.0f / 16.0f);
465 Error[i + 4].
r += Diff.
r * (5.0f / 16.0f);
466 Error[i + 4].
g += Diff.
g * (5.0f / 16.0f);
467 Error[i + 4].
b += Diff.
b * (5.0f / 16.0f);
472 _Analysis_assume_( i < 11 );
473 Error[i + 5].
r += Diff.
r * (1.0f / 16.0f);
474 Error[i + 5].
g += Diff.
g * (1.0f / 16.0f);
475 Error[i + 5].
b += Diff.
b * (1.0f / 16.0f);
482 Color[i].
r *= g_Luminance.
r;
483 Color[i].
g *= g_Luminance.
g;
484 Color[i].
b *= g_Luminance.
b;
490 HDRColorA ColorA, ColorB, ColorC, ColorD;
492 OptimizeRGB(&ColorA, &ColorB, Color, uSteps, flags);
501 ColorC.
r = ColorA.
r * g_LuminanceInv.
r;
502 ColorC.
g = ColorA.
g * g_LuminanceInv.
g;
503 ColorC.
b = ColorA.
b * g_LuminanceInv.
b;
505 ColorD.
r = ColorB.
r * g_LuminanceInv.
r;
506 ColorD.
g = ColorB.
g * g_LuminanceInv.
g;
507 ColorD.
b = ColorB.
b * g_LuminanceInv.
b;
513 if((uSteps == 4) && (wColorA == wColorB))
515 pBC->rgb[0] = wColorA;
516 pBC->rgb[1] = wColorB;
517 pBC->bitmap = 0x00000000;
524 if ( flags & BC_FLAGS_UNIFORM )
531 ColorA.
r = ColorC.
r * g_Luminance.
r;
532 ColorA.
g = ColorC.
g * g_Luminance.
g;
533 ColorA.
b = ColorC.
b * g_Luminance.
b;
535 ColorB.
r = ColorD.
r * g_Luminance.
r;
536 ColorB.
g = ColorD.
g * g_Luminance.
g;
537 ColorB.
b = ColorD.
b * g_Luminance.
b;
543 if((3 == uSteps) == (wColorA <= wColorB))
545 pBC->rgb[0] = wColorA;
546 pBC->rgb[1] = wColorB;
553 pBC->rgb[0] = wColorB;
554 pBC->rgb[1] = wColorA;
560 static const size_t pSteps3[] = { 0, 2, 1 };
561 static const size_t pSteps4[] = { 0, 2, 3, 1 };
562 const size_t *pSteps;
581 Dir.
r = Step[1].
r - Step[0].
r;
582 Dir.
g = Step[1].
g - Step[0].
g;
583 Dir.
b = Step[1].
b - Step[0].
b;
585 float fSteps = (float) (uSteps - 1);
586 float fScale = (wColorA != wColorB) ? (fSteps / (Dir.
r * Dir.
r + Dir.
g * Dir.
g + Dir.
b * Dir.
b)) : 0.0f;
594 if (flags & BC_FLAGS_DITHER_RGB)
595 memset(Error, 0x00, NUM_PIXELS_PER_BLOCK *
sizeof(
HDRColorA));
599 if((3 == uSteps) && (pColor[i].
a < alphaRef))
601 dw = (3 << 30) | (dw >> 2);
606 if ( flags & BC_FLAGS_UNIFORM )
614 Clr.
r = pColor[i].r * g_Luminance.
r;
615 Clr.
g = pColor[i].g * g_Luminance.
g;
616 Clr.
b = pColor[i].b * g_Luminance.
b;
619 if (flags & BC_FLAGS_DITHER_RGB)
626 float fDot = (Clr.
r - Step[0].
r) * Dir.
r + (Clr.
g - Step[0].
g) * Dir.
g + (Clr.
b - Step[0].
b) * Dir.
b;
631 else if(fDot >= fSteps)
634 iStep =
static_cast<uint32_t
>( pSteps[
static_cast<size_t>(fDot + 0.5f)] );
636 dw = (iStep << 30) | (dw >> 2);
638 if (flags & BC_FLAGS_DITHER_RGB)
641 Diff.
r = Color[i].
a * (Clr.
r - Step[iStep].
r);
642 Diff.
g = Color[i].
a * (Clr.
g - Step[iStep].
g);
643 Diff.
b = Color[i].
a * (Clr.
b - Step[iStep].
b);
647 Error[i + 1].
r += Diff.
r * (7.0f / 16.0f);
648 Error[i + 1].
g += Diff.
g * (7.0f / 16.0f);
649 Error[i + 1].
b += Diff.
b * (7.0f / 16.0f);
656 Error[i + 3].
r += Diff.
r * (3.0f / 16.0f);
657 Error[i + 3].
g += Diff.
g * (3.0f / 16.0f);
658 Error[i + 3].
b += Diff.
b * (3.0f / 16.0f);
661 Error[i + 4].
r += Diff.
r * (5.0f / 16.0f);
662 Error[i + 4].
g += Diff.
g * (5.0f / 16.0f);
663 Error[i + 4].
b += Diff.
b * (5.0f / 16.0f);
667 Error[i + 5].
r += Diff.
r * (1.0f / 16.0f);
668 Error[i + 5].
g += Diff.
g * (1.0f / 16.0f);
669 Error[i + 5].
b += Diff.
b * (1.0f / 16.0f);
683 #ifdef COLOR_AVG_0WEIGHTS
686 Color.r = pColor[0].r;
687 Color.g = pColor[0].g;
688 Color.b = pColor[0].b;
692 Color.r += pColor[i].r;
693 Color.g += pColor[i].g;
694 Color.b += pColor[i].b;
697 Color.r *= 1.0f / 16.0f;
698 Color.g *= 1.0f / 16.0f;
699 Color.b *= 1.0f / 16.0f;
703 uint16_t wColor = 0x0000;
704 #endif // COLOR_AVG_0WEIGHTS
707 pBC->rgb[0] = wColor;
708 pBC->rgb[1] = wColor;
709 pBC->bitmap = 0x00000000;
711 #endif // COLOR_WEIGHTS
721 _Use_decl_annotations_
724 auto pBC1 =
reinterpret_cast<const D3DX_BC1 *
>(pBC);
728 _Use_decl_annotations_
743 XMStoreFloat4( reinterpret_cast<XMFLOAT4*>( &clr ), pColor[i] );
745 float fAlph = clr.
a + fError[i];
750 Color[i].
a = (float) static_cast<int32_t>(clr.
a + fError[i] + 0.5f);
752 float fDiff = fAlph - Color[i].
a;
757 _Analysis_assume_( i < 15 );
758 fError[i + 1] += fDiff * (7.0f / 16.0f);
764 fError[i + 3] += fDiff * (3.0f / 16.0f);
766 fError[i + 4] += fDiff * (5.0f / 16.0f);
771 _Analysis_assume_( i < 11 );
772 fError[i + 5] += fDiff * (1.0f / 16.0f);
781 XMStoreFloat4( reinterpret_cast<XMFLOAT4*>( &Color[i] ), pColor[i] );
785 auto pBC1 =
reinterpret_cast<D3DX_BC1 *
>(pBC);
786 EncodeBC1(pBC1, Color,
true, alphaRef, flags);
793 _Use_decl_annotations_
797 static_assert(
sizeof(
D3DX_BC2) == 16,
"D3DX_BC2 should be 16 bytes" );
799 auto pBC2 =
reinterpret_cast<const D3DX_BC2 *
>(pBC);
805 DWORD dw = pBC2->bitmap[0];
807 for(
size_t i = 0; i < 8; ++i, dw >>= 4)
809 #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool")
810 pColor[i] = XMVectorSetW( pColor[i], (
float) (dw & 0xf) * (1.0f / 15.0f) );
813 dw = pBC2->bitmap[1];
815 for(
size_t i = 8; i < NUM_PIXELS_PER_BLOCK; ++i, dw >>= 4)
816 pColor[i] = XMVectorSetW( pColor[i], (
float) (dw & 0xf) * (1.0f / 15.0f) );
819 _Use_decl_annotations_
823 static_assert(
sizeof(
D3DX_BC2) == 16,
"D3DX_BC2 should be 16 bytes" );
828 XMStoreFloat4( reinterpret_cast<XMFLOAT4*>( &Color[i] ), pColor[i] );
831 auto pBC2 =
reinterpret_cast<D3DX_BC2 *
>(pBC);
839 memset(fError, 0x00, NUM_PIXELS_PER_BLOCK *
sizeof(
float));
843 float fAlph = Color[i].
a;
844 if (flags & BC_FLAGS_DITHER_A)
847 uint32_t u = (uint32_t) static_cast<int32_t>(fAlph * 15.0f + 0.5f);
849 pBC2->bitmap[i >> 3] >>= 4;
850 pBC2->bitmap[i >> 3] |= (u << 28);
852 if (flags & BC_FLAGS_DITHER_A)
854 float fDiff = fAlph - (float) u * (1.0f / 15.0f);
859 _Analysis_assume_( i < 15 );
860 fError[i + 1] += fDiff * (7.0f / 16.0f);
866 fError[i + 3] += fDiff * (3.0f / 16.0f);
868 fError[i + 4] += fDiff * (5.0f / 16.0f);
873 _Analysis_assume_( i < 11 );
874 fError[i + 5] += fDiff * (1.0f / 16.0f);
882 if(!pBC2->bitmap[0] && !pBC2->bitmap[1])
884 EncodeSolidBC1(pBC2->dxt1, Color);
887 #endif // COLOR_WEIGHTS
889 EncodeBC1(&pBC2->bc1, Color,
false, 0.f, flags);
896 _Use_decl_annotations_
900 static_assert(
sizeof(
D3DX_BC3) == 16,
"D3DX_BC3 should be 16 bytes" );
902 auto pBC3 =
reinterpret_cast<const D3DX_BC3 *
>(pBC);
910 fAlpha[0] = ((float) pBC3->alpha[0]) * (1.0f / 255.0f);
911 fAlpha[1] = ((float) pBC3->alpha[1]) * (1.0f / 255.0f);
913 if(pBC3->alpha[0] > pBC3->alpha[1])
915 for(
size_t i = 1; i < 7; ++i)
916 fAlpha[i + 1] = (fAlpha[0] * (7 - i) + fAlpha[1] * i) * (1.0f / 7.0f);
920 for(
size_t i = 1; i < 5; ++i)
921 fAlpha[i + 1] = (fAlpha[0] * (5 - i) + fAlpha[1] * i) * (1.0f / 5.0f);
927 DWORD dw = pBC3->bitmap[0] | (pBC3->bitmap[1] << 8) | (pBC3->bitmap[2] << 16);
929 for(
size_t i = 0; i < 8; ++i, dw >>= 3)
930 pColor[i] = XMVectorSetW( pColor[i], fAlpha[dw & 0x7] );
932 dw = pBC3->bitmap[3] | (pBC3->bitmap[4] << 8) | (pBC3->bitmap[5] << 16);
934 for(
size_t i = 8; i < NUM_PIXELS_PER_BLOCK; ++i, dw >>= 3)
935 pColor[i] = XMVectorSetW( pColor[i], fAlpha[dw & 0x7] );
938 _Use_decl_annotations_
942 static_assert(
sizeof(
D3DX_BC3) == 16,
"D3DX_BC3 should be 16 bytes" );
947 XMStoreFloat4( reinterpret_cast<XMFLOAT4*>( &Color[i] ), pColor[i] );
950 auto pBC3 =
reinterpret_cast<D3DX_BC3 *
>(pBC);
958 float fMinAlpha = Color[0].
a;
959 float fMaxAlpha = Color[0].
a;
962 memset(fError, 0x00, NUM_PIXELS_PER_BLOCK *
sizeof(
float));
966 float fAlph = Color[i].
a;
967 if (flags & BC_FLAGS_DITHER_A)
970 fAlpha[i] =
static_cast<int32_t
>(fAlph * 255.0f + 0.5f) * (1.0f / 255.0f);
972 if(fAlpha[i] < fMinAlpha)
973 fMinAlpha = fAlpha[i];
974 else if(fAlpha[i] > fMaxAlpha)
975 fMaxAlpha = fAlpha[i];
977 if (flags & BC_FLAGS_DITHER_A)
979 float fDiff = fAlph - fAlpha[i];
984 _Analysis_assume_( i < 15 );
985 fError[i + 1] += fDiff * (7.0f / 16.0f);
991 fError[i + 3] += fDiff * (3.0f / 16.0f);
993 fError[i + 4] += fDiff * (5.0f / 16.0f);
998 _Analysis_assume_( i < 11 );
999 fError[i + 5] += fDiff * (1.0f / 16.0f);
1005 #ifdef COLOR_WEIGHTS
1006 if(0.0f == fMaxAlpha)
1008 EncodeSolidBC1(&pBC3->dxt1, Color);
1009 pBC3->alpha[0] = 0x00;
1010 pBC3->alpha[1] = 0x00;
1011 memset(pBC3->bitmap, 0x00, 6);
1016 EncodeBC1(&pBC3->bc1, Color,
false, 0.f, flags);
1019 if(1.0f == fMinAlpha)
1021 pBC3->alpha[0] = 0xff;
1022 pBC3->alpha[1] = 0xff;
1023 memset(pBC3->bitmap, 0x00, 6);
1028 size_t uSteps = ((0.0f == fMinAlpha) || (1.0f == fMaxAlpha)) ? 6 : 8;
1030 float fAlphaA, fAlphaB;
1031 OptimizeAlpha<false>(&fAlphaA, &fAlphaB, fAlpha, uSteps);
1033 uint8_t bAlphaA = (
uint8_t) static_cast<int32_t>(fAlphaA * 255.0f + 0.5f);
1034 uint8_t bAlphaB = (
uint8_t) static_cast<int32_t>(fAlphaB * 255.0f + 0.5f);
1036 fAlphaA = (float) bAlphaA * (1.0f / 255.0f);
1037 fAlphaB = (float) bAlphaB * (1.0f / 255.0f);
1040 if((8 == uSteps) && (bAlphaA == bAlphaB))
1042 pBC3->alpha[0] = bAlphaA;
1043 pBC3->alpha[1] = bAlphaB;
1044 memset(pBC3->bitmap, 0x00, 6);
1048 static const size_t pSteps6[] = { 0, 2, 3, 4, 5, 1 };
1049 static const size_t pSteps8[] = { 0, 2, 3, 4, 5, 6, 7, 1 };
1051 const size_t *pSteps;
1056 pBC3->alpha[0] = bAlphaA;
1057 pBC3->alpha[1] = bAlphaB;
1062 for(
size_t i = 1; i < 5; ++i)
1063 fStep[i + 1] = (fStep[0] * (5 - i) + fStep[1] * i) * (1.0f / 5.0f);
1072 pBC3->alpha[0] = bAlphaB;
1073 pBC3->alpha[1] = bAlphaA;
1078 for(
size_t i = 1; i < 7; ++i)
1079 fStep[i + 1] = (fStep[0] * (7 - i) + fStep[1] * i) * (1.0f / 7.0f);
1085 float fSteps = (float) (uSteps - 1);
1086 float fScale = (fStep[0] != fStep[1]) ? (fSteps / (fStep[1] - fStep[0])) : 0.0f;
1088 if (flags & BC_FLAGS_DITHER_A)
1089 memset(fError, 0x00, NUM_PIXELS_PER_BLOCK *
sizeof(
float));
1091 for(
size_t iSet = 0; iSet < 2; iSet++)
1095 size_t iMin = iSet * 8;
1096 size_t iLim = iMin + 8;
1098 for(
size_t i = iMin; i < iLim; ++i)
1100 float fAlph = Color[i].
a;
1101 if (flags & BC_FLAGS_DITHER_A)
1103 float fDot = (fAlph - fStep[0]) * fScale;
1107 iStep = ((6 == uSteps) && (fAlph <= fStep[0] * 0.5f)) ? 6 : 0;
1108 else if(fDot >= fSteps)
1109 iStep = ((6 == uSteps) && (fAlph >= (fStep[1] + 1.0f) * 0.5f)) ? 7 : 1;
1111 iStep =
static_cast<uint32_t
>( pSteps[
static_cast<size_t>(fDot + 0.5f)] );
1113 dw = (iStep << 21) | (dw >> 3);
1115 if (flags & BC_FLAGS_DITHER_A)
1117 float fDiff = (fAlph - fStep[iStep]);
1120 fError[i + 1] += fDiff * (7.0f / 16.0f);
1125 fError[i + 3] += fDiff * (3.0f / 16.0f);
1127 fError[i + 4] += fDiff * (5.0f / 16.0f);
1130 fError[i + 5] += fDiff * (1.0f / 16.0f);
1135 pBC3->bitmap[0 + iSet * 3] = ((
uint8_t *) &dw)[0];
1136 pBC3->bitmap[1 + iSet * 3] = ((
uint8_t *) &dw)[1];
1137 pBC3->bitmap[2 + iSet * 3] = ((
uint8_t *) &dw)[2];
_Use_decl_annotations_ void D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, DWORD flags)
#define NUM_PIXELS_PER_BLOCK
static const HDRColorA g_LuminanceInv(0.7154f/0.2125f, 1.0f, 0.7154f/0.0721f, 1.0f)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
static void DecodeBC1(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_ const D3DX_BC1 *pBC, _In_ bool isbc1)
_Use_decl_annotations_ void D3DXDecodeBC3(XMVECTOR *pColor, const uint8_t *pBC)
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT _In_ DWORD flags assert(pDestination &&outSize > 0)
static uint16_t Encode565(_In_ const HDRColorA *pColor)
static void EncodeBC1(_Out_ D3DX_BC1 *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA *pColor, _In_ bool bColorKey, _In_ float alphaRef, _In_ DWORD flags)
static void OptimizeRGB(_Out_ HDRColorA *pX, _Out_ HDRColorA *pY, _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA *pPoints, _In_ size_t cSteps, _In_ DWORD flags)
HDRColorA * HDRColorALerp(_Out_ HDRColorA *pOut, _In_ const HDRColorA *pC1, _In_ const HDRColorA *pC2, _In_ float s)
SiliconStudio.Core.Mathematics.Color Color
_In_ size_t _In_ const TexMetadata _In_ DWORD _Out_writes_(nImages) Image *images
static const HDRColorA g_Luminance(0.2125f/0.7154f, 1.0f, 0.0721f/0.7154f, 1.0f)
_Use_decl_annotations_ void D3DXEncodeBC1(uint8_t *pBC, const XMVECTOR *pColor, float alphaRef, DWORD flags)
_In_ size_t _In_ DXGI_FORMAT _In_reads_(count) const XMVECTOR *pSource
static void Decode565(_Out_ HDRColorA *pColor, _In_ const uint16_t w565)
_Use_decl_annotations_ void D3DXEncodeBC2(uint8_t *pBC, const XMVECTOR *pColor, DWORD flags)
static const float fEpsilon
_Use_decl_annotations_ void D3DXDecodeBC1(XMVECTOR *pColor, const uint8_t *pBC)
_Use_decl_annotations_ void D3DXDecodeBC2(XMVECTOR *pColor, const uint8_t *pBC)