كيفية تنسيق المخزن المؤقت الأصلية GetGlyphOutline()

ملخص

الدالة GetGlyphOutline يوفر طريقة لتطبيق لاسترداد معلومات أقل مستوى حول حرف رسومي في بيئة تروتايب. توضح هذه المقالة تنسيق البيانات
ترجع الدالة GetGlyphOutline .

مزيد من المعلومات

مخطط تفصيلي رسومي عبارة عن سلسلة من المحيطات التي تصف الحرف الرسومي. ويعرف كل محيط بنية بيانات تبوليجونهيدير التي يتبعها العديد من هياكل البيانات تبوليكورفي التي تلزم لوصف المحيط.


يتم وصف كل موقف ببنية بيانات POINTFX ، الذي يمثل موضع مطلق، لا موضع نسبي. البدء والانتهاء للحرف الرسومي تعطي عضو بنية بيانات تبوليجونهيدير بفكسستارت .


بنيات البيانات تبوليكورفي تنقسم إلى نوعين: سجل TT_PRIM_LINE أو سجل TT_PRIM_QSPLINE. سجل TT_PRIM_LINE عبارة عن سلسلة من النقاط؛ وصف الخطوط المرسومة بين النقاط حدود الحرف الرسومي. سجل TT_PRIM_QSPLINE عبارة عن سلسلة للنقاط التي تحدد المفاتيح الدرجة الثانية (المفاتيح q) المطلوبة لوصف تفصيلي للحرف.


تروتايب، تم تعريف شريحة q بثلاث نقاط (A و B و C)، حيث تكون نقاط ألف وجيم على المنحنى ونقطة B إيقاف المنحنى. معادلة كل شريحة q كما يلي (xA يمثل اﻻحداثي س للنقطة ألف، يا يمثل اﻻحداثي ص للنقطة ألف، وهكذا)

   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 كما يلي:

  • نقطة على الشريحة q هو الموضع الحالي (أي بفكسستارت في تبوليجونهيدير أو نقطة البداية تبوليكورفي نقطة النهاية تبوليكورفي السابقة).
  • النقطة (ب) هو النقطة الحالية في السجل.
  • النقطة ج كما يلي:

    • إذا كان السجل اثنين أو أكثر من نقاط بعد النقطة (ب)، هو النقطة جيم نقطة المنتصف بين النقطة (ب) والنقطة التالية في السجل.
    • وإلا، نقطة 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;

}

في أحد تطبيقات إنتاج بدلاً من كتابة دالة دراوقسبليني لرسم شريحة q كل على حدة، من أكثر فعالية لحساب نقاط على الشريحة q وتخزينها في مجموعة واسعة من بنيات بيانات نقطة. عند إتمام العمليات الحسابية للحرف رسومي، تمرير صفيف نقطة للدالة بوليبوليجون لرسم أو تعبئة الحرف الرسومي.


يعرض المثال التالي البيانات الناتجة عن 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 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات