#include NSColor* nscolor(gx__Color c) { float red= (float)c.r / 255.0f; float green= (float)c.g / 255.0f; float blue= (float)c.b / 255.0f; return [NSColor colorWithDeviceRed:red green:green blue:blue alpha:1.0f]; } NSString* nsstring(string s) { return [ [ NSString alloc ] initWithBytesNoCopy:s.str length:s.len encoding:NSUTF8StringEncoding freeWhenDone: false]; } gg__Size gg_get_screen_size() { NSScreen *screen = [NSScreen mainScreen]; NSDictionary *description = [screen deviceDescription]; NSSize displayPixelSize = [[description objectForKey:NSDeviceSize] sizeValue]; CGSize displayPhysicalSize = CGDisplayScreenSize( [[description objectForKey:@"NSScreenNumber"] unsignedIntValue]); gg__Size res; res.width = displayPixelSize.width; res.height = displayPixelSize.height; return res; } void darwin_draw_string(int x, int y, string s, gx__TextCfg cfg) { NSFont* font = [NSFont userFontOfSize: 0]; //cfg.size]; // # NSFont* font = [NSFont fontWithName:@"Roboto Mono" size:cfg.size]; if (cfg.mono) { // # font = [NSFont fontWithName:@"Roboto Mono" size:cfg.size]; font = [NSFont fontWithName:@"Menlo" size:cfg.size-5]; } if (cfg.bold) { font = [[NSFontManager sharedFontManager] convertFont:font toHaveTrait:NSBoldFontMask]; } NSDictionary* attr = @{ NSForegroundColorAttributeName: nscolor(cfg.color), //NSParagraphStyleAttributeName: paragraphStyle, NSFontAttributeName: font, }; [nsstring(s) drawAtPoint:NSMakePoint(x,y-15) withAttributes:attr]; } int darwin_text_width(string s) { // println('text_width "$s" len=$s.len') NSString* n = @""; if (s.len == 1) { // println('len=1') n=[NSString stringWithFormat:@"%c" , s.str[0]]; } else { n = nsstring(s); } /* # if (!defaultFont){ # defaultFont = [NSFont userFontOfSize: ui__DEFAULT_FONT_SIZE]; # } # NSDictionary *attrs = @{ # NSFontAttributeName: defaultFont, # }; */ NSSize size = [n sizeWithAttributes:nil]; // # printf("!!!%f\n", ceil(size.width)); return (int)(ceil(size.width)); } void darwin_draw_rect(float x, float y, float width, float height, gx__Color c) { NSColor* color = nscolor(c); NSRect rect = NSMakeRect(x, y, width, height); [color setFill]; NSRectFill(rect); } void darwin_window_refresh() { //[g_view setNeedsDisplay:YES]; // update UI on the main thread TODO separate fn dispatch_async(dispatch_get_main_queue(), ^{ [g_view setNeedsDisplay:YES]; }); //puts("refresh"); //[g_view drawRect:NSMakeRect(0,0,2000,2000)]; //[[NSGraphicsContext currentContext] flushGraphics]; } gg__Image darwin_create_image(string path_) { // file = file.trim_space() NSString* path = nsstring(path_); NSImage* img = [[NSImage alloc] initWithContentsOfFile:path]; if (img == 0) { } NSSize size = [img size]; gg__Image res; res.width = size.width; res.height = size.height; res.path = path_; res.ok = true; //printf("inited img width=%d\n", res.width) ; // need __brige_retained so that the pointer is not freed by ARC res.data = (__bridge_retained voidptr)(img); return res; } void darwin_draw_image(float x, float y, float w, float h, gg__Image* img) { NSImage* i= (__bridge NSImage*)(img->data); [i drawInRect:NSMakeRect(x,y,w,h)]; } void darwin_draw_circle(float x, float y, float d, gx__Color color) { NSColor* c = nscolor(color); NSRect rect = NSMakeRect(x, y, d * 2, d * 2); NSBezierPath* circlePath = [NSBezierPath bezierPath]; [circlePath appendBezierPathWithOvalInRect: rect]; [c setFill]; // [circlePath stroke]; [circlePath fill]; // NSRectFill(rect); }