#include #include typedef unsigned char uint8; typedef unsigned long uint32; typedef unsigned int uint; uint32 planar[8] = { 0 }; /* bitplany */ uint32 index[256] = { 0 }; uint licznik = 0; /* Konwersja z planar do index */ /* tempdat: Dane z planu */ /* mask: Jakie piksele uwzględniać (maska) */ /* plane: Numer bitplanu */ /* min: Minimalna wartość piksela */ /* max: Maksymalna wartość piksela + 1 */ void Planar2Index(uint32 tempdat, uint32 mask, uint plane, uint min, uint max) { uint32 data; licznik++; /* Zliczamy wywołania */ data = mask & tempdat; /* Pobieram plan */ if (plane > 0) { plane--; uint32 nextdata = planar[plane]; if (data) { /* 'prawe poddrzewo', piksele [(min+max)/2, max] */ Planar2Index(nextdata, data, plane, (min + max) >> 1, max); } if (data ^= mask) { /* 'lewe poddrzewo', piksele [min, (min+max)/2] */ Planar2Index(nextdata, data, plane, min, (min + max) >> 1); } } else { index[min] = data ^ mask; index[min + 1] = data; } } int main(void) { uint i; planar[0] = 0x55555555; planar[1] = 0x33333333; planar[2] = 0x0f0f0f0f; planar[3] = 0x00ff00ff; planar[4] = 0x0000ffff; Planar2Index(planar[7], 0xffffffff, 7, 0, 256); printf("Licznik = %d\n", licznik); for (i = 0; i < 256; i++) { if (index[i]) { printf("$%02x: $%08x\n", i, index[i]); } } return(0); }