P
Schau Dir mal das Kapitel "Raster Operations" in der Platform SDK (Windows API) Dokumentation an. Der GDI-Blitter kann diese Operation auch als einzigen Grafikbefehl ausführen.
Hier die Regeln für Blitoperationen (Konzept vom Amiga Blitter, aber im Prinzip auch auf Windows anwendbar):
Es gibt drei Quellen A, B, C und ein Ziel D; die Grafikoperation wird für jedes Bit ausgeführt. Zuerst trägt man die gewünschten Ergebnisse (also die "logische Funktion") im Kanal D ein (wie, hängt davon ab, wie Du die 3 Quellen verwendest). Dadurch bekommst Du den "minterm" oder "lf" code. Bei einem Standard Cookie-Cut Blit mit Quelle A = Maske, Quelle B = Quellbild, Quelle C = Hintergrundbild, Ziel D = Ergebnisbild, ist die LF 0xCA (sieht man, wenn man den Kopf nach links neigt):
A B C | D
----------+-----
0 0 0 | 0
0 0 1 | 1
0 1 0 | 0
0 1 1 | 1 0xA
----------+-----
1 0 0 | 0
1 0 1 | 0
1 1 0 | 1
1 1 1 | 1 0xC
Bei Deiner Operation mußt Du Dir überlegen, welche Quellen und welches Ergebnis Du haben willst. D.h. nimmst Du für Quelle A das alte Bild, und für Quelle B das neue Bild, und für Quelle C die Füllfarbe, sieht die Tabelle so aus:
A B C | D
----------+-----
0 0 0 | 0 ( A == B, d.h. D = Wert von B )
0 0 1 | 0 ( A == B, d.h. D = Wert von B )
0 1 0 | 0 ( A != B, d.h. D = Wert von C )
0 1 1 | 1 0x8 ( A != B, d.h. D = Wert von C )
----------+-----
1 0 0 | 0 ( A != B, d.h. D = Wert von C )
1 0 1 | 1 ( A != B, d.h. D = Wert von C )
1 1 0 | 1 ( A == B, d.h. D = Wert von B )
1 1 1 | 1 0xE ( A == B, d.h. D = Wert von B )
d.h. da A und B gleich sein müssen, kann man sagen:
D = ( A & B ) | ( ~( A & B ) & C )
Bei Windows sind die 3 Quellen als Quelle, Ziel und Pattern (=Brush) definiert. Da Du als Pattern nur eine Farbe brauchst, erzeugst Du also zunächst einen Brush in der Farbe und selektierst ihn in den Ziel-DC.
Such in der MSDN Online Library bzw. Platform SDK unter "Ternary Raster Operations". Dort heißen die drei Quellen P, S und D (R für Result hier):
P S D | R
----------+-----
0 0 0 | 0 ( S == D, d.h. R = Wert von S )
0 0 1 | 0 ( S != D, d.h. R = Wert von P )
0 1 0 | 0 ( S != D, d.h. R = Wert von P )
0 1 1 | 1 0x8 ( S == D, d.h. R = Wert von S )
----------+-----
1 0 0 | 0 ( S == D, d.h. R = Wert von S )
1 0 1 | 1 ( S != D, d.h. R = Wert von P )
1 1 0 | 1 ( S != D, d.h. R = Wert von P )
1 1 1 | 1 0xE ( S == D, d.h. R = Wert von S )
Mit D ist hier das alte Bild (und das Ziel) gemeint, mit S das neue Bild, oder umgekehrt (spielt ja keine Rolle, da ja nur auf Gleichheit geprüft wird).
Du siehst, der Minterm Code ist hier derselbe (0xE8).
In der o.a. Ternary Raster Operation Table von Microsoft, ist 0xE8 mit dem Code 0X00E81D74 bzw. SSPxDSxax angegeben. Diesen Code kannst Du direkt bei BitBlt() usw. angeben.
Der Code SSPxDSxax besagt, was die Operation tut (und ist ggf. als define definiert). Sie beschreibt eine Stack-basierte Maschine (ähnlich FORTH), die die folgenden Operationen ausführt:
R = S ^ ( ( S ^ P ) & ( D ^ S ) )
Ich hoffe, das hilft!