Advertisement
Conmanx360

Untitled

Jun 22nd, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. static void dxt5_decompress_block(const BYTE *src, BYTE *dst, UINT width, UINT height, UINT depth,
  2. UINT x_pos, UINT y_pos, UINT z_pos, UINT dst_slice_pitch, UINT64 cur_block)
  3. {
  4. UINT64 alpha_block, alpha_index, color_block, color_index;
  5. const UINT64 *source;
  6. DWORD *dest;
  7. DWORD alpha_lookup;
  8. DWORD bgra;
  9. DWORD temp;
  10. DWORD i, x, y;
  11. WORD color[2];
  12. BYTE alpha_val, color_val;
  13. BYTE alpha[8];
  14. BYTE r[4];
  15. BYTE g[4];
  16. BYTE b[4];
  17.  
  18. source = (const UINT64 *)(src + cur_block * 16);
  19. alpha_block = source[0];
  20. color_block = source[1];
  21.  
  22. alpha[0] = alpha_block & 0xff;
  23. alpha[1] = (alpha_block >> 8) & 0xff;
  24.  
  25. /* Generate alpha lookup values */
  26. if (alpha[0] > alpha[1])
  27. {
  28. for (i = 0; i < 6; i++)
  29. alpha[2 + i] = (((6 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 7;
  30. }
  31. else if (alpha[0] <= alpha[1])
  32. {
  33. for (i = 0; i < 4; i++)
  34. alpha[2 + i] = (((4 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 5;
  35. alpha[6] = 0;
  36. alpha[7] = 255;
  37. }
  38.  
  39. /* Generate color lookup values */
  40. color[0] = color_block & 0xffff;
  41. color[1] = (color_block >> 16) & 0xffff;
  42.  
  43. for (i = 0; i < 2; i++)
  44. {
  45. temp = (color[i] >> 11) * 255 + 16;
  46. r[i] = (temp / 32 + temp) / 32;
  47. temp = ((color[i] >> 5) & 0x3f) * 255 + 32;
  48. g[i] = (temp / 64 + temp) / 64;
  49. temp = (color[i] & 0x1f) * 255 + 16;
  50. b[i] = (temp / 32 + temp) / 32;
  51. }
  52.  
  53. for (i = 0; i < 2; i++)
  54. {
  55. r[2 + i] = (2 * r[0 + i] + r[1 - i]) / 3;
  56. g[2 + i] = (2 * g[0 + i] + g[1 - i]) / 3;
  57. b[2 + i] = (2 * b[0 + i] + b[1 - i]) / 3;
  58. }
  59.  
  60. color_index = (color_block >> 32) & 0xffffffff;
  61. alpha_index = (alpha_block >> 16);
  62.  
  63. dest = (DWORD *)(dst + z_pos * dst_slice_pitch);
  64.  
  65. for (y = 0; y < 4; y++) {
  66. if (y_pos + y >= height)
  67. break;
  68. for (x = 0; x < 4; x++) {
  69. if (x_pos + x >= width)
  70. break;
  71.  
  72. color_val = 0;
  73. alpha_val = 0;
  74. bgra = 0;
  75.  
  76. color_val = (color_index >> (y * 8));
  77. color_val = (color_val >> (x * 2)) & 0x3;
  78. alpha_lookup = (alpha_index >> (y * 12)) & 0xfff;
  79. alpha_val = (alpha_lookup >> (x * 3)) & 0x7;
  80. bgra = ((alpha[alpha_val] << 24) | (r[color_val] << 16) | (g[color_val] << 8) | b[color_val]);
  81. dest[(y_pos + y) * width + (x_pos + x)] = bgra;
  82. }
  83. }
  84. }
  85.  
  86. static void convert_dxt5_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
  87. UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
  88. {
  89. UINT64 current_block;
  90. DWORD x, y, z;
  91.  
  92. current_block = 0;
  93.  
  94. for (z = 0; z < depth; z++)
  95. {
  96. for (y = 0; y < height; y += 4)
  97. {
  98. for (x = 0; x < width; x += 4)
  99. {
  100. dxt5_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block);
  101. current_block++;
  102. }
  103. }
  104. }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement