ReverseBox 0.35.7__tar.gz → 0.37.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {reversebox-0.35.7 → reversebox-0.37.1}/PKG-INFO +8 -8
  2. {reversebox-0.35.7 → reversebox-0.37.1}/README.md +7 -7
  3. {reversebox-0.35.7 → reversebox-0.37.1}/ReverseBox.egg-info/PKG-INFO +8 -8
  4. {reversebox-0.35.7 → reversebox-0.37.1}/ReverseBox.egg-info/SOURCES.txt +1 -1
  5. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/common.py +4 -0
  6. reversebox-0.35.7/reversebox/image/decoders/compressed_decoder.py → reversebox-0.37.1/reversebox/image/decoders/compressed_decoder_encoder.py +36 -17
  7. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/image_decoder.py +4 -3
  8. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/image_encoder.py +6 -0
  9. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/libs/DirectXTex.dll +0 -0
  10. {reversebox-0.35.7 → reversebox-0.37.1}/setup.py +1 -1
  11. {reversebox-0.35.7 → reversebox-0.37.1}/LICENSE +0 -0
  12. {reversebox-0.35.7 → reversebox-0.37.1}/ReverseBox.egg-info/dependency_links.txt +0 -0
  13. {reversebox-0.35.7 → reversebox-0.37.1}/ReverseBox.egg-info/requires.txt +0 -0
  14. {reversebox-0.35.7 → reversebox-0.37.1}/ReverseBox.egg-info/top_level.txt +0 -0
  15. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/__init__.py +0 -0
  16. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/__init__.py +0 -0
  17. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_adler32.py +0 -0
  18. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_cocos2d_pvr.py +0 -0
  19. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_fletcher16.py +0 -0
  20. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_fletcher32.py +0 -0
  21. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_internet_ipv4_header.py +0 -0
  22. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_sum8.py +0 -0
  23. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_sum8_2s_complement.py +0 -0
  24. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_unix_sum_bsd16.py +0 -0
  25. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_unix_sum_sysv.py +0 -0
  26. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/checksum/checksum_xor8.py +0 -0
  27. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/common/__init__.py +0 -0
  28. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/common/common.py +0 -0
  29. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/common/logger.py +0 -0
  30. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/common/numpy_helper_functions.py +0 -0
  31. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/__init__.py +0 -0
  32. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_jcalg1.py +0 -0
  33. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_lzo.py +0 -0
  34. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_mio0.py +0 -0
  35. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_re_tiyoruga_dat.py +0 -0
  36. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_refpack.py +0 -0
  37. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/compression/compression_zlib.py +0 -0
  38. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/__init__.py +0 -0
  39. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_arc.py +0 -0
  40. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_ccitt.py +0 -0
  41. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_dnp.py +0 -0
  42. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_ea_crcf.py +0 -0
  43. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_kermit.py +0 -0
  44. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_modbus.py +0 -0
  45. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc16_sick.py +0 -0
  46. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc32_asobo.py +0 -0
  47. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc32_iso_hdlc.py +0 -0
  48. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc64_asobo.py +0 -0
  49. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc64_go_iso.py +0 -0
  50. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc8.py +0 -0
  51. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/crc/crc_unix_cksum.py +0 -0
  52. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/__init__.py +0 -0
  53. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_hatch_engine.py +0 -0
  54. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_rot13.py +0 -0
  55. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_xor_basic.py +0 -0
  56. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_xor_basic_key_guesser.py +0 -0
  57. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_xor_gianas_return_zda.py +0 -0
  58. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/encryption/encryption_xor_retro64_eco.py +0 -0
  59. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/__init__.py +0 -0
  60. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_additive.py +0 -0
  61. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_ap.py +0 -0
  62. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_djb2.py +0 -0
  63. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_fnv.py +0 -0
  64. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_jenkins_one_at_a_time.py +0 -0
  65. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_md2.py +0 -0
  66. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_md5.py +0 -0
  67. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_murmur3.py +0 -0
  68. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_pivotal_games_dat.py +0 -0
  69. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_sdbm.py +0 -0
  70. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_sha1.py +0 -0
  71. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/hash/hash_sha2.py +0 -0
  72. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/__init__.py +0 -0
  73. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/byte_swap.py +0 -0
  74. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/__init__.py +0 -0
  75. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_gst.py +0 -0
  76. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_lzw.py +0 -0
  77. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_packbits.py +0 -0
  78. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_rle_executioners.py +0 -0
  79. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_rle_tga.py +0 -0
  80. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/compression/compression_zlib.py +0 -0
  81. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/decoders/__init__.py +0 -0
  82. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/decoders/bumpmap_decoder.py +0 -0
  83. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/decoders/gst_decoder.py +0 -0
  84. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/decoders/n64_decoder.py +0 -0
  85. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/decoders/yuv_decoder.py +0 -0
  86. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/encoders/__init__.py +0 -0
  87. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/encoders/gst_encoder.py +0 -0
  88. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/file_formats/__init__.py +0 -0
  89. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/file_formats/image_dds.py +0 -0
  90. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/image_formats.py +0 -0
  91. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/palettes/__init__.py +0 -0
  92. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/palettes/palette_random.py +0 -0
  93. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/palettes/palette_vga.py +0 -0
  94. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/pillow_wrapper.py +0 -0
  95. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/__init__.py +0 -0
  96. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_3ds.py +0 -0
  97. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_bc.py +0 -0
  98. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_cmpr.py +0 -0
  99. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_gamecube.py +0 -0
  100. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_gst.py +0 -0
  101. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_morton.py +0 -0
  102. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_morton_ps4.py +0 -0
  103. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_ps2.py +0 -0
  104. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_ps2_4bit.py +0 -0
  105. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_ps2_suba.py +0 -0
  106. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_psp.py +0 -0
  107. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_psvita_dreamcast.py +0 -0
  108. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_switch.py +0 -0
  109. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_wii_u.py +0 -0
  110. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/image/swizzling/swizzle_x360.py +0 -0
  111. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/__init__.py +0 -0
  112. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/bytes_handler.py +0 -0
  113. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/bytes_helper_functions.py +0 -0
  114. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/check_file.py +0 -0
  115. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/file_handler.py +0 -0
  116. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/mod_handler.py +0 -0
  117. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/io_files/translation_text_handler.py +0 -0
  118. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/libs/__init__.py +0 -0
  119. {reversebox-0.35.7 → reversebox-0.37.1}/reversebox/libs/refpack.dll +0 -0
  120. {reversebox-0.35.7 → reversebox-0.37.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ReverseBox
3
- Version: 0.35.7
3
+ Version: 0.37.1
4
4
  Summary: A set of functions useful in reverse engineering.
5
5
  Home-page: https://github.com/bartlomiejduda/ReverseBox
6
6
  Author: Bartlomiej Duda
@@ -186,13 +186,13 @@ or software researchers).
186
186
  - Decode N64_IA8 ✔️
187
187
  - Decode N64_RGBA32 ✔️
188
188
  - Decode N64_CMPR ✔️
189
- - Decode BC1/DXT1 ✔️
190
- - Decode BC2/DXT3 ✔️
191
- - Decode BC3/DXT5 ✔️
192
- - Decode BC4 ✔️
193
- - Decode BC5 ✔️
194
- - Decode BC6 ✔️
195
- - Decode BC7 ✔️
189
+ - Decode/Encode BC1/DXT1 ✔️
190
+ - Decode/Encode BC2/DXT3 ✔️
191
+ - Decode/Encode BC3/DXT5 ✔️
192
+ - Decode/Encode BC4 ✔️
193
+ - Decode/Encode BC5 ✔️
194
+ - Decode/Encode BC6 ✔️
195
+ - Decode/Encode BC7 ✔️
196
196
  - Decode GST121 ✔️
197
197
  - Decode GST221 ✔️
198
198
  - Decode GST421 ✔️
@@ -149,13 +149,13 @@ or software researchers).
149
149
  - Decode N64_IA8 ✔️
150
150
  - Decode N64_RGBA32 ✔️
151
151
  - Decode N64_CMPR ✔️
152
- - Decode BC1/DXT1 ✔️
153
- - Decode BC2/DXT3 ✔️
154
- - Decode BC3/DXT5 ✔️
155
- - Decode BC4 ✔️
156
- - Decode BC5 ✔️
157
- - Decode BC6 ✔️
158
- - Decode BC7 ✔️
152
+ - Decode/Encode BC1/DXT1 ✔️
153
+ - Decode/Encode BC2/DXT3 ✔️
154
+ - Decode/Encode BC3/DXT5 ✔️
155
+ - Decode/Encode BC4 ✔️
156
+ - Decode/Encode BC5 ✔️
157
+ - Decode/Encode BC6 ✔️
158
+ - Decode/Encode BC7 ✔️
159
159
  - Decode GST121 ✔️
160
160
  - Decode GST221 ✔️
161
161
  - Decode GST421 ✔️
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ReverseBox
3
- Version: 0.35.7
3
+ Version: 0.37.1
4
4
  Summary: A set of functions useful in reverse engineering.
5
5
  Home-page: https://github.com/bartlomiejduda/ReverseBox
6
6
  Author: Bartlomiej Duda
@@ -186,13 +186,13 @@ or software researchers).
186
186
  - Decode N64_IA8 ✔️
187
187
  - Decode N64_RGBA32 ✔️
188
188
  - Decode N64_CMPR ✔️
189
- - Decode BC1/DXT1 ✔️
190
- - Decode BC2/DXT3 ✔️
191
- - Decode BC3/DXT5 ✔️
192
- - Decode BC4 ✔️
193
- - Decode BC5 ✔️
194
- - Decode BC6 ✔️
195
- - Decode BC7 ✔️
189
+ - Decode/Encode BC1/DXT1 ✔️
190
+ - Decode/Encode BC2/DXT3 ✔️
191
+ - Decode/Encode BC3/DXT5 ✔️
192
+ - Decode/Encode BC4 ✔️
193
+ - Decode/Encode BC5 ✔️
194
+ - Decode/Encode BC6 ✔️
195
+ - Decode/Encode BC7 ✔️
196
196
  - Decode GST121 ✔️
197
197
  - Decode GST221 ✔️
198
198
  - Decode GST421 ✔️
@@ -79,7 +79,7 @@ reversebox/image/compression/compression_rle_tga.py
79
79
  reversebox/image/compression/compression_zlib.py
80
80
  reversebox/image/decoders/__init__.py
81
81
  reversebox/image/decoders/bumpmap_decoder.py
82
- reversebox/image/decoders/compressed_decoder.py
82
+ reversebox/image/decoders/compressed_decoder_encoder.py
83
83
  reversebox/image/decoders/gst_decoder.py
84
84
  reversebox/image/decoders/n64_decoder.py
85
85
  reversebox/image/decoders/yuv_decoder.py
@@ -223,6 +223,10 @@ def get_block_data_size(img_format: ImageFormats) -> int:
223
223
  return 1
224
224
 
225
225
 
226
+ def get_bc_image_data_size(image_height: int, image_width: int, image_format: ImageFormats) -> int:
227
+ return ((image_height + 3) // 4) * ((image_width + 3) // 4) * get_block_data_size(image_format)
228
+
229
+
226
230
  def calculate_aligned_value(value: int, multiple: int) -> int:
227
231
  return ((value + multiple - 1) // multiple) * multiple
228
232
 
@@ -1,5 +1,5 @@
1
1
  """
2
- Copyright © 2024 Bartłomiej Duda
2
+ Copyright © 2024-2025 Bartłomiej Duda
3
3
  License: GPL-3.0 License
4
4
  """
5
5
 
@@ -17,11 +17,13 @@ from ctypes import (
17
17
 
18
18
  from reversebox.common.common import get_dll_path
19
19
  from reversebox.common.logger import get_logger
20
+ from reversebox.image.common import get_bc_image_data_size
20
21
  from reversebox.image.image_formats import ImageFormats
21
22
 
22
23
  logger = get_logger(__name__)
23
24
 
24
25
  # fmt: off
26
+ # mypy: ignore-errors
25
27
 
26
28
 
27
29
  class DXGIImage(Structure):
@@ -38,9 +40,9 @@ class DXGIImage(Structure):
38
40
  ]
39
41
 
40
42
 
41
- class CompressedImageDecoder:
43
+ class CompressedImageDecoderEncoder:
42
44
  """
43
- Decoder for any compressed images like BC1/DXT1, BC2/DXT2 etc.
45
+ Decoder/Encoder for any compressed images like BC1/DXT1, BC2/DXT2 etc.
44
46
  """
45
47
 
46
48
  def __init__(self):
@@ -91,15 +93,19 @@ class CompressedImageDecoder:
91
93
  else:
92
94
  raise Exception(f"Not supported image format! Image_format: {image_format}")
93
95
 
94
- def _decode_directxtex_image(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats) -> bytes:
96
+ def _convert_directxtex_image(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats, encode_flag: bool) -> bytes:
95
97
  """
96
- Function used for decoding compressed BC formats
98
+ Function used for decoding/encoding compressed BC formats
97
99
  """
98
100
  dll_path: str = get_dll_path("DirectXTex.dll")
99
- input_format_number: int = self._get_dxgi_format_number(image_format)
100
- output_format_number: int = self._get_dxgi_format_number(ImageFormats.RGBA8888)
101
+ if encode_flag:
102
+ input_format_number: int = self._get_dxgi_format_number(ImageFormats.RGBA8888)
103
+ output_format_number: int = self._get_dxgi_format_number(image_format)
104
+ else:
105
+ input_format_number: int = self._get_dxgi_format_number(image_format)
106
+ output_format_number: int = self._get_dxgi_format_number(ImageFormats.RGBA8888)
101
107
 
102
- # calculating pitch logic
108
+ # calculating pitch params
103
109
  c_input_format_number = c_int(input_format_number)
104
110
  c_output_format_number = c_int(output_format_number)
105
111
  c_image_width = c_int(img_width)
@@ -110,6 +116,10 @@ class CompressedImageDecoder:
110
116
  c_output_slice_pitch = c_long(0)
111
117
  c_flags = c_int(0)
112
118
 
119
+ # encode params
120
+ c_threshold = ctypes.c_float(0.5)
121
+ c_nullptr = (c_uint8 * 100)()
122
+
113
123
  try:
114
124
  dll_file = ctypes.CDLL(dll_path)
115
125
  dll_file.ComputePitch(c_input_format_number, c_image_width, c_image_height, ctypes.byref(c_input_row_pitch), ctypes.byref(c_input_slice_pitch), c_flags)
@@ -122,22 +132,31 @@ class CompressedImageDecoder:
122
132
  input_dxgi_image: DXGIImage = self._init_dxgi_image(img_width, img_height, input_format_number, c_input_row_pitch.value, c_input_slice_pitch.value, image_data)
123
133
  output_dxgi_image: DXGIImage = self._init_dxgi_image(img_width, img_height, output_format_number, c_output_row_pitch.value, c_output_slice_pitch.value, b'')
124
134
 
125
- # decompressing image logic
135
+ # decompressing/compressing image logic
126
136
  try:
127
137
  dll_file = ctypes.CDLL(dll_path)
128
- h_result = dll_file.DecompressBC(ctypes.byref(input_dxgi_image), ctypes.byref(output_dxgi_image))
138
+
139
+ if encode_flag:
140
+ h_result = dll_file.CompressBC(ctypes.byref(input_dxgi_image), ctypes.byref(output_dxgi_image),
141
+ c_flags, c_flags,
142
+ c_threshold, c_nullptr)
143
+ else:
144
+ h_result = dll_file.DecompressBC(ctypes.byref(input_dxgi_image), ctypes.byref(output_dxgi_image))
129
145
  except Exception as error:
130
146
  raise Exception(f"Error while decoding compressed data! Error: {error}")
131
147
 
132
148
  if h_result != 0:
133
149
  raise Exception(f"DLL decompression failed! H_result: {h_result}")
134
150
 
135
- decoded_data_size: int = img_height * img_width * 4
136
- decoded_data = bytearray((c_uint8 * decoded_data_size).from_address(ctypes.addressof(output_dxgi_image.pixels.contents)))
137
- return decoded_data
151
+ if encode_flag:
152
+ converted_data_size: int = get_bc_image_data_size(img_height, img_width, image_format)
153
+ else:
154
+ converted_data_size: int = img_height * img_width * 4
155
+ converted_data = bytearray((c_uint8 * converted_data_size).from_address(ctypes.addressof(output_dxgi_image.pixels.contents)))
156
+ return converted_data
138
157
 
139
158
  def decode_compressed_image_main(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats) -> bytes:
140
- """
141
- Main decoder function
142
- """
143
- return self._decode_directxtex_image(image_data, img_width, img_height, image_format)
159
+ return self._convert_directxtex_image(image_data, img_width, img_height, image_format, False)
160
+
161
+ def encode_compressed_image_main(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats) -> bytes:
162
+ return self._convert_directxtex_image(image_data, img_width, img_height, image_format, True)
@@ -8,7 +8,9 @@ import struct
8
8
  from reversebox.common.logger import get_logger
9
9
  from reversebox.image.common import convert_bpp_to_bytes_per_pixel
10
10
  from reversebox.image.decoders.bumpmap_decoder import BumpmapDecoder
11
- from reversebox.image.decoders.compressed_decoder import CompressedImageDecoder
11
+ from reversebox.image.decoders.compressed_decoder_encoder import (
12
+ CompressedImageDecoderEncoder,
13
+ )
12
14
  from reversebox.image.decoders.gst_decoder import GSTImageDecoder
13
15
  from reversebox.image.decoders.n64_decoder import N64Decoder
14
16
  from reversebox.image.decoders.yuv_decoder import YUVDecoder
@@ -792,8 +794,7 @@ class ImageDecoder:
792
794
  return self._decode_indexed(image_data, palette_data, img_width, img_height, image_format, palette_format, image_endianess, palette_endianess)
793
795
 
794
796
  def decode_compressed_image(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats) -> bytes:
795
- compressed_decoder = CompressedImageDecoder()
796
- return compressed_decoder.decode_compressed_image_main(image_data, img_width, img_height, image_format)
797
+ return CompressedImageDecoderEncoder().decode_compressed_image_main(image_data, img_width, img_height, image_format)
797
798
 
798
799
  def decode_gst_image(self, image_data: bytes, palette_data: bytes, img_width: int, img_height: int, image_format: ImageFormats, convert_format: ImageFormats, convert_pal_format: ImageFormats, is_swizzled: bool = True) -> bytes:
799
800
  gst_decoder = GSTImageDecoder()
@@ -12,6 +12,9 @@ from reversebox.image.common import (
12
12
  convert_bpp_to_bytes_per_pixel,
13
13
  get_bpp_for_image_format,
14
14
  )
15
+ from reversebox.image.decoders.compressed_decoder_encoder import (
16
+ CompressedImageDecoderEncoder,
17
+ )
15
18
  from reversebox.image.image_formats import ImageFormats
16
19
  from reversebox.image.pillow_wrapper import PillowWrapper
17
20
  from reversebox.io_files.bytes_handler import BytesHandler
@@ -431,3 +434,6 @@ class ImageEncoder:
431
434
 
432
435
  def encode_indexed_image(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats, palette_format: ImageFormats, max_color_count: int, image_endianess: str = "little", palette_endianess: str = "little") -> Tuple[bytes, bytes]:
433
436
  return self._encode_indexed(image_data, img_width, img_height, image_format, palette_format, image_endianess, palette_endianess, max_color_count)
437
+
438
+ def encode_compressed_image(self, image_data: bytes, img_width: int, img_height: int, image_format: ImageFormats) -> bytes:
439
+ return CompressedImageDecoderEncoder().encode_compressed_image_main(image_data, img_width, img_height, image_format)
@@ -8,7 +8,7 @@ from typing import Final
8
8
 
9
9
  import setuptools
10
10
 
11
- VERSION_NUM: Final[str] = "0.35.7"
11
+ VERSION_NUM: Final[str] = "0.37.1"
12
12
 
13
13
 
14
14
  def get_long_description() -> str:
File without changes
File without changes