@@ -76,29 +76,29 @@ class VtfPF(IntEnum):
76
76
ABGR8888 = 1
77
77
RGB888 = 2
78
78
BGR888 = 3
79
- RGB565 = 4
79
+ # RGB565 = 4
80
80
I8 = 5
81
81
IA88 = 6
82
- P8 = 7
82
+ # P8 = 7
83
83
A8 = 8
84
- RGB888_BLUESCREEN = 9
85
- BGR888_BLUESCREEN = 10
84
+ # RGB888_BLUESCREEN = 9
85
+ # BGR888_BLUESCREEN = 10
86
86
ARGB8888 = 11
87
87
BGRA8888 = 12
88
88
DXT1 = 13
89
89
DXT3 = 14
90
90
DXT5 = 15
91
91
BGRX8888 = 16
92
- BGR565 = 17
93
- BGRX5551 = 18
94
- BGRA4444 = 19
92
+ # BGR565 = 17
93
+ # BGRX5551 = 18
94
+ # BGRA4444 = 19
95
95
DXT1_ONEBITALPHA = 20
96
- BGRA5551 = 21
96
+ # BGRA5551 = 21
97
97
UV88 = 22
98
- UVWQ8888 = 23
99
- RGBA16161616F = 24
100
- RGBA16161616 = 25
101
- UVLX8888 = 26
98
+ # UVWQ8888 = 23
99
+ # RGBA16161616F = 24
100
+ # RGBA16161616 = 25
101
+ # UVLX8888 = 26
102
102
103
103
104
104
VTFHeader = NamedTuple (
@@ -125,26 +125,8 @@ class VtfPF(IntEnum):
125
125
("resource_count" , int ),
126
126
],
127
127
)
128
- RGB_FORMATS = (
129
- VtfPF .DXT1 ,
130
- VtfPF .RGB888 ,
131
- VtfPF .BGR888 ,
132
- VtfPF .UV88 ,
133
- )
134
- RGBA_FORMATS = (
135
- VtfPF .DXT1_ONEBITALPHA ,
136
- VtfPF .DXT3 ,
137
- VtfPF .DXT5 ,
138
- VtfPF .RGBA8888 ,
139
- )
140
- L_FORMATS = (
141
- VtfPF .A8 ,
142
- VtfPF .I8 ,
143
- )
144
- LA_FORMATS = (VtfPF .IA88 ,)
145
128
146
129
BLOCK_COMPRESSED = (VtfPF .DXT1 , VtfPF .DXT1_ONEBITALPHA , VtfPF .DXT3 , VtfPF .DXT5 )
147
- SUPPORTED_FORMATS = RGBA_FORMATS + RGB_FORMATS + LA_FORMATS + L_FORMATS
148
130
HEADER_V70 = "<I2HI2H4x3f4xfIbI2b"
149
131
HEADER_V72 = "<I2HI2H4x3f4xfIbI2bH"
150
132
HEADER_V73 = "<I2HI2H4x3f4xfIbI2bH3xI8x"
@@ -153,22 +135,13 @@ class VtfPF(IntEnum):
153
135
def _get_texture_size (pixel_format : VtfPF , width , height ):
154
136
if pixel_format in (VtfPF .DXT1 , VtfPF .DXT1_ONEBITALPHA ):
155
137
return width * height // 2
156
- elif (
157
- pixel_format
158
- in (
159
- VtfPF .DXT3 ,
160
- VtfPF .DXT5 ,
161
- )
162
- + L_FORMATS
163
- ):
138
+ elif pixel_format in (VtfPF .DXT3 , VtfPF .DXT5 ):
164
139
return width * height
165
- elif pixel_format == VtfPF .UV88 :
166
- return width * height * 2
167
- elif pixel_format in LA_FORMATS :
140
+ elif pixel_format in ( VtfPF .A8 , VtfPF . I8 ,) :
141
+ return width * height
142
+ elif pixel_format in ( VtfPF . UV88 , VtfPF . IA88 ) :
168
143
return width * height * 2
169
- elif pixel_format == VtfPF .RGB888 :
170
- return width * height * 3
171
- elif pixel_format == VtfPF .BGR888 :
144
+ elif pixel_format in (VtfPF .RGB888 , VtfPF .BGR888 ):
172
145
return width * height * 3
173
146
elif pixel_format == VtfPF .RGBA8888 :
174
147
return width * height * 4
@@ -190,36 +163,28 @@ def _write_image(fp: BufferedIOBase, im: Image.Image, pixel_format: VtfPF):
190
163
if pixel_format == VtfPF .DXT1 :
191
164
encoder = "bcn"
192
165
encoder_args = (1 , "DXT1" )
193
- im = im .convert ("RGB " )
166
+ im = im .convert ("RGBA " )
194
167
elif pixel_format == VtfPF .DXT1_ONEBITALPHA :
195
168
encoder = "bcn"
196
169
encoder_args = (1 , "DXT1A" )
197
- im = im .convert ("RGBA" )
198
170
elif pixel_format == VtfPF .DXT3 :
199
171
encoder = "bcn"
200
172
encoder_args = (3 , "DXT3" )
201
- im = im .convert ("RGBA" )
202
173
elif pixel_format == VtfPF .DXT5 :
203
174
encoder = "bcn"
204
175
encoder_args = (5 , "DXT5" )
205
- im = im .convert ("RGBA" )
206
176
elif pixel_format == VtfPF .RGB888 :
207
177
encoder = "raw"
208
178
encoder_args = ("RGB" , 0 , 0 )
209
- im = im .convert ("RGB" )
210
179
elif pixel_format == VtfPF .BGR888 :
211
180
encoder = "raw"
212
181
encoder_args = ("BGR" , 0 , 0 )
213
- im = im .convert ("RGB" )
214
182
elif pixel_format == VtfPF .RGBA8888 :
215
183
encoder = "raw"
216
184
encoder_args = ("RGBA" , 0 , 0 )
217
- im = im .convert ("RGBA" )
218
185
elif pixel_format == VtfPF .A8 :
219
186
encoder = "raw"
220
- encoder_args = ("L" , 0 , 0 )
221
- * _ , a = im .split ()
222
- im = Image .merge ("L" , (a ,))
187
+ encoder_args = ("A" , 0 , 0 )
223
188
elif pixel_format == VtfPF .I8 :
224
189
encoder = "raw"
225
190
encoder_args = ("L" , 0 , 0 )
@@ -240,7 +205,7 @@ def _write_image(fp: BufferedIOBase, im: Image.Image, pixel_format: VtfPF):
240
205
241
206
def _closest_power (x ):
242
207
possible_results = round (log (x , 2 )), ceil (log (x , 2 ))
243
- return 2 ** min (possible_results , key = lambda z : abs (x - 2 ** z ))
208
+ return 2 ** min (possible_results , key = lambda z : abs (x - 2 ** z ))
244
209
245
210
246
211
class VtfImageFile (ImageFile .ImageFile ):
@@ -281,15 +246,14 @@ def _open(self):
281
246
# flags = CompiledVtfFlags(header.flags)
282
247
pixel_format = VtfPF (header .pixel_format )
283
248
low_format = VtfPF (header .low_pixel_format )
284
- if pixel_format == VtfPF .DXT1 : # Special case for DXT1
249
+ if pixel_format in (VtfPF .DXT1_ONEBITALPHA , VtfPF .DXT1 , VtfPF .DXT3 , VtfPF .DXT5 ,
250
+ VtfPF .RGBA8888 , VtfPF .BGRA8888 ,VtfPF .A8 ):
285
251
self .mode = "RGBA"
286
- elif pixel_format in RGB_FORMATS :
252
+ elif pixel_format in ( VtfPF . RGB888 , VtfPF . BGR888 , VtfPF . UV88 ) :
287
253
self .mode = "RGB"
288
- elif pixel_format in RGBA_FORMATS :
289
- self .mode = "RGBA"
290
- elif pixel_format in L_FORMATS :
254
+ elif pixel_format == VtfPF .I8 :
291
255
self .mode = "L"
292
- elif pixel_format in LA_FORMATS :
256
+ elif pixel_format == VtfPF . IA88 :
293
257
self .mode = "LA"
294
258
else :
295
259
raise VTFException (f"Unsupported VTF pixel format: { pixel_format } " )
@@ -311,19 +275,21 @@ def _open(self):
311
275
tile = ("bcn" , (0 , 0 ) + self .size , data_start , (2 , "DXT3" ))
312
276
elif pixel_format == VtfPF .DXT5 :
313
277
tile = ("bcn" , (0 , 0 ) + self .size , data_start , (3 , "DXT5" ))
314
- elif pixel_format in ( VtfPF .RGBA8888 ,) :
278
+ elif pixel_format == VtfPF .RGBA8888 :
315
279
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("RGBA" , 0 , 1 ))
316
- elif pixel_format in ( VtfPF .RGB888 ,) :
280
+ elif pixel_format == VtfPF .RGB888 :
317
281
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("RGB" , 0 , 1 ))
318
- elif pixel_format in ( VtfPF .BGR888 ,) :
282
+ elif pixel_format == VtfPF .BGR888 :
319
283
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("BGR" , 0 , 1 ))
320
- elif pixel_format in ( VtfPF .BGRA8888 ,) :
284
+ elif pixel_format == VtfPF .BGRA8888 :
321
285
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("BGRA" , 0 , 1 ))
322
- elif pixel_format in ( VtfPF .UV88 ,) :
286
+ elif pixel_format == VtfPF .UV88 :
323
287
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("RG" , 0 , 1 ))
324
- elif pixel_format in L_FORMATS :
288
+ elif pixel_format == VtfPF . I8 :
325
289
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("L" , 0 , 1 ))
326
- elif pixel_format in LA_FORMATS :
290
+ elif pixel_format == VtfPF .A8 :
291
+ tile = ("raw" , (0 , 0 ) + self .size , data_start , ("A" , 0 , 1 ))
292
+ elif pixel_format == VtfPF .IA88 :
327
293
tile = ("raw" , (0 , 0 ) + self .size , data_start , ("LA" , 0 , 1 ))
328
294
else :
329
295
raise VTFException (f"Unsupported VTF pixel format: { pixel_format } " )
@@ -343,15 +309,12 @@ def _save(im, fp, filename):
343
309
344
310
if pixel_format == VtfPF .DXT1_ONEBITALPHA :
345
311
flags |= CompiledVtfFlags .ONEBITALPHA
346
- elif pixel_format == VtfPF .A8 :
347
- flags |= CompiledVtfFlags . EIGHTBITALPHA
348
- elif pixel_format in RGBA_FORMATS + LA_FORMATS :
312
+ elif pixel_format in ( VtfPF .DXT3 , VtfPF . DXT5 ,
313
+ VtfPF . RGBA8888 , VtfPF . BGRA8888 ,
314
+ VtfPF . A8 , VtfPF . IA88 ) :
349
315
flags |= CompiledVtfFlags .EIGHTBITALPHA
350
- elif pixel_format in RGB_FORMATS + L_FORMATS :
351
- pass
352
316
else :
353
- raise VTFException ("Unhandled case" )
354
-
317
+ pass
355
318
im = im .resize ((_closest_power (im .width ), _closest_power (im .height )))
356
319
width , height = im .size
357
320
0 commit comments