{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":4917029,"defaultBranch":"main","name":"PhotoDemon","ownerLogin":"tannerhelland","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2012-07-05T23:43:00.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1930029?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1725642292.0","currentOid":""},"activityList":{"items":[{"before":"8b31333b75a6dc8b23aa2a3d4296e29c972bad13","after":"3d515e939ba74ffe77fd5e2909549e0c7cd2f3ff","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-19T20:04:30.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Treeview UI: expand/collapse now works\n\nStill a few more minor UI behavior tweaks needed (like keyboard support for navigating a treeview), but it's close enough to working that I can start rendering things like the hotkey text itself into the list!","shortMessageHtmlLink":"Treeview UI: expand/collapse now works"}},{"before":"cf93e4ba85d0b735ca2dd76bf626fcb04aa15b1b","after":"8b31333b75a6dc8b23aa2a3d4296e29c972bad13","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-19T16:33:24.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Treeview UI: tons of progress\n\nThe treeview is actually mostly rendered now - a large success Managing tree hierarchy silently in the background took more code than I anticipated.\n\nNext up, implementing hit-detection and UI bits for expand/collapse behavior.","shortMessageHtmlLink":"Treeview UI: tons of progress"}},{"before":"47a854c5ef77568a2496c52f025c24bf1422afab","after":"cf93e4ba85d0b735ca2dd76bf626fcb04aa15b1b","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-12T20:23:30.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Edit hotkeys UI: progress!\n\n- A full menu hierarchy is now retrieved by the edit hotkeys dialog\n- A full hotkey collection is now retrieved by the edit hotkeys dialog\n- The edit hotkeys dialog now correctly maps that menu hierarchy against the hotkey collection\n- Menus now get rendered to an early draft of a custom treeview","shortMessageHtmlLink":"Edit hotkeys UI: progress!"}},{"before":"a83a007cfc5fc9931c87d6b883dc8b0dd72dde65","after":"47a854c5ef77568a2496c52f025c24bf1422afab","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-09T16:39:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"New interop functions required for customized hotkeys\n\nAlso, start rewriting hotkey initialization to look for an on-disk hotkey file before loading the default hotkey collection.","shortMessageHtmlLink":"New interop functions required for customized hotkeys"}},{"before":"12172de922efc811a4ddd41b478e52d7662f9984","after":"a83a007cfc5fc9931c87d6b883dc8b0dd72dde65","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-09T15:09:18.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Initial framework for actual hotkey dialog","shortMessageHtmlLink":"Initial framework for actual hotkey dialog"}},{"before":"58e755b19f57f4b4fa2b19d37a5c874fdad5da10","after":"12172de922efc811a4ddd41b478e52d7662f9984","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-06T17:33:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Additional UI for the main window\n\nRelates to #474","shortMessageHtmlLink":"Additional UI for the main window"}},{"before":null,"after":"58e755b19f57f4b4fa2b19d37a5c874fdad5da10","ref":"refs/heads/custom-hotkeys","pushedAt":"2024-09-06T17:04:52.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Start knocking out new UI elements required for custom hotkeys","shortMessageHtmlLink":"Start knocking out new UI elements required for custom hotkeys"}},{"before":"d3359722aab80985e5f7de25ce733662be510166","after":"5ae6a3e53e1d332f3026c4de9fdca283395c5674","ref":"refs/heads/main","pushedAt":"2024-09-03T16:14:50.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"New approach for handling layer boundaries after...\n\n...null-padding operations.\n\nWhen performing certain canvas actions on a layer, PhotoDemon first expands layer boundaries to match image boundaries (called \"null-padding\", because it inserts a bunch of transparent pixels around the layer until it matches image size). This greatly simplifies operations with unpredictable boundaries, like painting onto a layer whose size is smaller than the parent image.\n\nAfter the edit operation is complete, I would previously just auto-crop the layer back to its relevant size. This works by scanning and removing transparent boundaries around the layer until it reaches its smallest possible size. A nice benefit of this is that it works extremely well on layers that use non-destructive transforms (like rotate or skew).\n\nUnfortunately, this approach totally breaks down if the layer is left fully transparent after the edit operation (like deleting a selected region). To solve this, in edit operations where I can, I'm now just restoring the layer's original size after the edit operation. This prevents unpredictable layer size changes after operations that *shouldn't* modify layer boundaries.\n\nNote that affine-transformed layers may still change size after such operations, as part of the committing the transformations permanently.\n\nThis should fix #590. Many thanks to @hi5 for catching and reporting this tricky bug!","shortMessageHtmlLink":"New approach for handling layer boundaries after..."}},{"before":"4869659943e34a02b14a76c644bff9d349ef5146","after":"d3359722aab80985e5f7de25ce733662be510166","ref":"refs/heads/main","pushedAt":"2024-08-31T13:09:51.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"New Russian localization\n\nThank you to @vosska for their generous contribution!","shortMessageHtmlLink":"New Russian localization"}},{"before":"57b65d0c833edf3ab6f76f20e8134f9906b5c30d","after":"4869659943e34a02b14a76c644bff9d349ef5146","ref":"refs/heads/main","pushedAt":"2024-08-29T21:02:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"HEIF/HEIC export: multi-frame exports now supported\n\nThe HEIF/HEIC export dialog now allows you to export just the composited image, or one-frame-per-layer. This allows for successful round-tripping of multi-frame HEIC images.\n\nI've also switched PD's default extension for exporting these images to HEIC instead of HEIF since the HEVC codec (h.265) is used, and if I'm reading the spec correctly, HEIC indicates HEVC encoding.\n\nWith this commit, I consider HEIF/HEIC support roughly complete for now. Note however that vcpkg's version of libheif trails the official version, and as noted in PD's code some known libheif bugs that currently require workarounds may go away as new libheif builds become available - so I'll keep an eye on vcpkg in the coming weeks to see if it picks up v1.18.x (instead of 1.17.6, which is the latest available as of this commit).","shortMessageHtmlLink":"HEIF/HEIC export: multi-frame exports now supported"}},{"before":"45ff52e34373f731969d901637636c97f110a2b0","after":"57b65d0c833edf3ab6f76f20e8134f9906b5c30d","ref":"refs/heads/main","pushedAt":"2024-08-29T15:57:45.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Localization updates for HEIF export dialog\n\nAll HEIF export text is (for now) reused from other dialogs, so no new translations are required!","shortMessageHtmlLink":"Localization updates for HEIF export dialog"}},{"before":"fc5a06e75f37b072323a5ca23fae3609106364a0","after":"45ff52e34373f731969d901637636c97f110a2b0","ref":"refs/heads/main","pushedAt":"2024-08-26T14:52:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Update German.xml\n\nThank you to Roy K for his ongoing work!","shortMessageHtmlLink":"Update German.xml"}},{"before":"a1e460307a2d61bcbb8518b6be4c8cae42de1a77","after":"fc5a06e75f37b072323a5ca23fae3609106364a0","ref":"refs/heads/main","pushedAt":"2024-08-22T20:21:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Fix clicking on selection with move tool (without other mouse movement)\n\nFixes #584. Thank you to @mythter for catching and reporting!","shortMessageHtmlLink":"Fix clicking on selection with move tool (without other mouse movement)"}},{"before":"5a6204a23918791fd55154731ec02ad2ab83c4be","after":"a1e460307a2d61bcbb8518b6be4c8cae42de1a77","ref":"refs/heads/main","pushedAt":"2024-08-22T19:45:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Fix hotkeys to support press+and+hold behavior\n\nRelates to #425. Thank you to @mythter for catching and reporting!","shortMessageHtmlLink":"Fix hotkeys to support press+and+hold behavior"}},{"before":"bf5585cd40c2ffa6886c13e41265d514496e79ad","after":null,"ref":"refs/heads/libheif","pushedAt":"2024-08-22T16:37:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"}},{"before":"3f2323c0a32a27039f0c7a959f4f2c3934636b91","after":"5a6204a23918791fd55154731ec02ad2ab83c4be","ref":"refs/heads/main","pushedAt":"2024-08-22T16:37:01.000Z","pushType":"pr_merge","commitsCount":10,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Merge pull request #585 from tannerhelland/libheif\n\nAdd HEIF/HEIC image import support","shortMessageHtmlLink":"Merge pull request #585 from tannerhelland/libheif"}},{"before":"4542519261929f5994cc64663ca3b8537c9c2ae6","after":"bf5585cd40c2ffa6886c13e41265d514496e79ad","ref":"refs/heads/libheif","pushedAt":"2024-08-22T16:31:06.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Update README.md\n\nNightly builds now have meaningful changes over the last stable release","shortMessageHtmlLink":"Update README.md"}},{"before":"5d5dc277822e8c87517c5763e4185a8901a5fd3b","after":"4542519261929f5994cc64663ca3b8537c9c2ae6","ref":"refs/heads/libheif","pushedAt":"2024-08-22T16:21:10.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Minor language file updates for HEIF support\n\nlibheif uses the LGPL, so new text is needed for license links","shortMessageHtmlLink":"Minor language file updates for HEIF support"}},{"before":"2a9d7046531cd337fbd7333af65b89b30d854042","after":"5d5dc277822e8c87517c5763e4185a8901a5fd3b","ref":"refs/heads/libheif","pushedAt":"2024-08-21T19:45:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"HEIF images: tons of import improvements\n\n- Multi-frame images are now fully supported (one frame per layer)\n- ICC profiles are now discovered, retrieved, and used\n- Invalid images no longer cause crashes or memory leaks (tested against a full conformance set)\n- HEIF images now work with Layer > Add from file\n\nWith this, I consider heif import complete!","shortMessageHtmlLink":"HEIF images: tons of import improvements"}},{"before":"3cf41fe6b793d4ecd8a9a8086204b1a959d240d7","after":"2a9d7046531cd337fbd7333af65b89b30d854042","ref":"refs/heads/libheif","pushedAt":"2024-08-20T15:55:21.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"HEIF images can now be imported (single-frame only)\n\n(Sort of relates to #556)\n\nYou can now import iPhone photos (or any other valid HEIF/HEIC images) into PhotoDemon.\n\nPD uses [libheif](https://github.com/strukturag/libheif) for HEIF parsing. This commit includes a small helper library - written in twinBASIC! - that handles some necessary interop with libheif.\n\nOn a number of critical function calls, libheif returns a custom 12-byte `heif_error` struct that prevents standard cdecl workarounds using DispCallFunc. Custom-building a portable copy of libheif for PD is already complicated (suggested Windows build method is vcpkg, which is what I'm using, and vcpkg makes it very obnoxious to maintain out-of-tree patches). Rather than go down the rabbit-hole of maintaining a separate stdcall branch of libheif, I thought I'd try using twinBASIC to interface with any custom cdecl function returns. It works wonderfully. Thank you to @WaynePhillipsEA and @twinBASIC for greatly simplifying my life while working on this feature.\n\nYou can build/investigate/critique the small tB helper project I'm using in the Support/twinBASIC/PDHelper folder.\n\nHEIF image export is still to-do, and I'm still investigating potential support for multi-frame image imports.","shortMessageHtmlLink":"HEIF images can now be imported (single-frame only)"}},{"before":"aabdc21106ff5a638c79f141f29c9b9020f6aca7","after":"3f2323c0a32a27039f0c7a959f4f2c3934636b91","ref":"refs/heads/main","pushedAt":"2024-07-23T13:25:54.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Updated Polish translation\n\nThank you to Ryszard C for their ongoing work!","shortMessageHtmlLink":"Updated Polish translation"}},{"before":"5bc7842b84a0ed7184b9da94a4a710c0d402cd73","after":"3cf41fe6b793d4ecd8a9a8086204b1a959d240d7","ref":"refs/heads/libheif","pushedAt":"2024-07-16T16:36:36.000Z","pushType":"push","commitsCount":13,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Merge branch 'main' into libheif","shortMessageHtmlLink":"Merge branch 'main' into libheif"}},{"before":null,"after":"5bc7842b84a0ed7184b9da94a4a710c0d402cd73","ref":"refs/heads/libheif","pushedAt":"2024-07-16T16:34:42.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"build and integrate libheif as possible HEIF loader\n\nBuilding libheif in a VB6-compatible way is not the easiest task. I've ended up going with vcpkg (which simplifies some things but complicates others) and using libheif for *only* heif/heic works OK. (libheif can potentially handle AVIF images too, but these won't build for anything but x64 via vcpkg.)\n\nRight now, this commit just loads the plugin and checks a basic version reporting function, but it's working well.\n\nNext up, see if I can actually load a HEIF image with it!","shortMessageHtmlLink":"build and integrate libheif as possible HEIF loader"}},{"before":"b378689cefa2e4216b97306cf9619c0d4027be20","after":"aabdc21106ff5a638c79f141f29c9b9020f6aca7","ref":"refs/heads/main","pushedAt":"2024-07-15T20:42:04.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Load images by drag/drop: suspend warnings on user-canceled imports\n\nRelates to #577. Thank you to @hi5 for catching and reporting this one!","shortMessageHtmlLink":"Load images by drag/drop: suspend warnings on user-canceled imports"}},{"before":"39141515733e729efb57f8538a425b9fa15f803d","after":"b378689cefa2e4216b97306cf9619c0d4027be20","ref":"refs/heads/main","pushedAt":"2024-07-13T16:40:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Allow \"Space\" key to trigger OK button on dialogs\n\n...same as the \"Enter\" key.\n\nRelates to #566. Thank you to @dbojan for the suggestion!","shortMessageHtmlLink":"Allow \"Space\" key to trigger OK button on dialogs"}},{"before":"55e31c8c697502ce731bd565da6d8e19daa9536c","after":"39141515733e729efb57f8538a425b9fa15f803d","ref":"refs/heads/main","pushedAt":"2024-07-13T16:00:09.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Add auto-download for latest libjxl (0.10.3)\n\nRelates to #579 . Thank you to @ZPNRG for reporting!","shortMessageHtmlLink":"Add auto-download for latest libjxl (0.10.3)"}},{"before":"b6befb4e58e7f5793c501955980c291b45067392","after":"55e31c8c697502ce731bd565da6d8e19daa9536c","ref":"refs/heads/main","pushedAt":"2024-07-13T15:30:43.000Z","pushType":"pr_merge","commitsCount":7,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Merge pull request #576 from hosiken/japanese_localize_2024_7\n\nJapanese Localization: Update to 2024.7 & some fix","shortMessageHtmlLink":"Merge pull request #576 from hosiken/japanese_localize_2024_7"}},{"before":"d9d4bc5b28fef6cf9dac02115dd42d845ea6e740","after":"b6befb4e58e7f5793c501955980c291b45067392","ref":"refs/heads/main","pushedAt":"2024-07-13T15:28:50.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Fix crash on invalid page ranges in PDF import\n\nRelates to #577 . Thank you to @hosiken for catching and reporting and thank you to @hi5 for additional testing.","shortMessageHtmlLink":"Fix crash on invalid page ranges in PDF import"}},{"before":"2197a2f4b01d12e3ff0d4e947693249a1000cb08","after":"d9d4bc5b28fef6cf9dac02115dd42d845ea6e740","ref":"refs/heads/main","pushedAt":"2024-07-11T19:05:31.000Z","pushType":"push","commitsCount":8,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"PhotoDemon 2024.7 (stable release)\n\nA detailed release announcement is available at photodemon.org:\n\nhttps://photodemon.org/2024/07/11/photodemon-2024-7.html\n\nThank you to everyone who contributed to this release. I am grateful for all of you ❤️","shortMessageHtmlLink":"PhotoDemon 2024.7 (stable release)"}},{"before":"0a3a0cba7f0bf978c81b57d01add49a35a882f8b","after":"2197a2f4b01d12e3ff0d4e947693249a1000cb08","ref":"refs/heads/main","pushedAt":"2024-07-11T17:05:35.000Z","pushType":"pr_merge","commitsCount":7,"pusher":{"login":"tannerhelland","name":"Tanner","path":"/tannerhelland","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1930029?s=80&v=4"},"commit":{"message":"Merge pull request #574 from hosiken/japanese_localize\n\nJapanese translation tuning","shortMessageHtmlLink":"Merge pull request #574 from hosiken/japanese_localize"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEu0YeVAA","startCursor":null,"endCursor":null}},"title":"Activity · tannerhelland/PhotoDemon"}