Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iphone CGContextShowTextAtPoint for Japanese characters

I am working on an app where I am using CGContextShowTextAtPoint to display text to the screen. I want to also display Japanese characters, but CGContextShowTextAtPoint takes as its input a C string. So either A) How do I change Japanese characters into a C string? If this is not possible, B) How can I manually print Japanese characters to the screen (within the drawRect method).

Thanks in advance.

like image 654
kiyoshi Avatar asked Aug 06 '09 08:08

kiyoshi


2 Answers

CoreText can help you:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 onwards) maps Unicode characters to glyphs
  2. CTFontDrawGlyphs (iOS 4.2 onwards) draws the glyphs into a CGContext.

NB. CGContextShowGlyphs should work, but I never found a way to convert my UniChars to glyphs. More on that here:

Ancient, pre iOS 3.2 answer

you need to use UIKit for this.

Check out [NSString drawAtPoint:...] to get started.

This SO question is useful, too.

I don't know what they were thinking with the CoreGraphic text stuff, it's useless.

like image 200
Rhythmic Fistman Avatar answered Nov 06 '22 23:11

Rhythmic Fistman


I was able to get this working by using a reimplementation of CGFontGetGlyphsForUnichars by Jens Egeblad: GlyphDrawing.mm

First load in a Japanese font as an otf file from the app bundle:

// Load font file from otf file
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"HStdNW8" ofType:@"otf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
CGFontRef _cgFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);

Then you can convert your unichar text to glyphs and draw them:

NSString *text = @"日本語"
CGContextSetFont(context, _cgFont);
CGContextSetFontSize(context, 12);
CGGlyph textGlyphs[[text length]];

unichar textChars[[text length]];
for(int i = 0; i < [text length]; i++) {
    textChars[i] = [text characterAtIndex:i];
}
CMFontGetGlyphsForUnichars(_cgFont, textChars, textGlyphs, [text length]);
CGContextShowGlyphsAtPoint(context, xCoord, yCoord, textGlyphs, [text length]);
like image 37
noodl_es Avatar answered Nov 06 '22 21:11

noodl_es