123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- #pragma once
- #include <assert.h>
- namespace Etc
- {
-
-
-
-
- class Block4x4EncodingBits
- {
- public:
- enum class Format
- {
- UNKNOWN,
-
- RGB8,
- RGBA8,
- R11,
- RG11,
- RGB8A1,
-
- FORMATS
- };
- static unsigned int GetBytesPerBlock(Format a_format)
- {
- switch (a_format)
- {
- case Format::RGB8:
- case Format::R11:
- case Format::RGB8A1:
- return 8;
- break;
- case Format::RGBA8:
- case Format::RG11:
- return 16;
- break;
- default:
- return 0;
- break;
- }
- }
- };
-
-
-
-
- class Block4x4EncodingBits_RGB8
- {
- public:
- static const unsigned int BYTES_PER_BLOCK = 8;
- inline Block4x4EncodingBits_RGB8(void)
- {
- assert(sizeof(Block4x4EncodingBits_RGB8) == BYTES_PER_BLOCK);
- for (unsigned int uiByte = 0; uiByte < BYTES_PER_BLOCK; uiByte++)
- {
- auc[uiByte] = 0;
- }
- }
- typedef struct
- {
- unsigned red2 : 4;
- unsigned red1 : 4;
-
- unsigned green2 : 4;
- unsigned green1 : 4;
-
- unsigned blue2 : 4;
- unsigned blue1 : 4;
-
- unsigned flip : 1;
- unsigned diff : 1;
- unsigned cw2 : 3;
- unsigned cw1 : 3;
-
- unsigned int selectors;
- } Individual;
- typedef struct
- {
- signed dred2 : 3;
- unsigned red1 : 5;
-
- signed dgreen2 : 3;
- unsigned green1 : 5;
-
- signed dblue2 : 3;
- unsigned blue1 : 5;
-
- unsigned flip : 1;
- unsigned diff : 1;
- unsigned cw2 : 3;
- unsigned cw1 : 3;
-
- unsigned int selectors;
- } Differential;
- typedef struct
- {
- unsigned red1b : 2;
- unsigned detect2 : 1;
- unsigned red1a : 2;
- unsigned detect1 : 3;
-
- unsigned blue1 : 4;
- unsigned green1 : 4;
-
- unsigned green2 : 4;
- unsigned red2 : 4;
-
- unsigned db : 1;
- unsigned diff : 1;
- unsigned da : 2;
- unsigned blue2 : 4;
-
- unsigned int selectors;
- } T;
- typedef struct
- {
- unsigned green1a : 3;
- unsigned red1 : 4;
- unsigned detect1 : 1;
-
- unsigned blue1b : 2;
- unsigned detect3 : 1;
- unsigned blue1a : 1;
- unsigned green1b : 1;
- unsigned detect2 : 3;
-
- unsigned green2a : 3;
- unsigned red2 : 4;
- unsigned blue1c : 1;
-
- unsigned db : 1;
- unsigned diff : 1;
- unsigned da : 1;
- unsigned blue2 : 4;
- unsigned green2b : 1;
-
- unsigned int selectors;
- } H;
- typedef struct
- {
- unsigned originGreen1 : 1;
- unsigned originRed : 6;
- unsigned detect1 : 1;
-
- unsigned originBlue1 : 1;
- unsigned originGreen2 : 6;
- unsigned detect2 : 1;
-
- unsigned originBlue3 : 2;
- unsigned detect4 : 1;
- unsigned originBlue2 : 2;
- unsigned detect3 : 3;
-
- unsigned horizRed2 : 1;
- unsigned diff : 1;
- unsigned horizRed1 : 5;
- unsigned originBlue4 : 1;
-
- unsigned horizBlue1: 1;
- unsigned horizGreen : 7;
-
- unsigned vertRed1 : 3;
- unsigned horizBlue2 : 5;
-
- unsigned vertGreen1 : 5;
- unsigned vertRed2 : 3;
-
- unsigned vertBlue : 6;
- unsigned vertGreen2 : 2;
- } Planar;
- union
- {
- unsigned char auc[BYTES_PER_BLOCK];
- unsigned long int ul;
- Individual individual;
- Differential differential;
- T t;
- H h;
- Planar planar;
- };
- };
-
-
-
-
- class Block4x4EncodingBits_A8
- {
- public:
- static const unsigned int BYTES_PER_BLOCK = 8;
- static const unsigned int SELECTOR_BYTES = 6;
- typedef struct
- {
- unsigned base : 8;
- unsigned table : 4;
- unsigned multiplier : 4;
- unsigned selectors0 : 8;
- unsigned selectors1 : 8;
- unsigned selectors2 : 8;
- unsigned selectors3 : 8;
- unsigned selectors4 : 8;
- unsigned selectors5 : 8;
- } Data;
- Data data;
- };
-
-
-
-
- class Block4x4EncodingBits_R11
- {
- public:
- static const unsigned int BYTES_PER_BLOCK = 8;
- static const unsigned int SELECTOR_BYTES = 6;
- typedef struct
- {
- unsigned base : 8;
- unsigned table : 4;
- unsigned multiplier : 4;
- unsigned selectors0 : 8;
- unsigned selectors1 : 8;
- unsigned selectors2 : 8;
- unsigned selectors3 : 8;
- unsigned selectors4 : 8;
- unsigned selectors5 : 8;
- } Data;
- Data data;
- };
- class Block4x4EncodingBits_RG11
- {
- public:
- static const unsigned int BYTES_PER_BLOCK = 16;
- static const unsigned int SELECTOR_BYTES = 12;
- typedef struct
- {
-
- unsigned baseR : 8;
- unsigned tableIndexR : 4;
- unsigned multiplierR : 4;
- unsigned selectorsR0 : 8;
- unsigned selectorsR1 : 8;
- unsigned selectorsR2 : 8;
- unsigned selectorsR3 : 8;
- unsigned selectorsR4 : 8;
- unsigned selectorsR5 : 8;
-
- unsigned baseG : 8;
- unsigned tableIndexG : 4;
- unsigned multiplierG : 4;
- unsigned selectorsG0 : 8;
- unsigned selectorsG1 : 8;
- unsigned selectorsG2 : 8;
- unsigned selectorsG3 : 8;
- unsigned selectorsG4 : 8;
- unsigned selectorsG5 : 8;
- } Data;
- Data data;
- };
- }
|