ID do artigo: 262127 - Última revisão: segunda-feira, 12 de fevereiro de 2007 - Revisão: 2.4

INFO: Aprimorando o desempenho de driver do Windows CE vídeo: operações de desenho de linha

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

A maioria dos drivers de vídeo Windows CE usam gráficos primitivos mecanismo (GPE) para fornecer padrão de processamento de primitivos de driver de vídeo. O método GPE::Line desenha linhas na superfície de destino usando os parâmetros fornecidos em GPELineParms e EGPEPhase estruturas de dados. Este artigo define as estruturas de dados GPELineParms e EGPEPhase e descreve como GPE desenha uma linha.

O desenho padrão fornecido pelo GPE pode ser substituído no driver de vídeo por acelerações emulado em software ou por acelerações de hardware nativo, como discutido no capítulo Windows CE 2.12 Device Driver Kit sobre drivers de vídeo.

Mais Informações

GPELineParms Estrutura

GPELineParms é uma estrutura. GPELineParms é definido neste diretório de Platform Builder:
Public\Common\Oak\Inc
GPELineParms é usado por GPE e o driver de vídeo para controlar o desenho de linha. Alguns dos parâmetros na estrutura de vir diretamente do aplicativo ou o contexto de dispositivo atual. O restante são calculados por 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
};
O estilo GPELineParms é o estilo de linha. Valor de zero (0) indica se é uma linha sólida (isto é, um único ROP2) enquanto um estilo de 0xAAAAAAAA é pontos de pixel único (alternando entre dois ROP2s). Como passada para a função DrvStrokePath , o sinalizador LA_ALTERNATE no plineattrs-> fl implica um estilo de 0xAAAAAAAA. Como alternativa, você pode usar oparâmetros pstyle e cstyle para tornar complexos tracejada ou pontilhada estilos. Por exemplo, 0xF0F0F0F0 em pParms-> estilo implica mais traços.

combinação GPELineParms é o valor ROP2. Ele consiste em dois bytes, um ROP2 para marca e um ROP2 para o espaço. O valor de cada bit no estilo escolhe entre os dois bytes no pParms-> mistura valor. GPELineParms iDir é o número de octant para a linha (um dos valores de 8, por algoritmo Bresenham). Octant eixo Y X-Dir-Dir 0 X-principais + 1 + 1 principais de Y 1 + 1 + 1 principais de Y 2-1 + 1 X 3-maior-1 + 1 4 X-principais-1-1 5 Y-principais-1-1 6 Y-principais-1 + 1 X 7-principais-1 + 1

EGPEPHASE enumeradas tipo

EGPEPHASE é um tipo enumerado. EGPEPHASE é definido no diretório de Platform Builder seguinte:
Public\Common\Oak\Inc
enum EGPEPhase
{
	gpeSingle,
	gpePrepare,  //device-specific initialization
	gpeContinue,
	gpeComplete  //device-specific clean up
};

Processamento de desenho de linha

Preparar fase

Desenho de linha começa quando um aplicativo chama o método de polilinha. GDI manipula a chamada para o método de polilinha. GDI valida que há pelo menos dois vértices e o estilo de linha não é nulo. GDI, em seguida, chama a função GPE DrvStrokePath , ou para uma caneta grande, a função DrvFillPath . Quando o GDI chama a função de membro GPE, ele passa informações do contexto do dispositivo:
  • Objeto superfície
  • Caminho de objeto
  • Retângulo de clipe
  • O Pincel
  • O valor ROP2
  • Os atributos de linha (sólidos ou tracejados).
Esses parâmetros foram definidos pelo aplicativo ou são realizados de atributos. GPE usa alguns dos parâmetros de entrada para preencher sua estrutura GPELineParms.

GPE, em seguida, chama função de linha do driver de vídeo, passando o GPELineParms e passando uma configuração EGPEPHASE de gpePrepare . O driver examina as propriedades de linha que está a serem desenhados. O driver, em seguida, escolhe se ele deseja usar a função GPE EmulatedLine ou lidar com a linha com sua própria função acelerada. Antes de selecionar uma função acelerada, o driver deve verificar se o hardware pode lidar com o estilo de linha e ROP. O driver de vídeo S3Trio64 (na pasta Platform Builder Platform\Cepc\Drivers\Display\S3trio64), o driver define o ponteiro de função por padrão para EmulatedLine, mas escolhe aceleração de hardware para linhas que estão na memória de vídeo e usar ROP 0x0D0D. O código de exemplo a seguir ilustra isso:

#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
Além disso, na fase de preparação, o driver pode opcionalmente executar processamento adicional, como inicializar os registradores de hardware com a cor selecionada. Após a fase de preparação, o controle retorna para a função GPE DrvStrokePath .

DrvStrokePath gerencia desenho de cada segmento

Após determinar a função de desenho de linha do driver, a função DrvStrokePath executa loops seguintes. A ordem dos loops se destina a maximizar o recorte de hardware. Normalmente, um caminho pertença a apenas um dos retâ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);
		}
	}
a função DrvStrokePath clipes segmentos de linha para o retângulo de recorte. Não é necessário para o driver fazer isso em sua função de linha . Na verdade, o driver realmente será impedido de corte porque não há nenhuma informação de recorte válida durante a fase de preparação. Não pode haver nenhum retângulo de recorte ou pode haver uma seqüência inteira de retângulos de recorte para uma chamada única preparação.
  • EmulatedLine é a função de desenho de linha padrão

    A função EmulatedLine é a função de desenho de linha GPE. EmulatedLine implementa o algoritmo a seguir:
    	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;
    	}
    Uso recomendado de EmulatedLine

    Use a função EmulatedLine para lidar com linhas diagonais. Linhas diagonais são relativamente raras e normalmente não precisam ser acelerado. Da mesma forma, é muito raro para estilos de linha a ser usado. A função EmulatedLine deve ser usada como o processador padrão para esta ocorrência bem.

  • Driver pode substituir a função padrão

    Para dispositivos que oferecem suporte a aceleração de desenho de linha de hardware, o driver pode implementar uma função de linha acelerado para substituir a função de EmulatedLine padrão. Como alternativa, o driver pode chamar uma função existente ou criar uma nova função de emulação de software para manipular o desenho de linha. Mesmo se o desenho de linha inadequada aceleração estiver disponível, se preenchimento sólido bloco transferência (BLT) aceleração é implementada no hardware, em seguida, isso deve ser usado para acelerar linhas horizontais e verticais.

    Aceleração de hardware de horizontal e vertical somente linhas

    A abordagem recomendada para a maioria das situações é emular todas as linhas diagonais e com estilo, usando o hardware de desenho de linha ou preenchimento blt hardware para acelerar linhas horizontais e verticais que constituem a maioria das linhas desenhadas pelo Windows CE. Para linhas horizontais e verticais, o parâmetro de nome distinto (DN) é zero (0) e não conta precisa ser executada das informações sub-pixel llgamma de prazo de parâmetro e erro 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
    }
Aceleração de hardware de linhas diagonal

É importante observar que para as linhas diagonais, valores do parâmetro dM , parâmetro de nome distinto (DN) , e erro termo llgamma campos de GPELineParms contêm informações sub-pixel. Essa informação deve ser usada quando inicializar o desenho de linha de hardware se registra. Caso contrário, as linhas diagonais que são cortadas são desenhadas incorretamente. Esse efeito pode ser bastante perceptível ao mover uma janela sobre outra janela que contém uma linha diagonal.

Na fase de preparação, o driver executa uma inspeção geral dos parâmetros de linha para determinar se ele pode acelerá-lo. Quando a função de aceleração é chamada, o driver talvez precise executar a validação adicional. Isso ocorre porque quando função acelerado do driver é chamada, ele é para um segmento de caminho específico, cortado para uma região de recorte específicos. O driver precisa garantir que, por exemplo, o comprimento do segmento de linha não fará seus registradores de hardware para estouro de capacidade. Por exemplo, no driver S3Trio64, esse nível adicional de triagem ocorre no código a seguir. Porque os valores de nome distinto (DN) e dM originalmente são expressas em 1/16ths de pixels, iteradores de inclinação de hardware do dispositivo precisam ser capaz de manter esses tamanhos para qualquer segmento de linha é desenhado. Uma grande quantidade de hardware foi projetada para ser capaz de desenhar uma linha diagonal em toda a tela mas espera dM e os valores de nome distinto (DN) (ou equivalentes) para ser expressas em pixels. Porque GPE usa sub-pixel precisão, esses contadores precisam bits mais quatro (4). Para linhas curtas, não é um problema, mas para linhas longas esses valores podem estourar registradores resultando em linhas apenas zinging desativar alguns borda da tela ou até mesmo quebra automática em torno de algumas vezes.

Embora as linhas diagonais são incomuns, linhas diagonais longo são extremamente raras para que o tempo gasto para processar linhas diagonais tempo usando a função EmulatedLine fique sem importância.
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;
	}

Fase concluída

Após a função DrvStrokePath conclusão desenho de linha, o DrvStrokePath chama novamente linha função do driver dessa vez passando o conjunto EGPEphase para gpeComplete . O driver deve limpar qualquer estado de desenho de linha exigido pelo hardware neste momento.

A informação contida neste artigo aplica-se a:
  • Microsoft Windows CE Platform Builder 2.11
  • Microsoft Windows CE Platform Builder 2.12
  • Microsoft Encarta Reference Suite 2001
Palavras-chave: 
kbmt kbinfo KB262127 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 262127  (http://support.microsoft.com/kb/262127/en-us/ )