From 4f151c7e2431e3c4e81202935450b9c9f6bbf248 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sun, 2 Mar 2025 20:19:33 +0900 Subject: [PATCH] Fix Tiger app icon png2icns produces a 128x128 icon that isn't compatible with OSX Tiger. Uses a patched version of png2icns to produce the correct icon. Here is the output of icns2png -l AppIcon_128.icns. Before: ``` Extracting icons from AppIcon_128.icns... Icon family size is 22560 bytes (including 8 byte header) Listing icon elements... 'is32' 16x16 32-bit icon (1024 bytes compressed to 710) 's8mk' 16x16 8-bit mask (256 bytes) 'il32' 32x32 32-bit icon (4096 bytes compressed to 2448) 'l8mk' 32x32 8-bit mask (1024 bytes) 'ih32' 48x48 32-bit icon (9216 bytes compressed to 4418) 'h8mk' 48x48 8-bit mask (2304 bytes) 'ic07' 128x128 32-bit icon (65536 bytes compressed to 11336) ``` After: ``` Extracting icons from AppIcon_128.icns... Icon family size is 42420 bytes (including 8 byte header) Listing icon elements... 'is32' 16x16 32-bit icon (1024 bytes compressed to 710) 's8mk' 16x16 8-bit mask (256 bytes) 'il32' 32x32 32-bit icon (4096 bytes compressed to 2300) 'l8mk' 32x32 8-bit mask (1024 bytes) 'it32' 128x128 32-bit icon (65536 bytes compressed to 21690) 't8mk' 128x128 8-bit mask (16384 bytes) ``` --- Packaging/apple/AppIcon_128.icns | Bin 22560 -> 42420 bytes Packaging/apple/png2icns_tiger/.gitignore | 1 + Packaging/apple/png2icns_tiger/CMakeLists.txt | 8 + .../apple/png2icns_tiger/png2icns_tiger.c | 354 ++++++++++++++++++ Packaging/apple/png2icns_tiger/run.sh | 59 +++ 5 files changed, 422 insertions(+) create mode 100644 Packaging/apple/png2icns_tiger/.gitignore create mode 100644 Packaging/apple/png2icns_tiger/CMakeLists.txt create mode 100644 Packaging/apple/png2icns_tiger/png2icns_tiger.c create mode 100755 Packaging/apple/png2icns_tiger/run.sh diff --git a/Packaging/apple/AppIcon_128.icns b/Packaging/apple/AppIcon_128.icns index 76108cf0a337e7103fb72314031db82d8354d2cc..5280caf12071602a2d69e71162c9608578b93d55 100644 GIT binary patch literal 42420 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%0D170_6NSK<1O0<%Qvl zh-UIrg9qD1B2nAm=cDfS*kD`?@k+g5Sg_D-%<(@B;jGlaR{oT`t~gz@LBq&s-S@xW zy?ymm2^Vt`usKn%`r%oyl2w=>^r>|tkVrg|R8%|QH}2qLCH=|VYk-Bjg=$e0~~8N zn>2VBu#iIOBnVe|;4ehBKv#KDWc*%8Q7D%G;O9enOe+ule*Y8~l4O8G27`}fB(Sf8 ze8|}BXhx=E3U_7a(@WGU$Oi;HNj!v?j_L|VQR)d^ z(!Um<)t*OjV{6a~Vw~?G!N{i6oTCc%_w${`<#AEVa~L`WTre3At_WAn(Fx>O0_#BH z6`(NOpY4k@;2&`m#fKmmatglF>?zHbp@tA+X@4|6+5uw5*sps%8--lq*^~2hk;`{g zMGRyzEG}l;it`|{+!eA_nqD%?qvrNvX7fA`R39KGDz? zboQj75S%a-+{ZQ)eaf@%ItvCI0cjoJlS?4BW0<1UEJlwVVfPE)QH8oK9za9Je&!(N zMIyeybBMXLcv>qcbnt|N)rfHP83;C4I}oeaFM*`r$2|s#ps*4GW1?_vl3EFwD@5(8F2Pab`MvFSBOCd5+9^<6f>;e)CyD3OiAO@wr@qiugPrHa7wMRl>bT`~k7;&GWML&@aM7IrCK~ud;k%jj&HmIDLv<7&F%+a z35Sa}CwfcvBf`bM+e)C#zNN^FlaCBW*!2om_ED@re4b1pSphXa_wm7XS0U?GYBI6t z;Gafr@$!^@Ws?=le$`^!F=UzpAVml{q0sE+gh`5R33fVX!uE246B*gUbGN& zNCIUZ;mFPDVVE52oQ$k^61xUp4)K9NgT(!aRmhGQMulcGC!QKBuYZ3)PwR42ZKQFC zsPo;IP$c1x$h&wZdwC@Gc8Ns_zEhp1pLZWRd3G?Y5GD!iZMOzFeSz@?hB@);jdH`| z+rNB&aL?}8VNGp?Jg8pC>eTNvC%9fHl6&pi_uwW}1JX2;?4yxH*)yXr84w(R^b>y)zoRwFWmsc9@9MJ1a3KJmA4sZuf-`X=# z2cNa5ge?^kX7$(HClQ=lweL510fZ3XY#=XyU=GH$ppP;WSxY8Sn#^M6z{ML6Z`~

g` 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 S#fzu+WU2eQRoAj%Q2z%`o7jB- literal 22560 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 diff --git a/Packaging/apple/png2icns_tiger/.gitignore b/Packaging/apple/png2icns_tiger/.gitignore new file mode 100644 index 000000000..a0155cb29 --- /dev/null +++ b/Packaging/apple/png2icns_tiger/.gitignore @@ -0,0 +1 @@ +/build*/ diff --git a/Packaging/apple/png2icns_tiger/CMakeLists.txt b/Packaging/apple/png2icns_tiger/CMakeLists.txt new file mode 100644 index 000000000..5d8da22fa --- /dev/null +++ b/Packaging/apple/png2icns_tiger/CMakeLists.txt @@ -0,0 +1,8 @@ +# On Debian/Ubuntu, this requires libpng-dev and libicns-dev +cmake_minimum_required(VERSION 3.22) +project(png2icns_tiger LANGUAGES C) +add_executable(png2icns_tiger png2icns_tiger.c) +find_package(PkgConfig REQUIRED) +pkg_check_modules(PNG REQUIRED IMPORTED_TARGET libpng) +pkg_check_modules(ICNS REQUIRED IMPORTED_TARGET libicns) +target_link_libraries(png2icns_tiger PRIVATE PkgConfig::PNG PkgConfig::ICNS) diff --git a/Packaging/apple/png2icns_tiger/png2icns_tiger.c b/Packaging/apple/png2icns_tiger/png2icns_tiger.c new file mode 100644 index 000000000..7658b1b43 --- /dev/null +++ b/Packaging/apple/png2icns_tiger/png2icns_tiger.c @@ -0,0 +1,354 @@ +/* + * png2icns_tiger - based on png2icns from the pngutils Debian package but + * modified for Tiger support. See the section that says MODIFICATION. + * + * Copyright (C) 2008 Julien BLACHE + * Copyright (C) 2012 Mathew Eis + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#define FALSE 0 +#define TRUE 1 + +#if PNG_LIBPNG_VER >= 10209 +#define PNG2ICNS_EXPAND_GRAY 1 +#endif + +static int read_png(FILE *fp, png_bytepp buffer, int32_t *bpp, int32_t *width, + int32_t *height) { + png_structp png_ptr; + png_infop info; + png_uint_32 w; + png_uint_32 h; + png_bytep *rows; + + int bit_depth; + int32_t color_type; + + int row; + int rowsize; + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png_ptr == NULL) + return FALSE; + + info = png_create_info_struct(png_ptr); + if (info == NULL) { + png_destroy_read_struct(&png_ptr, NULL, NULL); + return FALSE; + } + + if (setjmp(png_jmpbuf(png_ptr))) { + png_destroy_read_struct(&png_ptr, &info, NULL); + return FALSE; + } + + png_init_io(png_ptr, fp); + + png_read_info(png_ptr, info); + png_get_IHDR(png_ptr, info, &w, &h, &bit_depth, &color_type, NULL, NULL, + NULL); + + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: +#ifdef PNG2ICNS_EXPAND_GRAY + png_set_expand_gray_1_2_4_to_8(png_ptr); +#else + png_set_gray_1_2_4_to_8(png_ptr); +#endif + + if (bit_depth == 16) { + png_set_strip_16(png_ptr); + bit_depth = 8; + } + + png_set_gray_to_rgb(png_ptr); + png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER); + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: +#ifdef PNG2ICNS_EXPAND_GRAY + png_set_expand_gray_1_2_4_to_8(png_ptr); +#else + png_set_gray_1_2_4_to_8(png_ptr); +#endif + + if (bit_depth == 16) { + png_set_strip_16(png_ptr); + bit_depth = 8; + } + + png_set_gray_to_rgb(png_ptr); + break; + + case PNG_COLOR_TYPE_PALETTE: + png_set_palette_to_rgb(png_ptr); + + if (png_get_valid(png_ptr, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + else + png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER); + break; + + case PNG_COLOR_TYPE_RGB: + if (bit_depth == 16) { + png_set_strip_16(png_ptr); + bit_depth = 8; + } + + png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER); + break; + + case PNG_COLOR_TYPE_RGB_ALPHA: + if (bit_depth == 16) { + png_set_strip_16(png_ptr); + bit_depth = 8; + } + + break; + } + + *width = w; + *height = h; + *bpp = bit_depth * 4; + + png_set_interlace_handling(png_ptr); + + png_read_update_info(png_ptr, info); + + rowsize = png_get_rowbytes(png_ptr, info); + rows = malloc(sizeof(png_bytep) * h); + *buffer = malloc(rowsize * h + 8); + + rows[0] = *buffer; + for (row = 1; row < h; row++) { + rows[row] = rows[row - 1] + rowsize; + } + + png_read_image(png_ptr, rows); + png_destroy_read_struct(&png_ptr, &info, NULL); + + free(rows); + + return TRUE; +} + +static int add_png_to_family(icns_family_t **iconFamily, char *pngname) { + FILE *pngfile; + + int icnsErr = ICNS_STATUS_OK; + icns_image_t icnsImage; + icns_image_t icnsMask; + icns_type_t iconType; + icns_type_t maskType; + icns_icon_info_t iconInfo; + + icns_element_t *iconElement = NULL; + icns_element_t *maskElement = NULL; + char iconStr[5] = {0, 0, 0, 0, 0}; + char maskStr[5] = {0, 0, 0, 0, 0}; + int iconDataOffset = 0; + int maskDataOffset = 0; + + png_bytep buffer; + int width, height, bpp; + + pngfile = fopen(pngname, "rb"); + if (pngfile == NULL) { + fprintf(stderr, "Could not open '%s' for reading: %s\n", pngname, + strerror(errno)); + return FALSE; + } + + if (!read_png(pngfile, &buffer, &bpp, &width, &height)) { + fprintf(stderr, "Failed to read PNG file\n"); + fclose(pngfile); + + return FALSE; + } + + fclose(pngfile); + + icnsImage.imageWidth = width; + icnsImage.imageHeight = height; + icnsImage.imageChannels = 4; + icnsImage.imagePixelDepth = 8; + icnsImage.imageDataSize = width * height * 4; + icnsImage.imageData = buffer; + + iconInfo.isImage = 1; + iconInfo.iconWidth = icnsImage.imageWidth; + iconInfo.iconHeight = icnsImage.imageHeight; + iconInfo.iconBitDepth = bpp; + iconInfo.iconChannels = (bpp == 32 ? 4 : 1); + iconInfo.iconPixelDepth = bpp / iconInfo.iconChannels; + + iconType = icns_get_type_from_image_info(iconInfo); + maskType = icns_get_mask_type_for_icon_type(iconType); + + /* MODIFICATION */ + if (iconType == ICNS_128x128_32BIT_ARGB_DATA) { + /* libicns returns "ic07" for 128x128 icons but that doesn't work on Tiger + */ + iconType = ICNS_128X128_32BIT_DATA; + maskType = ICNS_128X128_8BIT_MASK; + } + /* END OF MODIFICATION */ + + icns_type_str(iconType, iconStr); + icns_type_str(maskType, maskStr); + + /* Only convert the icons that match sizes icns supports */ + if (iconType == ICNS_NULL_TYPE) { + fprintf(stderr, "Bad dimensions: PNG file '%s' is %dx%d\n", pngname, width, + height); + free(buffer); + + return FALSE; + } + + if (bpp != 32) { + fprintf(stderr, "Bit depth %d unsupported in '%s'\n", bpp, pngname); + free(buffer); + + return FALSE; + } + + icns_set_print_errors(0); + if (icns_get_element_from_family(*iconFamily, iconType, &iconElement) == + ICNS_STATUS_OK) { + icns_set_print_errors(1); + + fprintf(stderr, "Duplicate icon element of type '%s' detected (%s)\n", + iconStr, pngname); + free(buffer); + + return FALSE; + } + + icns_set_print_errors(1); + + if ((iconType != ICNS_1024x1024_32BIT_ARGB_DATA) && + (iconType != ICNS_512x512_32BIT_ARGB_DATA) && + (iconType != ICNS_256x256_32BIT_ARGB_DATA) && + (iconType != ICNS_128x128_32BIT_ARGB_DATA)) { + printf("Using icns type '%s', mask '%s' for '%s'\n", iconStr, maskStr, + pngname); + } else { + printf("Using icns type '%s' (ARGB) for '%s'\n", iconStr, pngname); + } + + icnsErr = icns_new_element_from_image(&icnsImage, iconType, &iconElement); + + if (iconElement != NULL) { + if (icnsErr == ICNS_STATUS_OK) { + icns_set_element_in_family(iconFamily, iconElement); + } + free(iconElement); + } + + if ((iconType != ICNS_1024x1024_32BIT_ARGB_DATA) && + (iconType != ICNS_512x512_32BIT_ARGB_DATA) && + (iconType != ICNS_256x256_32BIT_ARGB_DATA) && + (iconType != ICNS_128x128_32BIT_ARGB_DATA)) { + icns_init_image_for_type(maskType, &icnsMask); + + iconDataOffset = 0; + maskDataOffset = 0; + + while ((iconDataOffset < icnsImage.imageDataSize) && + (maskDataOffset < icnsMask.imageDataSize)) { + icnsMask.imageData[maskDataOffset] = + icnsImage.imageData[iconDataOffset + 3]; + iconDataOffset += 4; /* move to the next alpha byte */ + maskDataOffset += 1; /* move to the next byte */ + } + + icnsErr = icns_new_element_from_mask(&icnsMask, maskType, &maskElement); + + if (maskElement != NULL) { + if (icnsErr == ICNS_STATUS_OK) { + icns_set_element_in_family(iconFamily, maskElement); + } + free(maskElement); + } + + icns_free_image(&icnsMask); + } + + free(buffer); + + return TRUE; +} + +int main(int argc, char **argv) { + FILE *icnsfile; + + icns_family_t *iconFamily; + + int i; + + if (argc < 3) { + printf("Usage: png2icns file.icns file1.png file2.png ... filen.png\n"); + exit(1); + } + + icnsfile = fopen(argv[1], "wb+"); + if (icnsfile == NULL) { + fprintf(stderr, "Could not open '%s' for writing: %s\n", argv[1], + strerror(errno)); + exit(1); + } + + icns_set_print_errors(1); + icns_create_family(&iconFamily); + + for (i = 2; i < argc; i++) { + if (!add_png_to_family(&iconFamily, argv[i])) { + fclose(icnsfile); + unlink(argv[1]); + + exit(1); + } + } + + if (icns_write_family_to_file(icnsfile, iconFamily) != ICNS_STATUS_OK) { + fprintf(stderr, "Failed to write icns file\n"); + fclose(icnsfile); + + exit(1); + } + + fclose(icnsfile); + + printf("Saved icns file to %s\n", argv[1]); + + if (iconFamily != NULL) + free(iconFamily); + + return 0; +} diff --git a/Packaging/apple/png2icns_tiger/run.sh b/Packaging/apple/png2icns_tiger/run.sh new file mode 100755 index 000000000..d8ae7f8dd --- /dev/null +++ b/Packaging/apple/png2icns_tiger/run.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +set -euo pipefail + +declare -r INPUT=../../resources/icon.png +declare -ra SIZES=(16 32 128) +declare -r OUTPUT=../AppIcon_128.icns + +declare -rA DEPENDENCY_SOURCES=( + [convert]=imagemagick + [cmake]=cmake +) + +check_deps() { + local -a missing_deps=() + local path + for dep in "${!DEPENDENCIES[@]}"; do + if path="$(which "$dep")"; then + echo >&2 "Using $dep from $path" + else + missing_deps+=("$dep") + fi + done + if (( ${#missing_deps[@]} )); then + echo >&2 "Error: Missing dependencies" + for dep in "${missing_deps[@]}"; do + echo >&2 '* '"Please install \"${dep}\", provided by ${DEPENDENCY_SOURCES[$dep]} on Debian/Ubuntu" + done + exit 1 + fi +} + +main() { + cd "$(dirname "$0")" + check_deps + + set -x + mkdir -p tmp + { set +x; } 2> /dev/null + + local path + local -a FILES=() + for s in "${SIZES[@]}"; do + path="tmp/output_${s}.png" + FILES+=("$path") + + set -x + convert "$INPUT" -resize "${s}x${s}" "$path" + { set +x; } 2> /dev/null + done + + set -x + cmake -S. -Bbuild-rel -DCMAKE_BUILD_TYPE=Release + cmake --build build-rel + build-rel/png2icns_tiger "$OUTPUT" "${FILES[@]}" + rm -rf tmp +} + +main "$@"