2.1 Rastrové operace
Rastrovou operací rozumíme výsledek kombinace bitů ze zdrojové bitmapy, cílové
bitmapy a aktuálního štětce (vzoru). Jak jsme se již dověděli v metodách BitBlt
a StretchBlt tuto operaci specifikuje parametr dwROP. Protože bitmapy
jsou tvořeny maticí bodů, představují tyto operace logické operace právě mezi
těmito body. Pro následující kapitoly platí, že bod s hodnotou 0 odpovídá černé
barvě a bod s hodnotou 1 bílé barvě.
2.1.1 SRCOPY
Tato operace provádí přímé kopírování zdrojového kontext do cílového.
Použitím této operace můžeme beze změny vytisknout bitmapu.

2.1.2 SRCAND
Tato operace kombinuje body zdrojového a cílového kontext pomocí logické operace AND.
Jak uvidíme později, pomocí této operace můžeme vytisknout pouze černé plochy
zdrojové bitmapy a ostatní budou v cílovém kontextu ponechány beze změny.

2.1.3 SRCPAINT
Pomocí této operace se body zdrojové a cílové bitmapy kombinují pomocí logické
operace OR. Podívejme se opět na následující obrázek.

2.1.4 SRCINVERT
Tato rastrová operace používá pro kombinaci bitů jednotlivých bitmap logickou
operaci XOR. Pokud je použita dvakrát, uvede se vše do původního stavu. Jak uvidíme
později, lze tuto operace také výhodně použít pro transparentní tisk.

2.2 Transparentní tisk pomocí masky
Na předcházejících příkladech je jasně patrné, jak fungují rastrové operace a
můžeme je tedy použít k transparentnímu kreslení bitmap. V prvním příkladě (z
předchozího dílu), který jsme probírali bylo jasné, že červené pozadí není
určeno pro tisk a mělo by být při této operaci vynecháno. Nějakým způsobem
musíme tedy definovat, že červená barva je průhledná a všechny body bitmapy, které
jsou červené při tisku ignorovat (takový bod pak nazýváme transparentní). Tento
problém se obvykle řeší pomocí masky.
2.3 Maska
Maska se skládá ze dvou částí, neprůhledná část (opaque), která je
složena z černých bodů a průhledná část (transparent), jež je složena z
bílých bodů. V neprůhledné části jsou body zdrojové bitmapy zobrazeny a v
průhledné nikoliv. Tím je zajištěna definice průhledných a neprůhledných částí
jedné bitmapy. Jelikož je maska vždy složena ze dvou barev (černá a bílá), je
ideální použít černobílou (monochromatickou) bitmapu (může však být použita i
barevná).
2.4 Konverze černobílých a barevných bitmap
Pokud pro masky používáme černobílé bitmapy, je důležité vědět, jakým
algoritmem se převádějí černobílé bitmapy na barevné a naopak. Pro tyto konverze
je základním údajem aktuální barva textu (popředí) a aktuální barva pozadí. Tyto
barvy mohou být explicitně nastaveny pomocí metod SetTextColor (popředí) a SetBkColor
(pozadí).
Při převodu černobílé bitmapy na barevnou jsou všechny černé
bity (0) konvertovány na barvu popředí (text) a všechny bílé bity na barvu pozadí.
Pokud tedy v kontextu nastavíme barvu textu na červenou, barvu pozadí na zelenou a
provedeme konverzi černobílé bitmapy bude výsledek následující (nejdříve ukázka
zdrojového kódu).
pDC->SetTextColor(RGB(255, 0, 0));
pDC->SetBkColor(RGB(0, 255, 0)); |

Při převodu barevné bitmapy na černobílou je postup podobný,
všechny bity jejichž barva odpovídá aktuální barvě pozadí jsou převedeny na
bílé a všechny ostatní bity jsou převedeny na černé (barva textu není v tomto
případě použita).
Pro úplnost dodejme, že ke konverzi z černobílé bitmapy na
barevnou dochází tehdy, vložíme-li tuto bitmapu do barevného kontextu. Podobně
dochází ke konverzi barevné bitmapy, vložíme-li ji do černobílého kontextu.
2.5 Metoda pozitivní masky - True Mask Method
První způsob průhledného kreslení nevyžaduje změnu zdrojové bitmapy. Tato
vlastnost je mnohdy velice užitečná, avšak je vykoupená jednou rastrovou operací
navíc. Přepokládejme tedy existenci zdrojové bitmapy a masky, která definuje
průhledné (bílá barva) a neprůhledné (černá barva) části.

Nyní si ukážeme zdrojový kód, který pomocí tří rastrových
operací vykreslí bitmapu transparentně (tzn. červené body budou ignorovány). Ukázka
je maximálně redukována, takže nekontroluje chybové návratové hodnoty a nevrací
kontexty do původních stavů. Ukázka dále přepokládá, že existují a jsou v
pořádku nahrány dvě bitmapy oSourceBmp a oMaskBmp, že existuje
inicializovaný ukazatel na cílový kontext pDC a proměnné nWidth a nHeight,
které obsahují rozměry obou bitmap.
CDC oSourceDC, oMaskDC;
oSourceDC.CreateCompatibleDC(pDC);
oMaskDC.CreateCompatibleDC(pDC);
oSourceDC.SelectObject(&oSourceBmp);
oMaskDC.SelectObject(&oMaskBmp);
pDC->SetBkColor(RGB(255, 255, 255));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->BitBlt(0, 0, nWidth, nHeight, &oSourceDC, 0, 0, SRCINVERT);
pDC->BitBlt(0, 0, nWidth, nHeight, &oMaskDC, 0, 0, SRCAND);
pDC->BitBlt(0, 0, nWidth, nHeight, &oSourceDC, 0, 0, SRCINVERT); |
První akcí je vytvoření kompatibilních kontextů zařízení a
vložení odpovídajících bitmap do těchto kontextů. Dalším krokem je nastavení
barvy textu a pozadí, které zajišťuje správnou konverzi černobílé masky.
Toto nastavení je provedeno pouze "pro jistotu", protože jsou to implicitní
hodnoty kreslicího kontextu. Poslední akcí jsou tři rastrové operace, které
zajišťují transparentní kreslení.
.
|
Provede XOR zdrojové bitmapy do cílového kontextu. |
|
Provede AND masky do cílového kontextu. Všechny bílé (průhledné)
bity masky ponechají cíl beze změny, zatímco neprůhledné cíle jsou nastaveny na
černé. |
|
Provede druhý XOR zdrojové bitmapy do cílového kontextu, který
všechny průhledné bity nastaví do jejich původního stavu a neprůhledné bity jsou
přímo kopírovány. |
Příště metoda černého zdroje... |