1

我正在尝试在 iOS 上使用 CoreText 来渲染 OpenGL 纹理。CoreText 在 CoreGraphics 位图上下文中呈现,然后使用glTexImage2D.

当我使用 RGB 颜色空间创建位图上下文时,一切正常

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
uint8_t *data = (uint8_t *)calloc(height, 4 * width);
CGContextRef context = CGBitmapContextCreate(data, width, height, 8, 4 * width, colorSpace, kCGImageAlphaNoneSkipLast);
CGColorSpaceRelease(colorSpace);

但是,我想只使用灰度色彩空间。当我这样做时,文本不会出现。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
uint8_t *data = (uint8_t *)calloc(height, width);
CGContextRef context = CGBitmapContextCreate(data, width, height, 8, width, colorSpace, kCGImageAlphaNone);
CGColorSpaceRelease(colorSpace);

我正在渲染的文本是黑色的。在这两种情况下,我都可以使用 CoreGraphics 方法在上下文中绘制。

我使用以下代码绘制文本:

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);

CGSize dimensions = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [text length]), NULL, CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX), NULL);

CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, dimensions.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGRect box = CGRectMake(0, 0, dimensions.width, dimensions.height);

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, box );

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [text length]), path, NULL);

CTFrameDraw(frame, context);

CFRelease(frame);
CFRelease(path);
CFRelease(framesetter);

CoreText 中是否有特殊设置来完成这项工作?

谢谢

4

1 回答 1

0

好的,我设法重现了这个问题。在您的 NSAttributeString 属性字典中,您不应该使用 UIColor(NSColor?),而是使用 CGColorRef。这样,CGContextAPI 将知道如何根据颜色空间处理您的颜色。如果您只是执行以下操作,您应该可以走了。

CGColorRef col = [UIColor blackColor].CGColor;
NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                          //whatever attributes you need
                                          col, kCTForegroundColorAttributeName,
                                          nil];

NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:yourText
                                                                   attributes:attributesDict];

我希望这会有所帮助,让我知道它是否有效!

于 2013-05-24T15:55:47.050 回答