forked from hglm/detex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
detex.h
1194 lines (1040 loc) · 43.2 KB
/
detex.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
Copyright (c) 2015 Harm Hanemaaijer <fgenfb@yahoo.com>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef __DETEX_H__
#define __DETEX_H__
#undef __BEGIN_DECLS
#undef __END_DECLS
#ifdef __cplusplus
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS }
#else
#define __BEGIN_DECLS /* empty */
#define __END_DECLS /* empty */
#endif
/* Generic helper definitions for shared library support. */
#if defined _WIN32 || defined __CYGWIN__
#define DETEX_HELPER_SHARED_IMPORT __declspec(dllimport)
#define DETEX_HELPER_SHARED_EXPORT __declspec(dllexport)
#define DETEX_HELPER_SHARED_LOCAL
#else
#if __GNUC__ >= 4
#define DETEX_HELPER_SHARED_IMPORT __attribute__ ((visibility ("default")))
#define DETEX_HELPER_SHARED_EXPORT __attribute__ ((visibility ("default")))
#define DETEX_HELPER_SHARED_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define DETEX_HELPER_SHARED_IMPORT
#define DETEX_HELPER_SHARED_EXPORT
#define DETEX_HELPER_SHARED_LOCAL
#endif
#endif
/* Now we use the generic helper definitions above to define DETEX_API and DETEX_LOCAL. */
/* DETEX_API is used for the public API symbols. It either imports or exports the symbol */
/* for shared/DLL libraries (or does nothing for static build). DETEX_LOCAL is used for */
/* non-API symbols. */
#ifdef DETEX_SHARED
/* Defined if DETEX is compiled as a shared library. */
#ifdef DETEX_SHARED_EXPORTS
/* Defined if we are building the detex shared library (instead of using it). */
#define DETEX_API DETEX_HELPER_SHARED_EXPORT
#else
#define DETEX_API DETEX_HELPER_SHARED_IMPORT
#endif /* DETEX_SHARED_EXPORTS */
#define DETEX_LOCAL DETEX_HELPER_SHARED_LOCAL
#else
/* DETEX_SHARED is not defined: this means detex is a static lib. */
#define DETEX_API
#define DETEX_LOCAL
#endif /* DETEX_SHARED */
__BEGIN_DECLS
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#define DETEX_INLINE_ONLY __attribute__((always_inline)) inline
#define DETEX_RESTRICT __restrict
/* Maximum uncompressed block size in bytes. */
#define DETEX_MAX_BLOCK_SIZE 256
/* Detex library pixel formats. */
enum {
/* The format has 16-bit components. */
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT = 0x1,
/* The format has 32-bit components. */
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT = 0x2,
/* The format has an alpha component. */
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT = 0x4,
/* The sequential component order is RGB. */
DETEX_PIXEL_FORMAT_RGB_COMPONENT_ORDER_BIT = 0x0,
/* The sequential component order is BGR. */
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT = 0x8,
/* The format has one component. */
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS = 0x0,
/* The format has two components. */
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS = 0x10,
/* The format has three components. */
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS = 0x20,
/* The format has four components. */
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS = 0x30,
/* The format is stored as 8-bit pixels. */
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS = 0x000,
/* The format is stored as 16-bit pixels. */
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS = 0x100,
/* The format is stored as 24-bit pixels. */
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS = 0x200,
/* The format is stored as 32-bit pixels. */
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS = 0x300,
/* The format is stored as 48-bit pixels. */
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS = 0x500,
/* The format is stored as 64-bit pixels. */
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS = 0x700,
/* The format is stored as 96-bit pixels. */
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS = 0xB00,
/* The format is stored as 128-bit pixels. */
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS = 0xF00,
/* The format has signed integer components. */
DETEX_PIXEL_FORMAT_SIGNED_BIT = 0x1000,
/* The format has (half-)float components. */
DETEX_PIXEL_FORMAT_FLOAT_BIT = 0x2000,
/* The fomat is HDR (high dynamic range). */
DETEX_PIXEL_FORMAT_HDR_BIT = 0x4000,
DETEX_PIXEL_FORMAT_RGBA8 = (
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_BGRA8 = (
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_RGBX8 = (
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_BGRX8 = (
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_RGB8 = (
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_BGR8 = (
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_R8 = (
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_SIGNED_R8 = (
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT
),
DETEX_PIXEL_FORMAT_RG8 = (
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_SIGNED_RG8 = (
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT
),
DETEX_PIXEL_FORMAT_R16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_SIGNED_R16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT
),
DETEX_PIXEL_FORMAT_RG16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_SIGNED_RG16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT
),
DETEX_PIXEL_FORMAT_RGB16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_RGBX16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_RGBA16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS
),
DETEX_PIXEL_FORMAT_FLOAT_R16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_R16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RG16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RG16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBX16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBX16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBA16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBA16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGB16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGB16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_BGRX16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_BGRX16_HDR = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_SIGNED_FLOAT_BGRX16 = (
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_SIGNED_BIT |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_R32 = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_R32_HDR = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RG32 = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RG32_HDR = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGB32 = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGB32_HDR = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBX32 = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBX32_HDR = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBA32 = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT
),
DETEX_PIXEL_FORMAT_FLOAT_RGBA32_HDR = (
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
DETEX_PIXEL_FORMAT_FLOAT_BIT |
DETEX_PIXEL_FORMAT_HDR_BIT
),
DETEX_PIXEL_FORMAT_A8 = (
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS
),
};
/* Mode mask flags. */
enum {
DETEX_MODE_MASK_ETC_INDIVIDUAL = 0x1,
DETEX_MODE_MASK_ETC_DIFFERENTIAL = 0x2,
DETEX_MODE_MASK_ETC_T = 0x4,
DETEX_MODE_MASK_ETC_H = 0x8,
DETEX_MODE_MASK_ETC_PLANAR = 0x10,
DETEX_MODE_MASK_ALL_MODES_ETC1 = 0x3,
DETEX_MODE_MASK_ALL_MODES_ETC2 = 0x1F,
DETEX_MODE_MASK_ALL_MODES_ETC2_PUNCHTHROUGH = 0X1E,
DETEX_MODE_MASK_ALL_MODES_BPTC = 0xFF,
DETEX_MODE_MASK_ALL_MODES_BPTC_FLOAT = 0x3FFF,
DETEX_MODE_MASK_ALL = 0XFFFFFFFF,
};
/* Decompression function flags. */
enum {
/* Function returns false (invalid block) when the compressed block */
/* is in a format not allowed to be generated by an encoder. */
DETEX_DECOMPRESS_FLAG_ENCODE = 0x1,
/* For compression formats that have opaque and non-opaque modes, */
/* return false (invalid block) when the compressed block is encoded */
/* using a non-opaque mode. */
DETEX_DECOMPRESS_FLAG_OPAQUE_ONLY = 0x2,
/* For compression formats that have opaque and non-opaque modes, */
/* return false (invalid block) when the compressed block is encoded */
/* using an opaque mode. */
DETEX_DECOMPRESS_FLAG_NON_OPAQUE_ONLY = 0x4,
};
/* Set mode function flags. */
enum {
/* The block is opaque (alpha is always 0xFF). */
DETEX_SET_MODE_FLAG_OPAQUE = 0x2,
/* The block is non-opaque (alpha is not always 0xFF). */
DETEX_SET_MODE_FLAG_NON_OPAQUE = 0x4,
/* The block has punchthrough alpha (alpha is either 0x00 or 0xFF). */
DETEX_SET_MODE_FLAG_PUNCHTHROUGH = 0x8,
/* The block only consists of one or two different pixel colors. */
DETEX_SET_MODE_FLAG_MAX_TWO_COLORS = 0x10,
};
/*
* Decompression functions for 8-bit RGB8/RGBA8 formats. The output pixel format
* is DETEX_PIXEL_FORMAT_RGBA8 or DETEX_PIXEL_FORMAT_RGBX8 (32-bit pixels with
* optional alpha component, red component in lowest-order byte. When the
* texture format does not have alpha, alpha is set to 0xFF.
*/
/* Decompress a 64-bit 4x4 pixel texture block compressed using the ETC1 */
/* format. */
DETEX_API bool detexDecompressBlockETC1(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the ETC2 */
/* format. */
DETEX_API bool detexDecompressBlockETC2(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the */
/* ETC2_PUNCHTROUGH format. */
DETEX_API bool detexDecompressBlockETC2_PUNCHTHROUGH(const uint8_t *bitstring,
uint32_t mode_mask, uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the ETC2_EAC */
/* format. */
DETEX_API bool detexDecompressBlockETC2_EAC(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the BC1 */
/* format. */
DETEX_API bool detexDecompressBlockBC1(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the BC1A */
/* format. */
DETEX_API bool detexDecompressBlockBC1A(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the BC2 */
/* format. */
DETEX_API bool detexDecompressBlockBC2(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the BC3 */
/* format. */
DETEX_API bool detexDecompressBlockBC3(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the BPTC */
/* (BC7) format. */
DETEX_API bool detexDecompressBlockBPTC(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/*
* Decompression functions for 8-bit unsigned R and RG formats. The
* output format is DETEX_PIXEL_FORMAT_R8 or DETEX_PIXEL_FORMAT_RG8.
*/
/* Decompress a 64-bit 4x4 pixel texture block compressed using the */
/* unsigned RGTC1 (BC4) format. */
DETEX_API bool detexDecompressBlockRGTC1(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* unsigned RGTC2 (BC5) format. */
DETEX_API bool detexDecompressBlockRGTC2(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/*
* Decompression functions for 16-bit unsigned/signed R and RG formats. The
* output format is DETEX_PIXEL_FORMAT_R16, DETEX_PIXEL_FORMAT_SIGNED_R16,
* DETEX_PIXEL_FORMAT_RG16, or DETEX_PIXEL_FORMAT_SIGNED_RG16.
*/
/* Decompress a 64-bit 4x4 pixel texture block compressed using the */
/* signed RGTC1 (signed BC4) format. */
DETEX_API bool detexDecompressBlockSIGNED_RGTC1(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* signed RGTC2 (signed BC5) format. */
DETEX_API bool detexDecompressBlockSIGNED_RGTC2(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the */
/* ETC2_R11_EAC format. */
DETEX_API bool detexDecompressBlockEAC_R11(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 64-bit 4x4 pixel texture block compressed using the */
/* ETC2_SIGNED_R11_EAC format. */
DETEX_API bool detexDecompressBlockEAC_SIGNED_R11(const uint8_t *bitstring,
uint32_t mode_mask, uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* ETC2_RG11_EAC format. */
DETEX_API bool detexDecompressBlockEAC_RG11(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* ETC2_SIGNED_RG11_EAC format. */
DETEX_API bool detexDecompressBlockEAC_SIGNED_RG11(const uint8_t *bitstring,
uint32_t mode_mask, uint32_t flags, uint8_t *pixel_buffer);
/*
* Decompression functions for 16-bit half-float formats. The output format is
* DETEX_PIXEL_FORMAT_FLOAT_RGBX16 or DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16.
*/
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* BPTC_FLOAT (BC6H) format. The output format is */
/* DETEX_PIXEL_FORMAT_FLOAT_RGBX16. */
DETEX_API bool detexDecompressBlockBPTC_FLOAT(const uint8_t *bitstring, uint32_t mode_mask,
uint32_t flags, uint8_t *pixel_buffer);
/* Decompress a 128-bit 4x4 pixel texture block compressed using the */
/* BPTC_FLOAT (BC6H_FLOAT) format. The output format is */
/* DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16. */
DETEX_API bool detexDecompressBlockBPTC_SIGNED_FLOAT(const uint8_t *bitstring,
uint32_t mode_mask, uint32_t flags, uint8_t *pixel_buffer);
/*
* Get mode functions. They return the internal compression format mode used
* inside the compressed block. For compressed formats that do not use a mode,
* there is no GetMode function.
*/
DETEX_API uint32_t detexGetModeBC1(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeETC1(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeETC2(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeETC2_PUNCHTHROUGH(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeETC2_EAC(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeBPTC(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeBPTC_FLOAT(const uint8_t *bitstring);
DETEX_API uint32_t detexGetModeBPTC_SIGNED_FLOAT(const uint8_t *bitstring);
/*
* Set mode functions. The set mode function modifies a compressed texture block
* so that the specified mode is set, making use of information about the block
* (whether it is opaque, non-opaque or punchthrough for formats with alpha,
* whether at most two different colors are used). For compressed formats
* that do not use a mode, there is no SetMode function.
*/
DETEX_API void detexSetModeBC1(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeETC1(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeETC2(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeETC2_PUNCHTHROUGH(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeETC2_EAC(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeBPTC(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
DETEX_API void detexSetModeBPTC_FLOAT(uint8_t *bitstring, uint32_t mode, uint32_t flags,
uint32_t *colors);
/* Compressed texture format definitions for general texture decompression */
/* functions. */
#define DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(n) ((uint32_t)n << 24)
enum {
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_UNCOMPRESSED = 0,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1 = 1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT1 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_S3TC = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT1A = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT3 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_DXT5 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC4_UNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC4_SNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC5_UNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC5_SNORM = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC6H_UF16 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC6H_SF16 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC7 = DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC1,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_PUNCHTHROUGH,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_EAC,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_R11,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_R11,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_RG11,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_RG11,
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ASTC_4X4,
};
enum {
DETEX_TEXTURE_FORMAT_PIXEL_FORMAT_MASK = 0x0000FFFF,
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT = 0x00800000,
DETEX_TEXTURE_FORMAT_BC1 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1) |
DETEX_PIXEL_FORMAT_RGBX8
),
DETEX_TEXTURE_FORMAT_BC1A = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC1A) |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_BC2 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC2) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_BC3 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BC3) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_RGTC1 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC1) |
DETEX_PIXEL_FORMAT_R8
),
DETEX_TEXTURE_FORMAT_SIGNED_RGTC1 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC1) |
DETEX_PIXEL_FORMAT_SIGNED_R16
),
DETEX_TEXTURE_FORMAT_RGTC2 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_RGTC2) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RG8
),
DETEX_TEXTURE_FORMAT_SIGNED_RGTC2 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_SIGNED_RGTC2) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_SIGNED_RG16
),
DETEX_TEXTURE_FORMAT_BPTC_FLOAT = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_FLOAT) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_FLOAT_RGBX16
),
DETEX_TEXTURE_FORMAT_BPTC_SIGNED_FLOAT = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC_SIGNED_FLOAT) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16
),
DETEX_TEXTURE_FORMAT_BPTC = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_BPTC) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_ETC1 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC1) |
DETEX_PIXEL_FORMAT_RGBX8
),
DETEX_TEXTURE_FORMAT_ETC2 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2) |
DETEX_PIXEL_FORMAT_RGBX8
),
DETEX_TEXTURE_FORMAT_ETC2_PUNCHTHROUGH = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_PUNCHTHROUGH) |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_ETC2_EAC = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ETC2_EAC) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RGBA8
),
DETEX_TEXTURE_FORMAT_EAC_R11 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_R11) |
DETEX_PIXEL_FORMAT_R16
),
DETEX_TEXTURE_FORMAT_EAC_SIGNED_R11 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_R11) |
DETEX_PIXEL_FORMAT_SIGNED_R16
),
DETEX_TEXTURE_FORMAT_EAC_RG11 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_RG11) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RG16
),
DETEX_TEXTURE_FORMAT_EAC_SIGNED_RG11 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_EAC_SIGNED_RG11) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_SIGNED_RG16
),
DETEX_TEXTURE_FORMAT_ASTC_4X4 = (
DETEX_TEXTURE_FORMAT_COMPRESSED_FORMAT_BITS(
DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_ASTC_4X4 ) |
DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT |
DETEX_PIXEL_FORMAT_RGBA8
),
};
typedef struct {
uint32_t format;
uint8_t *data;
int width;
int height;
int width_in_blocks;
int height_in_blocks;
} detexTexture;
/*
* General texture decompression functions (tiled or linear) with specified
* compression format.
*/
/*
* General block decompression function. Block is decompressed using the given
* compressed format, and stored in the given pixel format.
*/
DETEX_API bool detexDecompressBlock(const uint8_t *bitstring, uint32_t texture_format,
uint32_t mode_mask, uint32_t flags, uint8_t *pixel_buffer,
uint32_t pixel_format);
/*
* Decode texture function (tiled). Decode an entire compressed texture into an
* array of image buffer tiles (corresponding to compressed blocks), converting
* into the given pixel format.
*/
DETEX_API bool detexDecompressTextureTiled(const detexTexture *texture, uint8_t *pixel_buffer,
uint32_t pixel_format);
/*
* Decode texture function (linear). Decode an entire texture into a single
* image buffer, with pixels stored row-by-row, converting into the given pixel
* format.
*/
DETEX_API bool detexDecompressTextureLinear(const detexTexture *texture, uint8_t *pixel_buffer,
uint32_t pixel_format);
/*
* Miscellaneous functions.
*/
/*
* Convert pixels between different formats. The target pixel buffer must
* be allocated with sufficient size to the hold the result. Returns true if
* succesful.
*/
DETEX_API bool detexConvertPixels(uint8_t *source_pixel_buffer, uint32_t nu_pixels,
uint32_t source_pixel_format, uint8_t *target_pixel_buffer,
uint32_t target_pixel_format);
/* Convert in-place, modifying the source pixel buffer only. If any conversion step changes the */
/* pixel size, the function will not be succesful and return false. */
DETEX_API bool detexConvertPixelsInPlace(uint8_t * DETEX_RESTRICT source_pixel_buffer,
uint32_t nu_pixels, uint32_t source_pixel_format, uint32_t target_pixel_format);
/* Return the component bitfield masks for a pixel format (pixel size must be at most 64 bits). */
/* Return true if succesful. */
DETEX_API bool detexGetComponentMasks(uint32_t texture_format, uint64_t *red_mask, uint64_t *green_mask,
uint64_t *blue_mask, uint64_t *alpha_mask);
/* Return a text description/identifier of the texture type. */
DETEX_API const char *detexGetTextureFormatText(uint32_t texture_format);
/* Return a alternative text description of the texture type. Returns empty string */
/* when there is no alternative description. */
DETEX_API const char *detexGetAlternativeTextureFormatText(uint32_t texture_format);
/* Return OpenGL TexImage2D/KTX file parameters for a texture format. */
DETEX_API bool detexGetOpenGLParameters(uint32_t texture_format, int *gl_internal_format,
uint32_t *gl_format, uint32_t *gl_type);
/* Return DirectX 10 format for a texture format. */
DETEX_API bool detexGetDX10Parameters(uint32_t texture_format, uint32_t *dx10_format);
/* Return the error message for the last encountered error. */
DETEX_API const char *detexGetErrorMessage();
/*
* HDR-related functions.
*/
/* Set HDR gamma curve parameters. */
DETEX_API void detexSetHDRParameters(float gamma, float range_min, float range_max);
/* Calculate the dynamic range of a pixel buffer. Valid for float and half-float formats. */
/* Returns true if successful. */
DETEX_API bool detexCalculateDynamicRange(uint8_t *pixel_buffer, int nu_pixels, uint32_t pixel_format,
float *range_min_out, float *range_max_out);
/*
* Texture file loading.
*/
/* Load texture from KTX file with mip-maps. Returns true if successful. */
/* nu_levels is a return parameter that returns the number of mipmap levels found. */
/* textures_out is a return parameter for an array of detexTexture pointers that is allocated, */
/* free with free(). textures_out[i] are allocated textures corresponding to each level, free */
/* with free(). */
DETEX_API bool detexLoadKTXFileWithMipmaps(const char *filename, int max_mipmaps, detexTexture ***textures_out,
int *nu_levels_out);
/* Load texture from KTX file (first mip-map only). Returns true if successful. */
/* The texture is allocated, free with free(). */
DETEX_API bool detexLoadKTXFile(const char *filename, detexTexture **texture_out);
/* Save textures to KTX file (multiple mip-maps levels). Return true if succesful. */
DETEX_API bool detexSaveKTXFileWithMipmaps(detexTexture **textures, int nu_levels, const char *filename);
/* Save texture to KTX file (single mip-map level). Returns true if succesful. */
DETEX_API bool detexSaveKTXFile(detexTexture *texture, const char *filename);
/* Load texture from DDS file with mip-maps. Returns true if successful. */
/* nu_levels is a return parameter that returns the number of mipmap levels found. */
/* textures_out is a return parameter for an array of detexTexture pointers that is allocated, */
/* free with free(). textures_out[i] are allocated textures corresponding to each level, free */
/* with free(). */
DETEX_API bool detexLoadDDSFileWithMipmaps(const char *filename, int max_mipmaps, detexTexture ***textures_out,
int *nu_levels_out);
/* Load texture from DDS file (first mip-map only). Returns true if successful. */
/* The texture is allocated, free with free(). */
DETEX_API bool detexLoadDDSFile(const char *filename, detexTexture **texture_out);
/* Save textures to DDS file (multiple mip-maps levels). Return true if succesful. */
DETEX_API bool detexSaveDDSFileWithMipmaps(detexTexture **textures, int nu_levels, const char *filename);
/* Save texture to DDS file (single mip-map level). Returns true if succesful. */
DETEX_API bool detexSaveDDSFile(detexTexture *texture, const char *filename);
/* Load texture file (type autodetected from extension) with mipmaps. */
DETEX_API bool detexLoadTextureFileWithMipmaps(const char *filename, int max_mipmaps, detexTexture ***textures_out,
int *nu_levels_out);
/* Load texture file (type autodetected from extension). */
DETEX_API bool detexLoadTextureFile(const char *filename, detexTexture **texture_out);
/* Load texture from raw file (first mip-map only) given the format and dimensions */
/* in texture. Returns true if successful. */
/* The texture->data is allocated, free with free(). */
DETEX_API bool detexLoadRawFile(const char *filename, detexTexture *texture);
/* Save texture to raw file (first mip-map only) given the format and dimensions */
/* in texture. Returns true if successful. */
DETEX_API bool detexSaveRawFile(detexTexture *texture, const char *filename);
/* Return pixel size in bytes for pixel format or texture format (decompressed). */
static DETEX_INLINE_ONLY int detexGetPixelSize(uint32_t pixel_format) {
return 1 + ((pixel_format & 0xF00) >> 8);
}
/* Return the number of components of a pixel format or texture format. */
static DETEX_INLINE_ONLY int detexGetNumberOfComponents(uint32_t pixel_format) {
return 1 + ((pixel_format & 0x30) >> 4);
}
/* Return the component size in bytes of a pixel format or texture format. */
static DETEX_INLINE_ONLY int detexGetComponentSize(uint32_t pixel_format) {
return 1 << (pixel_format & 0x3);
}
/* Return the approximate precision in bits of the components of a pixel format. */
static DETEX_INLINE_ONLY uint32_t detexGetComponentPrecision(uint32_t pixel_format) {
return detexGetComponentSize(pixel_format) * 8 -
((pixel_format & DETEX_PIXEL_FORMAT_FLOAT_BIT) != 0) * 5 *
(1 + (detexGetComponentSize(pixel_format) == 4));
}
/* Return the total size of a compressed texture. */
static DETEX_INLINE_ONLY uint32_t detexTextureSize(uint32_t width_in_blocks,
uint32_t height_in_blocks, uint32_t pixel_format) {
return width_in_blocks * height_in_blocks * detexGetPixelSize(pixel_format) * 16;
}
/* Return whether a pixel or texture format has an alpha component. */
static DETEX_INLINE_ONLY uint32_t detexFormatHasAlpha(uint32_t pixel_format) {
return (pixel_format & DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT) != 0;
}
/* Return the compressed texture type index of a texture format. */
static DETEX_INLINE_ONLY uint32_t detexGetCompressedFormat(uint32_t texture_format) {
return texture_format >> 24;
}
/* Return the block size of a compressed texture format in bytes. */
static DETEX_INLINE_ONLY uint32_t detexGetCompressedBlockSize(uint32_t texture_format) {
return 8 + ((texture_format & DETEX_TEXTURE_FORMAT_128BIT_BLOCK_BIT) >> 20);
}
/* Return whether a texture format is compressed. */
static DETEX_INLINE_ONLY uint32_t detexFormatIsCompressed(uint32_t texture_format) {
return detexGetCompressedFormat(texture_format) != DETEX_COMPRESSED_TEXTURE_FORMAT_INDEX_UNCOMPRESSED;
}
/* Return the pixel format of a texture format. */
static DETEX_INLINE_ONLY uint32_t detexGetPixelFormat(uint32_t texture_format) {
return texture_format & DETEX_TEXTURE_FORMAT_PIXEL_FORMAT_MASK;
}
DETEX_API extern const uint8_t detex_clamp0to255_table[767];
/* Clamp an integer value in the range -255 to 511 to the the range 0 to 255. */
static DETEX_INLINE_ONLY uint8_t detexClamp0To255(int x) {
return detex_clamp0to255_table[x + 255];
}
/* Clamp a float point value to the range 0.0 to 1.0f. */
static DETEX_INLINE_ONLY float detexClamp0To1(float f) {
if (f < 0.0f)
return 0.0f;
else if (f > 1.0f)
return 1.0f;
else
return f;
}
/* Integer division using look-up tables, used by BC1/2/3 and RGTC (BC4/5) */
/* decompression. */
DETEX_API extern const uint8_t detex_division_by_3_table[768];
static DETEX_INLINE_ONLY uint32_t detexDivide0To767By3(uint32_t value) {
return detex_division_by_3_table[value];
}
DETEX_API extern const uint8_t detex_division_by_7_table[1792];
static DETEX_INLINE_ONLY uint32_t detexDivide0To1791By7(uint32_t value) {
return detex_division_by_7_table[value];
}
static DETEX_INLINE_ONLY int8_t detexSignInt32(int v) {
return (int8_t)((v >> 31) | - (- v >> 31));
}
static DETEX_INLINE_ONLY int detexDivideMinus895To895By7(int value) {
return (int8_t)detex_division_by_7_table[abs(value)] * detexSignInt32(value);
}
DETEX_API extern const uint8_t detex_division_by_5_table[1280];
static DETEX_INLINE_ONLY uint32_t detexDivide0To1279By5(uint32_t value) {
return detex_division_by_5_table[value];
}
static DETEX_INLINE_ONLY int detexDivideMinus639To639By5(int value) {
return (int8_t)detex_division_by_5_table[abs(value)] * detexSignInt32(value);
}
/*
* Define some short functions for pixel packing/unpacking. The compiler will
* take care of optimization by inlining and removing unused functions.
*
* The pixel format used corresponds to formats with an RGB component order,
* including:
*
* DETEX_PIXEL_FORMAT_RGB8, DETEX_PIXEL_FORMAT_RGBA8
* detexPack32RGB8Alpha0xFF, detexPack32R8, detexPack32G8, detexPack32B8,
* detexPixel32GetR8, detexPixel32GetG8, detexPixel32GetB8
* DETEX_PIXEL_FORMAT_RGBA8
* detexPack32RGBA8, detexPack32A8, detexPixel32GetA8
* DETEX_PIXEL_FORMAT_RG16, DETEX_PIXEL_FORMAT_SIGNED_RG16,
* DETEX_PIXEL_FORMAT_FLOAT_RG16
* detexPack32RG16, detexPack32R16, detexPack32G16, detexPack32RG16,
* detexPixel32GetR16, detexPixel32GetG16