add functions for loading images (Cocoa) default tip

Mon, 15 Dec 2025 15:33:52 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 15 Dec 2025 15:33:52 +0100
changeset 1008
6c6ea5cfe334
parent 1007
a2070417b280

add functions for loading images (Cocoa)

ui/cocoa/image.h file | annotate | diff | comparison | revisions
ui/cocoa/image.m file | annotate | diff | comparison | revisions
--- 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);
 
--- 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);
+}

mercurial