type 描述的曲线仅属于 kCGPathElementAddQuadCurveToPoint 类型,该类型有 -6ren">
gpt4 book ai didi

macos - 为什么 TrueType 字体在 Mac 上仅使用 "Quadratic Curves"?

转载 作者:行者123 更新时间:2023-12-03 16:51:25 24 4
gpt4 key购买 nike

我使用下面的代码提取了 TrueType 字体的路径元素。

问题在于 element->type 描述的曲线仅属于 kCGPathElementAddQuadCurveToPoint 类型,该类型有 2 个点(低质量)。为什么没有任何元素使用更高质量的 kCGPathElementAddCurveToPoint 类型(有 3 个点)?

有人有想法吗?

int count = 0;
void applierFunction(void *info, const CGPathElement *element)
{
int point_count;
switch (element->type)
{
case kCGPathElementMoveToPoint:
point_count = 1;
break;
case kCGPathElementAddLineToPoint:
point_count = 1;
break;
case kCGPathElementAddQuadCurveToPoint:
point_count = 2;
break;
case kCGPathElementAddCurveToPoint:
point_count = 3;
break;
case kCGPathElementCloseSubpath:
point_count = 0;
break;
}
count+=point_count;
printf("%u.:\n", count);
for (int i = 0; i<point_count; i++) {
switch (element->type) {
case kCGPathElementMoveToPoint:
printf("kCGPathElementMoveToPoint\n");
break;
case kCGPathElementAddLineToPoint:
printf("kCGPathElementAddLineToPoint\n");
break;
case kCGPathElementAddQuadCurveToPoint:
printf("kCGPathElementAddQuadCurveToPoint\n");
break;
case kCGPathElementAddCurveToPoint:
printf("kCGPathElementAddCurveToPoint\n");
break;
case kCGPathElementCloseSubpath:
printf("kCGPathElementCloseSubpath\n");
break;
default:
printf("unknown path type\n");
}
}
}

void extractStringPathElements()
{
CFStringRef str = CFSTR("Q");
CFStringRef strFont = CFSTR("Arial");
CTFontRef font = CTFontCreateWithName(strFont, 500, NULL);
CFStringRef keys[] = {kCTFontAttributeName};
CFTypeRef values[] = {font};
CFDictionaryRef attr = CFDictionaryCreate(NULL, (const void **)&keys,
(const void **)&values, sizeof(keys) / sizeof(keys[0]),
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFAttributedStringRef attrString =
CFAttributedStringCreate(NULL, str, attr);
CFRelease(attr);
CTLineRef line = CTLineCreateWithAttributedString(attrString);
CFArrayRef runs = CTLineGetGlyphRuns(line);
long runCount = CFArrayGetCount(runs);
for (int ri = 0; ri < runCount; ri++) {
::CTRunRef run = (::CTRunRef)CFArrayGetValueAtIndex(runs, ri);
long glyphCount = CTRunGetGlyphCount(run);
const unsigned short *glyphs = CTRunGetGlyphsPtr(run);
for (int gi = 0; gi < glyphCount; gi++) {
::CGPathRef path = CTFontCreatePathForGlyph(font, glyphs[gi], NULL);
CGPathApply(path, 0, applierFunction);
printf("glyph %u has %u elements.\n", glyphs[gi], count);
CGPathRelease(path);
}
}
CFRelease(line);
CFRelease(attrString);
CFRelease(font);

}

int main (int argc, const char * argv[])
{
extractStringPathElements();
return 0;
}

最佳答案

TrueType 没有三次贝塞尔曲线。它仅限于二次贝塞尔曲线。 TrueType 就是这样指定的。

关于macos - 为什么 TrueType 字体在 Mac 上仅使用 "Quadratic Curves"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10780207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com