You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
8.8 KiB
240 lines
8.8 KiB
;----------------------------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
|
|
|
|
|
|
|