UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2025 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #import "image.h" 30 31 static NSDictionary *standardIconNames; 32 33 #define UI_ICON_ENTRY(x) @#x : x 34 35 void ui_icon_init(void) { 36 standardIconNames = @{ 37 UI_ICON_ENTRY(NSImageNameAddTemplate), 38 UI_ICON_ENTRY(NSImageNameBluetoothTemplate), 39 UI_ICON_ENTRY(NSImageNameBonjour), 40 UI_ICON_ENTRY(NSImageNameBookmarksTemplate), 41 UI_ICON_ENTRY(NSImageNameCaution), 42 UI_ICON_ENTRY(NSImageNameComputer), 43 UI_ICON_ENTRY(NSImageNameEnterFullScreenTemplate), 44 UI_ICON_ENTRY(NSImageNameExitFullScreenTemplate), 45 UI_ICON_ENTRY(NSImageNameFolder), 46 UI_ICON_ENTRY(NSImageNameFolderBurnable), 47 UI_ICON_ENTRY(NSImageNameFolderSmart), 48 UI_ICON_ENTRY(NSImageNameFollowLinkFreestandingTemplate), 49 UI_ICON_ENTRY(NSImageNameHomeTemplate), 50 UI_ICON_ENTRY(NSImageNameIChatTheaterTemplate), 51 UI_ICON_ENTRY(NSImageNameLockLockedTemplate), 52 UI_ICON_ENTRY(NSImageNameLockUnlockedTemplate), 53 UI_ICON_ENTRY(NSImageNameNetwork), 54 UI_ICON_ENTRY(NSImageNamePathTemplate), 55 UI_ICON_ENTRY(NSImageNameQuickLookTemplate), 56 UI_ICON_ENTRY(NSImageNameRefreshFreestandingTemplate), 57 UI_ICON_ENTRY(NSImageNameRefreshTemplate), 58 UI_ICON_ENTRY(NSImageNameRemoveTemplate), 59 UI_ICON_ENTRY(NSImageNameRevealFreestandingTemplate), 60 UI_ICON_ENTRY(NSImageNameShareTemplate), 61 UI_ICON_ENTRY(NSImageNameSlideshowTemplate), 62 UI_ICON_ENTRY(NSImageNameStatusAvailable), 63 UI_ICON_ENTRY(NSImageNameStatusNone), 64 UI_ICON_ENTRY(NSImageNameStatusPartiallyAvailable), 65 UI_ICON_ENTRY(NSImageNameStatusUnavailable), 66 UI_ICON_ENTRY(NSImageNameStopProgressFreestandingTemplate), 67 UI_ICON_ENTRY(NSImageNameStopProgressTemplate), 68 UI_ICON_ENTRY(NSImageNameTrashEmpty), 69 UI_ICON_ENTRY(NSImageNameTrashFull), 70 UI_ICON_ENTRY(NSImageNameActionTemplate), 71 UI_ICON_ENTRY(NSImageNameSmartBadgeTemplate), 72 UI_ICON_ENTRY(NSImageNameIconViewTemplate), 73 UI_ICON_ENTRY(NSImageNameListViewTemplate), 74 UI_ICON_ENTRY(NSImageNameColumnViewTemplate), 75 UI_ICON_ENTRY(NSImageNameFlowViewTemplate), 76 UI_ICON_ENTRY(NSImageNameInvalidDataFreestandingTemplate), 77 UI_ICON_ENTRY(NSImageNameGoForwardTemplate), 78 UI_ICON_ENTRY(NSImageNameGoBackTemplate), 79 UI_ICON_ENTRY(NSImageNameGoRightTemplate), 80 UI_ICON_ENTRY(NSImageNameGoLeftTemplate), 81 UI_ICON_ENTRY(NSImageNameRightFacingTriangleTemplate), 82 UI_ICON_ENTRY(NSImageNameLeftFacingTriangleTemplate), 83 UI_ICON_ENTRY(NSImageNameMobileMe), 84 UI_ICON_ENTRY(NSImageNameMultipleDocuments), 85 UI_ICON_ENTRY(NSImageNameUserAccounts), 86 UI_ICON_ENTRY(NSImageNamePreferencesGeneral), 87 UI_ICON_ENTRY(NSImageNameAdvanced), 88 UI_ICON_ENTRY(NSImageNameInfo), 89 UI_ICON_ENTRY(NSImageNameFontPanel), 90 UI_ICON_ENTRY(NSImageNameColorPanel), 91 UI_ICON_ENTRY(NSImageNameUser), 92 UI_ICON_ENTRY(NSImageNameUserGroup), 93 UI_ICON_ENTRY(NSImageNameEveryone), 94 UI_ICON_ENTRY(NSImageNameUserGuest), 95 UI_ICON_ENTRY(NSImageNameMenuOnStateTemplate), 96 UI_ICON_ENTRY(NSImageNameMenuMixedStateTemplate), 97 UI_ICON_ENTRY(NSImageNameApplicationIcon) 98 }; 99 } 100 101 NSImage* ui_cocoa_named_icon(const char *name) { 102 NSString *imageName = [[NSString alloc] initWithUTF8String:name]; 103 NSString *imgName = [standardIconNames objectForKey:imageName]; 104 if(imgName) { 105 imageName = imgName; 106 } 107 return [NSImage imageNamed:imageName]; 108 } 109 110 static UIIMAGE create_image(NSImage *image) { 111 UiImage *img = malloc(sizeof(UiImage)); 112 img->nsimage = (__bridge_retained void*)image; 113 img->ref = 1; 114 return img; 115 } 116 117 void ui_image_ref(UIIMAGE img) { 118 UiImage *image = img; 119 image->ref++; 120 } 121 122 void ui_image_unref(UIIMAGE img) { 123 UiImage *image = img; 124 if(--image->ref == 0) { 125 CFRelease(image->nsimage); 126 free(img); 127 } 128 } 129 130 static int load_image(UiGeneric *obj, NSImage *img) { 131 UIIMAGE image = create_image(img); 132 133 if(obj->set) { 134 obj->set(obj, image, UI_IMAGE_OBJECT_TYPE); 135 ui_image_unref(image); 136 } else { 137 obj->value = image; 138 obj->type = UI_IMAGE_OBJECT_TYPE; 139 } 140 141 return 0; 142 } 143 144 int ui_image_load_file(UiGeneric *obj, const char *path) { 145 NSString *str = [[NSString alloc]initWithUTF8String:path]; 146 NSImage *img = [[NSImage alloc]initWithContentsOfFile:str]; 147 if(img == nil) { 148 return 1; 149 } 150 return load_image(obj, img); 151 } 152 153 int ui_image_load_data(UiGeneric *obj, const void *imgdata, size_t size) { 154 NSData *data = [NSData dataWithBytes:(void*)imgdata length:size]; 155 NSImage *img = [[NSImage alloc] initWithData:data]; 156 if(img == nil) { 157 return 1; 158 } 159 return load_image(obj, img); 160 } 161