# HG changeset patch # User Olaf Wintermann # Date 1765809232 -3600 # Node ID 6c6ea5cfe334f64b102e77cc96f7fd4b1e167c63 # Parent a2070417b2801825fbe17d9fc1e69741c5bce537 add functions for loading images (Cocoa) diff -r a2070417b280 -r 6c6ea5cfe334 ui/cocoa/image.h --- a/ui/cocoa/image.h Sun Dec 14 21:03:19 2025 +0100 +++ b/ui/cocoa/image.h Mon Dec 15 15:33:52 2025 +0100 @@ -30,7 +30,10 @@ #include "Container.h" - +typedef struct UiImage { + void *nsimage; + unsigned int ref; +} UiImage; void ui_icon_init(void); diff -r a2070417b280 -r 6c6ea5cfe334 ui/cocoa/image.m --- a/ui/cocoa/image.m Sun Dec 14 21:03:19 2025 +0100 +++ b/ui/cocoa/image.m Mon Dec 15 15:33:52 2025 +0100 @@ -107,11 +107,54 @@ return [NSImage imageNamed:imageName]; } +static UIIMAGE create_image(NSImage *image) { + UiImage *img = malloc(sizeof(UiImage)); + img->nsimage = (__bridge_retained void*)image; + img->ref = 1; + return img; +} void ui_image_ref(UIIMAGE img) { - // TODO + UiImage *image = img; + image->ref++; } void ui_image_unref(UIIMAGE img) { - // TODO + UiImage *image = img; + if(--image->ref == 0) { + CFRelease(image->nsimage); + free(img); + } } + +static int load_image(UiGeneric *obj, NSImage *img) { + UIIMAGE image = create_image(img); + + if(obj->set) { + obj->set(obj, image, UI_IMAGE_OBJECT_TYPE); + ui_image_unref(image); + } else { + obj->value = image; + obj->type = UI_IMAGE_OBJECT_TYPE; + } + + return 0; +} + +int ui_image_load_file(UiGeneric *obj, const char *path) { + NSString *str = [[NSString alloc]initWithUTF8String:path]; + NSImage *img = [[NSImage alloc]initWithContentsOfFile:str]; + if(img == nil) { + return 1; + } + return load_image(obj, img); +} + +int ui_image_load_data(UiGeneric *obj, const void *imgdata, size_t size) { + NSData *data = [NSData dataWithBytes:(void*)imgdata length:size]; + NSImage *img = [[NSImage alloc] initWithData:data]; + if(img == nil) { + return 1; + } + return load_image(obj, img); +}