Кодове на растерни операции

По същата традиция битовете, които определят растерната карта на съвместим контекст, се обозначават с буквата S (source - източник, източник), битовете за запълване - с буквата P (pattern - образец), а битовете, върху които ще бъде начертано изображението - с буквата D (destination - местоназначение, дестинация). Операциите се обозначават по следния начин: a - побитово И (И), n - побитово НЕ (НЕ), o - побитово ИЛИ (ИЛИ), x - побитово изключително ИЛИ (XOR).

Няколко думи за полската нотация. Операциите се изписват отляво надясно. Знакът на оператора следва операндите. Появата на знака за операция означава, че трябва да извършите следните действия: - вземете последните два операнда - изпълнете необходимата операция с тях - запишете резултата на мястото на последните два операнда.

Всъщност полската нотация описва действия, сякаш операндите и операциите са в стека, за което всъщност е измислена тази полска нотация.

Означавайки знака на операцията като Op, в полска нотация операциите с битове могат да бъдат записани, както следва:

Това показва необходимостта да се вземе пикселът от шаблона и рисуваното растерно изображение и да се извърши операция върху него. Ако операцията включва три операнда, тогава получаваме:

Какво трябва да направим в този случай? Точно така, първо изпълнете действието, посочено от Op1 с битовете на шаблона и растерното изображение, което се изчертава, след това изпълнете Op2 с резултата и действителните контекстни битове. Тук няма нищо сложно.

Всеки растерен код на операцията е представен като 32-битово цяло число. Горната дума на кода е индексът на битовата операция, ниската дума е кодът на операцията. Как се определя оперативният индекс?

Нека си представим, че трябва да определим индекса на растерна операция, дефинирана на полскинотация нотация DPSxx. По пътя можете да определите индекса на операцията PSx. Нека напишем ОПРЕДЕЛЕНИТЕ стойности на P, S и D един под друг, а под тях - резултатите от побитовите операции PSx и DPSxx:

П11110000
С11001100
д10101010
PSx00111100
DPSxx00010110

И така, индексът на работа PSx е 0x3C, а индексът на операция DPSxx е 0x96. Уважаеми читателю, моля да обърнете внимание на факта, че една под друга не са произволни, а строго определени стойности. Тези стойности ви позволяват да итерирате всички възможни комбинации от шаблон, източник и целеви растерни изображения. Сега, когато всичко е ясно, можете да опитате да се упражнявате да определяте индексите на всякакви операции. Въпреки че има 256 растерни операционни индекса, само няколко от тях се използват на практика. Файлът wingdi.h дефинира идентификатори за най-често използваните растерни операции, които са показани в таблицата:

Кратко описание на кодовете на растерните операции

ИмеИндекс ОперацияПолски записЕфект
ЧЕРНОТА0x000Запълване на действителния контекст с черно
NOTSCERASE0x11DSon
НЕ КОПИРАНЕ0x33снНачертаното растерно изображение се нанася напо негативен начин
DSTINVERT0x55DnОбразът на действителния контекст изглежда негативен
ПАТИНВЕРТ0x5ADPx
SRCINVERT0x66DSx
SRCAND0x88DSa
MERGEPAINT0xBBDSno
MERGECOPY0xC0Psa
SRCCOPY0xCCСКопиране на изобразено растерно изображение във валиден контекст
SCRPAINT0xEEDSo
PATCOPY0xF0ПКопиране на шаблон във валиден контекст
PATPAINT0xFBDPSnoo
БЕЛОТА0xFF1Запълване на действителния контекст с бяло

Въз основа на данните от таблицата ми е трудно да обясня как се променя изображението при използване на различни растерни операции. Препоръчвам на читателя да стартира горната програма няколко пъти и всеки път да указва нова операция с растерна графика във функцията StretchBlt().