Kopieren von Bitmaps

Bitblockübertragungsfunktionen (BitBlt), die von Treibern implementiert werden, kopieren Bitblöcke von einer Oberfläche auf eine andere. Dazu gehören folgende Funktionen:

Es gibt auch eine anzeigetreiberspezifische BitBlt-Funktion namens DrvSaveScreenBits.

Wenn es sich bei der gezeichneten Oberfläche um eine vom Gerät verwaltete Oberfläche oder Bitmap handelt, muss der Treiber eine Mindestebene von Bitblockübertragungsfunktionen unterstützen. Wenn es sich bei der Oberfläche um eine von GDI verwaltete Standardformatbitbitbit handelt, verarbeitet GDI nur die Vorgänge, die nicht vom Treiber eingebunden werden.

DrvBitBlt

Die DrvBitBlt-Funktion bietet allgemeine Bitblockübertragungsfunktionen. Wenn eine Quelle verwendet wird, kopiert DrvBitBlt den Inhalt des Quellrechtecks in das Zielrechteck. (Der pptlSrc-Parameter dieser Funktion identifiziert die obere linke Ecke des Rechtecks.) Wenn kein Quellrechteck vorhanden ist, ignoriert DrvBitBlt den pptlSrc-Parameter . Das Zielrechteck, die zu ändernde Oberfläche, wird durch zwei ganzzahlige Punkte definiert, die obere linke und die untere rechte Ecke. Das Rechteck ist unten rechts exklusiv; der untere und rechte Rand des Rechtecks sind nicht Teil der Blockübertragung. DrvBitBlt kann nicht mit einem leeren Zielrechteck aufgerufen werden. Die beiden Punkte des Rechtecks sind immer gut sortiert; Das heißt, beide Koordinaten des unteren rechten Punkts sind größer als ihre Entsprechungen im oberen linken Punkt.

DrvBitBlt befasst sich mit verschiedenen ROPs und führt je nach Gerät Optimierungen durch. In einigen Fällen, wenn der ROP eine Volltonfarbe ist, kann anstelle einer BitBlt eine Füllung ausgeführt werden. Bei Geräten oder Treibern, die keine ROPs unterstützen, z. B. der Pscript-Treiber, kann es zu Abweichungen zwischen den angezeigten und gedruckten Bildern kommen.

Optional kann eine von DrvBitBlt behandelte Blockübertragung maskiert werden und eine Farbindexübersetzung beinhalten. Ein Übersetzungsvektor unterstützt die Farbindexübersetzung für Paletten. Die Übertragung muss möglicherweise von einem Anzeigetreiber mithilfe einer Reihe von Cliprechtecks willkürlich abgeschnitten werden. Die erforderliche Region und Informationen werden von GDI bereitgestellt.

Die Implementierung von DrvBitBlt stellt einen erheblichen Teil der Arbeit dar, die beim Schreiben eines Treibers für einen Rasteranzeigetreiber ohne Framepuffer im Standardformat erforderlich ist. Der Microsoft VGA-Treiber, der mit dem Windows Driver Kit (WDK) ausgestattet ist, bietet Beispielcode, der die Basisfunktion für ein planares Gerät unterstützt. Die Implementierung von DrvBitBlt für andere Geräte ist möglicherweise weniger komplex.

DrvCopyBits

Die DrvCopyBits-Funktion wird von GDI aus seinen Simulationsvorgängen aufgerufen, um zwischen einer geräteverwalteten Rasteroberfläche und einer GDI-Bitmap im Standardformat zu übersetzen. DrvCopyBits bietet einen schnellen Pfad für SRCCOPY (0xCCCC) ROP-Bitblockübertragungen.

Diese Funktion ist für einen Grafiktreiber mit vom Gerät verwalteten Bitmaps oder Rasteroberflächen erforderlich und muss Treiberoberflächen in und aus jeder Bitmap im Standardformat übersetzen. DrvCopyBits wird nie mit einem leeren Zielrechteck aufgerufen, und die beiden Punkte des Zielrechtecks sind immer gut sortiert. Dieser Aufruf hat die gleichen Anforderungen wie DrvBitBlt.

Wenn ein Treiber eine geräteseitig verwaltete Oberfläche oder Bitmap unterstützt, muss der Treiber die DrvCopyBits-Funktion implementieren. Der Treiber muss mindestens die folgenden Schritte ausführen, wenn DrvCopyBits aufgerufen wird:

  • Führen Sie eine Blockübertragung zu und von einer Bitmap im bevorzugten Format des Geräts und auf die Geräteoberfläche durch.
  • Führen Sie die Übertragung mit dem SRCCOPY-Rastervorgang (0xCCCC) aus.
  • Beliebiges Ausschneiden zulassen.

Der Treiber kann die GDI CLIPOBJ-Enumerationsdienste verwenden, um das Clipping auf eine Reihe von Cliprechtecken zu reduzieren. GDI übergibt einen Übersetzungsvektor, die XLATEOBJ-Struktur , um die Farbindexübersetzung zwischen Quell- und Zieloberflächen zu unterstützen.

Wenn die Oberfläche eines Geräts als geräteunabhängige Bitmap (Device-Independent Bitmap, DIB) im Standardformat organisiert ist, kann der Treiber nur einfache Übertragungen unterstützen. Wenn ein Aufruf mit einem komplizierten ROP eingeht, kann der Treiber die Blockübertragungsanforderung mit einem Aufruf der EngCopyBits-Funktion zurück an GDI übermitteln. Dadurch kann GDI den Aufruf in einfachere Funktionen unterteilen, die der Treiber ausführen kann.

DrvCopyBits wird auch mit RLE-Bitmaps (siehe Microsoft Windows SDK-Dokumentation) und geräteabhängigen Bitmaps (DDBs) aufgerufen. Die Bitmaps werden für diese Funktion als Ergebnis von Anwendungsprogrammaufrufen mehrerer Win32-GDI-Routinen bereitgestellt. Die optionale DDB wird nur von einigen spezialisierten Treibern unterstützt.

DrvStretchBlt

Ein Treiber kann optional die DrvStretchBlt-Funktion bereitstellen, auch Treiber, die geräteseitig verwaltete Oberflächen unterstützen. Diese Funktion bietet Funktionen zum Strecken von Blockübertragungen zwischen geräte- und GDI-verwalteten Oberflächen. DrvStretchBlt unterstützt nur bestimmte Dehnungstypen, z. B. Das Strecken um ganzzahlige Vielfache.

DrvStretchBlt ermöglicht es einem Treiber auch, auf GDI-Bitmaps zu schreiben, insbesondere wenn der Treiber die Halbtonierung durchführen kann. Die Funktion ermöglicht auch die Anwendung desselben Halftoningalgorithmus auf GDI-Bitmaps und Geräteoberflächen.

DrvStretchBlt ordnet ein geometrisches Quellrechteck genau einem geometrischen Zielrechteck zu. Die Quelle ist ein Rechteck mit Ecken, die um (-0,5,-0,5) von den angegebenen ganzzahligen Koordinaten verschoben werden. Die in den Funktionsparametern angegebenen Punkte liegen auf ganzzahligen Koordinaten, die Pixelzentrierungen entsprechen. Ein Rechteck, das durch zwei solche Punkte definiert wird, gilt als geometrisch, mit zwei Scheitelpunkten, deren Koordinaten die angegebenen Punkte sind, aber mit 0,5 subtrahiert von jeder Koordinate. (GDI POINTL-Strukturen verwenden eine kurze Notation zum Angeben dieser Bruchkoordinatenvertices.) Beachten Sie, dass die Ränder eines solchen Rechtecks niemals ein Pixel überschneiden, sondern einen Satz von Pixeln umgehen. Die Pixel innerhalb des Rechtecks sind normale Pixel für ein unteres rechtes Rechteck.

Die Punkte, die die Ecken des Quellrechtecks definieren, sind gut sortiert; DrvStretchBlt kann kein leeres Quellrechteck erhalten. Im Gegensatz zu DrvBitBlt kann DrvStretchBlt mit einem einzelnen Clippingrechteck aufgerufen werden, um Rundungsfehler beim Ausschneiden der Ausgabe zu verhindern.

Das Zielrechteck wird durch zwei ganzzahlige Punkte definiert. Diese Punkte sind nicht gut sortiert, was bedeutet, dass die Koordinaten des zweiten Punkts nicht notwendigerweise größer sind als die des ersten. Das Quellrechteck, das diese Punkte beschreiben, enthält nicht den unteren und rechten Rand. Da das Rechteck nicht gut sortiert ist, muss DrvStretchBlt manchmal Inversionen in den beiden x-Koordinaten und/oder den beiden y-Koordinaten ausführen. (Der Treiber darf nicht versuchen, Pixel zu lesen, die nicht auf der Quelloberfläche liegen.) DrvStretchBlt kann nicht mit einem leeren Zielrechteck aufgerufen werden.

Für die Farbübersetzung stellt DrvStretchBlt einen Zeiger pxlo auf die XLATEOBJ-Struktur bereit, die zum Übersetzen zwischen der Quell- und Der Zieloberfläche verwendet wird. Die XLATEOBJ-Struktur kann abgefragt werden, um den Zielindex für einen beliebigen Quellindex zu finden. Für eine hochwertige Stretchblockübertragung ist drvStretchBlt erforderlich, um Farben in einigen Fällen zu interpolieren. DrvStretchBlt verwendet auch die COLORADJUSTMENT-Struktur, um die Farbanpassungswerte zu definieren, die auf die Quellbitbitte angewendet werden sollen, bevor die Bits gestreckt werden.

DrvStretchBlt verwendet den iMode-Parameter , um zu definieren, wie die Quellpixel für die Ausgabe kombiniert werden sollen. Insbesondere bietet iMode die Option HALFTONE, die es dem Treiber ermöglicht, Gruppen von Pixeln auf der Ausgabeoberfläche zu verwenden, um die Farbe oder graue Ebene der Ausgabe anzunähern. Änderungen an der COLORADJUSTMENT-Struktur werden nach dem nächsten DrvStretchBlt-Aufruf mit einem iMode von HALFTONE an den Treiber übergeben. Wenn der Treiber GDI zum Verarbeiten der Halbtonierung für GDI-Bitmaps erfordert, hängt der Treiber drvStretchBlt ab, legt den iMode-Parameter auf HALFTONE fest und gibt ihn in EngStretchBlt zurück.

Wenn DrvStretchBlt einen Aufruf der EngStretchBlt-Funktion eingebunden hat und aufgefordert wird, etwas zu tun, das nicht unterstützt wird, wird die Anforderung an GDI zurückgegeben, damit die entsprechende Funktion sie verarbeiten kann.

DrvTransparentBlt

Die DrvTransparentBlt-Funktion bewirkt, dass eine Quellbit in eine Zielbitmap kopiert wird, sodass Teile der Zielbit nach dem Kopieren sichtbar bleiben. Der iTransColor-Parameter dieser Funktion gibt die Farbe an, die transparent gemacht werden soll.

Die folgende Abbildung zeigt ein Beispiel für ein transparentes Blt.

Diagramm, das den Prozess des transparenten Blt mit Quell- und Zielbitbits veranschaulicht.

Von links nach rechts zeigt die vorherige Abbildung die Quellbitmap, die Zielbitmap vor dem transparenten blt und die Zielbitmap nach dem transparenten blt. Beachten Sie, dass die Farbe in iTransColor die gleiche ist wie in den vier Regionen oben, unten und auf beiden Seiten des zentralen Bereichs in der Quellbitmap.

Wenn der blt-Vorgang ausgeführt wird, werden diese vier Bereiche nicht kopiert, was dazu führt, dass jedes Pixelmuster in der Zielbit unter diesen Regionen sichtbar bleibt. Jedes Pixelmuster unter den anderen Regionen (den vier Ecken und der Mitte) wird im transparenten blt überschrieben.

Dies wird im Bild ganz rechts veranschaulicht: Die Teile des Buchstabens "M" in den vier Ecken und die Mitte wurden mit den Farben in der Quellbitmap überschrieben. Die Teile des Buchstabens "M" unter den vier Bereichen, deren Farbe der in iTransColor entspricht, bleiben sichtbar.