أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية رسم مخطط تفصيلي الصورة الرمزية تروتايب

انتهاء دعم نظام التشغيل Windows XP

لقد أنهت شركة Microsoft دعم Windows XP في 8 أبريل، 2014. وقد أثر هذا التغيير على تحديثات البرامج لديك وخيارات الأمان الخاصة بك. تعرف على ما يعنيه ذلك فيما يتعلق بك وكيفية الحفاظ على حمايتك.

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية243285
الموجز
يمكن أن ترجع الدالة Win32 API GetGlyphOutline بيانات المخطط التفصيلي الصورة الرمزية الأصلية من خط تروتايب. لرسم مخطط تفصيلي الصورة الرمزية تروتايب يجب تحويل البيانات من تعريف الشريحة B الأصلي الخاص به على تسلسل من تعريفات سطر Bezier. ثم يمكن استخدام الدالة Win32 API PolyBezier لرسم المخطط التفصيلي.
معلومات أخرى
يمكن استرداد الدالة GetGlyphOutline في Interface(API) برمجة تطبيقات Win32 مخطط تفصيلي تروتايب. خيار تنسيق GGO_NATIVE تعبئة المخزن مؤقت مع المنحنيات الشريحة B Quadratic عن مخطط تفصيلي تروتايب. يتم استخدام Splines B quadratic قبل تروتايب لوصف المخطط التفصيلي الصورة الرمزية في ملف خطوط تروتايب. لرسم منحنيات المخطط التفصيلي هذه أحد يمكن تطبيق دالة رسم شريحة B أو استخدم الدالة PolyBezier من Win32 API.

منحنيات الشريحة B quadratic هي فئة المنحنيات parametric تعريف المسار متعددة القطع منحنى خلال القليل من نقاط التحكم. منحنى Quadratic منحنى parametric ترتيب ثاني. هناك لم دالة في API لرسم الشريحة Quadratic مباشرة ولكن إذا تربيعية يتحول إلى ياردات يمكن أن سحب مع Win32 API تعمل الرسومية منحنى Bezier مباشرة؛ PolyBezier.

يتم بشكل عام quadratic المنحنيات B الشريحة في المنحنيات معينة و parametric موضوع well-researched من الرسومات في علم الكمبيوتر. فيمكن أن تكون أيضاً معقد تماماً. تم نشرها خوارزميات في نصوص Item المتنوعة التي يمكن استخدامها لتنفيذ دالة لرسم الشريحة Quadratic ولكن تصف مثل خوارزمية خارج نطاق هذا المقال.

يمكن رسم الدالة PolyBezier الشريحة Quadratic لأن منحنى Bezier منحنى parametric ترتيب مكعب أو الثالثة. ولأن الشريحة Quadratic معادلة ترتيب ثاني فإنه يمكن التعبير عن يتعلق المعادلة مكعبة ترتيب أعلى. على الرغم من أنه يتم تحديد معادلة يعبر quadratic مثل ياردات في نموذج التعليمة البرمجية, لا تمت مناقشته اشتقاق الخاص به في هذه المقالة.

نموذج التعليمة البرمجية في هذه المقالة العرض توضيحي كيفية تحليل المخزن مؤقت الصورة الرمزية GGO_NATIVE التي يتم إرجاعها بواسطة الدالة GetGlyphOutline. المخزن المؤقت الذي تم إرجاعه بواسطة علامة تنسيق GGO_NATIVE تتوافق مع بنية TTPOLYGONHEADER. بنية TTPOLYGONHEADER والبيانات التي تليها مباشرة تكوّن الإحاطة واحد من الصورة الرمزية تروتايب. المنحنى هو عبارة واحدة المسار الكامل من المنحنيات ضمنيًا مغلق إذا أرجعت بهذه الطريقة هو غير بشكل صريح.

الرجاء مراجعة Platform SDK الوثائق في بنيات TTPOLYGONHEADER و TTPOLYCURVE.

مخطط توزيع الصورة الرمزية يتكون من عدة مقاطع منحنى تمثيل بنيات TTPOLYCURVE. في المنحنى هو TTPOLYGONHEADER متبوعاً بنيات TTPOLYCURVE و بيانات نقطة إحداثي واحد أو أكثر. يعطي عضو pfxStart نقطة البداية إحداثي المنحنى. يتم إعطاء عدد السجلات منحنى التي تتبع TTPOLYGONHEADER بواسطة العضو cb. نقطة البدء نسبة إلى نقطة الصفر الصورة الرمزية. أصل الصورة الرمزية هو الزاوية اليمنى السفلية من الحرف في الأساس الحرف.

يتكون كل سجل منحنى TTPOLYCURVE (قطعة منحنى) من نقاط التحكم الشريحة B Quadratic أو نقاط شكل مكون من عدة مستقيمات متصلة بسيطة. يتم إعطاء عدد نقاط بواسطة العضو cpfxTTPOLYCURVE. يتم إعطاء نوع منحنى الشريحة أو شكل مكون من عدة مستقيمات متصلة بواسطة العضو wType. صفيف نقاط إحداثي اتبع البنية فوراً. يتم إعطاء نقطة البداية المنحنى بواسطة العضو apfx.

منذ قد يحتوي على الصورة الرمزية أكثر من مخطط التوزيع ، المخزن المؤقت الذي يحتوي على مجموعة واحدة أو أكثر من بنيات TTPOLYGONHEADER بيانات. يتم حزم تقوم مخططات توزيع اللاحقة التالية المهمة السابقة في المخزن المؤقت الأصلية مباشرة. بدء تشغيل مخطط التوزيع التالية باستخدام TTPOLYGONHEADER في البايت التالي بعد آخر نقطة السجل منحنى السابق.

يرسم هذا نموذج التعليمة البرمجية محيط الصورة الرمزية تروتايب عن طريق تحليل المخزن المؤقت GGO_NATIVE لإنشاء قائمة مقاطع خطية Bezier التي تشكل كل مخطط التوزيع. يتم رسم قائمة مقاطع خطية Bezier ثم استخدام PolyBezier. رمز تحليلها المخزن المؤقت في دالة DrawT2Outline.

الخطوة الأولى لإنشاء قائمة أسطر Bezier تحديد حجم المخزن المؤقت لقائمة. تعرف نقاط أربعة خطوط Bezier. يفسر الدالة PolyBezier صفيف نقاط أنه سطر واحد مستمر من قطع Bezier عليه coincident بنقطة نهاية السطر السابق بداية السطر التالي. وبالتالي، مطلوبة فقط ثلاث نقاط لوصف على مقطع سطر Bezier إضافية.

قد يحتوي على المخزن المؤقت GGO_NATIVE منحنى شكل مكون من عدة مستقيمات متصلة أو منحنى شريحة B Quadratic. تعريف نقطتين مقطع أثناء تحديد ثلاث نقاط شريحة B. لأن كل نوع رسم باستخدام خط Bezier باستخدام PolyBezier يحدث السيناريو حالة أسوأ عند توسيع مخطط التوزيع واحد وهو يتكون تماماً من مقاطع خطية Beziers متعددة.

لاحظ أن للتعبير منحنى إضافية قطعة في تمثيل منحنى شريحة B يتطلب نقطة إضافية واحدة فقط. النقطة بوضوح تعريف "B" أو إيقاف منحنى أشر وتقوم ضمنيًا بتعريف في إضافية على نقطة المنحنى. هو نقطة منحنى على نقطة وسط إلى نقطة "B" التالي. ولذلك سيتم توسيع على مقطع سطر إضافية أو قطعة منحنى إضافية إلى ثلاث نقاط إضافية لخط Bezier.

التعليمات البرمجية يفترض أن المخزن المؤقت الأصلية بأكملها سوف تتكون من بنيات POINTFX بحيث يتمكن من تحديد أكبر عدد ممكن من نقاط تمثيل المخزن المؤقت. الرقم الفعلي أصغر قليلاً حيث الحمل بنية في وصف تقوم مخططات توزيع والمنحنيات. يتم إعطاء حجم المخزن المؤقت لقائمة Bezier بواسطة الحد الأقصى من عدد نقاط ضرب البيانات حجم بنية نقطة ثم ضرب ثلاثة المحتملة. ثلاثة هو عدد نقاط إضافية مطلوبة لكل مقطع إضافية سطر أو مقطع quadratic الشريحة عند تحويل إلى Bezier.

بمجرد تخصيص المخزن المؤقت Bezier يوزع التعليمة البرمجية المخزن المؤقت الأصلي قبل بداية الأول TTPOLYGONHEADER. أثناء تكرار الحلقة التعليمة البرمجية بمعالجة الإحاطة واحد ثم رسم عليه. حلقة داخلية ثانية يوزع لكل نوع منحنى.

في حالة منحنى شكل مكون من عدة مستقيمات متصلة (TT_PRIM_LINE) ، كل مقطع من شكل مكون من عدة مستقيمات متصلة يتم تحويل وانقر إلحاق قائمة Beziers مع الدالة AppendPolyLineToBezier. إذا كان المنحنى Quadratic الشريحة B (TT_PRIM_QSPLINE) ، تحويل الدالة AppendQuadBSplineToBezier وتقوم إلحاق الشريحة - B Quadratic. كل من هذه الوظائف يستخدم حلقة تحليل الخروج كل قطعة المنحنى في نقاط التحكم المستقلة الخاصة به. خط أو شريحة يتم تحويلها إلى Bezier ثم إلحاق قائمة Beziers.

يمكنك رسم خط Bezier خط مستقيم بسهولة. البداية وتاريخ النهاية موجهات ببساطة نقطة نهاية مقطع سطر المعاكس. يتم هذا في الدالة MakeBezierFromLine.

لتحويل شريحة quadratic إلى شريحة Bezier مكعبة يتطلب يعبر نقاط التحكم الخاص ياردات من نقاط التحكم الخاص quadratic. المعادلة لترجمة نقاط التحكم الموجود في الدالة MakeBezierFromQBSpline.

قبل بالإحاطة الرسم، يضمن التعليمة البرمجية إغلاق المسار بواسطة استدعاء دالة CloseContour. يتم استدعاء الدالة فقط إذا كانت "البدء" و "نقاط النهاية من تسلسل Beziers غير coincident. ثم يتم استدعاء الدالة PolyBezier.

بعد أن يتم رسم بالإحاطة العثور على مخطط التوزيع التالي TTPOLYGONHEADER عن طريق تقديم المؤشر lpHeader بعد نهاية السجلات في مخطط التوزيع الحالية. إذا وينتج قيمة مؤشر بعد نهاية المخزن المؤقت الأصلي عالجت التعليمة البرمجية تقوم مخططات توزيع وكافة إنهاء.
/**************************************************************************** *  FUNCTION   : IntFromFixed *  RETURNS    : int value approximating the FIXED value. ****************************************************************************/ int PASCAL NEAR IntFromFixed(FIXED f){    if (f.fract >= 0x8000)    return(f.value + 1);    else    return(f.value);}/**************************************************************************** *  FUNCTION   : fxDiv2 *  RETURNS    : (val1 + val2)/2 for FIXED values ****************************************************************************/ FIXED PASCAL NEAR fxDiv2(FIXED fxVal1, FIXED fxVal2){    long l;    l = (*((long far *)&(fxVal1)) + *((long far *)&(fxVal2)))/2;    return(*(FIXED *)&l);}/**************************************************************************** *  FUNCTION   : MakeBezierFromLine * *  PURPOSE    : Converts a line define by two points to a four point Bezier *               spline representation of the line in pPts. * * *  RETURNS    : number of Bezier points placed into the pPts POINT array. ****************************************************************************/ UINT MakeBezierFromLine( POINT *pPts, POINT startpt, POINT endpt ){    UINT cTotal = 0;    // starting point of Bezier    pPts[cTotal] = startpt;    cTotal++;    // 1rst Control, pt == endpoint makes Bezier a line    pPts[cTotal].x = endpt.x;    pPts[cTotal].y = endpt.y;    cTotal++;    // 2nd Control, pt == startpoint makes Bezier a line    pPts[cTotal].x = startpt.x;    pPts[cTotal].y = startpt.y;    cTotal++;    // ending point of Bezier    pPts[cTotal] = endpt;    cTotal++;        return cTotal;}/**************************************************************************** *  FUNCTION   : MakeBezierFromQBSpline * *  PURPOSE    : Converts a quadratic spline in pSline to a four point Bezier *               spline in pPts. * * *  RETURNS    : number of Bezier points placed into the pPts POINT array. ****************************************************************************/ UINT MakeBezierFromQBSpline( POINT *pPts, POINTFX *pSpline ){    POINT   P0,         // Quadratic on curve start point            P1,         // Quadratic control point            P2;         // Quadratic on curve end point    UINT    cTotal = 0;    // Convert the Quadratic points to integer    P0.x = IntFromFixed( pSpline[0].x );    P0.y = IntFromFixed( pSpline[0].y );    P1.x = IntFromFixed( pSpline[1].x );    P1.y = IntFromFixed( pSpline[1].y );    P2.x = IntFromFixed( pSpline[2].x );    P2.y = IntFromFixed( pSpline[2].y );    // conversion of a quadratic to a cubic    // Cubic P0 is the on curve start point    pPts[cTotal] = P0;    cTotal++;        // Cubic P1 in terms of Quadratic P0 and P1    pPts[cTotal].x = P0.x + 2*(P1.x - P0.x)/3;    pPts[cTotal].y = P0.y + 2*(P1.y - P0.y)/3;    cTotal++;    // Cubic P2 in terms of Qudartic P1 and P2    pPts[cTotal].x = P1.x + 1*(P2.x - P1.x)/3;    pPts[cTotal].y = P1.y + 1*(P2.y - P1.y)/3;    cTotal++;    // Cubic P3 is the on curve end point    pPts[cTotal] = P2;    cTotal++;    return cTotal;}/**************************************************************************** *  FUNCTION   : AppendPolyLineToBezier * *  PURPOSE    : Converts line segments into their Bezier point  *               representation and appends them to a list of Bezier points.  * *               WARNING - The array must have at least one valid *               start point prior to the address of the element passed. * *  RETURNS    : number of Bezier points added to the POINT array. ****************************************************************************/ UINT AppendPolyLineToBezier( LPPOINT pt, POINTFX start, LPTTPOLYCURVE lpCurve ){    int     i;    UINT    cTotal = 0;    POINT   endpt;    POINT   startpt;    POINT   bezier[4];    endpt.x = IntFromFixed(start.x);    endpt.y = IntFromFixed(start.y);    for (i = 0; i < lpCurve->cpfx; i++)    {        // define the line segment        startpt = endpt;        endpt.x = IntFromFixed(lpCurve->apfx[i].x);        endpt.y = IntFromFixed(lpCurve->apfx[i].y);        // convert a line to a bezier representation        MakeBezierFromLine( bezier, startpt, endpt );        // append the Bezier to the existing ones                                    // Point 0 is Point 3 of previous.        pt[cTotal++] = bezier[1];   // Point 1        pt[cTotal++] = bezier[2];   // Point 2        pt[cTotal++] = bezier[3];   // Point 3    }    return cTotal;}/**************************************************************************** *  FUNCTION   : AppendQuadBSplineToBezier * *  PURPOSE    : Converts Quadratic spline segments into their Bezier point  *               representation and appends them to a list of Bezier points.  * *               WARNING - The array must have at least one valid *               start point prior to the address of the element passed. * *  RETURNS    : number of Bezier points added to the POINT array. ****************************************************************************/ UINT AppendQuadBSplineToBezier( LPPOINT pt, POINTFX start, LPTTPOLYCURVE lpCurve ){    WORD                i;    UINT                cTotal = 0;    POINTFX             spline[3];  // a Quadratic is defined by 3 points    POINT               bezier[4];  // a Cubic by 4    // The initial A point is on the curve.    spline[0] = start;    for (i = 0; i < lpCurve->cpfx;)    {        // The B point.        spline[1] = lpCurve->apfx[i++];        // Calculate the C point.        if (i == (lpCurve->cpfx - 1))        {            // The last C point is described explicitly            // i.e. it is on the curve.            spline[2] = lpCurve->apfx[i++];        }             else        {            // C is midpoint between B and next B point            // because that is the on curve point of             // a Quadratic B-Spline.            spline[2].x = fxDiv2(                lpCurve->apfx[i-1].x,                lpCurve->apfx[i].x                );            spline[2].y = fxDiv2(                lpCurve->apfx[i-1].y,                lpCurve->apfx[i].y                );        }        // convert the Q Spline to a Bezier        MakeBezierFromQBSpline( bezier, spline );                // append the Bezier to the existing ones                                    // Point 0 is Point 3 of previous.        pt[cTotal++] = bezier[1];   // Point 1        pt[cTotal++] = bezier[2];   // Point 2        pt[cTotal++] = bezier[3];   // Point 3        // New A point for next slice of spline is the         // on curve C point of this B-Spline        spline[0] = spline[2];    }    return cTotal;}/**************************************************************************** *  FUNCTION   : CloseContour * *  PURPOSE    : Adds a bezier line to close the circuit defined in pt. * * *  RETURNS    : number of points aded to the pt POINT array. ****************************************************************************/ UINT CloseContour( LPPOINT pt, UINT cTotal ){    POINT               endpt,                         startpt;    // definition of a line    POINT               bezier[4];    // connect the first and last points by a line segment    startpt = pt[cTotal-1];    endpt = pt[0];    // convert a line to a bezier representation    MakeBezierFromLine( bezier, startpt, endpt );    // append the Bezier to the existing ones                                // Point 0 is Point 3 of previous.    pt[cTotal++] = bezier[1];   // Point 1    pt[cTotal++] = bezier[2];   // Point 2    pt[cTotal++] = bezier[3];   // Point 3    return 3;}/**************************************************************************** *  FUNCTION   : DrawT2Outline * *  PURPOSE    : Decode the GGO_NATIVE outline, create a sequence of Beziers *               for each contour, draw with PolyBezier.  Color and relative  *               positioning provided by caller. The coordinates of hDC are *               assumed to have MM_TEXT orientation. * *               The outline data is not scaled. To draw a glyph unhinted *               the caller should create the font at its EMSquare size *               and retrieve the outline data. Then setup a mapping mode *               prior to calling this function. * *  RETURNS    : none. ****************************************************************************/ void DrawT2Outline(HDC hDC, LPTTPOLYGONHEADER lpHeader, DWORD size) {    WORD                i;    UINT                cTotal = 0; // Total points in a contour.    LPTTPOLYGONHEADER   lpStart;    // the start of the buffer    LPTTPOLYCURVE       lpCurve;    // the current curve of a contour    LPPOINT             pt;         // the bezier buffer    POINTFX             ptStart;    // The starting point of a curve    DWORD               dwMaxPts = size/size of(POINTFX); // max possible pts.    DWORD               dwBuffSize;    dwBuffSize = dwMaxPts *     // Maximum possible # of contour points.                 sizeof(POINT) * // sizeof buffer element                 3;             // Worst case multiplier of one additional point                                // of line expanding to three points of a bezier   lpStart = lpHeader;   pt = (LPPOINT)malloc( dwBuffSize );    // Loop until we have processed the entire buffer of contours.    // The buffer may contain one or more contours that begin with    // a TTPOLYGONHEADER. We have them all when we the end of the buffer.    while ((DWORD)lpHeader < (DWORD)(((LPSTR)lpStart) + size) && pt != NULL)    {        if (lpHeader->dwType == TT_POLYGON_TYPE)        // Draw each coutour, currently this is the only valid        // type of contour.        {            // Convert the starting point. It is an on curve point.            // All other points are continuous from the "last"             // point of the contour. Thus the start point the next            // bezier is always pt[cTotal-1] - the last point of the             // previous bezier. See PolyBezier.            cTotal = 1;            pt[0].x = IntFromFixed(lpHeader->pfxStart.x);            pt[0].y = IntFromFixed(lpHeader->pfxStart.y);            // Get to first curve of contour -             // it starts at the next byte beyond header            lpCurve = (LPTTPOLYCURVE) (lpHeader + 1);            // Walk this contour and process each curve( or line ) segment             // and add it to the Beziers            while ((DWORD)lpCurve < (DWORD)(((LPSTR)lpHeader) + lpHeader->cb))            {                //**********************************************                // Format assumption:                //   The bytes immediately preceding a POLYCURVE                //   structure contain a valid POINTFX.                //                 //   If this is first curve, this points to the                 //      pfxStart of the POLYGONHEADER.                //   Otherwise, this points to the last point of                //      the previous POLYCURVE.                //                 //   In either case, this is representative of the                //      previous curve's last point.                //**********************************************                ptStart = *(LPPOINTFX)((LPSTR)lpCurve - sizeof(POINTFX));                if (lpCurve->wType == TT_PRIM_LINE)                {                    // convert the line segments to Bezier segments                    cTotal += AppendPolyLineToBezier( &pt[cTotal], ptStart, lpCurve );                    i = lpCurve->cpfx;                }                else if (lpCurve->wType == TT_PRIM_QSPLINE)                {                    // Decode each Quadratic B-Spline segment, convert to bezier,                    // and append to the Bezier segments                    cTotal += AppendQuadBSplineToBezier( &pt[cTotal], ptStart, lpCurve );                    i = lpCurve->cpfx;                }                else                    // Oops! A POLYCURVE format we don't understand.                    ; // error, error, error            // Move on to next curve in the contour.            lpCurve = (LPTTPOLYCURVE)&(lpCurve->apfx[i]);            }            // Add points to close the contour.            // All contours are implied closed by TrueType definition.            // Depending on the specific font and glyph being used, these            // may not always be needed.            if ( pt[cTotal-1].x != pt[0].x || pt[cTotal-1].y != pt[0].y )            {                cTotal += CloseContour( pt, cTotal );            }            // flip coordinates to get glyph right side up (Windows coordinates)            // TT native coordiantes are zero originate at lower-left.            // Windows MM_TEXT are zero originate at upper-left.            for (i = 0; i < cTotal; i++)                pt[i].y = 0 - pt[i].y;            // Draw the contour            PolyBezier( hDC, pt, cTotal );        }        else            // Bad, bail, must have a bogus buffer.            break; // error, error, error        // Move on to next Contour.        // Its header starts immediate after this contour        lpHeader = (LPTTPOLYGONHEADER)(((LPSTR)lpHeader) + lpHeader->cb);    }    free( pt );}				
مراجع
للحصول على مزيد من المعلومات حول مواصفات تروتايب الرجاء مراجعة:
Microsoft TrueType Specifications (http://www.microsoft.com/typography/tt/tt.htm)

أيضاً متوفرة على CD مكتبة شبكة Microsoft المطور ضمن مواصفات.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 243285 - آخر مراجعة: 02/12/2007 19:26:04 - المراجعة: 1.5

Microsoft Win32 واجهة برمجة تطبيقات, Microsoft Windows XP Professional, the operating system: Microsoft Windows XP 64-Bit Edition

  • kbmt kbdswgdi2003swept kbdraw kbfont kbgdi kbhowto KB243285 KbMtar
تعليقات
&t=">endChild(m); &t=">