;----------------------------Module-Header------------------------------; ; Module Name: ROPDEFS.BLT ; ; Constants relating to raster operation definitions. ; ; Copyright (c) 1988 - 1992 Microsoft Corporation ; ; These constants are used mainly in the file ROPTABLE.BLT, in which ; the raster operation code templates are defined. ; ; This file is part of a set that makes up the Windows BitBLT function ; at driver-level. ;-----------------------------------------------------------------------; subttl Raster Operation Definitions page if 0 ; Not passed to us anymore !!! ; Raster Op Definitions ; ; ; The include file COMMENT.BLT contains a good description ; of the encoding of the raster operations. It should be ; read before examining the definitions that follow. ; ; The sixteen-bit number indicating which raster Op is to be ; performed is encoded in the following manner: EPS_OFF = 0000000000000011b ;Offset within parse string EPS_INDEX = 0000000000011100b ;Parse string index LogPar = 0000000000100000b ;(1 indicates implied NOT as Logop6) LogOp1 = 0000000011000000b ;Logical Operation #1 LogOp2 = 0000001100000000b ;Logical Operation #2 LogOp3 = 0000110000000000b ;Logical Operation #3 LogOp4 = 0011000000000000b ;Logical Operation #4 LogOp5 = 1100000000000000b ;Logical Operation #5 ; The parity bit is used to encode an optional sixth logical operation ; which will always be a "NOT". In most cases this is used to get an ; even number of "NOT"s so that reduction can take place (two sequential ; trailing "NOT"s cancel each other out and thus are eliminated). ; Each LogOp (Logical Operation) is encoded as follows: LogNOT = 00b ;NOT result LogXOR = 01b ;XOR result with next operand LogOR = 10b ;OR result with next operand LogAND = 11b ;AND result with next operand ; The parse string is a string which contains the operands for ; the logical operation sequences (source, destination, pattern). ; The logic opcodes are applied to the current result and the next ; element of the given string (unless the LogOp is a NOT which only ; affects the result). ; ; The string is encoded as eight two-bit numbers indicating which ; operand is to be used opDefs struc OpSpec db ? ;Special Operand as noted below OpSrc db ? ;Operand is source field OpDest db ? ;Operand is destination field OpPat db ? ;Operand is pattern field opDefs ends ; The special operand is used for a few rops that would not fit into ; an RPN format. On the first occurance of an OpSpec, the current result ; is "PUSHED", and the next operand is loaded. On the second occurance ; of the OpSpec, the given logic operation is performed between the ; current result and the "PUSHED" value. ; ; **NOTE** Since there can be no guarantee that the client will call ; the BLT routine with one of the 256 published raster ops, it is ; possible that a value might be "PUSHED" and then never "POPPED". ; If these "PUSHES" are made to the stack, then care must be made to ; remove the "PUSHED" value. ; ; In any case, since the raster op was not one of the published ; "magic numbers", the BLT can be aborted or the result can be ; computed to the extent possible. The only restriction is that it ; must not crash the system (i.e. don't leave extra stuff on the stack). ; ; Simply: Compute garbage, but don't crash! ; Define the parse strings to be allocated later. ; ; An example parse string for the pattern "SDPSDPSD" would be ; "0110110110110110b" parseStr0 = 07AAAh ;src,pat,dest,dest,dest,dest,dest,dest parseStr1 = 079E7h ;src,pat,dest,src,pat,dest,src,pat parseStr2 = 06DB6h ;src,dest,pat,src,dest,pat,src,dest parseStr3 = 0AAAAh ;dest,dest,dest,dest,dest,dest,dest,dest parseStr4 = 0AAAAh ;dest,dest,dest,dest,dest,dest,dest,dest parseStr5 = 04725h ;src,spec,src,pat,spec,dest,src,src parseStr6 = 04739h ;src,spec,src,pat,spec,pat,dest,src parseStr7 = 04639h ;src,spec,src,dest,spec,pat,dest,src ; The following equates are for certain special functions that are ; derived from the very first string (index of SpecParseStrIndex). ; ; These strings will have their innerloops special cased for ; speed enhancements (i.e MOVSx and STOSx for pattern copys and ; white/black fill, and MOVSx for source copy if possible) PAT_COPY equ 0021h ;P - dest = Pattern NOTPAT_COPY equ 0001h ;Pn - dest = NOT Pattern FILL_BLACK equ 0042h ;DDx - dest = 0 (black) FILL_WHITE equ 0062h ;DDxn - dest = 1 SOURCE_COPY equ 0020h ;S - dest = source errnz LogXOR-01b ;These must hold true for above equates errnz LogOp1-0000000011000000b errnz LogPar-0000000000100000b errnz parseStr0-7AAAh ; plus the string must be SPDD SPEC_PARSE_STR_INDEX equ 0 ;Special cased strings index endif ; The raster operation table consists of a word for each of ; the first 128 raster operations (00 through 7F). The second ; half of the raster operations (FF through 80) are the inverse ; of the first half. ; ; The table is encoded as follows: ; ; N S P LLL OOOOOOOOOO ; | | | | | ; | | | | |_____ Offset of code from roptable. ; | | | | ; | | | |____________ Length index ; | | | ; | | |_______________ Pattern is present ; | | ; | |_________________ Source is present ; | ; |___________________ Generate trailing NOT ; ; ; To map the ROPS 80h through FFh to 00h through 7Fh, take the ; 1's complement of the ROP, and invert 'N' above. ; ; ; Notes: ; ; 1) An offset of 0 is reserved for source copy. This ; was done to reduce the number of LLLs to 8, so that ; the above encoding could fit into a 16-bit integer. ; ; ; 2) LLL only allows a maximum of 8 different template sizes! ; Actual length is at roptable+256+LLL. ; ; ; ; ; ROP is the macro that generates the equates which will be ; stored into the roptable as specified above. ; ; Usage: ; ; ROPDEF Pattern,Number ; ; Where ; ; Pattern Is the RPN definition of the raster operation. ; It is used as the label of the first byte of ; the template. It also is used to determine ; is there is a (S)ource, (P)attern, and if the ; final result is to be (n)egated. ; ; Number is the boolean result of the raster operation ; based on a P=F0, S=CC, and D=AA. These labels ; and indexes can be found in the file COMMENT.BLT ; ; Since there are many equivelent boolean expresions, ; some of the rops will not match the label given. ; The label is for reference only. The final result ; is what counts. ROPOffset equ 0000001111111111b ROPLength equ 0001110000000000b SOURCE_PRESENT equ 0010000000000000b PATTERN_PRESENT equ 0100000000000000b NEGATE_NEEDED equ 1000000000000000b ; Define the eight template length indices. ROPLen0 equ 0 ROPLen2 equ 1 ROPLen4 equ 2 ROPLen6 equ 3 ROPLen8 equ 4 ROPLen10 equ 5 ROPLen12 equ 6 ROPLen14 equ 7 ; Binary raster ops R2_BLACK equ 1 R2_NOTMERGEPEN equ 2 R2_MASKNOTPEN equ 3 R2_NOTCOPYPEN equ 4 R2_MASKPENNOT equ 5 R2_NOT equ 6 R2_XORPEN equ 7 R2_NOTMASKPEN equ 8 R2_MASKPEN equ 9 R2_NOTXORPEN equ 10 R2_NOP equ 11 R2_MERGENOTPEN equ 12 R2_COPYPEN equ 13 R2_MERGEPENNOT equ 14 R2_MERGEPEN equ 15 R2_WHITE equ 16 R2_LAST equ 16