Makale numarası: 262127 - Son Gözden Geçirme: 12 Şubat 2007 Pazartesi - Gözden geçirme: 2.4

BILGI: Windows CE video sürücüsü performansı artırma: satır çizim işlemleri

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Çoğu Windows CE görüntü sürücüleri, varsayılan görüntü sürücüsü temel öğeler için işleme sağlamak üzere grafikleri temel altyapısı (GPE) kullanın. GPE::Line yöntemi, GPELineParms ve veri yapıları EGPEPhase sağlanan parametreleri kullanarak hedef yüzey üzerinde çizgiler çizer. Bu makalede, GPELineParms ve EGPEPhase veri yapılarını tanımlar ve nasıl GPE, bir çizgi çizer açıklar.

GPE tarafından sağlanan varsayılan çizim görüntü sürücüsü yazılımı Öykünülen ivmelerini veya özgün donanım hızlandırmaları, görüntü sürücüleri Windows CE 2.12 Device Driver Kit bölümde anlatıldığı gibi değiştirilebilir.

Daha fazla bilgi

GPELineParms Yapısı

GPELineParms bir yapıdır. GPELineParms Platform Builder'ın bu dizinde tanımlanır:
Public\Common\Oak\Inc
GPELineParms çizim denetlemek için GPE ve görüntü sürücüsü tarafından kullanılır. Bazı yapısındaki parametreleri, uygulama veya geçerli aygıt içeriğini doğrudan gelir. Kalan GPE tarafından hesaplanır.
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
};
Çizgi stilini GPELineParms stilidir. Değeri sıfır (0), piksel tek nokta (iki ROP2s arasında değişen) 0xAAAAAAAA stilidir ise, kesintisiz çizgi (yani, tek bir ROP2) olduğunu gösterir. DrvStrokePath işlevi geçirilen gibi plineattrs fl-> LA_ALTERNATE bayrağı 0xAAAAAAAA stili anlamına gelir. Alternatif olarak, kullanabileceğinizkesik çizgili veya stilleri noktalı karmaşık hale pstyle ve cstyle parametreleri. Örneğin, uzun tire 0xF0F0F0F0 pParms stili-> içinde anlamına gelir.

GPELineParms karışık ROP2 değerdir. Iki baytlık bir ROP2 işareti ve bir ROP2 alanı için oluşur. Karma değeri-> pParms iki durumda olan bayt arasında bir stilde her bit değeri seçer. GPELineParms iDir octant satırının (bir Bresenham algoritması başına 8 değerlerin) sayısıdır. Octant eksen (X dizini bir E-dizini 0 X-ana + 1 + 1 1 Y ana + 1 + 1 2 Y-ana-1 + 1 3 X ana-1 + 1 4 X ana-1 -1 5 Y-önemli-1 -1 6 Y ana + 1 ile -1 7 X ana + 1 ile -1

EGPEPHASE türü numaralandırılır...

EGPEPHASE numaralandırılmış bir türüdür. EGPEPHASE Platform Builder'ın aşağıdaki dizinde tanımlanır:
Public\Common\Oak\Inc
enum EGPEPhase
{
	gpeSingle,
	gpePrepare,  //device-specific initialization
	gpeContinue,
	gpeComplete  //device-specific clean up
};

Satır çizim işleme

Phase hazırla

Bir uygulama Polyline yöntemini çağırır çizim başlar. GDI Polyline yöntemine ça?r? işler. GDI, en az iki tepe noktaları vardır ve çizgi stilini boş olduğunu doğrular. GDI, sonra GPE DrvStrokePath işlevi çağıran veya geniş bir kalem DrvFillPath işlevi. GDI GPE üye işlevini çağırdığında, aygıt içerikten bilgi geçirir:
  • Yüzey nesnesi
  • Yol nesnesi
  • Dikdörtgen kırpma
  • Fırça
  • ROP2 değeri
  • Satır öznitelikleri (dolu veya kesik).
Bu parametreler, uygulama tarafından ya da bir kümesi olan veya Gerçekleşmiş öznitelikleri. GPE giriş parametrelerden bazıları GPELineParms yapısını doldurmak için kullanır.

GPE içinde GPELineParms geçirilmesi ve gpePrepare EGPEPHASE ayarında geçirmeden sonra Görüntü sürücüsünün satırı işlevini çağırır. Sürücü çizilmesi için satır özelliklerini inceler. Sonra GPE EmulatedLine işlevini kullanın veya Hızlandırılmış kendi işlevini içeren satırı işlemek istiyor olup olmadığını, sürücüyü seçer. Hızlandırılmış bir işlevi seçmeden önce donanım çizgi stilini ve ROP ele alabilir sürücüyü denetlemeniz gerekir. (Dizininde Platform Builder Platform\Cepc\Drivers\Display\S3trio64) S3Trio64 görüntü sürücüsü, sürücü işlev işaretçisi, EmulatedLine için varsayılan ayarlar, ancak donanım hızlandırmasını ROP 0x0D0D video belleği ikisinde iseniz ve satırları da seçer. Aşağıdaki örnek kodu bunu göstermektedir:

#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
Ayrıca, hazırlık aşamasında, sürücü isteğe bağlı olarak seçilen renkle donanım yazmaçların başlatılıyor gibi ek bir işlem gerçekleştirebilir. Hazırlık evresi sonra Denetim GPE DrvStrokePath işlevine döner.

Her kesimi, çizim DrvStrokePath yönetir

Çizim işlevini sürücünün belirleme sonra dışında bir aşağıdaki döngülere DrvStrokePath işlevi gerçekleştirir. Bu döngü sipariş, donanım kırpma en üst düzeye çıkarmak için hazırlanmıştır. Genellikle, yalnızca bir kırpma dikdörtgenin bir yolu döner.
	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 işlevi çizgi parçaları için kırpma dikdörtgen kırpar. Sürücünün satır işlevi bunu yapmak gerekli değildir. Aslında, sürücüyü gerçekten geçerli kırpma bilgi hazırlık aşamasında olduğundan kırpma engellenir. Hiçbir kırpma dikdörtgen olabilir veya tüm bir tek hazırlık arama için kırpma dikdörtgenler sırası olabilir.
  • EmulatedLine varsayılan satır çizim işlevidir

    Çizim işlevini GPE EmulatedLine işlevdir. EmulatedLine aşağıdaki algoritmayı kullanır:
    	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, önerilen kullanımı

    Çapraz Çizgiler işlemek için EmulatedLine işlevini kullanın. Çapraz Çizgiler göreli olarak seyrek ve genellikle Hızlandırılmış gerekmez. Benzer şekilde, kullanılacak çizgi stilleri oldukça seyrek değişkenidir. EmulatedLine işlevi, bu durum için varsayılan işlemci olarak kullanılmalıdır.

  • Sürücü varsayılan işlev Değiştir

    Donanım çizim hızlandırmasını destekleyen aygıtları için sürücü varsayılan EmulatedLine işlevini değiştirmek için bir Hızlandırılmış bekleme fonksiyonu uygulayabilirsiniz. Alternatif olarak, sürücü, varolan bir işlevini çağırmak veya çizgi çizme işlemek için yeni bir yazılım öykünmesi fonksiyon oluşturabilirsiniz. Düz Dolgu bloğu aktarımı (BLT) hızlandırma donanım uygulanır, yetersiz çizim Hızlandırma kullanılabiliyorsa, daha sonra bu yatay ve dikey çizgiler hızlandırmak için kullanılmalıdır.

    Donanım ivmesi, yatay ve dikey satırları yalnızca

    Birçok durum için önerilen yaklaşım, çoğu Windows CE tarafından çizilen satırları oluşturan yatay ve dikey çizgiler hızlandırmak için çizim donanım ya da doldurma blt donanım'ı kullanarak tüm çapraz ve Biçemlendirilmiş satırları'na öykünme sağlamaktır. Yatay ve dikey çizgiler için dN parametresi sıfır (0) ve hesap dM parametresi ve bir hata koşulu llgamma sub-pixel bilgilerinin alınması.
    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
    }
Çapraz çizgiler, donanım ivmesi

Hata koşulu llgamma GPELineParms alanlarının sub-pixel bilgileri içeren ve çapraz çizgiler dM parametresinde dN parametre değerleri için dikkat daha önemlidir. Donanım çizim başlatılıyor kaydeder, bu bilgileri yeniden kullanılması gerekir. Aksi halde, kırpılır, çapraz çizgiler yanlış çizilir. Bu, bir çapraz çizgi içeren başka bir pencere üzerinde bir pencereyi taşırken, oldukça fark olabilir.

Hazırlık aşamasında, sürücü satırı parametrelerinin, onu hızlandırabilir, belirlemek için genel bir incelemesi yapar. Hızlandırma işlevi çağrıldığında, sürücü ek doğrulama gerçekleştirmek gerekebilir. Sürücünün Hızlandırılmış işlevi çağrıldığında bir özel kırpma bölgeye kırpılmış belirli bir yola segment, ilgili olduğu olmasıdır. Örneğin, segment satırının uzunluğu taşma, <a2>Donanım</a2> kayıtlarına neden olmaz, emin olmak, sürücü gerekiyor. Örneğin, S3Trio64 sürücüsünde, bu ek engelleme düzeyi izleyen kodda gerçekleşir. DM ve dN değerleri 1/16ths piksel özgün olarak ifade edilir, çünkü bu uzunlukları için herhangi bir çizgi parçasının çizilen korumak aygıtın donanım Eğim yineleyiciler gerekir. Çok sayıda donanım tam ekranda çapraz bir çizgi çizmek için tasarlanmıştır ancak dM ve dN değerleri (veya eşdeğerleri) piksel cinsinden ifade için bekliyor. GPE sub-pixel duyarlık kullandığından, bu sayaçlar, dört (4) daha fazla bit gerekir. Kısa çizgileri, bir sorun değildir ancak uzun satırlar için bu değerleri yalnızca devre dışı bazı ekran ya da birkaç kez etrafında kaydırma kenarına zinging satırlarındaki kaynaklanan yazmaçların taşma.

Çapraz Çizgiler seyrek olsa da, uzun köşegen çizgiler EmulatedLine işlevini kullanarak işlemek için kullanılan süre önemli değildir; böylece uzun çapraz çizgiler oldukça seyrek.
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;
	}

Tam evresi

Çizim DrvStrokePath işlevi tamamlandıktan sonra DrvStrokePath EGPEphase kümesi gpeComplete için geçirerek, bu kez yeniden sürücünün satırı işlevini çağırır. Sürücü bu noktada, donanım tarafından gerekli tüm çizim durumu temizlemeniz.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Windows CE Platform Builder 2.11
  • Microsoft Windows CE Platform Builder 2.12
  • Microsoft Encarta Reference Suite 2001
Anahtar Kelimeler: 
kbmt kbinfo KB262127 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:262127  (http://support.microsoft.com/kb/262127/en-us/ )