Uma estrutura de tópicos glifo é uma série de delimitações que descrevem o glifo. Cada delimitação é definida por uma estrutura de dados
TTPOLYGONHEADER , que é seguida por como muitas estruturas de dados
TTPOLYCURVE quando forem necessárias para descrever a delimitação.
Cada posição é descrita por uma estrutura de dados
POINTFX , que representa uma posição absoluta, não uma posição relativa. Inicial e final ponto para o glifo é fornecido pelo membro
pfxStart da estrutura de dados
TTPOLYGONHEADER .
As estruturas de dados
TTPOLYCURVE se enquadram em dois tipos: um registro TT_PRIM_LINE ou um registro TT_PRIM_QSPLINE. Um registro TT_PRIM_LINE é uma série de pontos; as linhas desenhadas entre os pontos de descrevem o contorno do glifo. Um registro TT_PRIM_QSPLINE é uma série de pontos definindo splines quadráticas (q-splines) necessárias para descrever a estrutura do caractere.
TrueType, um spline q é definido por três pontos (A, B e C), onde os pontos A e C estão na curva e ponto que B está desativado a curva. A equação para cada q-spline é como segue (xA representa a coordenada x do ponto A, até representa a coordenada y do ponto A e assim por diante)
x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
onde t varia de 0,0 a 1,0.
O formato de um registro TT_PRIM_QSPLINE é da seguinte maneira:
- A ponto no q-spline é a posição atual (qualquer pfxStart no TTPOLYGONHEADER, o ponto de partida para o TTPOLYCURVE ou o ponto final do TTPOLYCURVE anterior).
- Ponto B é o ponto atual no registro.
- Ponto C é o seguinte:
- Se o registro possui dois ou mais pontos seguintes ponto B, C de ponto é o ponto médio entre ponto B e o próximo ponto no registro.
- Caso contrário, ponto C é o ponto seguinte B. de ponto
O código a seguir apresenta o algoritmo usado para processar um registro TT_PRIM_QSPLINE. Embora esse código demonstra como extrair q splines de um registro TT_PRIM_QSPLINE, não é apropriado para uso em um aplicativo.
pfxA = pfxStart; // Starting point for this polygon
for (u = 0; u < cpfx - 1; u++) // Walk through points in spline
{
pfxB = apfx[u]; // B is always the current point
if (u < cpfx - 2) // If not on last spline, compute C
{
pfxC.x = (pfxB.x + apfx[u+1].x) / 2; // x midpoint
pfxC.y = (pfxB.y + apfx[u+1].y) / 2; // y midpoint
}
else // Else, next point is C
pfxC = apfx[u+1];
// Draw q-spline
DrawQSpline(hdc, pfxA, pfxB, pfxC);
pfxA = pfxC; // Update current point
}
o algoritmo acima manipula pontos diretamente, usando operadores de ponto flutuante. No entanto, pontos de spline q registros são armazenados em um tipo de dados fixo. O código a seguir demonstra como manipular itens de dados fixo:
FIXED fx;
long *pl = (long *)&fx;
// Perform all arithmetic on *pl rather than on fx
*pl = *pl / 2;
a seguinte função converte um número de ponto flutuante em representação fixo:
FIXED FixedFromDouble(double d)
{
long l;
l = (long) (d * 65536L);
return *(FIXED *)&l;
}
em um aplicativo de produção, em vez escrever uma função
DrawQSpline para desenhar cada q-spline individualmente, é mais eficiente para calcular pontos em q-spline e armazená-los em uma matriz de estruturas de dados de
ponto . Quando os cálculos de um glifo estiverem concluídos, passe a matriz de ponto para a função
PolyPolygon para desenhar e preencher o glifo.
O exemplo a seguir apresenta os dados retornados por GetGlyphOutline para o glifo minúsculas "j" na fonte Arial 24 pontos do 8514/a (fontes pequenas) driver de vídeo:
GetGlyphOutline GGO_NATIVE 'j'
dwrc = 208 // Total native buffer size in bytes
gmBlackBoxX, Y = 6, 29 // Dimensions of black part of glyph
gmptGlyphOrigin = -1, 23 // Lower-left corner of glyph
gmCellIncX, Y = 7, 0 // Vector to next glyph origin
TTPOLYGONHEADER #1 // Contour for dot on "j"
cb = 44 // Total size of dot polygon
dwType = 24 // TT_POLYGON_TYPE
pfxStart = 2.000, 20.000 // Start at lower-left corner of dot
TTPOLYCURVE #1
wType = TT_PRIM_LINE
cpfx = 3
pfx[0] = 2.000, 23.000
pfx[1] = 5.000, 23.000
pfx[2] = 5.000, 20.000 // Automatically close to pfxStart
TTPOLYGONHEADER #2 // Contour for body of "j"
cb = 164 // Total size is 164 bytes
dwType = 24 // TT_POLYGON_TYPE
pfxStart = -1.469, -5.641
TTPOLYCURVE #1 // Finish flat bottom end of "j"
wType = TT_PRIM_LINE
cpfx = 1
pfx[0] = -0.828, -2.813
TTPOLYCURVE #2 // Make hook in "j" with spline
// Point A in spline is end of TTPOLYCURVE #1
wType = TT_PRIM_QSPLINE
cpfx = 2 // two points in spline -> one curve
pfx[0] = -0.047, -3.000 // This is point B in spline
pfx[1] = 0.406, -3.000 // Last point is always point C
TTPOLYCURVE #3 // Finish hook in "j"
// Point A in spline is end of TTPOLYCURVE #2
wType = TT_PRIM_QSPLINE
cpfx = 3 // Three points -> two splines
pfx[0] = 1.219, -3.000 // Point B for first spline
// Point C is (pfx[0] + pfx[1]) / 2
pfx[1] = 2.000, -1.906 // Point B for second spline
pfx[2] = 2.000, 0.281 // Point C for second spline
TTPOLYCURVE #4 // Majority of "j" outlined by this polyline
wType = TT_PRIM_LINE
cpfx = 3
pfx[0] = 2.000, 17.000
pfx[1] = 5.000, 17.000
pfx[2] = 5.000, -0.250
TTPOLYCURVE #5 // start of bottom of hook
wType = TT_PRIM_QSPLINE
cpfx = 2 // One spline in this polycurve
pfx[0] = 5.000, -3.266 // Point B for spline
pfx[1] = 4.188, -4.453 // Point C for spline
TTPOLYCURVE #6 // Middle of bottom of hook
wType = TT_PRIM_QSPLINE
cpfx = 2 // One spline in this polycurve
pfx[0] = 3.156, -6.000 // B for spline
pfx[1] = 0.766, -6.000 // C for spline
TTPOLYCURVE #7 // Finish bottom of hook and glyph
wType = TT_PRIM_QSPLINE
cpfx = 2 // One spline in this polycurve
pfx[0] = -0.391, -6.000 // B for spline
pfx[1] = -1.469, -5.641 // C for spline
ID do artigo: 87115 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 2.3
A informação contida neste artigo aplica-se a:
- Microsoft Windows Software Development Kit 3.1
- Interface de Programação de Aplicativos do Microsoft Win32
| kbmt kbhowto KB87115 KbMtpt |
Tradução automáticaIMPORTANTE: 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:
87115
(http://support.microsoft.com/kb/87115/en-us/
)
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB AposentadoEste artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.