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... |