INFORMACIÓN: Mejorar el rendimiento de controlador de Windows CE vídeo: operaciones de dibujo de línea

Seleccione idioma Seleccione idioma
Id. de artículo: 262127 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

La mayoría de los controladores de pantalla Windows CE utilizan el motor de primitivos de gráficos (GPE) para proporcionar procesamiento predeterminado para tipos primitivos de controlador de pantalla. El método de GPE::Line dibuja líneas en la superficie de destino mediante los parámetros proporcionados en el GPELineParms y estructuras de datos de EGPEPhase . En este artículo define las estructuras de datos GPELineParms y EGPEPhase y describe cómo GPE dibuja una línea.

El dibujo predeterminado proporcionado por GPE puede sustituirse en el controlador de pantalla mediante las aceleraciones de emulación de software o aceleración de hardware nativo, como se describe en el capítulo del Kit de controladores de dispositivos de Windows CE 2.12 acerca de controladores de pantalla.

Más información

GPELineParms Estructura

GPELineParms es una estructura. GPELineParms se define en este directorio de Platform Builder:
Public\Common\Oak\Inc
GPE y el controlador de pantalla utilizan GPELineParms para controlar el dibujo de línea. Algunos de los parámetros en la estructura proceden directamente de la aplicación o el contexto de dispositivo actual. El resto se calculan mediante GPE.
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
};
El estilo GPELineParms es el estilo de línea. Un valor cero (0) implica que es una línea sólida (es decir, un único ROP2) mientras que un estilo de 0xAAAAAAAA es solo píxel puntos (alternando entre dos ROP2s). Que pasó la función DrvStrokePath , el indicador LA_ALTERNATE plineattrs-> fl implica un estilo de 0xAAAAAAAA. Como alternativa, puede utilizar elparámetros pstyle y cstyle para realizar complejas guión o puntos de estilos. Por ejemplo, 0xF0F0F0F0 en pParms-> estilo implica más largas guiones.

mezcla GPELineParms es el valor de ROP2. Se compone de dos bytes, una ROP2 de marca y un ROP2 espacio. El valor de cada bit en el estilo se elige entre los dos bytes en pParms-> valor de la combinación. GPELineParms iDir es el número de octant para la línea (uno de los 8 valores, por el algoritmo Bresenham). Octant eje X Dir Y-Dir 0 X-principal + 1 + 1 1 Y-principal + 1 + 1 Y 2-principal-1 + 1 X 3-principal-1 + 1 X 4-superior-1-1 Y 5-superior-1-1 Y 6-superior-1 + 1 X 7-principal-1 + 1

EGPEPHASE enumeradas tipo

EGPEPHASE es un tipo enumerado. EGPEPHASE se define en el siguiente directorio de Platform Builder:
Public\Common\Oak\Inc
enum EGPEPhase
{
	gpeSingle,
	gpePrepare,  //device-specific initialization
	gpeContinue,
	gpeComplete  //device-specific clean up
};

Proceso de dibujo de línea

Preparar la fase

Dibujo de línea comienza cuando una aplicación llama al método polilínea. GDI trata la llamada al método polilínea. GDI valida que hay al menos dos vértices y que el estilo de línea no es null. GDI, a continuación, llama a la función GPE DrvStrokePath o para un lápiz ancho, la función DrvFillPath . Cuando GDI llama a la función de miembro GPE, pasa a lo largo de información desde el contexto de dispositivo:
  • Objeto de superficie
  • Objeto de trazado
  • Rectángulo de recorte
  • El pincel
  • El valor de ROP2
  • Los atributos de línea (sólidos o discontinuos).
Estos parámetros se estaban establecen mediante la aplicación o se son atributos producidos. GPE utiliza algunos de los parámetros de entrada para llenar su estructura GPELineParms.

GPE, a continuación, se llama a la presentación función del controlador línea , pasando el GPELineParms y pasando un valor de EGPEPHASE de gpePrepare . El controlador examina las propiedades de la línea que se va a dibujar. El controlador, a continuación, elige si desea utilizar la función GPE EmulatedLine o controlador de la línea con su propia función acelerado. Antes de seleccionar una función acelerada, el controlador debe comprobar si el hardware puede controlar el estilo de línea y ROP. En el controlador de pantalla S3Trio64 (en el directorio de Platform Builder Platform\Cepc\Drivers\Display\S3trio64), el controlador establece el puntero de función a EmulatedLine de forma predeterminada, pero elige la aceleración de hardware para líneas que están en memoria de vídeo y utilizar ROP 0x0D0D. El código de ejemplo siguiente ilustra esto:

#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
Además, en la fase de preparación, el controlador, opcionalmente, puede realizar procesamiento adicional, como inicializar los registros de hardware con el color seleccionado. Después de la fase de preparación, el control vuelve a la función GPE DrvStrokePath .

DrvStrokePath administra el dibujo de cada segmento

Después de determinar la función de dibujo de línea del controlador, la función DrvStrokePath lleva a cabo el siguiente bucle. El orden de estos bucles está pensado para maximizar el recorte de hardware. Normalmente, una ruta de acceso se encuentra en sólo uno de los rectángulos de recorte.
	for( each clip rectangle in clip list )
	{
		for( each line segment in stroke path )
		{
			calculate line segment clipped to current cliprect

			pParms->pLine(pParms);
		}
	}
clips de la función DrvStrokePath los segmentos de línea para el rectángulo de recorte. No es necesario para el controlador hacer en su función en línea . De hecho, el controlador realmente se impedirá recorte porque no hay ninguna información de recorte válido durante la fase de preparación. No puede haber ningún rectángulo de recorte o puede haber una secuencia completa de rectángulos de recorte para una llamada única preparación.
  • EmulatedLine es la función de dibujo de línea predeterminado

    La función EmulatedLine es la función de dibujo de línea GPE. EmulatedLine implementa el algoritmo siguiente:
    	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;
    	}
    Recomendado uso de EmulatedLine

    Utilice la función EmulatedLine para controlar líneas diagonales. Líneas diagonales son relativamente raras y normalmente no es necesario ser acelerado. De forma similar, es bastante raro para estilos de línea que se va a utilizar. La función EmulatedLine debe utilizarse como el procesador predeterminado para este caso así.

  • Controlador puede reemplazar la función predeterminada

    Para dispositivos que admiten aceleración de dibujo de línea, el controlador puede implementar una función línea acelerado para reemplazar la función de EmulatedLine predeterminada. Como alternativa, el controlador puede llamar a una función existente o cree una nueva función de emulación de software para controlar el dibujo de línea. Incluso si está disponible, la aceleración de inadecuados de dibujo de línea si relleno sólido bloque transferencia (BLT) aceleración está implementado en el hardware debe utilizarse para acelerar líneas horizontales y verticales.

    Aceleración de hardware de horizontal y vertical sólo líneas

    El enfoque recomendado para la mayoría de situaciones es emular todas líneas de la diagonales y con estilo mediante hardware de dibujo de línea o relleno blt hardware para acelerar líneas horizontales y verticales que forman la mayoría de las líneas dibujadas por Windows CE. Para líneas horizontales y verticales, el parámetro de dN es cero (0) y no necesita realizarse ninguna cuenta de la información subpíxeles llgamma de término de parámetro y de error de dM .
    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
    }
Aceleración de hardware de líneas en diagonal

Es importante observar que las líneas diagonales, los valores en el parámetro dM , parámetro de dN y error término llgamma campos de GPELineParms contienen información de subpíxel. Esta información se debe utilizar cuando registra inicializando dibujo de línea de hardware. En caso contrario, incorrectamente se dibujan líneas diagonales que se recortan. Este efecto puede ser bastante apreciable al mover una ventana por encima de otra ventana que contiene una línea diagonal.

En la fase de preparación, el controlador realiza una inspección general de los parámetros de línea para determinar si puede acelerar. Cuando se llama a la función de aceleración, el controlador que tenga que realizar validación adicional. Esto es porque cuando se llama a la función del controlador acelerado, es para un segmento de ruta específica, recortado a una región de recorte específicos. El controlador necesita garantizar que, por ejemplo, la longitud de segmento de línea no hará que los registros de hardware a desbordamiento. Por ejemplo, en el controlador S3Trio64, este nivel adicional de filtrado tiene lugar en el código que sigue. Porque los valores de dM y dN originalmente se expresan en 1/16ths de píxeles, hardware pendiente iteradores del dispositivo necesitan poder conservar estas longitudes para cualquier segmento de línea se está dibujando. Una gran cantidad de hardware está diseñada para poder dibujar una línea diagonal en toda la pantalla pero espera dM y el dN de valores (o equivalentes) a se expresan en píxeles. Dado que GPE utiliza la precisión de subpíxeles, estos contadores necesita cuatro (4) más bits. Corta las líneas, no es un problema pero para las líneas largas estos valores pueden desbordar los registros de lo que sólo zinging desactivar algunos borde de la pantalla o incluso unas cuantas veces alrededor de ajuste de líneas.

Mientras que líneas diagonales son raro, líneas diagonales largo son extremadamente raras por lo que el tiempo necesario para representar líneas diagonales largo mediante la función EmulatedLine es importante.
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;
	}

Finalizar fase

Después de la función DrvStrokePath finaliza el dibujo de línea, DrvStrokePath llama a la función del controlador línea nuevo este tiempo pasa el conjunto de EGPEphase a gpeComplete . El controlador debería limpiar cualquier estado de dibujo de línea requerida por el hardware en este momento.

Propiedades

Id. de artículo: 262127 - Última revisión: lunes, 12 de febrero de 2007 - Versión: 2.4
La información de este artículo se refiere a:
  • Microsoft Windows CE Platform Builder 2.11
  • Microsoft Windows CE Platform Builder 2.12
  • Microsoft Encarta Reference Suite 2001
Palabras clave: 
kbmt kbinfo KB262127 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 262127

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com