From deff2ef6d2264a2ff83eaf1c8fe545e9ae91c5da Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Thu, 4 Feb 2021 23:54:03 +0300 Subject: initial --- emojiexport/AppDelegate.m | 211 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 emojiexport/AppDelegate.m (limited to 'emojiexport/AppDelegate.m') diff --git a/emojiexport/AppDelegate.m b/emojiexport/AppDelegate.m new file mode 100644 index 0000000..fcf83bf --- /dev/null +++ b/emojiexport/AppDelegate.m @@ -0,0 +1,211 @@ +// +// AppDelegate.m +// emojiexport +// +// Created by Гришка on 14.08.12 +// Copyright (c) 2012 Гришка +// Copyright (c) 2019 ch1p_ +// +// All rights reserved +// + +#import "AppDelegate.h" + +#define FONT_SIZE 40 +#define SIZE 40 +#define OFFSET -13 + +//#define FONT_SIZE 20 +//#define SIZE 20 +//#define OFFSET -7 + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Insert code here to initialize your application +// [[self outputTextField] setStringValue:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingString:@"/emoji"]]; +} +- (IBAction)pickInputFile:(id)sender { + NSOpenPanel* panel=[NSOpenPanel openPanel]; + + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result){ + if (result == NSFileHandlingPanelOKButton) { + [[self inputTextField] setStringValue:[panel filename]]; + } + }]; +} + +- (IBAction)pickOutputFolder:(id)sender { + NSOpenPanel* panel=[NSOpenPanel openPanel]; + [panel setCanChooseDirectories:true]; + [panel setCanChooseFiles:false]; + [panel setCanCreateDirectories:true]; + [panel setDirectory:[[self outputTextField] stringValue]]; + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result){ + if (result == NSFileHandlingPanelOKButton) { + [[self outputTextField] setStringValue:[panel filename]]; + } + }]; +} + +NSString *trimString(NSString* string) { + return [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; +} + +unsigned int parseChar(NSString *string) { + unsigned int result = 0; + NSScanner *scanner = [NSScanner scannerWithString:string]; + + [scanner setScanLocation:0]; // bypass '#' character + [scanner scanHexInt:&result]; + + return result; +} + +NSString *stringFromChar(unsigned int value) { + UTF32Char inputChar = value; // input UTF32 value + inputChar = NSSwapHostIntToLittle(inputChar); // swap to little-endian if necessary + NSString *str = [[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding]; + return str; +} + +- (IBAction)doThat:(id)sender { + NSString *fontPath = [[self inputTextField] stringValue]; + NSString *dir = [[self outputTextField] stringValue]; + + CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); + + // Create the font with the data provider, then release the data provider. + CGFontRef fontRef = CGFontCreateWithDataProvider( dataProvider ); + + CTFontRef fontCore = CTFontCreateWithGraphicsFont(fontRef, FONT_SIZE, NULL, NULL); + CGDataProviderRelease(dataProvider); + CGFontRelease(fontRef); + NSFont *font = (__bridge NSFont*)fontCore; + + NSString *emojiDataFile = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"emoji-data" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; + NSArray *lines = [emojiDataFile componentsSeparatedByString:@"\n"]; + + NSMutableArray *emoji = [NSMutableArray new]; + + emojiDataFile = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"emoji-test" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; + lines = [emojiDataFile componentsSeparatedByString:@"\n"]; + + NSMutableArray *unicodes = [NSMutableArray new]; + + for(NSString *line in lines) { + if([line length] == 0 || [line characterAtIndex:0] ==';') { + continue; + } + + NSArray *parts = [line componentsSeparatedByString:@";"]; + if (parts.count < 2) { + continue; + } + NSString *format = trimString(parts[0]); + NSArray *emojiArray = [trimString(parts[1]) componentsSeparatedByString:@"# "]; + if (emojiArray.count < 2) { + continue; + } + + NSString *emojiStr = [emojiArray[1] componentsSeparatedByString:@" "][0]; + + NSString *emojiUnicode = @""; + NSString *fileNameStr = @""; + for (NSUInteger i = 0; i < [emojiStr length]; i++) { + unichar c = [emojiStr characterAtIndex:i]; + NSString *unicode = [NSString stringWithFormat:@"%04x", (unsigned)c]; + + + if (i + 1 == [emojiStr length] && [unicode isEqualToString:@"fe0f"]) { + continue; + } + + + fileNameStr = [fileNameStr stringByAppendingString:[[NSString stringWithFormat:@"%lX_", (long)c] lowercaseString]]; + emojiUnicode = [emojiUnicode stringByAppendingString:[NSString stringWithFormat:@"\\\\u%@", [unicode uppercaseString]]]; + } + + if ([unicodes indexOfObject:emojiUnicode] == NSNotFound) { + [unicodes addObject:emojiUnicode]; + } + + int i = 0; + + fileNameStr = [fileNameStr substringToIndex:fileNameStr.length - 1]; + drawString(emojiStr, fileNameStr, dir, font); + } + + + NSArray *unicodesArray = [unicodes sortedArrayUsingComparator:^NSComparisonResult(NSString *a, NSString *b) { + return a.length > b.length ? NSOrderedAscending : NSOrderedDescending; + }]; + + NSString *unicodesString = [unicodesArray componentsJoinedByString:@"|"]; + NSData *unicodesStringData = [unicodesString dataUsingEncoding:NSUTF8StringEncoding]; + [unicodesStringData writeToFile:[NSString stringWithFormat:@"%@/%@", dir, @"unicodes.txt"] atomically:true]; +} + +NSString *stringFromCodes(NSString *codes) { + NSArray *codesArray = [codes componentsSeparatedByString:@" "]; + NSString *textCode = @""; + for(NSString *string in codesArray) { + unsigned result = 0; + NSScanner *scanner = [NSScanner scannerWithString:string]; + [scanner scanHexInt:&result]; + + unichar characterArray[2]; + CFStringGetSurrogatePairForLongCharacter(result, characterArray); + + if(characterArray[1] != 0) { + textCode = [NSString stringWithFormat:@"%@%2X%2X", textCode, characterArray[0], characterArray[1]]; + } else { + textCode = [NSString stringWithFormat:@"%@%2X", textCode, characterArray[0]]; + } + } + return textCode; +} + + +void drawString(NSString* str, NSString* fileName, NSString* dir, NSFont* font){ + fileName = [[fileName stringByReplacingOccurrencesOfString:@" " withString:@"-"] lowercaseString]; + + NSArray *array = @[@"1f5e8", @"23cf", @"0023", @"002a", @"0030", @"0031", @"0032", @"0033", @"0034", @"0035", @"0036", @"0037", @"0038", @"0039", @"1f1e6", @"1f1e7", @"1f1e8", @"1f1e9", @"1f1ea", @"1f1eb", @"1f1ec", @"1f1ed", @"1f1ee", @"1f1ef", @"1f1f0", @"1f1f1", @"1f1f2", @"1f1f3", @"1f1f4", @"1f1f5", @"1f1f6", @"1f1f7", @"1f1f8", @"1f1f9", @"1f1fa", @"1f1fb", @"1f1fc", @"1f1fd", @"1f1fe", @"1f1ff"]; + + if([array indexOfObject:fileName] != NSNotFound) { + return; + } + + NSBitmapImageRep *offscreenRep = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:SIZE + pixelsHigh:SIZE + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSDeviceRGBColorSpace + bitmapFormat:NSAlphaFirstBitmapFormat + bytesPerRow:0 + bitsPerPixel:0]; + NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep]; + [NSGraphicsContext saveGraphicsState]; + [NSGraphicsContext setCurrentContext:g]; + + //NSFont* font=[NSFont fontWithName:@"Apple Color Emoji" size:96]; + NSDictionary* d=[NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, nil]; + NSRect rect=[font boundingRectForGlyph:[font glyphWithName:str]]; + + [str drawAtPoint:CGPointMake(0, OFFSET) withAttributes:d]; + + + NSData *data = [offscreenRep representationUsingType: NSPNGFileType properties: nil]; + + [data writeToFile: [NSString stringWithFormat:@"%@/%@.png", dir, fileName] atomically: NO]; + //NSLog(@"Draw %@ OK [%@] [%f %f %f %f]", str, fileName, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); +} + +- (IBAction)outputTextField:(id)sender { +} +@end -- cgit v1.2.3