Как собственный формат буфера GetGlyphOutline()

Переводы статьи Переводы статьи
Код статьи: 87115 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

В GetGlyphOutline функция предоставляет метод для приложения получить о низком уровне глифов в TrueType среда. В данной статье описывается формат данныхGetGlyphOutline функция возвращает.

Дополнительная информация

Глиф структуры представляет собой набор контуров, описывающие глиф. Каждый Профиль загрузки определяется TTPOLYGONHEADER Структура данных, которая является следуют столько TTPOLYCURVE структуры данных, необходимые для Описание профиля.

Описывается каждое положение POINTFX данные структуры, представляет абсолютное положение, не относительное положение. Даты начала и конечную точку для данного глиф pfxStart член TTPOLYGONHEADER Структура данных.

В TTPOLYCURVE структуры данных делятся на два типа: TT_PRIM_LINE запись или запись TT_PRIM_QSPLINE. Запись TT_PRIM_LINE представляет собой серию точек; линий между точками описывают контур глиф. TT_PRIM_QSPLINE запись — это последовательность из точки, определяющие квадратичных сплайнов (q сплайны), необходимые для описания структуры символ.

В TrueType, сплайн q определяется три точки (A, B и C) где точек a и c находятся на кривой и точки b отключен от кривой. Уравнение для каждого сплайна q является следующим образом (представляющий xA Координата x точки A, интересными представляет координату по оси y точки a и т. д.)
   x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
   y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
				
где t варьируется от 0,0 до 1,0.

Формат записи TT_PRIM_QSPLINE выглядит следующим образом:
  • A точку на кривую q является (либо pfxStart в текущей позиции TTPOLYGONHEADER, отправной точкой для TTPOLYCURVE, или Конечная точка предыдущей TTPOLYCURVE).
  • B точки является текущей записи.
  • C точки выглядит следующим образом:
    • Если запись имеет два или более точек, после точки b пункт c является средней точки между точки b и далее точки запись.
    • В противном случае c точка является точкой, после точки б.
Следующий код представляет алгоритм, используемый для процесса Запись TT_PRIM_QSPLINE. Хотя этот код демонстрирует извлечение q сплайны с TT_PRIM_QSPLINE записи, он не подходит для использования в приложении.
   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
   }
				
Выше алгоритма управляет точки непосредственно, с плавающей запятой операторы. Тем не менее точки сплайна q записей хранятся в фиксированный Тип данных. Следующий код демонстрирует управление фиксированный элементы данных:
   FIXED fx;
   long *pl = (long *)&fx;

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

   *pl = *pl / 2;
				
Следующая функция преобразует число с плавающей запятой в фиксированный представление:
   FIXED FixedFromDouble(double d)
   {

   long l;

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

   }
				
В реальном приложении, а не письма DrawQSpline функции для рисования каждого сплайна q по отдельности, более эффективным Расчет точки на кривой q и хранить их в массив ТОЧКАструктуры данных. После выполнения расчетов для глифов, передача ТОЧКИ массива PolyPolygon функции для рисования и заполнения глиф.

Следующий пример представляет данные, возвращенные GetGlyphOutline для строчные буквы «j» глифов в шрифте Arial 24 точки 8514/a (мелкий шрифт) видео драйвер:
   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
				

Свойства

Код статьи: 87115 - Последний отзыв: 1 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
Ключевые слова: 
kbhowto kbmt KB87115 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:87115
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

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