Como formato da memória intermédia nativo GetGlyphOutline()

Traduções de Artigos Traduções de Artigos
Artigo: 87115 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

A função GetGlyphOutline fornece um método para uma aplicação obter informações de nível mais baixo sobre um glifo no ambiente do TrueType. Este artigo descreve o formato de dados que devolve a função GetGlyphOutline .

Mais Informação

Um destaque de glifo é uma série de curvas de nível que descrevem o glifo. Cada curva de nível é definida pela estrutura de dados TTPOLYGONHEADER , qual é seguida por estruturas de dados TTPOLYCURVE quantas necessárias para descrever a curva de nível.

Cada posição é descrita pela estrutura de dados POINTFX , que representa uma posição absoluta, não uma posição relativa. Inicial e final ponto para a imagem é fornecido pelo membro pfxStart a estrutura de dados TTPOLYGONHEADER .

As estruturas de dados TTPOLYCURVE enquadram-se dois tipos: um registo TT_PRIM_LINE ou um registo TT_PRIM_QSPLINE. Um registo TT_PRIM_LINE é uma série de pontos; linhas desenhadas entre pontos de descrevem o contorno da imagem de. Um registo TT_PRIM_QSPLINE é uma série de pontos definir curvas de quadrático polinomiais (q curvas polinomiais) necessárias para descrever o destaque do carácter.

TrueType, uma curva polinomial q é definida por três pontos (A, B e C), onde são pontos A e C na curva e ponto que B está desactivada a curva. A equação para cada curva polinomial q é como se segue (xA representa a coordenada x do ponto de A,-representa a coordenada y do ponto de etc.)
   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 para 1.0.

O formato de um registo TT_PRIM_QSPLINE é da seguinte forma:
  • UM ponto na curva polinomial q é a posição actual (ou pfxStart o TTPOLYGONHEADER, o ponto de partida para a TTPOLYCURVE ou o ponto final da TTPOLYCURVE anterior).
  • Ponto B é o ponto actual no registo.
  • Ponto C é:
    • Se o registo tem dois ou mais pontos B ponto a seguir, o ponto de C é o ponto intermédio entre ponto B e o ponto seguinte no registo.
    • Caso contrário, ponto C é o ponto seguir ponto B.
O código seguinte apresenta o algoritmo utilizado para processar um registo TT_PRIM_QSPLINE. Enquanto este código demonstra como extrair q-curvas polinomiais de um registo TT_PRIM_QSPLINE, não é apropriado para utilização numa aplicação.
   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
   }
				
algoritmo acima manipula pontos directamente, utilizando operadores de vírgula flutuante. No entanto, pontos q-curva polinomial registos são armazenados num tipo de dados fixa. O seguinte código demonstra como manipular itens de dados fixa:
   FIXED fx;
   long *pl = (long *)&fx;

   // Perform all arithmetic on *pl rather than on fx

   *pl = *pl / 2;
				
a função seguinte converte um número de vírgula flutuante a representação fixa:
   FIXED FixedFromDouble(double d)
   {

   long l;

   l = (long) (d * 65536L);
   return *(FIXED *)&amp;l;

   }
				
de uma aplicação de produção e não escrever uma função DrawQSpline para desenhar individualmente cada curva polinomial q, é mais eficiente para calcular pontos a curva polinomial q e armazená-los numa 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 seguinte apresenta os dados devolvidos por GetGlyphOutline para glifo minúsculas "j" no tipo de 24 pontas Arial letra do 8514/a (tipos de letra minúscula) controlador 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

Artigo: 87115 - Última revisão: 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
  • Microsoft Win32 Application Programming Interface
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 87115
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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