diff --git a/Credits.html b/Credits.html
index 060bca9..68194ae 100644
--- a/Credits.html
+++ b/Credits.html
@@ -1,19 +1,17 @@
-
+
-
+
Phoenix Slides Credits
Free.
Please contribute time, talent, or wealth!
Official web site (source code available):
-http://blyt.net/phxslides/.
+https://blyt.net/phxslides/.
Thanks to David Chow - beta testing; Takeshi Gondo - icon;
Thomas Steg, César Piñera, Laurent Bovet, Silvano Dotti - localization;
Bradyn Breon-Drish - equipment;
-rasterman - Epeg;
M. Uli Kusterer - UKPrefsPanel
Legalese
This software is based in part on the work of the Independent JPEG Group.
diff --git a/CreeveyController.m b/CreeveyController.m
index 1a992f5..4e8fd77 100644
--- a/CreeveyController.m
+++ b/CreeveyController.m
@@ -17,6 +17,10 @@
#import "DYVersChecker.h"
#import "DYExiftags.h"
+// The thumbs cache should always store images using the resolved filename as the key.
+// This prevents duplication somewhat, but it means when you look things up
+// you need to make a call to ResolveAliasToPath.
+
#define MAX_THUMBS 2000
#define DYVERSCHECKINTERVAL 604800
#define MAX_FILES_TO_CHECK_FOR_JPEG 100
diff --git a/Info.plist b/Info.plist
index dba44a6..b4b7899 100644
--- a/Info.plist
+++ b/Info.plist
@@ -50,7 +50,7 @@
CFBundleExecutable
Phoenix Slides
CFBundleGetInfoString
- Phoenix Slides 1.5.3, Copyright 2005-2024 Dominic Yu, Gold Mountain Software
+ Phoenix Slides 1.5.4, Copyright 2005-2024 Dominic Yu, Gold Mountain Software
CFBundleHelpBookFolder
Phoenix Slides Help
CFBundleHelpBookName
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 6ae6678..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
-GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- Phoenix Slides
- Copyright (C) 2013 gobbledegook
-
- 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.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- {signature of Ty Coon}, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/README b/README
deleted file mode 100644
index 33c1b53..0000000
--- a/README
+++ /dev/null
@@ -1,224 +0,0 @@
-Phoenix Slides source code README
-by Dominic Yu
-created 2005 June 8
-modified 2012 October
-
-creevey was the code name for Phoenix Slides. Colin Creevey is the
-kid in Harry Potter who keeps taking pictures.
-
-I put my source code out in the hopes that people might contribute
-to the project, and also so others may benefit from my hours of
-blood, sweat, and code (as the old CodeWarrior mantra goes).
-
-Sorry for the messy source code. I've tried to make things modular
-and reusable, though a lot of classes are rather application-specific.
-Let's see, the wrapping matrix is kinda cool. The dir browser could
-be useful (NSBrowser quirks notwithstanding). And the
-Carbon Goodies are definitely useful.
-
-If anyone wants to contribute their coding talent and make this
-program come along more quickly, help is always welcome.
-
-Aliases: a pain to deal with. Why can't the OS just use symbolic links?
-Anyway, things to keep in mind re aliases:
-1. the thumbs image cache always stores images using the resolved filename as
- the key. This prevents duplication somewhat, but it means when you look
- things up you need to make a call to ResolveAliasToPath.
-2. for some reason, i decided to store images using unresolved filenames
- in the slideshow cache. Oh, I think it's in case there are multiple
- slideshows in the future, each one should have its own cache.
- So anyway, it's different than for the thumbnails, which is one global cache
- for all the windows.
-3. file operations should of course operate on the original file.
- Everything in the JPEG and EXIF menus call rotateTest:; get exiforientation etc.
- and set desktop should also resolve to the original path.
- But move to trash, reveal in finder should not. Get Info is weird, since
- you want to show that it's an alias, but also show the original info.
- Plus there's two places where you get info, once in the slideshow and
- once in the get info window.
-
-TO DO:
-- play movies
-- lossless jpeg cropping?
-- speed, speed, speed. i've noticed a slight lag sometimes when going forward
- in the slideshow, which disappears if you go back over those pics again.
- can't figure out why...
-
-
-Enjoy!
-
-
-Version History
----------------
-1.2.8
------
-make universal binary again (you have to compile with XCode 3.2.6)
-info bar now hidden by default
-info bar visibility is now sticky
-
-1.2.7
------
-thumbnail view now auto-rotates JPEG images with orientation tags
-- you can turn this off in a menu item
-for better consistency...
-- JPEGs are now rotated relative to their currently displayed orientation
-- in the slideshow you can save the current rotation (cmd-shift-S);
- (in the browser view, use "Rotate by Tag", since you can't rotate thumbnails in the browser)
-sort thumbnails by either name or date
-directory names in browser sorted by name.
-columns now resize individually (hold option to do all at once). see setPrefersAllColumnUserResizing.
-made the "orientation" menu items more sensitive to context (specifically, during slideshows they only activate if the orientation > 1)
-'*' now resets rotation and flip (used to be just zoom)
-added hidden pref: defaults write net.blyt.phoenixslides Slideshow:RerandomizeOnLoop -boolean NO
-fixed bug where super-skinny images might crash the browser (thanks to Luis Lozano)
-fixed bug where you're stuck in a slideshow if you dragged something to the
- Phoenix Slides icon, then switch to view a particular category, then
- switched away from that window (e.g. another app) and back again (thanks to Doc O'Leary)
-fixed bug where a jpeg would remain flipped in the slideshow after modifying it
-fixed bug where slideshow rotations would be stored incorrectly after flipping
-fixed: aliases in slideshows can now show EXIF info
-fixed: replace thumb works with aliases
-fixed: white line on the right side of some 180-degree rotations
-got rid of annoying NSLock warnings in the console
-updated localizations (except French!)
-fixed "type" field as shown in Get Info in the Finder
-
-1.2.6
------
-fixed - work around Snow Leopard's NSBrowser bug(?)
-if slideshow is running, don't switch to different monitor
-when in random mode AND loop mode, re-randomize at the start of each loop
-fixed crash on EXIF field type mismatch
-Italian localization improved (thanks to Silvano Dotti)
-
-1.2.5
------
-thumbs bg color
-pref to move files/make alias
-allows flipping with 'f'
-shift-space goes back
-in EXIF menu, "Auto-rotate JPEG Files" changed to "Rotate JPEG File by EXIF tag"
-made slideshow auto-rotate by exif orientation, but not the thumbnails
-fixed bug when reading JPEG Comments with 8-bit characters
-fixed - dragging to trash can now removes thumbnail from view (bug introduced in 1.2, I think)
-fixed - banished that annoying white line when showing cached, scaled-down images
-fixed - typo "Focal Lenght In 35mm Film"
-
-1.2.4
------
-possible fix for intel hanging (same nsbrowser bug as 1.0)
-- we should check if it happens in 10.5
-worked around non-standard EXIF header crash
-got rid of extra white line on some thumbnails
-resolution independence stuff (percent means pixels)
-
-1.2.3
------
-changes:
-Selected thumbnail now matches last viewed slide
-items sorted by filename (in Finder order)
-skips folders named "Thumbs" (for better iPhoto library browsing)
-icon (Takeshi Gondo)
-Italian
-fixes:
-now hides exif thumb popup menu correctly when info window collapsed
-ghost of last thumbnail no longer remains when deleting a file
-jpeg ops no longer cause menubar/dock to show during slideshows
-
-1.2.2
------
-jpeg rotations (not grayscale) now also apply to exif thumbs
-(there seems to be some extraneous stuff in the ifd1 of the exif, seems safe to delete)
-can reset orientation tag and auto-rotate by them
-rotating resets orientation tag
-better prefs window, can set slideshow defaults
-left- and right-click now go next/back
-dbl-click to end
-scroll wheel to navigate, but it conflicts with scroll wheel to scroll zoomed images
-+-= w/ cmd key held down can now zoom (= on numeric keypad only)
-hand cursor shows up for dragging zoomed images
-set bg color, transparency for slideshow
-fixed: jpeg files with non-EXIF APP1 tags would cause problems with selection/info display
-fixed: jpeg rotation during slideshow didn't update if "don't change modification date" was checked
-fixed: rotating and trashing in thumbs window will now cause slideshow to update too
-fixed crash when exiting slideshow with images waiting to be cached (also made currentIndex volatile)
-changed supported file types from imageFileTypes to imageUnfilteredFileTypes
- (seems to make no difference, 106 types both ways)
-'@' to auto-advance 1.5 secs (not official... try to have better interface in future)
-made columns resizable
-
-1.2.1
------
-show EXIF info during slideshow ('i' cycles; shift-i for more EXIF)
-fixed 2 4 6 8 to not scroll orthogonal to intended dir (uninitialized vars.)
-fixed incorrectly enabled menu items during slideshow
-fixed drawing glitch when hiding cheat sheet (non-integral coords)
-made vars volatile where necessary (i.e., when accessed from multiple threads)
-zoom sticks until quit (like rotations)
-show all at actual size
-fat(x86) binary - especially useful: TN2137
-opening a file starts slideshow immediately
-option to not change mod dates for lossless jpeg (grayscale/markers still does)
-fixed multiple monitor bug - dimensions but not lower left corner were used for mainScreen (the one with the key window)
-
-1.2
----
-lossless jpeg rotation and other transformations
-get info window: name, alias, size, progressive, jpeg comments, exif info
-- localizations from /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/
-multiple windows! (this was a cr@pload of work)
-save prefs on exit (i forgot to call synchronize)
-tried to make thumbnail loading faster, but can't seem to make significant
- improvements. Epeg is nice, tho i can't seem to get anywhere near the promised
- 25 thumbs/second, but I think that figure's just for small (<1MP) jpegs.
-fixed a problem when releasing a UKKQueue that only became apparent
- when closing multiple windows (up to 5-second hang)
-double-click on empty trailing whitespace or with cmd or shift no longer sends action
-German localization, thanks to Thomas Steg.
-removed help indexes--they were just taking up space, and it's a one-page doc anyway.
-cheat sheet rect now calculated to fit text exactly
-random slideshows
-categories
-auto vers check
-zoom in slideshow - if flush to edge, zoom in on edges
- otherwise zooming in zooms in on center
-faster image loading - use NSImage's setScalesWhenResized and setSize
-
-
-1.1
----
-info bar
-resize thumbnails
-change (single-)selection in matrix using arrow keys
-speed/memory optimizations in wrapping matrix
-- now reuses a single NSImageCell
-- setNeedsDisplayInRect redraws only what's needed (selections are faster)
-fixed view/thread bugs (setNeedsDisplay is not thread-safe)
-animated GIFs - ridiculously simple to implement.
-dir listing shows volumes at the top level
-dir listing updates on volume mounting, dir renaming/deletion
- (using kqueue - it's too much to refresh for any and every
- dir content change, i think)
-space now pause/continues auto-advance
-pressing 1-9 now starts auto-advance right away
-added scale up for small images
-
-While optimizing the drawing in the wrapping matrix,
-I discovered another Apple bug: needsToDrawRect: sometimes
-returns NO when it should return YES. Supposedly fixed in 10.4,
-and it's documented (TN2107), but it took me a while to figure out.
-
-
-1.0
----
-first release, day before Tiger (2005.04.28 Thursday).
-
-As of June 12, there've been about 800 downloads. ONE person
-has emailed me thanking me for the program. I guess that means
-no one's found anything wrong with it...
-
-The most annoying bugs are the ones in Apple's frameworks.
-(cuz you assume there aren't any...)
-NSBrowser seems to crash if you click on it too much (something
-about the horizontal scrolling animation). I've made a poser subclass
-to disable the animation.
\ No newline at end of file
diff --git a/README.md b/README.md
index f759de4..43c328c 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,39 @@
-Phoenix Slides
-==============
+# Phoenix Slides
-The master branch now compiles and runs only on OS X 10.9+/Xcode 5.1.
+Official web site:
-Commit 7d0cc7e (tag "v1.3.1i") should compile for 10.6+.
+Phoenix Slides aims to be the fastest way to browse and view the image files
+on your disk. Features include the following:
-Branch xcode326 will compile a universal binary with PPC support but requires Xcode 3.2.6.
+- Fast thumbnailing. Uses embedded EXIF (for jpeg and heic) or JPEG (for raw) previews when appropriate. Otherwise uses macOS's Image I/O framework to scale down images quickly.
+- Slideshows (full screen or in a window) with random, loop, and/or auto-advance options
+- Special support for sorting files by EXIF (creation) date
+- Support for animated GIF and WebP files
+- Support for viewing EXIF metadata
+
+And of course, it is open source! After a major code overhaul the source should be
+fairly readable now. It's not Swift (this app was started in 2005 when macOS was
+called OS X 10.3 and the system frameworks still had very basic bugs in them),
+but it's modern!
+
+Enjoy!
+
+## Localization
+
+If anyone wants to help translate to any currently supported or new languages,
+let me know. Lately I've been just plugging new strings into google translate
+and massaging those results. (I don't actually speak Italian!)
+
+## Compiling
+
+The master branch will generally require the latest version of Xcode.
+
+Commit 7d0cc7e should compile for 10.6+. https://github.com/gobbledegook/creevey/releases/tag/v1.3.1i
+
+Branch xcode326 will compile a universal binary with PPC support but requires Xcode 3.2.6. https://github.com/gobbledegook/creevey/tree/xcode326
+
+## Etymology
+
+`creevey` was the code name for Phoenix Slides when I first started developing it
+and code names were cool.
+Colin Creevey is the kid in Harry Potter who keeps taking pictures.
diff --git a/creevey.xcodeproj/project.pbxproj b/creevey.xcodeproj/project.pbxproj
index 04f574a..dbff3a4 100644
--- a/creevey.xcodeproj/project.pbxproj
+++ b/creevey.xcodeproj/project.pbxproj
@@ -747,13 +747,13 @@
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 26;
+ CURRENT_PROJECT_VERSION = 27;
DEVELOPMENT_TEAM = 9436CS8LQX;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LIBRARY_SEARCH_PATHS = "$(SRCROOT)/libjpeg";
- MARKETING_VERSION = 1.5.3;
+ MARKETING_VERSION = 1.5.4;
PRODUCT_BUNDLE_IDENTIFIER = net.blyt.phoenixslides;
PRODUCT_NAME = "Phoenix Slides";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -775,14 +775,14 @@
CODE_SIGN_ENTITLEMENTS = "Phoenix Slides.entitlements";
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 26;
+ CURRENT_PROJECT_VERSION = 27;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 9436CS8LQX;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LIBRARY_SEARCH_PATHS = "$(SRCROOT)/libjpeg";
- MARKETING_VERSION = 1.5.3;
+ MARKETING_VERSION = 1.5.4;
PRODUCT_BUNDLE_IDENTIFIER = net.blyt.phoenixslides;
PRODUCT_NAME = "Phoenix Slides";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/de.lproj/Phoenix Slides Help/index.html b/de.lproj/Phoenix Slides Help/index.html
index 348f19b..2046fc5 100755
--- a/de.lproj/Phoenix Slides Help/index.html
+++ b/de.lproj/Phoenix Slides Help/index.html
@@ -76,12 +76,7 @@
Fensterrand an.
Mittels des Schiebereglers unten rechts kann die Anzeigegröße der Vorschaubilder
- von/auf 40-160 Pixel in der Breite vergrößert/verkleinert werden (intern arbeitet
- das Programm generell mit 160 Pixeln Breite).
-
- Für diejenigen die es interessiert: Phoenix Slides benutzt die schnelle Epeg
- Bibliothek zur Erzeugung der Vorschaubilder. Vorschaubilder aller Nicht-JPGs
- werden langsamer erstellt.
+ von/auf 40-512 Pixel in der Breite vergrößert/verkleinert werden.
Bilderauswahl
@@ -302,11 +297,8 @@ Gruppen/Kategorien
dürcken Sie Taste F1 im Vollbildmodus, oder Apfel-F1 in der Vorschauanzeige.
Diese schnelle Ein-Tasten-Zuordnung ist dann nützlich, um eine Gruppe (markiert
unter F2) von Bildern anschließend 'auf einen Rutsch' zu drehen, und die
- 'F3 Gruppe' zu löschen o.ä.
-
- Diese Gruppenselektion ist nur temporär. Alle sog. 'Markierungen' gehen
- verloren, sobald Sie das Programm beenden. .
-
+ 'F3 Gruppe' zu löschen o.ä.
+
Die 'Phoenix Slides Story'
Eines Tages brachte Jim (der leitende Professor des Institus, bei dem ich
arbeite) einige Foto-CDs aus Thailand mit. Komm, laß uns die anschauen, sagte
@@ -333,11 +325,7 @@
Dank an David Chow und seine unheimliche Begabung, mein Programm zum Absturz
zu bringen.
- Ebenso gilt mein Dank allen, von deren Quellcode ich lernen und Ideen übernehmen
- konnte. Im Einzelnen: rasterman (Epeg), Allan Hsu (Magic Lantern) und Marc Liyanage
- (EpegWrapper).
-
- Ebenso mein Dank an Thomas Steg, Karlsruhe (Deutschland) für die deutsche Lokalisation
+
Ebenso mein Dank an Thomas Steg, Karlsruhe (Deutschland) für die deutsche Lokalisation
des Programms und der Text-Dokumentation.
Ebenso mein Dank an César Piñera für die spanische Lokalisation;
@@ -354,20 +342,12 @@
in Deine Muttersprache übersetzen will/kannst, bitte kontaktiere
mich.
-
Ebenso könnt Ihr für das kostenlose Programm einen kleinen, freiwilligen Beitrag
- leisten oder mir ein Buch zukommen lassen (Cocoa, perl, linguistics), oder eben
- Geld, Skateboarding stuff, whatsoever... :)
-
Kontakt / Lizenz
Offizielle Webseite: https://blyt.net/phxslides/
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
- Copyright 2005-2021 by Dominic Yu. This software is free and open source. You are
- free to use it for non-commercial purposes. Derivative works must give proper
- credit to me and be shared under the same license, unless I give written permission
- stating otherwise.
- Copyright 2005-2021 by Dominic Yu. Diese Software ist kostenlos und Open Source.
+
Copyright 2005-2024 by Dominic Yu. Diese Software ist kostenlos und Open Source.
Sie kann im Nicht-Kommerziellen Umfeld frei ge-/ und benutzt werden. Derivate
dieses Programm bedürfen der Erwähnung meiner Person in der Dokumentation und
dürfen nur unter derselben Lizenz vertrieben/verbreitet werden. Ausnahmen erforderen
diff --git a/en.lproj/Phoenix Slides Help/index.html b/en.lproj/Phoenix Slides Help/index.html
index 833f308..1e21816 100644
--- a/en.lproj/Phoenix Slides Help/index.html
+++ b/en.lproj/Phoenix Slides Help/index.html
@@ -36,17 +36,21 @@
Usage
or double-clicking an image's thumbnail.
+You can start a slideshow in a window (vs. full screen)
+by holding down option when starting the slideshow, or by
+choosing "Begin Slideshow in Window" from the Slideshow menu.
+
Using the directory listing
In addition to the usual clicking, you can also type in
directory names to jump directly to them.
The first column of the directory listing contains a list of
-mounted volumes. This list is updated automatically when disks
-are inserted or ejected. The list is also updated if the current
-folder is moved, renamed, or deleted. To refresh the listing
-for all other file system changes (new files, renaming of
-other folders, etc.), click on a folder name and its contents will
+mounted volumes. Currently only volumes mounted at /Volumes are shown.
+This list is updated automatically when disks are inserted or ejected.
+To refresh the listing for other file system changes (renaming of
+folders, etc.), click on a folder name and its contents will
be updated.
+Files in folders that you are viewing should be updated automatically.
Check "Subfolders" to have the program search all
@@ -66,6 +70,8 @@
Using the directory listing
type code (like 'PICT')). Phoenix Slides supports all image types
that Mac OS X supports (i.e., everything NSImage can read).
+You can completely collapse the folder browser by dragging the divider all the way up.
+
Thumbnails
After getting the list of filenames, the program starts generating
thumbnails of each of the images. Thumbnails are cached in memory
@@ -75,12 +81,8 @@
Thumbnails
about the currently
selected file(s) in the status bar at the bottom of the window.
-You can resize the thumbnails to display anywhere from 40 to 160
-pixels wide. (They're stored 160 pixels wide internally.)
-
-For those who care: Phoenix Slides uses the Epeg library for fast
-thumbnailing of JPEGs. Non-JPEG files, on the other hand,
-will be thumbnailed slowly. =P
+You can resize the thumbnails to display anywhere from 40 to the maximum thumbnail width
+that you choose in the Preferences. For fastest thumbnail generation, choose 160 pixels.
Selecting images
You can select images to start a slideshow with them,
@@ -98,9 +100,14 @@
Dragging images
Drag images to another program to open them with
that program, or to the Finder to copy the files.
+Moving files
+You can choose a folder to quickly move selected files to with the "Move To..." item in the File menu.
+Phoenix Slides will remember this folder and you can quickly move files to this folder again
+with a keyboard shortcut.
+
Reveal in Finder
-The "Reveal in Finder" menu item can be handy for file operations
-that are beyond the limits of drag and drop. If one or more files are selected,
+
The "Reveal in Finder" menu item can be handy for other file operations.
+If one or more files are selected,
Phoenix Slides tells the Finder to show those files. If you have "Subfolders"
checked and your files are from different directories, the specific behavior
will be up to the Finder. If no files are selected, the Phoenix Slides will
@@ -240,8 +247,7 @@
Groups/Categories
notable examples. However, you can usually work around this by
holding down either the control or option key when pressing F1-F12.
-Categories are temporary and will be lost when Phoenix Slides quits.
-You should think of this functionality as a sort of fancy selection mechanism.
+As of version 1.5.4, categories are saved across launches.
@@ -273,11 +279,6 @@ Acknowledgements
Laurent Bovet - French;
Silvano Dotti - Italian.
-Thanks to all those who make their source code available to
-learn from/adapt to other purposes, including rasterman (Epeg),
-Allan Hsu (Magic Lantern), and Marc Liyanage (EpegWrapper).
-
-
Thanks to Takeshi Gondo for an icon that's been better received than mine.
@@ -292,13 +293,6 @@ Help Wanted
Phoenix Slides to your language please
contact me.
-
-You can also contribute by offering
-programming help or making a donation along the lines of books
-(Cocoa, perl, linguistics), money, or skateboarding stuff.
-
-
-
Contact/License
Official web site:
https://blyt.net/phxslides/
@@ -307,7 +301,7 @@
Contact/License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
-Copyright 2005-2021 by Dominic Yu. This software is free and open source.
+Copyright 2005-2024 by Dominic Yu. This software is free and open source.
You are free to use it for non-commercial
purposes. Derivative works must give proper credit to me and be shared under
the same license, unless I give written permission stating otherwise.
diff --git a/es.lproj/Phoenix Slides Help/index.html b/es.lproj/Phoenix Slides Help/index.html
index c8daa0e..0cb6ef4 100644
--- a/es.lproj/Phoenix Slides Help/index.html
+++ b/es.lproj/Phoenix Slides Help/index.html
@@ -41,8 +41,9 @@ Miniaturas
Phoenix Slides despliega información básica (nombre, tamaño, dimensiones) acerca de los archivos actualmente seleccionados en la barra de estado en la parte inferior de las ventana.
-Es posible cambiar el tamaño de las miniaturas para desplegarlos entre 40 y 160 pixeles de ancho. (Internamente se almacenan 160 pixeles).
-Para los interesados: Phoenix Slides usa la bibliotega Epeg para crear miniatuuras de los JPEGs. Los archivos que no sean JPEG, por el contrario, serán miniaturizados lentamente. =P
+Es posible cambiar el tamaño de las miniaturas para desplegarlos entre 40 y 512 pixeles de ancho.
+
+
Seleccionar imágenes
Puede seleccionar imágenes para iniciar un pase de diapositivas con ellas, moverlas a la papelera, ubicarlas en el Finder, o establecer una imagen como fondo de escritorio. Para seleccionar una imagen, haga click en ella. Haga un shift-click para extender la selección; command-click para revertir la selección. También puede seleccionar imágenes arrastrando alrededor de ellas (en el espacio en blanco).
@@ -183,9 +184,6 @@ Grupos/Categorías
Evidentemente no podrá usar las teclas de función que el sistema u otras aplicaciones hayan reservado para otras cosas, siendo las telcas F9-F12 las tradicionales para Exposé y Dashboard dos de los ejemplos más notables. Sin embargo, casi siempre es posible encontrar una solución a esto al presionar ya sea la tecla de control o de option cuando se presione F1-F12.
-Las categorías son temporales y se perderán cuando se cierre Phoenix Slides. Debe pensar en esta funcionalidad como un mecanismo avanzado de selección.
-
-
La historia de Phoenix Slides
Un día, Jim (el profesor en cargo del proyecto de investigación en el que trabajo) trajo unos CDs con fotografías de Tailandia. Veamos estas fotografías, dijo. Buscamos algún programa adecuado en las Macs de la oficina, sin éxito. Terminamos por usar el modo de pantalla completa de Preview. Fue... doloroso. Ni siquiera pudimos rotar las imágenes en modo de pantalla completa. Por ello decidí escribir mi propio programa.
@@ -202,18 +200,11 @@ Agradecimientos
y a Silvano Dotti por la traducción italiana.
-Gracias a todos los que hacen su código fuente disponible para aprender o adaptar a otros propósitos, incluyendo rasterman (Epeg), Allan Hsu (Magic Lantern), y Marc Liyanage (EpegWrapper).
-
-
Y finalmente, gracias a mi antigüo jefe en mi trabajo sin futuro por "despedirme". Que Phoenix Slides sea una prueba de las ventajas del desempleo.
Se requiere ayuda
Se busca ayuda para las traducciones: Si desea traducir Phoenix Slides a su idioma sea tan amable de ponerse en contacto conmigo.
-
-También puede contribuir ofreciendo ayuda para la programación o realizando donativos de libros
-(Cocoa, perl, lingüística), dinero, or materiales de patinaje.
-
Historial de cambios
@@ -280,7 +271,7 @@ Contacto/Licencia
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
-Copyright 2005-2021 by Dominic Yu. Este software es gratis y de código abierto. Usted puede usarlo de forma gratuita para propósitos no comerciales. Los trabajos derivados deben dar crédito a mi y deben ser compartidos bajo la misma licencia, salvo que se obtenga permiso por escrito de mi que indique lo contrario.
+Copyright 2005-2024 by Dominic Yu. Este software es gratis y de código abierto. Usted puede usarlo de forma gratuita para propósitos no comerciales. Los trabajos derivados deben dar crédito a mi y deben ser compartidos bajo la misma licencia, salvo que se obtenga permiso por escrito de mi que indique lo contrario.
diff --git a/it.lproj/Phoenix Slides Help/index.html b/it.lproj/Phoenix Slides Help/index.html
index 5fd2c04..1a0ee71 100644
--- a/it.lproj/Phoenix Slides Help/index.html
+++ b/it.lproj/Phoenix Slides Help/index.html
@@ -58,11 +58,8 @@ Miniature
Formata la lista dei nomi dei file, il programma inizia a
disco) sul/i file selezionati
nella barra di stato in fondo alla finestra.
-Si possono ridimensionare a piacere le miniature per visualizzarle con una ampiezza da 40 a 160
-pixel. (Internamente vengono memorizzate con un'ampiezza di 160 pixel.)
-
-Per chi può essere interessato: Phoenix Slides usa la 'Epeg library' per ottenere veloci
-miniature dei JPEG. I file Non-JPEG, d'altro canto, verranno miniaturizzati lentamente.
+Si possono ridimensionare a piacere le miniature per visualizzarle con una ampiezza da 40 a 512
+pixel.
Selezione delle immagini
Si possono selezionare le immagini come inizio di una
presentazione, per spostarle nel cestino, per mostrarle nel Finder, o per utilizzarle come sfondo
@@ -193,9 +190,6 @@
Gruppi/Categorie
Exposé e Dashboard. Tuttavia, normalmente si può aggirare il problema tenendo premuto
contemporaneamente ai tasti F1-F12 il tasto control o alt (⌥).
-Le Categorie sono temporanee e andranno perse con l'uscita da Phoenix Slides. Si può
-pensare a questa funzionalità come ad una sorta di meccanismo di selezione alternativo.
-
Storia di Phoenix Slides
Un giorno, Jim (il professore in carica al
@@ -222,19 +216,12 @@
Ringraziamenti
Ringrazio David Chow e la sua incre
Tedesca; César Piñera per la localizzazione in lingua Spagnola; Laurent Bovet per la
localizzazione in lingua Francese e Silvano Dotti per la localizzazione in lingua Italiana.
-Ringrazio tutti coloro che mi hanno reso disponibile il loro codice sorgente per
-imparare/adattarlo ad altri scopi, includendo rasterman (Epeg), Allan Hsu (Magic Lantern), e Marc
-Liyanage (EpegWrapper).
-
Ed infine, ringrazio il mio vecchio capo nel mio lavoro senza speranza per avermi "licenziato".
Possa Phoenix Slides essere testimonianza dei vantaggi della disoccupazione.
Richiesta di Aiuto
Cerco aiuto per localizzazioni: se intendete tradurre Phoenix Slides
nella vostra lingua prego contattatemi.
- Potete anche contribuire offrendomi aiuto nella programmazione o facendo una donazione in libri
-(Cocoa, perl, linguistica), danaro, o materiale per skateboard.
-
Storia delle Versioni
@@ -446,7 +433,7 @@ Contatti/Licenza
Sito web ufficiale:
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
-
Copyright 2005-2021 by Dominic Yu. Questo software è gratuito e a codice aperto (open
+
Copyright 2005-2024 by Dominic Yu. Questo software è gratuito e a codice aperto (open
source). Può essere usato liberamente per scopi non commerciali. Eventuali opere derivate
devono rendermi appropriato merito ed essere distribuite con lo stesso tipo di licenza, a meno che
io non dia permesso scritto in altro senso.
diff --git a/version.html b/version.html
index 94acd71..6999102 100644
--- a/version.html
+++ b/version.html
@@ -7,12 +7,24 @@
Phoenix Slides Version History
+2024.01.18 1.5.4
+
+ - faster thumbnails
+ - better performance in slideshows, especially for zoomed-in images
+ - categories (the ones assigned with F2-F12 keys) now saved across launches
+ - experimental support for animated webp images
+ - add preference for the startup slideshow to appear in a window
+ - fix bug where some EXIF thumbnails were not recognized
+ - fix regression: corresponding thumbnail not selected after closing slideshow
+
+
2024.01.07 1.5.3
- add ability to start slideshow immediately at startup (set in Preferences)
- add option to start without a browser window (when starting up with slideshow)
- add menu item File -> Move to Folder
- allow collapsing file browser (drag the divider all the way to the top)
+ - choose whether not to start slideshow/auto-advance when opening files from the Finder
- fix auto-advance being on sometimes despite preference setting
- improved startup time; other optimizations and bug fixes
- fix drag and drop resulting in string vs. file in apps like InDesign
diff --git a/zh-Hant.lproj/Phoenix Slides Help/index.html b/zh-Hant.lproj/Phoenix Slides Help/index.html
index d09e78e..f597172 100644
--- a/zh-Hant.lproj/Phoenix Slides Help/index.html
+++ b/zh-Hant.lproj/Phoenix Slides Help/index.html
@@ -53,9 +53,6 @@ 縮覽圖
然後開始生成縮覽圖。縮覽圖將會緩存於記憶體,結束程式時便會被丟掉。
-Phoenix Slides用Epeg函數庫來快速地生成JPEG檔案的縮覽圖。
-製造非JPEG檔案的縮覽圖就比較慢了。
-
選擇影像
你可以用滑鼠選擇影像。如果剛好選了一個影像,你也可以用箭頭鍵選擇影像。
@@ -137,9 +134,6 @@ 影像群組/分類
這個功能很方便,你可以先選擇很多影像,然後一起把它們旋轉或執行其他動作。
-群組是暫時的,結束程式時就會被丟掉。
-
-
Phoenix Slides的故事
有一天,馬教授帶了幾張CD到辦公室,CD上有他在泰國拍的照片。
「我們來看這些照片吧」他說。我們便在辦公室的Mac裡找適合的幻燈秀程式,
@@ -164,10 +158,6 @@
謝意
Silvano Dotti - 意大利文翻譯。
-感謝open source軟體的開發者,包括 rasterman (Epeg)、
-Allan Hsu (Magic Lantern) 及 Marc Liyanage (EpegWrapper)。
-
-
最後也要感謝我的前任老板,他炒了我魷魚我才有空開發Phoenix Slides。
@@ -176,12 +166,6 @@ Help Wanted
Phoenix Slides to your language please
contact me.
-
-You can also contribute by offering
-programming help or making a donation along the lines of books
-(Cocoa, perl, linguistics), money, or skateboarding stuff.
-
-
聯絡方式/版權
官方網站:
https://blyt.net/phxslides/
@@ -193,7 +177,7 @@
聯絡方式/版權
此軟體是免費、開放的,可以為非商業性用途重製、散布或創作衍生作品。
惟需保留我的姓名標示、用相同的授權方式分享(除非您取得著作權人之許可)。
-Copyright 2005-2021 by Dominic Yu. This software is free and open source.
+Copyright 2005-2024 by Dominic Yu. This software is free and open source.
You are free to use it for non-commercial
purposes. Derivative works must give proper credit to me and be shared under
the same license, unless I give written permission stating otherwise.