Кодове на растерни операции
По същата традиция битовете, които определят растерната карта на съвместим контекст, се обозначават с буквата S (source - източник, източник), битовете за запълване - с буквата P (pattern - образец), а битовете, върху които ще бъде начертано изображението - с буквата D (destination - местоназначение, дестинация). Операциите се обозначават по следния начин: a - побитово И (И), n - побитово НЕ (НЕ), o - побитово ИЛИ (ИЛИ), x - побитово изключително ИЛИ (XOR).
Няколко думи за полската нотация. Операциите се изписват отляво надясно. Знакът на оператора следва операндите. Появата на знака за операция означава, че трябва да извършите следните действия: - вземете последните два операнда - изпълнете необходимата операция с тях - запишете резултата на мястото на последните два операнда.
Всъщност полската нотация описва действия, сякаш операндите и операциите са в стека, за което всъщност е измислена тази полска нотация.
Означавайки знака на операцията като Op, в полска нотация операциите с битове могат да бъдат записани, както следва:
Това показва необходимостта да се вземе пикселът от шаблона и рисуваното растерно изображение и да се извърши операция върху него. Ако операцията включва три операнда, тогава получаваме:
Какво трябва да направим в този случай? Точно така, първо изпълнете действието, посочено от Op1 с битовете на шаблона и растерното изображение, което се изчертава, след това изпълнете Op2 с резултата и действителните контекстни битове. Тук няма нищо сложно.
Всеки растерен код на операцията е представен като 32-битово цяло число. Горната дума на кода е индексът на битовата операция, ниската дума е кодът на операцията. Как се определя оперативният индекс?
Нека си представим, че трябва да определим индекса на растерна операция, дефинирана на полскинотация нотация DPSxx. По пътя можете да определите индекса на операцията PSx. Нека напишем ОПРЕДЕЛЕНИТЕ стойности на P, S и D един под друг, а под тях - резултатите от побитовите операции PSx и DPSxx:
П | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
С | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
д | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
PSx | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
DPSxx | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
И така, индексът на работа PSx е 0x3C, а индексът на операция DPSxx е 0x96. Уважаеми читателю, моля да обърнете внимание на факта, че една под друга не са произволни, а строго определени стойности. Тези стойности ви позволяват да итерирате всички възможни комбинации от шаблон, източник и целеви растерни изображения. Сега, когато всичко е ясно, можете да опитате да се упражнявате да определяте индексите на всякакви операции. Въпреки че има 256 растерни операционни индекса, само няколко от тях се използват на практика. Файлът wingdi.h дефинира идентификатори за най-често използваните растерни операции, които са показани в таблицата:
Кратко описание на кодовете на растерните операции
Име | Индекс Операция | Полски запис | Ефект |
ЧЕРНОТА | 0x00 | 0 | Запълване на действителния контекст с черно |
NOTSCERASE | 0x11 | DSon | |
НЕ КОПИРАНЕ | 0x33 | сн | Начертаното растерно изображение се нанася напо негативен начин |
DSTINVERT | 0x55 | Dn | Образът на действителния контекст изглежда негативен |
ПАТИНВЕРТ | 0x5A | DPx | |
SRCINVERT | 0x66 | DSx | |
SRCAND | 0x88 | DSa | |
MERGEPAINT | 0xBB | DSno | |
MERGECOPY | 0xC0 | Psa | |
SRCCOPY | 0xCC | С | Копиране на изобразено растерно изображение във валиден контекст |
SCRPAINT | 0xEE | DSo | |
PATCOPY | 0xF0 | П | Копиране на шаблон във валиден контекст |
PATPAINT | 0xFB | DPSnoo | |
БЕЛОТА | 0xFF | 1 | Запълване на действителния контекст с бяло |
Въз основа на данните от таблицата ми е трудно да обясня как се променя изображението при използване на различни растерни операции. Препоръчвам на читателя да стартира горната програма няколко пъти и всеки път да указва нова операция с растерна графика във функцията StretchBlt().