@@ -173,6 +173,14 @@ int Image::get_format_pixel_size(Format p_format) {
173
173
return 1 ;
174
174
case FORMAT_DXT5_RA_AS_RG:
175
175
return 1 ;
176
+ case FORMAT_ASTC_4x4:
177
+ return 1 ;
178
+ case FORMAT_ASTC_4x4_HDR:
179
+ return 1 ;
180
+ case FORMAT_ASTC_8x8:
181
+ return 1 ;
182
+ case FORMAT_ASTC_8x8_HDR:
183
+ return 1 ;
176
184
case FORMAT_MAX: {
177
185
}
178
186
}
@@ -213,7 +221,18 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) {
213
221
r_h = 4 ;
214
222
215
223
} break ;
224
+ case FORMAT_ASTC_4x4:
225
+ case FORMAT_ASTC_4x4_HDR: {
226
+ r_w = 4 ;
227
+ r_h = 4 ;
228
+
229
+ } break ;
230
+ case FORMAT_ASTC_8x8:
231
+ case FORMAT_ASTC_8x8_HDR: {
232
+ r_w = 8 ;
233
+ r_h = 8 ;
216
234
235
+ } break ;
217
236
default : {
218
237
r_w = 1 ;
219
238
r_h = 1 ;
@@ -222,7 +241,9 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) {
222
241
}
223
242
224
243
int Image::get_format_pixel_rshift (Format p_format) {
225
- if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) {
244
+ if (p_format == FORMAT_ASTC_8x8) {
245
+ return 2 ;
246
+ } else if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) {
226
247
return 1 ;
227
248
} else {
228
249
return 0 ;
@@ -260,6 +281,14 @@ int Image::get_format_block_size(Format p_format) {
260
281
{
261
282
return 4 ;
262
283
}
284
+ case FORMAT_ASTC_4x4:
285
+ case FORMAT_ASTC_4x4_HDR: {
286
+ return 4 ;
287
+ }
288
+ case FORMAT_ASTC_8x8:
289
+ case FORMAT_ASTC_8x8_HDR: {
290
+ return 8 ;
291
+ }
263
292
default : {
264
293
}
265
294
}
@@ -2581,19 +2610,21 @@ Error Image::decompress() {
2581
2610
_image_decompress_etc1 (this );
2582
2611
} else if (format >= FORMAT_ETC2_R11 && format <= FORMAT_ETC2_RA_AS_RG && _image_decompress_etc2) {
2583
2612
_image_decompress_etc2 (this );
2613
+ } else if (format >= FORMAT_ASTC_4x4 && format <= FORMAT_ASTC_8x8_HDR && _image_decompress_astc) {
2614
+ _image_decompress_astc (this );
2584
2615
} else {
2585
2616
return ERR_UNAVAILABLE;
2586
2617
}
2587
2618
return OK;
2588
2619
}
2589
2620
2590
- Error Image::compress (CompressMode p_mode, CompressSource p_source, float p_lossy_quality) {
2621
+ Error Image::compress (CompressMode p_mode, CompressSource p_source, float p_lossy_quality, ASTCFormat p_astc_format ) {
2591
2622
ERR_FAIL_INDEX_V_MSG (p_mode, COMPRESS_MAX, ERR_INVALID_PARAMETER, " Invalid compress mode." );
2592
2623
ERR_FAIL_INDEX_V_MSG (p_source, COMPRESS_SOURCE_MAX, ERR_INVALID_PARAMETER, " Invalid compress source." );
2593
- return compress_from_channels (p_mode, detect_used_channels (p_source), p_lossy_quality);
2624
+ return compress_from_channels (p_mode, detect_used_channels (p_source), p_lossy_quality, p_astc_format );
2594
2625
}
2595
2626
2596
- Error Image::compress_from_channels (CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality) {
2627
+ Error Image::compress_from_channels (CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality, ASTCFormat p_astc_format ) {
2597
2628
switch (p_mode) {
2598
2629
case COMPRESS_S3TC: {
2599
2630
ERR_FAIL_COND_V (!_image_compress_bc_func, ERR_UNAVAILABLE);
@@ -2611,6 +2642,10 @@ Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels
2611
2642
ERR_FAIL_COND_V (!_image_compress_bptc_func, ERR_UNAVAILABLE);
2612
2643
_image_compress_bptc_func (this , p_lossy_quality, p_channels);
2613
2644
} break ;
2645
+ case COMPRESS_ASTC: {
2646
+ ERR_FAIL_COND_V (!_image_compress_bptc_func, ERR_UNAVAILABLE);
2647
+ _image_compress_astc_func (this , p_lossy_quality, p_astc_format);
2648
+ } break ;
2614
2649
case COMPRESS_MAX: {
2615
2650
ERR_FAIL_V (ERR_INVALID_PARAMETER);
2616
2651
} break ;
@@ -2967,10 +3002,12 @@ void (*Image::_image_compress_bc_func)(Image *, float, Image::UsedChannels) = nu
2967
3002
void (*Image::_image_compress_bptc_func)(Image *, float , Image::UsedChannels) = nullptr ;
2968
3003
void (*Image::_image_compress_etc1_func)(Image *, float ) = nullptr ;
2969
3004
void (*Image::_image_compress_etc2_func)(Image *, float , Image::UsedChannels) = nullptr ;
3005
+ void (*Image::_image_compress_astc_func)(Image *, float , Image::ASTCFormat) = nullptr ;
2970
3006
void (*Image::_image_decompress_bc)(Image *) = nullptr ;
2971
3007
void (*Image::_image_decompress_bptc)(Image *) = nullptr ;
2972
3008
void (*Image::_image_decompress_etc1)(Image *) = nullptr ;
2973
3009
void (*Image::_image_decompress_etc2)(Image *) = nullptr ;
3010
+ void (*Image::_image_decompress_astc)(Image *) = nullptr ;
2974
3011
2975
3012
Vector<uint8_t > (*Image::webp_lossy_packer)(const Ref<Image> &, float ) = nullptr ;
2976
3013
Vector<uint8_t > (*Image::webp_lossless_packer)(const Ref<Image> &) = nullptr ;
@@ -3387,8 +3424,8 @@ void Image::_bind_methods() {
3387
3424
ClassDB::bind_method (D_METHOD (" is_invisible" ), &Image::is_invisible);
3388
3425
3389
3426
ClassDB::bind_method (D_METHOD (" detect_used_channels" , " source" ), &Image::detect_used_channels, DEFVAL (COMPRESS_SOURCE_GENERIC));
3390
- ClassDB::bind_method (D_METHOD (" compress" , " mode" , " source" , " lossy_quality" ), &Image::compress, DEFVAL (COMPRESS_SOURCE_GENERIC), DEFVAL (0.7 ));
3391
- ClassDB::bind_method (D_METHOD (" compress_from_channels" , " mode" , " channels" , " lossy_quality" ), &Image::compress_from_channels, DEFVAL (0.7 ));
3427
+ ClassDB::bind_method (D_METHOD (" compress" , " mode" , " source" , " lossy_quality" , " astc_format " ), &Image::compress, DEFVAL (COMPRESS_SOURCE_GENERIC), DEFVAL (0.7 ), DEFVAL (ASTC_FORMAT_4x4 ));
3428
+ ClassDB::bind_method (D_METHOD (" compress_from_channels" , " mode" , " channels" , " lossy_quality" , " astc_format " ), &Image::compress_from_channels, DEFVAL (0.7 ), DEFVAL (ASTC_FORMAT_4x4 ));
3392
3429
ClassDB::bind_method (D_METHOD (" decompress" ), &Image::decompress);
3393
3430
ClassDB::bind_method (D_METHOD (" is_compressed" ), &Image::is_compressed);
3394
3431
@@ -3472,6 +3509,10 @@ void Image::_bind_methods() {
3472
3509
BIND_ENUM_CONSTANT (FORMAT_ETC2_RGB8A1);
3473
3510
BIND_ENUM_CONSTANT (FORMAT_ETC2_RA_AS_RG);
3474
3511
BIND_ENUM_CONSTANT (FORMAT_DXT5_RA_AS_RG);
3512
+ BIND_ENUM_CONSTANT (FORMAT_ASTC_4x4);
3513
+ BIND_ENUM_CONSTANT (FORMAT_ASTC_4x4_HDR);
3514
+ BIND_ENUM_CONSTANT (FORMAT_ASTC_8x8);
3515
+ BIND_ENUM_CONSTANT (FORMAT_ASTC_8x8_HDR);
3475
3516
BIND_ENUM_CONSTANT (FORMAT_MAX);
3476
3517
3477
3518
BIND_ENUM_CONSTANT (INTERPOLATE_NEAREST);
@@ -3499,6 +3540,9 @@ void Image::_bind_methods() {
3499
3540
BIND_ENUM_CONSTANT (COMPRESS_SOURCE_GENERIC);
3500
3541
BIND_ENUM_CONSTANT (COMPRESS_SOURCE_SRGB);
3501
3542
BIND_ENUM_CONSTANT (COMPRESS_SOURCE_NORMAL);
3543
+
3544
+ BIND_ENUM_CONSTANT (ASTC_FORMAT_4x4);
3545
+ BIND_ENUM_CONSTANT (ASTC_FORMAT_8x8);
3502
3546
}
3503
3547
3504
3548
void Image::set_compress_bc_func (void (*p_compress_func)(Image *, float , UsedChannels)) {
0 commit comments