Można rzeczywiście przejść po pikselach Chunky i dokonać odpowiedniego mapowania.
Jest to dosyć wygodne - po prostu odczytujesz i zapisujesz wartości bajtowe pikseli, wymaga to konwersji Chunky.
Istnieje też inna metoda na
podmianę kolorów - używam podobnego schematu do tworzenia maski bitowej z pikselami przeźroczystymi dla BOBów.
Idea polega na tym, że odczytujemy maskę bitową pikseli o podanej wartości.
Ta maska ma ustawiony bit 1 wszędzie tam, gdzie są piksele o podanym kolorze.
Poniżej szybka implementacja: Pierwsza funkcja odczytuje maskę bitową dla podanego koloru. Druga zaś zapisuje maskę bitową w miejsce podanego koloru, czyli zastępuje wszystkie te piksele nowym kolorem.
Używam Blittera.
"Minterm" to rodzaj operacji logicznej wykonywanej na bitach.
W przypadku funkcji BltBitMap() podajemy operację logiczną mając:
- w kanale B dane źródłowe oraz,
- w C dane docelowe.
Przy odczycie:
- na starcie mam maskę złożoną z samych wartości 1,
- Dla bitplanów o wartości 1, robię D=BC (koniunkcja bitowa),
- Dla bitplanów o wartości 0, robię D=bC (koniunkcja negacji bitowej)
W rezultacie otrzymując maskę bitową koloru kodowanego tymi bitami.
Przy zapisie:
- dla bitplanów o wartości 1, dodaję te bity, czyli robię D=B+C (alternatywa bitowa)
- Dla bitplanów o wartości 0, usuwam (tzw. mask out) te bity za pomocą D=bC.
W rezultacie piksele określone przez maskę zostają ustawione na podany nowy kolor.
/* Odczyt */
PLANEPTR ReadColorMask(UBYTE color)
{
PLANEPTR mask = AllocRaster(width, height);
struct BitMap aux;
InitBitMap(&aux, depth, width, height);
WORD i;
BltClear(mask, RASSIZE(width, height), 0x04 | (0xffff << 16));
for (i = 0; i < depth; i++)
{
aux.Planes[i] = mask;
}
for (i = 0; i < depth; i++)
{
UBYTE minterm;
if (color & (1 << i))
{
minterm = ABC;
}
else
{
minterm = ANBC;
}
BltBitMap(bm, 0, 0, &aux, 0, 0, width, height, minterm, 1 << i, NULL);
}
return(mask);
}
/* Zapis */
VOID WriteColorMask(PLANEPTR mask, UBYTE color)
{
struct BitMap aux;
InitBitMap(&aux, depth, width, height);
WORD i;
for (i = 0; i < depth; i++)
{
aux.Planes[i] = mask;
}
for (i = 0; i < depth; i++)
{
UBYTE minterm;
if (color & (1 << i))
{
minterm = ABC|ABNC|ANBC;
}
else
{
minterm = ANBC;
}
BltBitMap(&aux, 0, 0, bm, 0, 0, width, height, minterm, 1 << i, NULL);
}
}