Bir glif anahat glifi açıklayan dağılımlarını dizisidir. Her bir dağılımı dağılıma tanımlamak için gerektiğinden çok
TTPOLYCURVE veri yapıları tarafından izlenen bir
TTPOLYGONHEADER veri yap?s? olarak tanımlanır.
Her konuma, bir göreceli konumu mutlak bir konumu gösteren bir
POINTFX veri yap?s? tanımlanır. Başlangıç ve glifi noktasının bitiş
TTPOLYGONHEADER veri yapısı
pfxStart üyesi tarafından verilir.
TTPOLYCURVE veri yapılarını iki türe ayrılır: bir TT_PRIM_LINE kaydı veya TT_PRIM_QSPLINE kayıt. Bir dizi noktaları TT_PRIM_LINE kayıttır; glifi anahatlarını noktalar arasında çizilmiş satırlarını açıklamak. Bir dizi karakterin anahat tanımlamak için gereken çeyrek dönemlerde splines (q splines) tanımlama noktaları TT_PRIM_QSPLINE kayıttır.
TrueType'de, q-ayraç üç (A, B ve C) noktaları burada A ve C Eğride noktalarıdır ve B eğri açık tanımlanır. Her q ayraç denklemi (xA noktası A yA temsil x koordinatını y-koordinatı noktası A, vb. gösterir) aşağıdaki gibi
x(t) = (xA-2xB+xC)*t^2 + (2xB-2xA)*t + xA
y(t) = (yA-2yB+yC)*t^2 + (2yB-2yA)*t + yA
burada t 0,0 ile 1,0 değişir.
TT_PRIM_QSPLINE kaydının biçimi aşağıdaki gibidir:
- Nokta, q-ayraç geçerli konumunu (ya da pfxStart the TTPOLYGONHEADER, the TTPOLYCURVE başlangıç noktası veya önceki TTPOLYCURVE bitiş noktası) açık.
- Nokta B kayıttaki geçerli noktasıdır.
- Nokta C aşağıdaki gibidir:
- Iki kaydı varsa veya daha fazla puan noktası B aşağıdaki noktası C kayıttaki bir sonraki noktasını noktasını B arasındaki orta ' dir.
- Aksi halde, noktası C noktası b aşağıdaki noktasıdır
Aşağıdaki kod TT_PRIM_QSPLINE bir kaydı işlemek için kullanılan algoritma sunar. Bu kod, q-splines TT_PRIM_QSPLINE kaydının ayıklamak gösterilmiştir, ancak bir uygulamada kullanmak için uygun değil.
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
}
Kayan nokta) işleçleri kullanarak doğrudan, yukarıdaki algoritma noktalarını yönetir. Ancak, q-ayraç kayıtlarında noktaları SAYıDÜZENLE veri türü depolanır. Aşağıdaki kodda, SAYıDÜZENLE veri öğeleri işlemek gösterilmiştir:
FIXED fx;
long *pl = (long *)&fx;
// Perform all arithmetic on *pl rather than on fx
*pl = *pl / 2;
aşağıdaki işlevi, bir kayan noktalı sayı SABIT gösterimine dönüştürür:
FIXED FixedFromDouble(double d)
{
long l;
l = (long) (d * 65536L);
return *(FIXED *)&l;
}
bir üretim uygulaması yerine
DrawQSpline işlev yazma her q ayraç tek tek çizmek için q-ayraç noktalarında hesaplamak ve bunları
NOKTASı veri yapıları dizisi depolamak için daha verimli olur. Hesaplamalar için glif tamamlandığından, çizmek ve glifi doldurmak için
PolyPolygon işlevine NOKTASı dizi geçirmek.
Aşağıdaki örnek, "j" küçük glif 8514/a (küçük yazı tipleri) video sürücüsünün 24-nokta Arial yazı tipi için GetGlyphOutline tarafından döndürülen verilerin sunar:
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
Makale numarası: 87115 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 2.3
Bu makaledeki bilginin uygulandığı durum:
- Microsoft Windows Software Development Kit 3.1
- Microsoft Win32 Uygulama Programlama Arabirimi
| kbmt kbhowto KB87115 KbMttr |
Otomatik TercümeÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:
87115
(http://support.microsoft.com/kb/87115/en-us/
)
Kullanım Dışı Bilgi Bankası İçeriği Yasal UyarıBu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.