Artikel-ID: 262127 - Geändert am: Montag, 12. Februar 2007 - Version: 2.4

INFO: Leistungsoptimierung Windows CE-Video-Treiber: Strichzeichnung Operations

SystemtippDieser Artikel bezieht sich auf ein anderes Betriebssystem als das von Ihnen verwendete. Für Sie möglicherweise nicht relevante Artikelinhalte wurden deaktiviert.

Auf dieser Seite

Alles erweitern | Alles schließen

Zusammenfassung

Die meisten Windows CE-Grafiktreiber verwenden GPE (Graphics Primitive Engine), um Standardverarbeitung für Anzeige Treiber primitive bereitzustellen. Die GPE::Line-Methode zeichnet Linien auf der Zieloberfläche mit den Parametern in der GPELineParms und EGPEPhase Datenstrukturen zur Verfügung gestellt. Dieser Artikel definiert die GPELineParms und EGPEPhase Datenstrukturen und beschreibt, wie GPE eine Linie zeichnet.

Die Standard-Zeichnung GPE bereitgestellten kann in der Bildschirmtreiber durch Software emulierte Beschleunigungen oder systemeigenen Hardware Beschleunigungen ersetzt werden wie in der Windows CE 2.12 Device Driver Kit Kapitel über Bildschirmtreiber beschrieben.

Weitere Informationen

GPELineParms Struktur

GPELineParms ist eine Struktur. GPELineParms ist in diesem Verzeichnis von Platform Builder definiert:
Public\Common\Oak\Inc
GPELineParms wird durch GPE und der Bildschirmtreiber verwendet, um Strichzeichnung steuern. Einige der Parameter in der Struktur stammen direkt von der Anwendung oder den aktuellen Gerätekontext. Die übrigen werden durch GPE berechnet.
struct GPELineParms
{
	SCODE 			(GPE::*pLine)(GPELineParms *);
	long				xStart;  //Starting point of line, in X direction
	long				yStart;  //Starting point of line, in Y direction
	int				cPels;  //Length of line in major direction, in pixels
	unsigned long	dM;  //larger of |xStart-Xend| and |yStart-yEnd|, calculated in 1/16ths of a pixel
	unsigned long	dN;  //smaller of |xStart-Xend| and |yStart-yEnd|, calculated in 1/16ths of a pixel
	long				llGamma;  //typically used as the initial starting value for the slope iterator
	int				iDir;  //Octant number for line
	unsigned long	style;  //IN parameter - line attributes (solid or dashed)
	int				styleState;  //state of line style in current path, in pixels
	GPESurf 			*pDst;  //IN parameter - destination surface
	COLOR			solidColor;  //IN parameter brush color
	RECTL			*prclClip;  //clipping rectangle
	unsigned short	mix;  //IN parameter ROP2 values for mark and space
};
Die GPELineParms -Formatvorlage ist die Linienart. Der Wert Null (0) zeigt an, dass es eine durchgezogene Linie (d. h., eine einzelne ROP2), ist während eine Formatvorlage 0xAAAAAAAA Single-Pixel-Punkten (alternierende zwischen zwei ROP2s). Die DrvStrokePath -Funktion übergeben, impliziert das Flag LA_ALTERNATE in Plineattrs-> fl eine Formatvorlage 0xAAAAAAAA. Sie können auch die Pstyle und Cstyle Parameter komplexe damit gestrichelte oder gepunktete Formatvorlagen. Beispielsweise impliziert 0xF0F0F0F0 in pParms-> Formatvorlage mehr Bindestriche.

GPELineParms Mischung ist der Wert ROP2. Es besteht aus zwei Bytes, eine ROP2 für die Markierung und eine ROP2 für den Speicherplatz. Der Wert der jedes Bit in der Formatvorlage wählt zwischen zwei Bytes in der pParms-> Mix-Wert. GPELineParms iDir ist die Octant-Anzahl für die Zeile (eine der acht Werte pro der Bresenham-Algorithmus). Octant Achse Dir X-Y-Dir 0 X-Haupt + 1 + 1 1 Y-Haupt + 1 + 1 2 Y-Haupt-1 + 1 3 X-Haupt-1 + 1 4 X-Haupt-1-1 5 Y-Haupt-1-1 6 Y-Haupt + 1-1 7 X-Hauptversion + 1 (-1)

EGPEPHASE aufgezählte Typ

EGPEPHASE ist ein aufgezählter Typ. EGPEPHASE wird im folgenden Verzeichnis von Platform Builder definiert:
Public\Common\Oak\Inc
enum EGPEPhase
{
	gpeSingle,
	gpePrepare,  //device-specific initialization
	gpeContinue,
	gpeComplete  //device-specific clean up
};

Strichzeichnung Verarbeitung

Vorbereiten der Phase

Strichzeichnung beginnt, wenn eine Anwendung die Polylinie-Methode aufruft. GDI verarbeitet den Aufruf der Methode Polylinie. GDI überprüft, dass mindestens zwei Vertices vorhanden sind und dass die Linienart nicht null ist. GDI ruft dann die GPE- DrvStrokePath -Funktion auf, oder für einen breiten Stift die DrvFillPath -Funktion. Wenn GDI GPE-Memberfunktion aufruft, übergibt es aus dem Gerätekontext sowie Informationen:
  • Oberflächenobjekt
  • Objektpfad
  • Clip-Rechteck
  • Der Pinsel
  • Der Wert ROP2
  • Die Zeile Attribute (durchgezogene oder gestrichelte).
Diese Parameter wurden entweder durch die Anwendung gesetzt oder realisierten Attribute sind. GPE verwendet einige der Eingabeparameter zum Auffüllen der GPELineParms-Struktur.

GPE ruft dann den Grafiktreiber Zeile -Funktion, in die GPELineParms übergeben und in einer EGPEPHASE von GpePrepare übergeben. Der Treiber überprüft die Eigenschaften der Zeile, die gezeichnet werden soll. Der Treiber wählt anschließend, ob es die GPE- EmulatedLine -Funktion verwenden oder behandeln die Zeile mit eigenen beschleunigte Funktion möchte. Bevor Sie eine beschleunigte Funktion auswählen, muss der Treiber überprüfen, ob die Hardware die Linienart und ROP verarbeiten kann. In der S3Trio64-Bildschirmtreiber (im Platform Builder-Verzeichnis, Platform\Cepc\Drivers\Display\S3trio64) der Treiber legt den Funktionszeiger standardmäßig zu EmulatedLine fest, aber wählt Hardwarebeschleunigung für Zeilen, die beide im Videospeicher und ROP 0x0D0D verwenden. Das folgende Codebeispiel veranschaulicht dies:

#ifdef ENABLE_ACCELERATION
	if( phase == gpeSingle || phase == gpePrepare )
	{
		pLineParms->pLine = EmulatedLine;
//		pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *))EmulatedLine;
		if( pLineParms->pDst->InVideoMemory() && pLineParms->mix == 0x0d0d )
		{
			SelectSolidColor( pLineParms->solidColor );
			pLineParms->pLine = (SCODE (GPE::*)(struct GPELineParms *))AcceleratedSolidLine;
		}
//		if( pLineParms->mix == 0x0B07 )	   .. dotted line

	}
#else
		pLineParms->pLine = EmulatedLine;
#endif
Darüber hinaus kann in der Vorbereitungsphase der Treiber optional zusätzliche Verarbeitung, z. B. initialisieren Hardwareregistern mit der ausgewählten Farbe ausführen. Nach der Vorbereitungsphase die Kontrolle an die GPE- DrvStrokePath -Funktion zurückgegeben.

DrvStrokePath verwaltet Zeichnen der einzelnen Segmente

Nach der Ermittlung des Treibers Strichzeichnung Funktion, führt die folgenden Schleifen die DrvStrokePath -Funktion. Die Reihenfolge der folgenden Schleifen soll Clipping Hardware zu maximieren. Normalerweise fällt ein Pfad nur eine Clipping Rechtecke.
	for( each clip rectangle in clip list )
	{
		for( each line segment in stroke path )
		{
			calculate line segment clipped to current cliprect

			pParms->pLine(pParms);
		}
	}
DrvStrokePath -Funktion clips Liniensegmente auf das Clippingrechteck. Es ist nicht für den Treiber, führen Sie die Zeile Funktion erforderlich. Tatsächlich wird der Treiber wirklich verhindert clipping, da keine gültigen Clipping Informationen während der Vorbereitungsphase. Gibt es möglicherweise keine Auswahlrechteck oder kann es eine ganze Folge von Clipping Rechtecke für ein einzelnes Vorbereiten Aufruf.
  • EmulatedLine ist der Standard Strichzeichnung-Funktion

    Die Funktion EmulatedLine ist die GPE-Strichzeichnung-Funktion. EmulatedLine implementiert den folgenden Algorithmus:
    	long accum = (long)(pParms->dN) + pParms->llGamma;
    	long axstp = (long)(pParms->dN);
    	long dgstp = (long)(pParms->dN) - (long)(pParms->dM);
    
    for( remainingPels = pParms->cPels; remainingPels; remainingPels-- )
    	{
    		if( axstp )		//  ( axstp == 0 implies horizontal or vertical line being drawn )
    		{
    			if( accum < 0 )
    			{
    				accum += axstp;
    			}
    			else
    			{
    				increment_in_minor_direction;
    				accum += dgstp;
    			}
    		}
    		increment_in_major_direction;
    	}
    EmulatedLine Verwendung empfohlen

    Verwenden Sie die EmulatedLine -Funktion, behandeln diagonale Linien. Diagonale Linien sind relativ selten und müssen normalerweise nicht beschleunigt werden. Ebenso ist es ziemlich selten für Zeile Formatvorlagen verwendet werden. Die Funktion EmulatedLine sollte als der Standard-Prozessor für diesen Fall auch verwendet werden.

  • Treiber kann Standard-Funktion ersetzen.

    Für Geräte, die Strichzeichnung Hardwarebeschleunigung unterstützen, kann der Treiber eine beschleunigte Inlinefunktion, ersetzen die Standardfunktion für EmulatedLine implementieren. Alternativ kann der Treiber Aufrufen eine vorhandene Funktion oder erstellen eine neue Software-Emulation-Funktion, Zeile Zeichnung behandeln. Auch wenn unzureichend Strichzeichnung Beschleunigung verfügbar, ist wenn einfarbige Füllung Block Transfer (BLT) Beschleunigung in der Hardware implementiert wird, diese verwendet werden sollte, um horizontale und vertikale Linien zu beschleunigen.

    Hardware Beschleunigung der horizontale und vertikale Linien nur

    Die empfohlene Vorgehensweise für die meisten Situationen besteht darin, alle diagonale und formatierte Zeilen, mit Strichzeichnung Hardware oder Füllung blt-Hardware die um horizontale und vertikale Linien zu beschleunigen, die den Großteil von Windows CE gezeichneten Linien bilden zu emulieren. Für horizontale und vertikale Linien der dN -Parameter ist NULL (0) und kein Konto muss die Sub-pixel Informationen in der Llgamma dM Parameter und Fehler Begriff übernommen werden.
    if( pLineParms->dN == 0 )
    {
    	// Line is vertical or horizontal
    	// Use fill-blt or h/w line to draw a line starting at
    	// pLineParms->xStart, pLineParms->yStart
    	// in the direction specified by pLineParms->iDir
    	// for a total of pLineParms->cPels pixels
    }
    else
    {
    	return EmulatedLine( pLineParms );	// use S/W for diagonal line
    }
Hardware Acceleration der diagonale Linien

Es ist wichtig für diagonalen Linien, die Werte in der dM -Parameter, dN -Parameter beachten und Fehler Begriff Llgamma Felder des GPELineParms Sub-pixel Informationen enthalten. Diese Informationen sollten verwendet werden, wenn beim Initialisieren der Hardware Strichzeichnung registriert. Andernfalls werden diagonale Linien, die abgeschnitten werden nicht korrekt gezeichnet. Dieser Effekt kann ziemlich erkennbar sein, wenn ein Fenster über ein anderes Fenster zu verschieben, der eine diagonale Linie enthält.

In der Vorbereitungsphase führt der Treiber eine allgemeine Überprüfung der die Parameter Zeile, um zu bestimmen wenn er es beschleunigen kann. Wenn die Beschleunigung-Funktion aufgerufen wird, müssen der Treiber möglicherweise zusätzliche Validierung durchzuführen. Dies ist da beim Aufruf des Treibers beschleunigte Funktion für ein Segment bestimmten Pfad zu einem bestimmten Clippingbereich abgeschnitten ist. Der Treiber muss sicherstellen, beispielsweise die Zeilenlänge Segment nicht seinen Hardwareregistern zu einem Überlauf führen wird. Beispielsweise erfolgt in der S3Trio64-Treiber diese zusätzliche Sicherheitsstufe ausblenden im Code, der folgt. Da die Werte für dM und dN ursprünglich in 1/16ths von Pixeln ausgedrückt werden, müssen das Gerät Hardware Steigung Iteratoren können diese Länge für beliebige Liniensegment gezeichnet wird beibehalten. Viel Hardware eine diagonale Linie über den gesamten Bildschirm zu zeichnen können entworfen ist aber erwartet die dM und den dN -Werte (oder Entsprechungen) in Pixeln ausgedrückt werden. Da GPE Sub-pixel Genauigkeit verwendet, benötigen diese Leistungsindikatoren mehr Bits vier (4). Für kurze Linien ist es kein Problem, doch für lange Zeilen können diese Werte die Zeilen, die nur an einige Rand den Bildschirm oder sogar um ein paar Mal Umbruch deaktivieren zinging führt Register Überlauf.

Während diagonale Linien ungewöhnlich darstellen, sind lange diagonale Linien sehr selten, so dass die Zeit zum Rendern lange diagonaler Linien mit der Funktion EmulatedLine unwichtig ist.
int errTerm = (int)pLineParms->dN + (int)pLineParms->llGamma - ( ( command & PLUS_X ) ? 0 : 1 );

	if(
		( pLineParms->dN > 4090 ) ||
		( pLineParms->dM-pLineParms->dN > 4090 ) ||		// remember dM >= dN
		( errTerm > 4090 ) ||
		( errTerm < -4090 ) )
	{
		RetVal = EmulatedLine( pLineParms );	// The hardware DDA would overflow so use the emulation
	}
	else
	{
		WaitForFIFO(7); // seven parameters required
		reg_ALT_CURXY = ((pLineParms->xStart + ((S3Trio64Surf *)(pLineParms->pDst))->Left()) << 16 ) |
						(pLineParms->yStart + ((S3Trio64Surf *)(pLineParms->pDst))->Top());
		reg_MAJ_AXIS_PCNT = (pLineParms->cPels-1);
		reg_ALT_STEP = (((pLineParms->dN-pLineParms->dM)/*&0x3FFF*/)<<16) | (pLineParms->dN /*&0x3FFF*/);
		reg_ERR_TERM = errTerm /*&0x3FFF*/;
		reg_CMD = command;
		RetVal = S_OK;
	}

Abschließen der Phase

Nach Abschluss die DrvStrokePath -Funktion Strichzeichnung ruft DrvStrokePath erneut den Treiber Zeile Funktion dieses Mal den EGPEphase-Satz an GpeComplete übergeben. Der Treiber sollte jeder Strichzeichnung Status zu diesem Zeitpunkt von der Hardware benötigt bereinigen.

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Windows CE Platform Builder 2.11
  • Microsoft Windows CE Platform Builder 2.12
  • Microsoft Encarta Reference Suite 2001
Keywords: 
kbmt kbinfo KB262127 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 262127  (http://support.microsoft.com/kb/262127/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.