Freigeben über


Voranalyse-Infrastruktur

Wichtig

Die moderne Druckplattform ist das bevorzugte Mittel von Windows, um mit Druckern zu kommunizieren. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.

Weitere Informationen finden Sie unter Moderne Druckplattform und im Entwurfsleitfaden für die Druckunterstützungs-App.

Die Voranalyse-Infrastruktur ist ein Mechanismus, mit dem Unidrv die Bandeinteilung eines Druckauftrags erzwingt, so dass die erste Bandwiedergabe jeder Seite ein Band ist, das die gesamte Seite enthält. Der Voranalyse-Durchgang ermöglicht kein Rendering und dient nur dazu, die Objekte auf der Seite zu analysieren, bevor sie gerendert werden.

Um eine ganzseitige Voranalyse zu ermöglichen, legt Unidrv zunächst eine ganzseitige Geräteoberfläche in der Funktion DrvEnableSurface fest und gibt dann mit DrvQueryPerBandInfoan, dass das erste Band die Größe der gesamten Seite ist. Nachdem die Voranalyse abgeschlossen ist, verwendet Unidrv DrvQueryPerBandInfo , um den Beschneidungsbereich wieder auf die Größe vor der Aktivierung der Voranalyse zurückzusetzen; Unidrv rendert anschließend auf diese Oberfläche. Aufgrund der Implementierungsbeschränkungen von GDI kann die Voranalyse nur aktiviert werden, wenn der N-up-Modus ONE_UP ist oder wenn das Renderingband die gesamte Seite umfasst.

Der folgende Pseudocode veranschaulicht die für die Voranalyse verwendete Logik.

DrvEnableSurface
if( preanalysis enabled )
   Use dummy device surface
DrvStartDoc
For each physical page 
{
   DrvStartPage
   DrvStartBanding
   For each banding surface 
   {
      DrvQueryPerBandInfo
// Set sizlBand member of PERBANDINFO
      if( preanalysis_pass ) 
         pbi.sizlBand = {whole page}
      else 
         pbi.sizlBand = {normal band}
      Carry out rendering operations
      if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass ) {
         Call OEM hooks
         DrvNextBand
      }
      if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass )
         Call OEMNextBand
      if( preanalysis pass ) {
         Disable preanalysis
         Switch from dummy device surface to real device surface
      }
      if( last band ) 
         Write end page character from GPD
   }  // for each banding surface

}  // for each physical page
DrvEndDoc

Da die Voranalysefunktionalität mit aktuellen generischen Druckerbeschreibungsdateien (GPD) und Plug-ins arbeiten muss, sind die Text-Z-Ordnung, die Erkennung leerer Bereiche und andere Operationen aus Sicht des Minitreibers unsichtbar implementiert. Ein Minitreiber kann DrvStartBanding und DrvNextBandeinhaken, aber er wird den ersten Aufruf von DrvNextBand nicht erhalten, weil der erste Aufruf von DrvNextBand kein Rendering beinhaltet. Das Plug-in erhält den ersten DrvNextBand -Aufruf nur, wenn es das Flag in der GPD setzt, das die Voranalyse auf OEM-Objektebene aktiviert (*PreAnalysisOptions: 8). In diesem Fall muss das Plug-in einen Haken bei DrvStartBanding und DrvNextBandsetzen, und das Plug-in muss den Parameter pptl der Funktion DrvStartBanding überprüfen. Wenn der Parameter pptl nichtNULList, wird die Voranalyse deaktiviert. Wenn der Parameter pptl NULList, was den Beginn des Voranalyse-Durchgangs anzeigt. In diesem Fall sollte das Plug-in davon ausgehen, dass alle Aufrufe von Zeichnungs-DDIs, die das Plug-in angehängt hat, aus dem Voranalyse-Durchgang stammen. Der Voranalysedurchlauf endet mit dem ersten Aufruf der Funktion DrvNextBand und die Rendering-Durchläufe beginnen nach dem ersten Aufruf der Funktion DrvNextBand . Nachfolgende Aufrufe dieser Funktion enthalten Rendering-Daten.

*PreAnalysisOptions-Modi

Der Präanalyse-Modus wird in der GPD-Datei durch das *PreAnalysisOptionsgesteuert: n Attributname und Attributparameter. Die folgende Tabelle enthält Parameterwerte, die mit dem Attribut *PreAnalysisOptions verwendet werden können. Zwei oder mehr dieser Werte können kombiniert werden, um mehrere Optionen zu aktivieren.

Parameter Bedeutung Wert 0

Deaktivieren Sie alle Voranalysemodi.

1

Standardmodus. Aktivieren Sie die monochrome Z-Order Textanalyse und die Optimierung des Leerbereichs. Dieser Modus ist für Geräte mit herunterladbarer Schrift oder Unterstützung von Geräteschriften und hoher Auflösung (600 dpi oder höher), 24 BPP Rendermodi aktiviert.

2

Aktivieren Sie 1 BPP Optimierung für 24 BPP IPrintOemUni ImageProcessing Callbacks.

4

Aktivieren Sie die StretchBlt-Operationen des Geräts.

8

Aktivieren Sie die Voranalyse auf OEM-Objektebene.

Monochrome Z-Order Textanalyse mit Leerstellen-Optimierung

*PreAnalysisOptions: 1

Wenn Sie den Parameter *PreAnalysisOptions auf 1 setzen, kann Unidrv die folgenden Operationen durchführen:

  • Erkennen Sie Probleme mit der Z-Reihenfolge zwischen Text und grafischen Objekten in Monochromdruckern.

  • Führen Sie die Leerbandoptimierung durch.

Die erste Operation behandelt Probleme mit der Z-Reihenfolge, die entstehen, wenn Text, der auf einen Schwarzweißdrucker heruntergeladen wurde, später überschrieben wird oder auf andere Weise mit Grafikobjekten interagiert. Probleme mit der Z-Reihenfolge werden häufig durch Grafikobjekte verursacht, die komplexe Clips enthalten, so dass Unidrv nicht in der Lage ist, ein weißes Rechteck herunterzuladen, das den zuvor heruntergeladenen Text löscht.

Unidrv führt für jede Seite eine Voranalyse durch, bevor es einen Rendering-Durchgang durchführt. Unidrv tut dies, um festzustellen, ob ein Text mit einem Bit-Block-Transfer (blt) Objekt überlagert wird, das einen komplexen Clip verwendet, der nicht simuliert werden kann. So wird der Text auf die Oberflächen-Bitmap gerendert, anstatt direkt heruntergeladen zu werden, damit später gerenderte Objekte korrekt mit dem Text interagieren.

Bei Geräten, die keine weißen Rechtecke unterstützen, prüft Unidrv außerdem, ob Text von Blts überlagert wird, auch wenn diese keine komplexen Clips enthalten. Unidrv rendert den Text auf die Oberfläche, anstatt ihn direkt auf den Drucker zu übertragen.

Die folgenden Zeichenbefehle werden mit Text getestet, der von nachfolgenden Blts überlagert werden könnte:

Dieser Modus sollte daher alle Probleme mit der z-Reihenfolge zwischen Text und Objekten mit gefüllten Bereichen beheben. Beachten Sie, dass es immer noch Probleme mit Text und überlagerten Linien geben kann. Diese Situationen werden nicht berücksichtigt, da eine solche Lösung dazu führen kann, dass fast der gesamte Text heruntergeladen wird, anstatt gezeichnet zu werden.

Diese Funktion korrigiert nicht die Probleme mit der Z-Reihenfolge bei der Verwendung von Geräteschriften. Wenn die Anwendung oder der Treiber den Geräteschriftmodus ausgewählt hat, kann der Treiber dieses Problem nicht korrigieren und ist nicht in der Lage, Geräteschriften auf die Oberfläche zu übertragen.

Der zweite Vorgang ermöglicht Unidrv die Optimierung für leere Bereiche auf der Seite. In diesem Modus überspringt Unidrv die leeren oberen und unteren Ränder sowie alle großen leeren Bereiche in der Mitte der Seite. Dieser Modus, der für den Farbdruck gedacht ist, verbessert die Leistung, indem er die Anzahl der für die Darstellung der Seite erforderlichen Banddurchläufe minimiert.

Während des Voranalyse-Durchgangs bestimmt Unidrv, wo auf der Seite gezeichnet werden soll. Die Optimierung für leere Bänder wird immer dann aktiviert, wenn die Voranalyse aktiviert ist oder wenn der Drucker 24 BPP-Rendering-Bänder bei hoher Auflösung (600 dpi oder höher) verwendet. 24 BPP-Rendering sollte bei Tintenstrahldruckern zu einer spürbaren Leistungssteigerung führen und erfordert keine Änderungen an bestehenden OEM-Plug-ins.

Blackband-Optimierung

*PreAnalysisOptions: 2  *% 1 bpp ImageProcessing bitmaps

Wenn Sie den Parameter *PreAnalysisOptions auf 2 setzen, kann Unidrv eine größere 1 BPP Banding-Oberfläche verwenden, um Regionen zu rendern, die nur schwarze Objekte enthalten, anstatt die gesamte Seite mit 24 BPP zu rendern. Dieser Modus ähnelt der Leerbereich-Optimierung, mit der Ausnahme, dass er auch durchgehende schwarze Bereiche (im Gegensatz zu farbigen Bereichen) auf der Seite bestimmt. Nur Objekte, die einfarbig schwarz sind (keine Grautöne), können in der 1 BPP Banding-Oberfläche gerendert werden, da Raster, die für 24 BPP Farbe eingerichtet sind, in 1 BPP Monochrom nicht korrekt gerendert werden.

Unidrv erstellt zwei Oberflächen innerhalb der Funktion DrvEnableSurface : eine für Farbe und die andere für 1 BPP Monochrom. Unidrv verwendet für beide den gleichen Speicher, so dass kein zusätzlicher Speicher erforderlich ist. Die Voranalyse der Seite bestimmt, ob die Seite einfarbige schwarze oder leere Bereiche enthält, für die größere Bandbreiten verwendet werden können als für Bereiche, die Farben enthalten. Nur für die Farbregionen muss die kleinere Farbbandfläche verwendet werden.

Bei gleichem Speicherbedarf kann eine monochrome Oberfläche mit 1 BPP 24 Mal so groß sein wie eine farbige Oberfläche mit 24 BPP. So kann ein Bild, das nur in der Mitte der Seite Farbe enthält, in drei Bereiche unterteilt werden: den oberen Bereich, den Bereich, der die Farbe enthält, und den unteren Bereich. Diese drei Regionen können wie folgt aufgeteilt werden: Die obere Region kann in einem einzigen monochromen Band platziert werden, die Region, die Farbe enthält, kann in so viele Farbbänder aufgeteilt werden, wie zur Abdeckung erforderlich sind, und die untere Region kann in einem einzigen monochromen Band platziert werden.

Diese Funktionalität erfordert, dass OEMs den IPrintOemUni ImageProcessing Callback unterstützen und den Dump der Rasterdaten verarbeiten. Die aktuelle OEM-Plugin-Unterstützung für den IPrintOemUni ImageProcessing Callback muss erweitert werden, um entweder 24 BPP-Bänder oder 1 BPP solide schwarze Bänder zu akzeptieren.

Unterstützung für Geräte-StretchBlt-Operationen

*PreAnalysisOptions: 4

Wenn Sie den Parameter *PreAnalysisOptions auf 4 setzen, kann Unidrv DrvStretchBlt -Aufrufe direkt auf Geräte herunterladen, die Stretchblt-Operationen unterstützen.

Wenn Unidrv 24 BPP-Farbdaten erzeugt, werden alle Stretchblt-Bilder auf die Auflösung des Geräts gestreckt, was zu großen Mengen an Rasterdaten führt, die heruntergeladen werden müssen. Dies kann zu einer langsamen Leistung und bei vielen ostasiatischen Druckern auch zu Speicherplatzproblemen führen.

Ein Minidriver-Render-Plugin ist erforderlich, um die Vorteile des Stretchblt-Modus zu nutzen, da es OEMStretchBlt einhaken und seine eigenen Befehle zum Herunterladen von Bildern bereitstellen muss. Unidrv erlaubt den OEMStretchBlt-Haken nur bei Anrufen, die direkt heruntergeladen werden können. Daher ist das Plug-in nicht für die Behandlung von Problemen mit der Z-Reihenfolge zuständig. Das Plug-in muss nur die Quellbilddaten, die in den empfangenen OEMStretchBlt-Aufrufen enthalten sind, direkt herunterladen. Das Plug-in hat auch die Möglichkeit, das Bild an Unidrv zurückzuschicken, wenn das Bild in einem Format vorliegt, das das Plug-in nicht unterstützt oder nicht herunterladen kann.

Wenn Objekte direkt auf ein Gerät heruntergeladen werden, während andere Daten auf dem System gerendert werden, kann es zu Problemen mit der Z-Ordnung oder zu Halbtoninkonsistenzen kommen. Dieser Modus verwendet eine Voranalyse, um festzustellen, welche Stretchblts direkt heruntergeladen werden können. Nur Stretchblts, die keine Maske oder komplexen Ausschnitte enthalten, werden für den direkten Download berücksichtigt. Wenn ein späteres Objekt eines der Stretchblts überlagert, die für den direkten Download in Frage kommen, werden keine Objekte direkt heruntergeladen. Dieses Prinzip sollte die Leistung verbessern und sicherstellen, dass kein Bild sowohl vom System als auch vom Gerät Halbtöne enthält, was zu einer schlechten Druckqualität führt.

Voranalyse-Hooks auf OEM-Objektebene

*PreAnalysisOptions: 8

Wenn Sie den Parameter *PreAnalysisOptions auf 8 setzen, kann der OEM einen Voranalysedurchlauf initiieren, so dass alle Objekte auf der gesamten Seite nach dem Aufruf DrvStartBanding ohne Rücksicht auf die Bandgröße abgespielt werden. Während des Voranalyse-Durchlaufs ist kein Zeichnen innerhalb von Unidrv erlaubt, aber OEMs können alle DrvXxx-Zeichnungsaufrufe einhaken, um die Objekte auf der Seite zu analysieren.

Die Funktionalität in diesem Modus ist auf Farbtintenstrahldrucker ausgerichtet, so dass OEMs objektbasierte Farbkorrektur oder Rendering verwenden können. Bestimmte Drucker müssen beispielsweise schwarze Objekte anders behandeln, wenn sie sich mit farbigen Objekten überschneiden, im Gegensatz zu schwarzen Objekten, die von selbst erscheinen. Andere OEMs möchten vielleicht einen Halbton für Stretchblt-Objekte, die sich von Bitblt-Objekten unterscheiden. Stretchblt-Objekte können in jedem von Windows unterstützten Grafikdateiformat vorliegen, z. B. .png oder .jpg. Bitblt-Objekte sind ausschließlich Bitmaps.

Wenn dieser Modus in der GPD aktiviert ist, definiert Unidrv die Oberfläche als Banding-Oberfläche, bewirkt aber, dass die erste Wiedergabe der gesamten Seite erfolgt. Dazu setzt Unidrv das GDI-Clip-Fenster auf die gesamte Seite. Unidrv lässt alle Zeichenbefehle zu, kehrt aber zurück, bevor eine Zeichnung ausgeführt werden kann. Bei den folgenden Durchläufen setzt Unidrv das Clip-Fenster wieder auf die normale Bandgröße zurück und bindet wie gewohnt.

OEMs müssen sowohl DrvStartBanding als auch DrvNextBand anhängen, wenn sie diesen Modus in der GPD aktiviert haben. Sie müssen den Parameter pptl der Funktion DrvStartBanding testen, um festzustellen, ob Unidrv die Voranalyse in diesem Modus auf der angegebenen Seite aktivieren kann. Wenn der Parameter pptl NULList, dann hat Unidrv die Voranalyse aktiviert. Unidrv verwendet den Parameter pptl , weil er zu diesem Zeitpunkt keine Bedeutung hat (er wurde nicht mit der Bandposition aktualisiert). Für die Voranalyse wird die Bandposition immer auf (0, 0) gesetzt.) Wenn der Parameter pptl NULList, dann sollte der OEM alle Zeichenaufrufe vor dem ersten DrvNextBand als Teil der Voranalyse betrachten und kein Zeichnen auf die Oberfläche erlauben.

Das Ende der Voranalyse wird durch einen Aufruf der Funktion OEMNextBand signalisiert. Der Parameter pptl , der an OEMNextBand übergeben wird, ist nicht NULL. Dieser Aufruf wird nur verwendet, um den entsprechenden pptl Wert an Unidrv zurückzugeben. Plug-ins können den Wert pptl selbst setzen oder Unidrv aufrufen (wie im vorangegangenen Pseudocode-Beispiel am Anfang dieses Artikels). Da die Banding-Oberfläche, die der pso -Parameter von OEMNextBand im ersten Aufruf von OEMNextBand angegeben hat, noch nicht gerendert wurde, sollte ein Plug-In seinen Inhalt nicht an das Gerät senden.