====== 絵文字の吸出し(3) ====== 絵文字の吸出しで全ソースを上げておきます。(ファイルはすべてUTF8にする事)\\ │ EmojiGet-Info.plist │ main.mm │ ├─ │ │ EmojiGetAppDelegate.h │ │ EmojiGetAppDelegate.mm │ │ │ └─ │ │ chlibs.h │ │ types.h │ │ │ └─ │ ImageTga.h │ ImageTga.mm │ └─ project.pbxproj #import int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"EmojiGetAppDelegate"); [pool release]; return retVal; } #import @interface EmojiGetAppDelegate : NSObject { UIWindow *window; } @property (nonatomic, retain) IBOutlet UIWindow *window; @end @interface EmojiView : UIView { } @end #import "EmojiGetAppDelegate.h" #import "chlibs/chlibs.h" //***************************************************************************** // 絵文字を一画面分描画 //***************************************************************************** void DrawEmoji(const int page) { const static u16 CodeList[][2] = { // 絵文字のコード {0xe001,0xe05a}, {0xe101,0xe15a}, {0xe201,0xe253}, {0xe301,0xe34d}, {0xe401,0xe44c}, {0xe501,0xe537}, } ; CGRect ViewRect = [[UIScreen mainScreen] bounds] ; CGContextRef ctx = UIGraphicsGetCurrentContext() ; BOOL HighReso = [UIScreen mainScreen].scale == 1.f ? NO : YES ; if(!HighReso) { ViewRect.size.width /= 2.f ; ViewRect.size.height /= 2.f ; } CGContextSetRGBFillColor(ctx,0.f,0.f,0.f,0.f) ; CGContextFillRect(ctx,ViewRect) ; CGAffineTransform tr = HighReso ? CGAffineTransformMakeScale(2.f,2.f) : CGAffineTransformMakeScale(1.f,1.f) ; CGContextSaveGState(ctx) ; CGContextConcatCTM(ctx,tr) ; for(u16 code = CodeList[page][0] ; code <= CodeList[page][1] ; ++ code) { char str[8] ; sprintf(str,"%c%c",code & 0xff,code >> 8) ; float x = ((code & 0xff) % 8) * 20.f - 1.f ; float y = ((code & 0xff) / 8) * 20.f - 1.f ; [ [ [NSString alloc] initWithCharactersNoCopy:(unichar *)str length:1 freeWhenDone:NO ] drawAtPoint:CGPointMake(x,y) withFont:[UIFont systemFontOfSize:20] ] ; } CGContextRestoreGState(ctx) ; } //***************************************************************************** // 絵文字を一画面分保存 //***************************************************************************** void SaveEmoji(const int page) { CGRect ViewRect = [[UIScreen mainScreen] bounds] ; BOOL HighReso = [UIScreen mainScreen].scale == 1.f ? NO : YES ; if(!HighReso) { ViewRect.size.width /= 2.f ; ViewRect.size.height /= 2.f ; } UIGraphicsBeginImageContext(ViewRect.size) ; DrawEmoji(page) ; // 絵文字を描画 CGImageRef ImgRef = UIGraphicsGetImageFromCurrentImageContext().CGImage ; CFDataRef DataRef = CGDataProviderCopyData(CGImageGetDataProvider(ImgRef)) ; u08 *data = (u08 *)CFDataGetBytePtr(DataRef) ; // αが適用された RGB 値を元に戻す for(int j = 0 ; j < CGImageGetWidth(ImgRef) * CGImageGetHeight(ImgRef) ; ++ j) { u08 alpha = data[j * 4 + 3] ; if(alpha) { data[j * 4 + 0] = min(data[j * 4 + 0] * 255 / alpha,255) ; data[j * 4 + 1] = min(data[j * 4 + 1] * 255 / alpha,255) ; data[j * 4 + 2] = min(data[j * 4 + 2] * 255 / alpha,255) ; } } CGDataProviderRef DataProv = CGDataProviderCreateWithCFData( CFDataCreate(0,data,CFDataGetLength(DataRef)) ) ; CGImageRef NewImg = CGImageCreate( CGImageGetWidth(ImgRef), CGImageGetHeight(ImgRef), CGImageGetBitsPerComponent(ImgRef), CGImageGetBitsPerPixel(ImgRef), CGImageGetBytesPerRow(ImgRef), CGImageGetColorSpace(ImgRef), CGImageGetBitmapInfo(ImgRef), DataProv, 0, CGImageGetShouldInterpolate(ImgRef), CGImageGetRenderingIntent(ImgRef) ) ; UIImage *SnapShot = [[UIImage alloc] initWithCGImage:NewImg] ; char filename[260] ; // 画像を tga で保存 sprintf(filename,"/Documents/emoji%d_%d.tga",HighReso ? 4 : 3,page) ; ImageSaveTag(filename,SnapShot) ; [SnapShot release] ; UIGraphicsEndImageContext() ; } //***************************************************************************** // 描画時に呼ばれる //***************************************************************************** @implementation EmojiView - (void)drawRect:(CGRect)rect { DrawEmoji(0) ; } @end @implementation EmojiGetAppDelegate @synthesize window; #pragma mark - #pragma mark Application lifecycle //***************************************************************************** // 起動時に呼ばれる //***************************************************************************** - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //------------------------------------------------------------------------- // ステータスバーを非表示 //------------------------------------------------------------------------- [ [UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade ] ; //------------------------------------------------------------------------- // ウィンドウの作成 //------------------------------------------------------------------------- window = [ [UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds] ] ; //------------------------------------------------------------------------- // ビューコントローラとビューの作成 //------------------------------------------------------------------------- { UIViewController *ViewCtrl = [UIViewController alloc] ; [window addSubview:ViewCtrl.view] ; UIView *view = [ [EmojiView alloc] initWithFrame:[[UIScreen mainScreen] bounds] ] ; [ViewCtrl.view addSubview:view] ; [ViewCtrl release] ; [view release] ; } [window makeKeyAndVisible] ; #if 1 for(int i = 0 ; i < 6 ; ++ i) SaveEmoji(i) ; exit(0) ; #endif return YES ; } - (void)dealloc { [window release]; [super dealloc]; } @end