Como GetGlyphOutline() no formato de buffer nativo

Traduções deste artigo Traduções deste artigo
ID do artigo: 87115 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

A função GetGlyphOutline fornece um método para um aplicativo recupere as informações de nível mais baixo sobre um glifo no ambiente de TrueType. Este artigo descreve o formato dos dados que a função GetGlyphOutline retorna.

Mais Informações

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 *)&amp;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
				

Propriedades

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
Palavras-chave: 
kbmt kbhowto KB87115 KbMtpt
Traduçã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: 87115
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este 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.

Submeter comentários

 

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