Przyznam, że nie jestem za bardzo obeznany z licencjami, więc ten kod udostępniam jako domena publiczna.

Możesz korzystać do woli bez restrykcji.
Zrobiłem łączenie par 4-bitowych pikseli w 8-bitowe przy odczycie, oraz w drugą stronę przy zapisie.
Zrobiłem też pewien manewr, który usprawnia czytanie bajtowych pikseli z długich słów. Otóż wiadomo że normalnie piksele są ułożone po 4 w rejestrze i to niekoniecznie w wygodnej kolejności, bo nawet 0, 1, 2, 3 - kolejność liniowa daje dostęp do piksela nr 3 w pierwszej kolejności (bo leży w najmłodszym bajcie).
Zrobiłem zatem tak, że definiuje się
własną funkcję, która przy zapisie pikseli (Chunky-To-Planar) przyjmuje indeks piksela i musi zwrócić wartość piksela o tym indeksie. To wszystko o co musi zadbać program. Resztę załatwia konwerter.
Przy odczycie pikseli (Planar-to-Chunky) tej funkcji przekazywany jest indeks i wartość piksela, zaś funkcja nic nie zwraca.
Funkcja zostaje wywołana oddzielnie dla każdego z 32 pikseli. Piksele są buforowane i zapisywane.
Wewnętrznie program może manipulować tymi danymi do woli, tzn. mapować piksele, przestawiać je itd.
Tak więc teraz WriteChunkyPixels() w pełni zgodny z oryginałem jest całkiem łatwy do napisania za pomocą mojej procedury. Jeśli się nie mylę, to nawet przesuw pikseli będzie łatwo zrealizować - zwracając piksele z odpowiednio przesuniętych pozycji.

(Początkowo chciałem by Blitter przesuwał dane planarne).
Jak tylko opakuję w WriteChunkyPixels() to będzie spokój z tym zagadnieniem.