From 69cbf9810d34cf9ed9f728c77bcb72f46a2605d0 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 11:48:26 -0600 Subject: [PATCH 01/74] Increase global input delay from 0.15 seconds to 0.2 seconds --- src/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.lua b/src/main.lua index d199258..a74ff75 100644 --- a/src/main.lua +++ b/src/main.lua @@ -18,7 +18,7 @@ local state = require("state") -- Input delay handling local lastInpuSeconds = 0 -local inputDelaySeconds = 0.15 +local inputDelaySeconds = 0.2 function state.canProcessInput() return lastInpuSeconds >= inputDelaySeconds From 9fd659af7a79b9ab9a0ec03bafc1be9221f07084 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 12:02:39 -0600 Subject: [PATCH 02/74] Improve cursor movement in HSV color picker Increase animation duration, add smooth easing, and reduce step sizes --- src/screen/color_picker/hsv.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/screen/color_picker/hsv.lua b/src/screen/color_picker/hsv.lua index 1de199d..bffcd67 100644 --- a/src/screen/color_picker/hsv.lua +++ b/src/screen/color_picker/hsv.lua @@ -23,7 +23,7 @@ local CURSOR = { TRIANGLE_HORIZONTAL_OFFSET = 12, TRIANGLE_SPACING = 1, CORNER_RADIUS = 4, - TWEEN_DURATION = 0.1, + TWEEN_DURATION = 0.25, } local CACHE_RESOLUTION_DIVIDER = 4 local HUE_UPDATE_THRESHOLD = 5 -- Only regenerate SV texture when hue changes by 5 degrees or more @@ -448,7 +448,7 @@ function colorpickerhsv.update(dt) if currentState.focusSquare then -- Handle SV square navigation - local step = 0.04 + local step = 0.03 local newSat, newVal = currentState.sat, currentState.val if virtualJoystick:isGamepadDown("dpleft") then @@ -476,11 +476,11 @@ function colorpickerhsv.update(dt) pickerState.tweens.svCursor = tween.new(CURSOR.TWEEN_DURATION, currentState.cursor, { svX = targetX, svY = targetY, - }, "linear") + }, "outQuad") end else -- Handle Hue slider navigation - local step = 8 + local step = 6 if virtualJoystick:isGamepadDown("dpup") or virtualJoystick:isGamepadDown("dpdown") then local newHue = currentState.hue if virtualJoystick:isGamepadDown("dpup") then @@ -509,7 +509,7 @@ function colorpickerhsv.update(dt) -- Create new tween for hue cursor pickerState.tweens.hueCursor = tween.new(CURSOR.TWEEN_DURATION, currentState.cursor, { hueY = baseY, - }, "linear") + }, "outQuad") moved = true end From bc03511adf765541dd69f1c0185eda7d634406e9 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 12:15:59 -0600 Subject: [PATCH 03/74] Fix: Update asset paths for hex picker icons Remove pcall wrappers --- src/screen/color_picker/hex.lua | 73 ++++++--------------------------- 1 file changed, 13 insertions(+), 60 deletions(-) diff --git a/src/screen/color_picker/hex.lua b/src/screen/color_picker/hex.lua index 5ad1e2a..33feaa8 100644 --- a/src/screen/color_picker/hex.lua +++ b/src/screen/color_picker/hex.lua @@ -54,7 +54,7 @@ local iconCache = {} -- Helper function to load an icon local function loadIcon(name) if not iconCache[name] then - local path = "assets/icons/lucide/png/" .. name + local path = "assets/icons/" .. name iconCache[name] = love.graphics.newImage(path) end return iconCache[name] @@ -173,11 +173,9 @@ function hex.load() -- Preload icons -- Lucide icons were generated using stroke width 3px, size 48px. - pcall(function() - loadIcon("delete.png") - loadIcon("trash.png") - loadIcon("check.png") - end) + loadIcon("delete.png") + loadIcon("trash.png") + loadIcon("check.png") end function hex.draw() @@ -303,64 +301,19 @@ function hex.draw() -- Special handling for icon buttons if buttonText == "BACKSPACE" then -- Backspace icon - local success, icon = pcall(loadIcon, "delete.png") - if success then - local scale = ICON_SIZE / icon:getWidth() - drawColoredIcon( - icon, - x + (width - ICON_SIZE) / 2, - y + (height - ICON_SIZE) / 2, - iconColor, - scale - ) - else - -- Fallback to text if icon fails to load - love.graphics.setColor(iconColor) - love.graphics.setFont(state.fonts.body) - local textWidth = state.fonts.body:getWidth("⌫") - local textHeight = state.fonts.body:getHeight() - love.graphics.print("⌫", x + (width - textWidth) / 2, y + (height - textHeight) / 2) - end + local icon = loadIcon("delete.png") + local scale = ICON_SIZE / icon:getWidth() + drawColoredIcon(icon, x + (width - ICON_SIZE) / 2, y + (height - ICON_SIZE) / 2, iconColor, scale) elseif buttonText == "CLEAR" then -- Trash icon - local success, icon = pcall(loadIcon, "trash.png") - if success then - local scale = ICON_SIZE / icon:getWidth() - drawColoredIcon( - icon, - x + (width - ICON_SIZE) / 2, - y + (height - ICON_SIZE) / 2, - iconColor, - scale - ) - else - -- Fallback to text if icon fails to load - love.graphics.setColor(iconColor) - love.graphics.setFont(state.fonts.body) - local textWidth = state.fonts.body:getWidth("🗑️") - local textHeight = state.fonts.body:getHeight() - love.graphics.print("🗑️", x + (width - textWidth) / 2, y + (height - textHeight) / 2) - end + local icon = loadIcon("trash.png") + local scale = ICON_SIZE / icon:getWidth() + drawColoredIcon(icon, x + (width - ICON_SIZE) / 2, y + (height - ICON_SIZE) / 2, iconColor, scale) elseif buttonText == "CONFIRM" then -- Check icon (confirm) - local success, icon = pcall(loadIcon, "check.png") - if success then - local scale = ICON_SIZE / icon:getWidth() - drawColoredIcon( - icon, - x + (width - ICON_SIZE) / 2, - y + (height - ICON_SIZE) / 2, - iconColor, - scale - ) - else - -- Fallback to text if icon fails to load - love.graphics.setColor(iconColor) - love.graphics.setFont(state.fonts.body) - local textWidth = state.fonts.body:getWidth("✅") - local textHeight = state.fonts.body:getHeight() - love.graphics.print("✅", x + (width - textWidth) / 2, y + (height - textHeight) / 2) - end + local icon = loadIcon("check.png") + local scale = ICON_SIZE / icon:getWidth() + drawColoredIcon(icon, x + (width - ICON_SIZE) / 2, y + (height - ICON_SIZE) / 2, iconColor, scale) else -- Regular text button love.graphics.setColor(iconColor) From 2c7509660eb79bf3c5782994281d480611127edd Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 12:25:23 -0600 Subject: [PATCH 04/74] Add splash animation settings documentation to splash.lua --- src/splash.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/splash.lua b/src/splash.lua index 33258f4..8678b29 100644 --- a/src/splash.lua +++ b/src/splash.lua @@ -17,11 +17,11 @@ function splash.new(init) -- Animation settings self.title = require("state").applicationName - self.typingDelay = 0.05 - self.cursorBlinkRate = 0.3 - self.cursorChar = "_" - self.holdDuration = 1.3 - self.fadeOutDuration = 0.2 + self.typingDelay = 0.05 -- Delay between revealing each character + self.cursorBlinkRate = 0.3 -- How fast the cursor blinks + self.cursorChar = "_" -- Character used to represent the cursor + self.holdDuration = 1.3 -- Duration to display the complete text before fading out + self.fadeOutDuration = 0.2 -- Duration of the fade out animation -- Initialize animation state self.currentIndex = 0 -- How many letters have been revealed @@ -32,6 +32,7 @@ function splash.new(init) self.holdTimer = 0 -- Timer for hold phase self.fadeTimer = 0 -- Timer for fade phase + -- Dimensions for positioning self.textWidth = self.font:getWidth(self.title) self.cursorWidth = self.font:getWidth(self.cursorChar) self.textHeight = self.font:getHeight() @@ -41,7 +42,7 @@ function splash.new(init) self.centerX = screenWidth / 2 - self.textWidth / 2 self.centerY = screenHeight / 2 - self.textHeight / 2 - -- State machine + -- State machine: controls the animation phase (waiting, typing, holding, fading, done) self.state = "waiting" -- Background settings From 8756861d6712bab1c9d69ea2ec2d538c94f902b0 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:36:48 -0600 Subject: [PATCH 05/74] =?UTF-8?q?Add=20L=C3=96VE=20license?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/LICENSE.txt | 1368 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1368 insertions(+) create mode 100644 bin/LICENSE.txt diff --git a/bin/LICENSE.txt b/bin/LICENSE.txt new file mode 100644 index 0000000..ae037b1 --- /dev/null +++ b/bin/LICENSE.txt @@ -0,0 +1,1368 @@ +Licensing information +===================== + +This distribution contains code from the following projects (full license text below): + + - LOVE + Website: https://love2d.org/ + License: zlib + Copyright (c) 2006-2024 LOVE Development Team + + - ENet + Website: http://enet.bespin.org/index.html + License: MIT/Expat + Copyright (c) 2002-2016 Lee Salzman + + - FreeType + Website: https://freetype.org/ + License: FreeType License + Copyright (c) 2006-2017 David Turner, Robert Wilhelm, and Werner Lemberg. + + - GLAD + Website: http://glad.dav1d.de/ + License: MIT/Expat + Copyright (c) 2013 David Herberth, modified by Sasha Szpakowski + + - glslang + Website: https://github.com/KhronosGroup/glslang + License: 3-Clause BSD + Copyright (C) 2002-2005 3Dlabs Inc. Ltd. + Copyright (C) 2013-2016 LunarG, Inc. + +- SPIRV-Cross + Website: https://github.com/KhronosGroup/SPIRV-Cross + License: Apache 2.0 or MIT/Expat + Copyright 2015-2021 Arm Limited + Copyright 2016-2021 The Brenwill Workshop Ltd. + + - Kepler Project's lua-compat-5.3 + Website: https://github.com/keplerproject/lua-compat-5.3 + License: MIT/Expat + Copyright (c) 2015 Kepler Project. + + - lua-enet + Website: http://leafo.net/lua-enet/ + License: MIT/Expat + Copyright (C) 2011 by Leaf Corcoran + + - LuaJIT + Website: http://luajit.org/ + License: MIT/Expat + LuaJIT is Copyright (c) 2005-2016 Mike Pall + + - Lua's UTF-8 module + Website: https://www.lua.org/ + License: MIT/Expat + Copyright (C) 1994-2015 Lua.org, PUC-Rio, 2015 LOVE Development Team. + + - LuaSocket + Website: http://w3.impa.br/~diego/software/luasocket/home.html + License: MIT/Expat + Copyright (C) 2004-2013 Diego Nehab + + - LZ4 + Website: https://lz4.github.io/lz4/ + License: 2-Clause BSD + Copyright (C) 2011-2015, Yann Collet. + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c + + - LodePNG + Website: https://lodev.org/lodepng/ + Source download: https://github.com/lvandeve/lodepng + License: zlib + Copyright (c) 2005-2020 Lode Vandevenne + + - TinyEXR + Website: https://github.com/syoyo/tinyexr + License: 3-Clause BSD + Copyright (c) 2014 - 2016, Syoyo Fujita + + - UTF8-CPP + Website: https://github.com/nemtrif/utfcpp + License: Unknown, MIT/Expat-like (listed as UTF8-CPP) + Copyright 2006 Nemanja Trifunovic + + - xxHash + Website: https://cyan4973.github.io/xxHash/ + License: 2-Clause BSD + Copyright (C) 2012-2016, Yann Collet. + You can contact the author at : + - xxHash source repository : https://github.com/Cyan4973/xxHash + + - dr_flac + Website: https://github.com/mackron/dr_libs + Source download: https://github.com/mackron/dr_libs/blob/15f37e3/dr_flac.h + License: MIT/Expat + Copyright 2018 David Reid + + - dr_mp3 + Website: https://mackron.github.io/dr_libs/ + Source download: https://github.com/mackron/dr_libs/blob/dd762b8/dr_mp3.h + License: MIT/Expat + Copyright 2018 David Reid + + - stb_image + Website: https://github.com/nothings/stb + Source download: https://github.com/nothings/stb/blob/e140649ccf40818781b7e408f6228a486f6d254b/stb_image.h + License: MIT/Expat + Copyright (c) 2017 Sean Barrett + + - OpenAL Soft + Website: https://openal-soft.org/ + Source download: https://openal-soft.org/#download + License: Mixed, licensing information obtained from the debian project + - Alc/backends/opensl.c + License: Apache 2.0 + Copyright 2011 The Android Open Source Project + - examples/alhrtf.c examples/allatency.c examples/alloopback.c examples/alreverb.c examples/alstream.c examples/altonegen.c examples/common/alhelpers.c examples/common/sdl_sound.c utils/openal-info.c + License: MIT/Expat + Copyright © 2010, 2015 Chris Robinson + - examples/alffplay.c + License: unclear, presumed LGPL 2.1 or higher + Copyright © 2003 Fabrice Bellard + Copyright © Martin Bohme + - Alc/bs2b.c OpenAL32/Include/bs2b.h + License: MIT/Expat + Copyright 2005 by Boris Mikhaylov + - cmake/FindALSA.cmake cmake/FindFFmpeg.cmake cmake/FindJACK.cmake cmake/FindSDL2.cmake + License: 3-Clause BSD + Copyright © 2006 Matthias Kretz + Copyright © 2008 Alexander Neundorf + Copyright © 2003-2011 Kitware, Inc. + Copyright © 2009-2011 Philip Lowman + Copyright © 2011 Michael Jansen + Copyright © 2012 Benjamin Eikel + - utils/makehrtf.c (not included in distribution) + License: GPL 2 or higher (2 listed below) + Copyright 2011-2014 Christopher Fitzgerald + - Everything else: + License: LGPL 2.0 or higher (2.1 listed below) + Copyright © 1999-2014 the OpenAL team + Copyright © 2008-2015 Christopher Fitzgerald + Copyright © 2009-2015 Chris Robinson + Copyright © 2013 Anis A. Hireche + Copyright © 2013 Nasca Octavian Paul + Copyright © 2013 Mike Gorchak + Copyright © 2014 Timothy Arceri + + - Vulkan Memory Allocator + Website: https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator + License: MIT/Expat + Copyright (c) 2017-2022 Advanced Micro Devices, Inc. + + - volk + Website: https://github.com/zeux/volk + License: MIT/Expat + Copyright (c) 2018-2022 Arseny Kapoulkine + + - Vulkan-Headers + Website: https://github.com/KhronosGroup/Vulkan-Headers + License: Apache 2.0 + Copyright (c) 2022 Khronos Group + +License text +============ + +zlib license + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + +MIT/Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +FreeType License + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + Introduction + ============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + + Legal Terms + =========== + + 0. Definitions + -------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + + 1. No Warranty + -------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + + 2. Redistribution + ----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + + 3. Advertising + -------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + + 4. Contacts + ----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + +3-Clause BSD + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + Neither the name of 3Dlabs Inc. Ltd. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +2-Clause BSD + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +UTF8-CPP + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +LGPL 2.1 + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + Licenses are intended to guarantee your freedom to share and change + free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some + specially designated software packages--typically libraries--of the + Free Software Foundation and other authors who decide to use it. You + can use it too, but we suggest you first think carefully about whether + this license or the ordinary General Public License is the better + strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, + 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 and use pieces of + it in new free programs; and that you are informed that you can do + these things. + + To protect your rights, we need to make restrictions that forbid + distributors to deny you these rights or to ask you to surrender these + rights. These restrictions translate to certain responsibilities for + you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis + or for a fee, you must give the recipients all the rights that we gave + you. You must make sure that they, too, receive or can get the source + code. If you link other code with the library, you must provide + complete object files to the recipients, so that they can relink them + with the library after making changes to the library and recompiling + it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the + library, and (2) we offer you this license, which gives you legal + permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that + there is no warranty for the free library. Also, if the library is + modified by someone else and passed on, the recipients should know + that what they have is not the original version, so that the original + author's reputation will not be affected by problems that might be + introduced by others. + + Finally, software patents pose a constant threat to the existence of + any free program. We wish to make sure that a company cannot + effectively restrict the users of a free program by obtaining a + restrictive license from a patent holder. Therefore, we insist that + any patent license obtained for a version of the library must be + consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the + ordinary GNU General Public License. This license, the GNU Lesser + General Public License, applies to certain designated libraries, and + is quite different from the ordinary General Public License. We use + this license for certain libraries in order to permit linking those + libraries into non-free programs. + + When a program is linked with a library, whether statically or using + a shared library, the combination of the two is legally speaking a + combined work, a derivative of the original library. The ordinary + General Public License therefore permits such linking only if the + entire combination fits its criteria of freedom. The Lesser General + Public License permits more lax criteria for linking other code with + the library. + + We call this license the "Lesser" General Public License because it + does Less to protect the user's freedom than the ordinary General + Public License. It also provides other free software developers Less + of an advantage over competing non-free programs. These disadvantages + are the reason we use the ordinary General Public License for many + libraries. However, the Lesser license provides advantages in certain + special circumstances. + + For example, on rare occasions, there may be a special need to + encourage the widest possible use of a certain library, so that it becomes + a de-facto standard. To achieve this, non-free programs must be + allowed to use the library. A more frequent case is that a free + library does the same job as widely used non-free libraries. In this + case, there is little to gain by limiting the free library to free + software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free + programs enables a greater number of people to use a large body of + free software. For example, permission to use the GNU C Library in + non-free programs enables many more people to use the whole GNU + operating system, as well as its variant, the GNU/Linux operating + system. + + Although the Lesser General Public License is Less protective of the + users' freedom, it does ensure that the user of a program that is + linked with the Library has the freedom and the wherewithal to run + that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and + modification follow. Pay close attention to the difference between a + "work based on the library" and a "work that uses the library". The + former contains code derived from the library, whereas the latter must + be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other + program which contains a notice placed by the copyright holder or + other authorized party saying it may be distributed under the terms of + this Lesser General Public License (also called "this License"). + Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on the + Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or translated + straightforwardly into another language. (Hereinafter, translation is + included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running a program using the Library is not restricted, and output from + such a program is covered only if its contents constitute a work based + on the Library (independent of the use of the Library in a tool for + writing it). Whether that is true depends on what the Library does + and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's + complete 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 distribute a copy of this License along with the + Library. + + 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 Library or any portion + of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, + 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 Library, 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 Library. + + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so + that they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in + these notices. + + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of + the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable form + under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being compiled or + linked with it, is called a "work that uses the Library". Such a + work, in isolation, is not a derivative work of the Library, and + therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because it + contains portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. + Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is not. + Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the object + file is unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section 6. + Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work + during execution displays copyright notices, you must include the + copyright notice for the Library among them, as well as a reference + directing the user to the copy of this License. Also, you must do one + of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special exception, + the materials to be 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. + + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you cannot + use both them and the Library together in an executable that you + distribute. + + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other library + facilities not covered by this License, and distribute such a combined + library, provided that the separate distribution of the work based on + the Library and of the other library facilities is otherwise + permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute + the Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Library (or any work based on the + Library), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + 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 with + this License. + + 11. 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 Library at all. For example, if a patent + license would not permit royalty-free redistribution of the Library 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 Library. + + 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. + + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new + versions of the Lesser 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 Library + 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 Library does not specify a + license version number, you may choose any version ever published by + the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + 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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR + OTHER PARTIES PROVIDE THE LIBRARY "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 + LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME + THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 + LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest + possible use to the public, we recommend making it free software that + everyone can redistribute and change. You can do so by permitting + redistribution under these terms (or, alternatively, under the terms of the + ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; 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. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the library, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + + That's all there is to it! + +GPL 2 + 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. + + + Copyright (C) + + 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. + + , 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. + +Apache 2.0 + Apache License + + Version 2.0, January 2004 + + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work + + To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file From 7e75e07a972c881d692651a7f928f6e83b02d324 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:37:02 -0600 Subject: [PATCH 06/74] Update license descriptions in README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8226b14..c02bff9 100644 --- a/README.md +++ b/README.md @@ -53,19 +53,19 @@ Want to improve **Aesthetic**? - To contribute directly, fork the repo and [submit a pull request](https://github.com/joneavila/aesthetic/compare). - Check out the wiki for the development guide. -## 🌟 Credits +## ⭐ Credits - [**Cascadia Code**](https://github.com/microsoft/cascadia-code/) • Font • [OFL-1.1](src/assets/fonts/cascadia_code/LICENSE) - [**Catppuccin Palettes**](https://github.com/catppuccin/palette) • Color palette • [MIT](https://github.com/catppuccin/palette/blob/main/LICENSE) - [**Input Prompts**](https://kenney.nl/assets/input-prompts) • Icons • [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/) - [**Inter**](https://github.com/rsms/inter) • Font • [OFL-1.1](src/assets/fonts/inter/OFL.txt) -- [**LÖVE**](https://github.com/love2d/love) • Game framework (included pre-compiled binary) • [ZLIB](https://github.com/love2d/love/blob/main/license.txt) +- [**LÖVE**](https://github.com/love2d/love) • Game framework • [ZLIB](bin/LICENSE.txt) - [**Lucide Icons**](https://github.com/lucide-icons/lucide) • Icons • [ISC](https://github.com/lucide-icons/lucide/blob/main/LICENSE) - [**Material Icons**](https://github.com/google/material-design-icons) • Icons • [Apache 2.0](https://github.com/google/material-design-icons/blob/master/LICENSE) -- [**MinUI**](https://github.com/shauninman/MinUI) • Inspiration (design) +- [**MinUI**](https://github.com/shauninman/MinUI) • Inspiration (design) • No license provided - [**MinUIfied Theme Generator**](https://github.com/hmcneill46/muOS-MinUIfied-Theme-Generator) • Inspiration (application), reference for default theme • [MIT](https://github.com/hmcneill46/muOS-MinUIfied-Theme-Generator/blob/master/LICENSE) - [**Nunito**](https://github.com/googlefonts/nunito) • Font • [OFL-1.1](src/assets/fonts/nunito/OFL.txt) -- [**tween.lua**](https://github.com/kikito/tween.lua) • Tweening library (included source code) • [MIT](https://github.com/kikito/tween.lua/blob/master/LICENSE.txt) +- [**tween.lua**](https://github.com/kikito/tween.lua) • Tweening library • [MIT](https://github.com/kikito/tween.lua/blob/master/LICENSE.txt) ## ❤️ More open-source muOS applications From 60b49d9f8e53e3c66fade3611be493755c6a6166 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:24:23 -0600 Subject: [PATCH 07/74] Fix: Warning "line is too long" in menu.lua --- src/screen/menu.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screen/menu.lua b/src/screen/menu.lua index 2fb4902..3308c35 100644 --- a/src/screen/menu.lua +++ b/src/screen/menu.lua @@ -20,7 +20,7 @@ local popupState = "none" -- none, created, manual, automatic -- IO operation states local waitingState = "none" -- none, create_theme, install_theme local waitingThemePath = nil --- Using a state system ensures IO operations happen in the next update loop, preventing UI freezes during file operations +-- Using a state system ensures IO operations happen in the next update loop, preventing UI freezes during operations function menu.load() constants.BUTTON.WIDTH = state.screenWidth - (constants.BUTTON.PADDING * 2) From 4d74d2e367cc8247e8ef7f15ff37981a127b2165 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:25:23 -0600 Subject: [PATCH 08/74] Fix: Warning "unused variable" in font.lua --- src/controls.lua | 2 +- src/screen/font.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controls.lua b/src/controls.lua index c49e482..b6d28a1 100644 --- a/src/controls.lua +++ b/src/controls.lua @@ -125,7 +125,7 @@ function controls.draw(controls_list) if type(control.icon) == "table" then -- Calculate width for multiple icons local iconsWidth = ICON_SIZE * #control.icon - for i = 1, #control.icon - 1 do + for _ = 1, #control.icon - 1 do iconsWidth = iconsWidth + state.fonts.caption:getWidth("/") + ICON_TEXT_SPACING * 2 end x = startX + iconsWidth + ICON_TEXT_SPACING + textWidth + PADDING diff --git a/src/screen/font.lua b/src/screen/font.lua index c7091df..e4166f9 100644 --- a/src/screen/font.lua +++ b/src/screen/font.lua @@ -28,7 +28,7 @@ local fontItems = {} -- Initialize font items based on constants.FONTS local function initFontItems() fontItems = {} - for i, font in ipairs(constants.FONTS) do + for _, font in ipairs(constants.FONTS) do table.insert(fontItems, { name = font.name, selected = font.name == state.selectedFont, @@ -131,7 +131,7 @@ function font.draw() }) end -function font.update(dt) +function font.update(_dt) if not state.canProcessInput() then return end From 05d1cd6f5564a169a2fce38ec91d894d00e2ff78 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:35:45 -0600 Subject: [PATCH 09/74] Add Retro Pixel as a theme font option --- README.md | 1 + src/assets/fonts/retro_pixel/LICENSE | 94 ++++++++++++++++++ .../fonts/retro_pixel/retro-pixel-thick.ttf | Bin 0 -> 10556 bytes src/main.lua | 4 + src/screen/font.lua | 4 + src/screen/menu/constants.lua | 5 + src/screen/menu/theme_creator.lua | 1 + src/screen/menu/ui.lua | 2 + src/template/font/retro_pixel.bin | Bin 0 -> 7908 bytes 9 files changed, 111 insertions(+) create mode 100644 src/assets/fonts/retro_pixel/LICENSE create mode 100644 src/assets/fonts/retro_pixel/retro-pixel-thick.ttf create mode 100644 src/template/font/retro_pixel.bin diff --git a/README.md b/README.md index c02bff9..59657b1 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Want to improve **Aesthetic**? - [**MinUI**](https://github.com/shauninman/MinUI) • Inspiration (design) • No license provided - [**MinUIfied Theme Generator**](https://github.com/hmcneill46/muOS-MinUIfied-Theme-Generator) • Inspiration (application), reference for default theme • [MIT](https://github.com/hmcneill46/muOS-MinUIfied-Theme-Generator/blob/master/LICENSE) - [**Nunito**](https://github.com/googlefonts/nunito) • Font • [OFL-1.1](src/assets/fonts/nunito/OFL.txt) +- [**Retro Pixel Font**](https://github.com/TakWolf/retro-pixel-font) • Font • [OFL-1.1](src/assets/fonts/retro_pixel/LICENSE) - [**tween.lua**](https://github.com/kikito/tween.lua) • Tweening library • [MIT](https://github.com/kikito/tween.lua/blob/master/LICENSE.txt) ## ❤️ More open-source muOS applications diff --git a/src/assets/fonts/retro_pixel/LICENSE b/src/assets/fonts/retro_pixel/LICENSE new file mode 100644 index 0000000..04879f0 --- /dev/null +++ b/src/assets/fonts/retro_pixel/LICENSE @@ -0,0 +1,94 @@ +Copyright (c) 2023, TakWolf (), +with Reserved Font Name 'Retro Pixel'. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: + + +----------------------------------------------------------- + +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/assets/fonts/retro_pixel/retro-pixel-thick.ttf b/src/assets/fonts/retro_pixel/retro-pixel-thick.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6eb2e1d7cae9509e440fec2663ee82615256a034 GIT binary patch literal 10556 zcma)CYiu0Xb-rh2m(P_PhT24qZC#XT3-m{rAO(yd{m~ze1++!&Ac=v5X@UZUH%NXZMEj#g!9IYpZGNRpgWA-x z-*@hrPU*e#^O3)4BaWnXOJ$4$XW$!o45hD9xgy`!m5in4iM+y|b4a z*B-vN>or_o$MMbi+Vs?mPtE)db$8X3aPKg#qlKx<)&4*I{yyjKUUjY` zQ?D&G9(etm&p9^$yj1-P(uLb=FXTf_zzie zX-CU{;pbH%Cq573gUcv--0P5jS2p9@!K!*H@|r=u3szkvjP!759dy+eb1K249q=B; zIqgfdIzBm<^KWx-UObm_;)A-}ZhW#2^V(xLPv@A9$#Hs~?2lzzALdpJmv+TAwq++} z#rN4q{8$I=Phyy@su#|a^I|{7a*1y~pug4ccC9{-&rL`5HTy8uABOAvCqTof@53)y zx(__5quuX5gq|+$DWR2$EP};?|8N2jgGaBpLKq$bEtEo^ZCvzoqyQ* zTIbuHKkEER*WRw-t}|V;UBBP;TGv;*{-Nu?y1Tj$bl>0oRQK<6|55kr-QVqA>;7ra zzMhjk&-J|0^QE3Qdj7uWpL^cx-P3zt@2TE%y;pj_)cdvGcY5FLZDpd&!uelYaJ*4@4J=swfFu6<0@nbc-iajaISx#FJH`O^L+z-1KE6b zpjoN#U$YrZ%3!6^T5GLUP<${eSPdpIOQrW?yx_n<8EiJgjnv zPga6SR7X^-KDZaDfKbv>+~Ium=U^dYtsX$;X>Rm82kZ6ASTU#Q3zh7DWRPD{gkP1^ z&X-Q`&cXhH5P91_0B&1!sUOm$seyzmV3DlcxE@U27_Vr6H3}vNK7b!{MMR+pU%*K> zu6su`ajw?cNO)h!9*$EEF|V@7ANmk8R}k2yh5%GuAr^hf5VY!0i1ejH+8Gad$W3Ss z+x2&sZ0010sP&>PmtshL6$*DG>POmr6vC;IuOOxsHS5#5q3NTVV0JJGNi0T`bmMwL zEBG{_Rj!Zq!B+^cO)C?uwlXY4stefytCDpLdi2AfWJKUIl|pOcs34}0LZ&eNn0GWQ zp$V$3_cy`|yTA?eF&PaL@QZp?hdeB#H&p`o7CL+~$YtRYPmFfzXY)`4;G3$6Pa4$& z4q@s;M}~@YyV)**8D5~qY=?21u{?@Kv_0!o9Ic|em`|{15IX=}6IduPxaMa%xV85h6UewNB3)f>y6xg>*dsH#6Jz@xOYL2u9Y8YAJ17sq%FkX<>3^{*; z$yQx9Z;Ugwwf=`2aqRu-iu#Z7a7;Y9X+v9e9lB#lHm)DLEP*|~p0#a3ppw@3bpedw z6AZM=0g7?JFTB7g&?Z?S9&}ytw!|xLyMm)SL#}2ZcPyayZaY}*tsuahM2%&52AjyC z9ZR?$)5@;d#GOPtqd-0ChTQdR$85$1iRtT@5*i)g$_9AmWil7ArqiZuPFJLGV{4u3 zBtFJ*LuAgg=79&KIk1SWMVHC%q5R6ewO_e~Xd}Y$`l7ott_NIORYp<{B!N&WM}K8g zHn;Zkx|KmRDdo1AVTCm2m)6S79fqmxiJ4lz$VOO#SdyPqm1Tu{D5fF&qj{B>)wio! zph6TiUj5AVKA+K8LQo?rx-mo|Q1M_Dt2S7X)EhbF>$TZ#Nhw;ZF&*UKOfZBiK8Z!$ zFi9&HdANIpZdZHg#5CApkJX5Fj>aXQt;y4f;5mc5=4{k&Z#)X^F3bc&J@@G+&1dBP z^42;in$Xb4SeZgksilZ{mirOxUi^n`xWNqxKXesBd=u-mh_<=n8Bc~o4ww2Q>)^Fu za%;Z|qg<4tghqJcz+R70!I z*3BJW0ri8gkbnjzrzfjHjA~ijr>I_AY`(apV)`! zTF*?%!Gkb{j^xuoTt&kOK19@zpZ*Jmk)M47Dwq`p{}^+)o=-Et*?9uOTwvJl1GD_z z12b)Gf*YZ}4?>YnKIvGLG$uYox)}jGII|t$n2owJwsQbU?vcnwJlMdQK6h@NhgGD_ z3aw8uBe+FXLKq_^VG$UiYXaCuE^2{=pJ6$xr14d`7iXEWPWc+IbT_WU9MnNlU&|um zqv@T9jy|ygfh=N#7+bQPQNqKpZsWKMW{%k^YyMVi{CbC+R3|FXW?~#FH`#({;x{hZ zTCeyPPWgfcOz@I%XbF-nXUo)QyM@rJ8a$FfJ;Ry00%f5gh?S2N}-D+M^g=RkUB7QZh3?<>TDzG|piQSp!^|uwA7Ar@gN-+7}kMS0Z%tXY(W$Ggc zDc!0;#yQw)?}zAB|KSX7=CHakBJ?6xQAox_M8_%*R3{Ozi+lepTUb`9ynmLyqj&xL zGd}NAAK>UZgh(=jL+*a~yxe}B0oj@ZXrTrCsC=i@Of<%wp3}@zi{L+O9kHYJ8Kj)C zO3WCkiF}r)me#a)5ZVX7WA|X5@oywyE3}1)AzQx5sdMw?*EKRjZGh4C&J>lEHVi1P zB4L}d0X#<3M(Mjo$c4n@yGHPt#^BF-9I5XWsKXw5oHF??G^cX0-r^k6>0depIgKCU z`158$Mq1yiYSe)EV8FnoO`J|6kLW~Rm=2VKFyAKTU@kHV9AwNnL*q?Y#ys^V&L|73 z4cA||2^>=fqbd#bgYPkCbPK~R27otFlKi#`0{z}3F|!|}r`?K*-Kf_TI4Bi(w!*JM zf2!<9b|^e;{RJajqNu>O?$i2E};PrDxXmv-KP{;%747b5a~ zJMT`M_qco953Rq~-RrEXyNv6X{no$7O~@zge6PDpuEH~t0%P3Y$`|Zh+&#frI}cn} zuxRI@8w);b=PBpkuyJnM?F+c$+f}E!dPa;-536y z_3v@7=`NNs_qtN*)kkXemlx+Q&NiaM(?_DwkId+u_)(Md~}GH-_{^!p?Y1q6?}nd2`R#W*S$g7ON3D=I5rX3rldsOAD3i zB0#Ir`9~+BC+pP(KX}3q7>u5-E-ua07NTRr$J#2?FpSV9Ww^F@5r4C+;jg7HyG1wW zF1lH8IC6*Gv^#=!)Q#ZCyFr{^a8vG*dj_ND-HeXm*aqeSh^sbY7&2<^ zGURafRY-3@dgRWzDrQuHcLl!{^qj`H1>B9?6OeEjy%GL8#c>Ucs^RJ^W?#egJkBpb z${b{0!kFO?FltQosU$`YCFBhy7| zPr~kb^X=G$S7Y%*GlnB)CBl$bFDX+9dmxO=;J zez2(fC@n#oo#>v2=%60tqE0Y3Yzo z>5^{gkzUEj9@#5*$cLm)J}mvRPqOk6`KaudJMn)6?vev?xBQBHTq4QIJu)Eo%0amg z|99Z99Fbp@Phc?{l3_V2BXUeeB`*ajN=eFcT<(_#=H$2KlFZ9xS&&-iOAB)&BcmhM9+Py04+_<6(68-CvK^M;={{Ji1k4L@)AdBe{ee%|o&hMzb5yy52!zhL+U z!!H_(j7n8h+96i-un`{G#C( z4ZmpkMZ+%|e$nuYhF>)NqTv?}zhw9&!!H?r$?!{tUo!lX;g<}*WcVe+FByKx@JohY zGW?R^mkhsb_+`T{8-CgF%Z6Vz{IcPf4Zm#oWy3EUe%bKLhF>=Pvf-aJyptwx%&y1c zYm+}_dXC%mX>CVGjwvo$#YL+)XccF4#K#}4^%usuvkNz{b8;OgSaJOCuG%B)M#C2k($8&XPHR!?cBwa6JLJlH_?0hvA?)CeT~myyN`GVQFgu@v-9<1c#ShY Q%i;h2Kp&j7zbmrx|LJa8-v9sr literal 0 HcmV?d00001 diff --git a/src/main.lua b/src/main.lua index a74ff75..7efeb18 100644 --- a/src/main.lua +++ b/src/main.lua @@ -62,6 +62,9 @@ local function setupFonts() local fontSizeNunito = 24 * (state.screenHeight / maxScreenHeight) local fontNunito = love.graphics.newFont("assets/fonts/nunito/Nunito-Bold.ttf", fontSizeNunito) + local fontSizeRetroPixel = 24 * (state.screenHeight / maxScreenHeight) + local fontRetroPixel = love.graphics.newFont("assets/fonts/retro_pixel/retro-pixel-thick.ttf", fontSizeRetroPixel) + -- Store fonts in a table for easy access state.fonts = { header = fontHeader, @@ -70,6 +73,7 @@ local function setupFonts() monoTitle = fontMonoTitle, monoBody = fontMonoBody, nunito = fontNunito, + retroPixel = fontRetroPixel, } end diff --git a/src/screen/font.lua b/src/screen/font.lua index e4166f9..b3ad144 100644 --- a/src/screen/font.lua +++ b/src/screen/font.lua @@ -65,6 +65,8 @@ function font.draw() love.graphics.setFont(state.fonts.body) elseif item.name == "Cascadia Code" then love.graphics.setFont(state.fonts.monoBody) + elseif item.name == "Retro Pixel" then + love.graphics.setFont(state.fonts.retroPixel) else love.graphics.setFont(state.fonts.nunito) end @@ -87,6 +89,8 @@ function font.draw() love.graphics.setFont(state.fonts.body) elseif hoveredFontName == "Cascadia Code" then love.graphics.setFont(state.fonts.monoBody) + elseif hoveredFontName == "Retro Pixel" then + love.graphics.setFont(state.fonts.retroPixel) else love.graphics.setFont(state.fonts.nunito) end diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index f10d9d4..6b2fd8b 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -90,6 +90,11 @@ constants.FONTS = { file = "cascadia_code.bin", selected = state.selectedFont == "Cascadia Code", }, + { + name = "Retro Pixel", + file = "retro_pixel.bin", + selected = state.selectedFont == "Retro Pixel", + }, } return constants diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index b5f437b..2a62fb7 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -61,6 +61,7 @@ local function createPreviewImage(outputPath) local fontMap = { ["Inter"] = state.fonts.body, ["Cascadia Code"] = state.fonts.monoBody, + ["Retro Pixel"] = state.fonts.retroPixel, } local font = fontMap[selectedFontName] or state.fonts.nunito love.graphics.setFont(font) diff --git a/src/screen/menu/ui.lua b/src/screen/menu/ui.lua index 91d5021..351dbbb 100644 --- a/src/screen/menu/ui.lua +++ b/src/screen/menu/ui.lua @@ -105,6 +105,8 @@ function ui.drawButton(button, x, y, isSelected) love.graphics.setFont(state.fonts.body) elseif selectedFontName == "Cascadia Code" then love.graphics.setFont(state.fonts.monoBody) + elseif selectedFontName == "Retro Pixel" then + love.graphics.setFont(state.fonts.retroPixel) else love.graphics.setFont(state.fonts.nunito) end diff --git a/src/template/font/retro_pixel.bin b/src/template/font/retro_pixel.bin new file mode 100644 index 0000000000000000000000000000000000000000..7705bba34a23768c8e5e2f77faa808e0f3daadf2 GIT binary patch literal 7908 zcmb_he{5A(9Y62&wXcOT-fK%+XmQhQ!AwX<%$m(C@n!ya#58*`S)fh>Wt&QtX)z{P z5V=R_q9!J`hS8}rVcC|kMI(?bK+x=xp^svX5luFWteP}I(;$Bd@4;=4pU?N)U+?w3 z^2FWto_p>+-}C+b{hseRZ?jTr*Ozxblfbh{^{P&F+w`ciQFwOZTL!mEH8(f&iR)3^ zPk(La?j)WYao>k~hf3g1%KOWB-=>CDE3hfmjQML+xB8G8P+QgC@a4IYr+4ncvlV~s zY6~ELtsY7IJW)=hlb=j}D|syW*W`RM(X^^*r0Mrf_olv`dN=j)<{vfBH|JYkX)!Hp z(~qRTnSM3>e)_@IU$nNiJ=5m4^{*IR@s|~wSN?FNyRyH1wEcYh!>e9eRa*7LJ;(29 zU%hMf^y-gh#xkYM6WP<*u8y4@?{s83H+Fuu^9!9n>HJUULtPVHf9hJZ<{NANuqM&{ z>F%T5bKMX2JlpeTPfPDpy_3D~_V%s);@Y3B{m0r5ulvrr->h5F_i*3yeXsWYz3-m> z&-eeif42W)>%X-ArS(dE^|`%Y*$ml+a-+&AskG5~W6nFq^B(My~7{mYr>ujpZQI_0>SlEMVqTo%MaSr(a4!dpy zV3DcePn=aMufa=dlpL`OmPy8#l24|b?E)5!Ddc-%wVBAas;^%+-bAYcmi`VF-ERens`*Y>uej~Vy~gvr5^2et@yG@uc- zX#;o=_rUh#4YYPTT8j|V;bf-;LV;5k2+2quy3rT}Zjm)PYZl)N0Wcl3AqqH$*oVQt zDHlw6HQ&AM#=H+b5MZRAxy;t`duRH zl(P<{3a*mCVMvgw+`do!AY&y|`|m$f)M}{x$5~uG!325gT<)>90B&gDr~d2!P2%k- zYc-lf%*RgC>_tl?08^7UbT}Gz5{3CHFj~|%BdBYKEcgy*eUDh2QXAcHY?NKNMbL!< z6s;p$pT=D8aiH*yiX*7u+%bT-s;vvoLN&%38Cbr-w5d#yNQurici{J2R*A6cArKQ! zP18mD95bhBL)CKAhS^j$YdsL`20`5*?zXN4ibbT~iN!%TacT}-$tnP(?@sj8NIO1;2pMo=dLV}1oycZ0L~O|^IA=BkQj9-d zMK%onJM%66k&x8GNth}LDew>Q9^wuhh`1p_4cren#@xz;I>B4Oi{A}#yJVdlI^I!V ziUDt&3}eJvd6{k_e!U%TyKqc+iN`=qzF{gXIw9Y2cq>B4_Yyat$V_q#={uMEjLi{k z84WR&3UfhjU*2ZNB_n<|Nge?>v`&ks!R-|z2?_m)3~hw(bO>p|lD5E!EK^yHJVfHW zY77k}kN9+egN~bZ7Os$HNg1GQZGVvHmO<&xHzU^0>10!>kIcO zXYn|g)S)b#=g$XNG&K6?zwpAeq9*Z}A_iQV?#LAru#&vU3f}q-3|?ja0`Z!Ud5kR% zUe$OA7EY(P;l(cCcnCc_5>$!`6Gr{uASvMReS)ZpY=Y&m+G!$K;&uRuB!DZ3t7>>U z@UKFE05-w`Rj}B=B@}(w2Kcthx4MoJP3$WKi*Q#ZItTOuUP!wtVN~iQ#%!z`;U+Tg zb)u0Z%Ga1gg1b(l6Qu=w(3;{@lC5ed{|^9nj7-!G_09FKwk_K#ay6p|E`#(3?~yJl z(3rj}7Fqa7OmVflmFf)iR~t6^s&ZyDY387fL8&&@#E-RBfkfdl$bM4@)gyNWEBa(r+aNR6iXG($;H28iy?@29h zaV(WME8Y~!f6KoSDf||t3UndVX&m;=%=g%0_d~7WDs7UM>cT80JnRx?*>Y~IrETpn z=V<^k6svPmg@HnY#=b_jt@dN!3*z;TxGezMc?S)qO&}vX)QMOw-fbZM>gObgih9>E zC+cil8qL!|(1F=o;x2GRFbQVUW(Hawaf;%I_!=m!0ltwp%Gr!=`8U?TjF?v35|Qa6z}ciWBpW!YR1Xzk8qjO(BtTb%Xx%2I)3GuESN>? z-GyDLjXNB3$wn+Hrw#BUini2`YUhSqnZyQezf;b&F+a0k#=eOWZd?qZPFHD30F8Kp z9|tivH|LlbrGkfkf!0$^JB)V}{2SdgV!ZL>Hq_Me3PPy-(5<;K8``t47&`#MuFwNM zmuxlkkZt67Fp!62*i#$mT(Sg}pD3Ksf<~m2g^P}#EL_%LC=S_jbG#O0(+IZYamWgG z-HAejTn6%B0{9Hr-O_PLrCqQyr{VtGym7_ga^b1rfs-smYg9A2?x&_NsFA&`kO$jJ z4QYqfTVv3?J*7Fpu5sJ42zW3LD3AnZ8?BPk@owb63CAhuy4FE`#fi99hd~!Gnt(Qg z2jz;kVG{;t6wHKOJcR~nFW{|yAuS3fmP+3I!!Yn>r9eyLS$l?Ekxis1lHQ$p8*u>U zZ`lIg>J@K-(3_r~e%&rXcrUfwM5{@$grnK-Ls1^~C{!fwsmvIB7h}u|a`T{r-(ZHC zHw-Ncug?;u)n9l+{rrwR__niZnZRbi3PsLt_fjpksD_tU8dKu~eIH*51aNcvUNm)e zS2NACfP_r;U*UWcNG18A1uNlDMFE)`cviz*?Z50A9TMh+y<#*J!bpePNM4tL+Rvr+ zMT$G6lw~-l;c?I$1!bLh*xb;Sbz-nQ)0`v`+&tQIpC!hubgFsl*lO27dLv|QaFWAcWu;`3Ua8Lp^==JcZs!ouh{EX;u5|!m|J#B6P`jmr3 z4>{Eb0F)fJNfwCQA#xeOEt3VT+c0y0C8T>8e2Hn|z8vM+&|vTE01sgXUw%Fu&wIeR z7M{n(%A;<63*YAF~8vdoMhjH(+{2WD5IusBQg z0ibB+adHdO00-Uf|Iq@4@l<6lj817Kq(BdsHR3rWO*5{O+ZNx0PaxW{HF_CE1M6;) zFb3;l<<~Sb2mmyVd0>^^WFMPMDdpVI7)?2I8Wmz}%z|Koag*DmV#w|JoIMJ($9~JV zibaQCXaFyM`|xRokA-7UAr+Xq>T?$d!36M=axRf~HQas@32V%OVUU#^%IW`h!(A$9 zjfQAT{>k1FQGhQfV$LJ^1;5$Vl&TLUSl^kY(yF24q)NUC--7~$0z1MFdE$l8m7`4y z Date: Tue, 25 Mar 2025 23:36:33 -0600 Subject: [PATCH 10/74] Create convert_font_to_binary.sh --- utils/convert_font_to_binary.sh | 51 +++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 utils/convert_font_to_binary.sh diff --git a/utils/convert_font_to_binary.sh b/utils/convert_font_to_binary.sh new file mode 100755 index 0000000..2a5b187 --- /dev/null +++ b/utils/convert_font_to_binary.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# This script converts a font file to binary format using lv_font_conv. +# lv_font_conv must be installed and accessible in PATH. +# The converted font is saved in the same directory as the input font file, with the same name, e.g., +# ./fonts/comic-sans.ttf -> ./fonts/comic-sans.bin +# +# Usage: +# ./convert_font_to_binary.sh [size] +# +# Examples: +# # Convert font with default size (24px) +# ./convert_font_to_binary.sh ./fonts/comic-sans.ttf +# +# # Convert font with custom size (28px) +# ./convert_font_to_binary.sh ./fonts/comic-sans.ttf 28 +# +# Output: +# +# Example: ./fonts/roboto.ttf -> ./fonts/roboto.bin + +if [ $# -lt 1 ]; then + echo "Usage: $0 [size]" + echo "size: Optional font size (default: 24)" + exit 1 +fi + +font_path="$1" + +if [ ! -f "$font_path" ]; then + echo "Error: Font file '$font_path' does not exist" + exit 1 +fi + +size=${2:-24} + +dir_path=$(dirname "$font_path") +filename=$(basename "$font_path") + +output_path="${dir_path}/${filename%.*}.bin" + +# See: https://muos.dev/themes/fonts.html#using-the-script +lv_font_conv --bpp 4 --size "$size" --font "$font_path" -r 0x00-0xFF --format bin --no-compress --no-prefilter -o "$output_path" + +if [ $? -eq 0 ]; then + echo "Font conversion completed successfully" + echo "Output saved to: $output_path" +else + echo "Error: Font conversion failed" + exit 1 +fi \ No newline at end of file From 238f42eb998e1ca59ae4d4b676ad5e7cac7955d6 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 27 Mar 2025 01:47:40 -0600 Subject: [PATCH 11/74] Add muOS logo on boot using custom colors --- build.sh | 113 +- mux_launch.sh | 36 +- src/assets/muOS/logo.svg | 1 + src/screen/menu/theme_creator.lua | 445 +++- src/tove/init.lua | 3967 +++++++++++++++++++++++++++++ src/tove/libTove.so | Bin 0 -> 963256 bytes 6 files changed, 4441 insertions(+), 121 deletions(-) create mode 100644 src/assets/muOS/logo.svg create mode 100644 src/tove/init.lua create mode 100644 src/tove/libTove.so diff --git a/build.sh b/build.sh index ff56703..dd23d51 100755 --- a/build.sh +++ b/build.sh @@ -1,39 +1,31 @@ #!/bin/bash -# Usage: ./build.sh [--clean] [] [] -# Packages the application into a .muxupd file +# Usage: ./scripts/build.sh [--clean] [] [] # -# If PRIVATE_KEY_PATH and DEVICE_IP are provided, the archive will be transferred to the handheld -# If --clean is provided, the script will delete application files from the handheld left over from previous builds - -CLEAN=false -PRIVATE_KEY_PATH="" -DEVICE_IP="" - -for arg in "$@"; do - if [ "$arg" == "--clean" ]; then - CLEAN=true - elif [ -z "$PRIVATE_KEY_PATH" ]; then - PRIVATE_KEY_PATH="$arg" - elif [ -z "$DEVICE_IP" ]; then - DEVICE_IP="$arg" - fi -done +# If PRIVATE_KEY_PATH and DEVICE_IP are provided, the archive will be uploaded to the device using scp +# If --clean is provided, the script will delete files from the device (left over from previous builds) +# before building a new version + +# Check for --clean option +if [[ "$1" == "--clean" ]]; then + CLEAN=true + shift +else + CLEAN=false +fi + +PRIVATE_KEY_PATH=$1 +DEVICE_IP=$2 APPLICATION_DIR=mnt/mmc/MUOS/application/Aesthetic + +LOG_DIR="${APPLICATION_DIR}/.aesthetic/logs" +mkdir -p "${LOG_DIR}" + + GLYPH_DIR=opt/muos/default/MUOS/theme/active/glyph/muxapp ARCHIVE_BASE_NAME=Aesthetic -# Items to delete with --clean -ITEMS_TO_DELETE=( - "/.local/share/love/Aesthetic" - "/mnt/mmc/MUOS/application/Aesthetic" - "/run/muos/storage/theme/Aesthetic.muxthm" - "/mnt/sdcard/MUOS/theme/active/glyph/muxapp/aesthetic.png" - "/mnt/sdcard/MUOS/theme/Aesthetic*.muxthm" - "/mnt/mmc/ARCHIVE/Aesthetic_*.muxupd" - "/mnt/mmc/MUOS/update/installed/Aesthetic_*.muxupd.done" - "/opt/muos/default/MUOS/theme/active/glyph/muxapp/aesthetic.png" -) + # Get version from src/version.lua MAJOR=$(awk '/version.major =/ {print $3}' src/version.lua) @@ -46,6 +38,18 @@ if [ ! -z "$PRERELEASE" ]; then VERSION="${VERSION}-${PRERELEASE}" fi +# Items to delete with --clean +ITEMS_TO_DELETE=( + "/.local/share/love/Aesthetic" + "/mnt/mmc/MUOS/application/Aesthetic" + "/run/muos/storage/theme/Aesthetic.muxthm" + "/mnt/sdcard/MUOS/theme/active/glyph/muxapp/aesthetic.png" + "/mnt/sdcard/MUOS/theme/Aesthetic*.muxthm" + "/mnt/mmc/ARCHIVE/Aesthetic_*.muxupd" + "/mnt/mmc/MUOS/update/installed/Aesthetic_*.muxupd.done" + "/opt/muos/default/MUOS/theme/active/glyph/muxapp/aesthetic.png" +) + if [ "$CLEAN" = true ]; then if [ -z "$PRIVATE_KEY_PATH" ] || [ -z "$DEVICE_IP" ]; then echo "Error: --clean requires both PRIVATE_KEY_PATH and DEVICE_IP" @@ -72,12 +76,50 @@ fi mkdir -p .dist mkdir -p .build/"${APPLICATION_DIR}" -mkdir -p .build/"${GLYPH_DIR}" - rsync -a mux_launch.sh .build/"${APPLICATION_DIR}" -rsync -a bin/ .build/"${APPLICATION_DIR}" -rsync -a lib/ .build/"${APPLICATION_DIR}" -rsync -a src/ .build/"${APPLICATION_DIR}" +rsync -av src/ .build/"${APPLICATION_DIR}"/.aesthetic/ + +# Debug: Check if SVG was copied +if [ -f ".build/${APPLICATION_DIR}/.aesthetic/assets/muOS/logo.svg" ]; then + echo "SVG file copied successfully" + ls -l ".build/${APPLICATION_DIR}/.aesthetic/assets/muOS/logo.svg" +else + echo "ERROR: SVG file not found in build directory!" + exit 1 +fi + +rsync -a bin/ .build/"${APPLICATION_DIR}"/.aesthetic/bin +rsync -a lib/ .build/"${APPLICATION_DIR}"/.aesthetic/lib +rsync -a src/tove/ .build/"${APPLICATION_DIR}"/.aesthetic/tove +# rsync -a src/ .build/"${APPLICATION_DIR}" + +# Check for required directories and files +if [ ! -d "src/tove" ]; then + echo "ERROR: 'tove' directory not found!" + echo "Please ensure the Tove library is installed in the 'tove' directory" + echo "Expected location: ./tove/libTove.so" + exit 1 +fi + +if [ ! -f "src/tove/libTove.so" ]; then + echo "ERROR: 'libTove.so' not found!" + echo "Please ensure the Tove library is installed at: ./src/tove/libTove.so" + exit 1 +fi + + + +# Debug: Check if Tove library exists and has correct permissions +if [ -f ".build/${APPLICATION_DIR}/.aesthetic/tove/libTove.so" ]; then + echo "Tove library found" + ls -l ".build/${APPLICATION_DIR}/.aesthetic/tove/libTove.so" +else + echo "ERROR: Tove library not found!" + exit 1 +fi + +# Copy application glyph +mkdir -p .build/"${GLYPH_DIR}" rsync -a src/template/glyph/muxapp/aesthetic.png .build/"${GLYPH_DIR}" # Create archive, exclude macOS system files @@ -95,6 +137,9 @@ elif [ -z "$DEVICE_IP" ]; then else echo "Uploading to $DEVICE_IP" scp -i "${PRIVATE_KEY_PATH}" .dist/"${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" root@"${DEVICE_IP}":/mnt/mmc/ARCHIVE + + # Set proper permissions for libraries + ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "chmod 755 /mnt/mmc/MUOS/application/Aesthetic/.aesthetic/tove/libTove.so" fi echo "Done!" \ No newline at end of file diff --git a/mux_launch.sh b/mux_launch.sh index fad98eb..1fe3f4b 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -5,19 +5,49 @@ # Source muOS system functions . /opt/muos/script/var/func.sh +# SCREEN_WIDTH=$(GET_VAR device mux/width) +# SCREEN_HEIGHT=$(GET_VAR device mux/height) +# SCREEN_RESOLUTION="${SCREEN_WIDTH}x${SCREEN_HEIGHT}" + +# echo app >/tmp/act_go + # Define paths -ROOT_DIR="$(GET_VAR "device" "storage/rom/mount")/MUOS/application/Aesthetic" +ROOT_DIR="$(GET_VAR "device" "storage/rom/mount")/MUOS/application/Aesthetic/.aesthetic" THEME_DIR="/run/muos/storage/theme" +BINDIR="$ROOT_DIR/bin" +LOG_DIR="$ROOT_DIR/logs" # Create required directories mkdir -p "$THEME_DIR/active" +mkdir -p "$LOG_DIR" +chmod 777 "$LOG_DIR" + +# Debug: Check directory creation and permissions +echo "Debug: Checking directories and permissions" > "$LOG_DIR/launch_debug.log" +echo "ROOT_DIR: $ROOT_DIR" >> "$LOG_DIR/launch_debug.log" +ls -la "$ROOT_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 +echo "Logs directory:" >> "$LOG_DIR/launch_debug.log" +ls -la "$LOG_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 +echo "Tove library:" >> "$LOG_DIR/launch_debug.log" +ls -la "$ROOT_DIR/tove" >> "$LOG_DIR/launch_debug.log" 2>&1 # Export environment variables export SDL_GAMECONTROLLERCONFIG_FILE="/usr/lib/gamecontrollerdb.txt" export THEME_DIR -export LD_LIBRARY_PATH="$ROOT_DIR/lib:${LD_LIBRARY_PATH:-}" +export LOG_DIR +export LD_LIBRARY_PATH="$ROOT_DIR/lib:$ROOT_DIR/tove:$LD_LIBRARY_PATH" + +# Debug: Print environment +echo "Environment:" >> "$LOG_DIR/launch_debug.log" +env >> "$LOG_DIR/launch_debug.log" # Launch application cd "$ROOT_DIR" || exit SET_VAR "system" "foreground_process" "love" -./love . + +# Redirect both stdout and stderr to log files +./bin/love . > "$LOG_DIR/app.log" 2> "$LOG_DIR/error.log" + +# Debug: Check if logs were created +echo "After LÖVE execution:" >> "$LOG_DIR/launch_debug.log" +ls -la "$LOG_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 diff --git a/src/assets/muOS/logo.svg b/src/assets/muOS/logo.svg new file mode 100644 index 0000000..3aed931 --- /dev/null +++ b/src/assets/muOS/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 2a62fb7..f6f1b88 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -9,6 +9,24 @@ local colorUtils = require("utils.color") -- Module table to export public functions local themeCreator = {} +-- Debug logging function that can be called from anywhere +function themeCreator.debugLog(message, filePath) + local logPath = filePath or "/tmp/theme_creator_debug.log" + local f = io.open(logPath, "a") + if f then + f:write(os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") + f:close() + end + print("DEBUG: " .. message) + + -- Try LÖVE filesystem as fallback + pcall(function() + if love and love.filesystem then + love.filesystem.append("theme_creator_debug.log", os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") + end + end) +end + -- Handles both Lua 5.1 (returns 0) and Lua 5.2+ (returns true) os.execute() success values local function isSuccess(result) return result == 0 or result == true @@ -170,117 +188,376 @@ local function applyScreenWidthSettings(filepath, screenWidth) return true end --- Function to create theme -function themeCreator.createTheme() - -- Clean up and prepare working directory - executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') - if not fileUtils.copyDir(constants.ORIGINAL_TEMPLATE_DIR, constants.WORKING_TEMPLATE_DIR) then - errorHandler.setError("Failed to prepare working template directory") +-- Function to save image data as a 24-bit BMP file +local function saveAsBMP(imageData, filepath) + -- Get image dimensions + local width = imageData:getWidth() + local height = imageData:getHeight() + + -- Calculate row size and padding + -- BMP rows must be aligned to 4 bytes + local rowSize = math.floor((24 * width + 31) / 32) * 4 + local padding = rowSize - width * 3 + + -- Calculate file size + local headerSize = 54 -- 14 bytes file header + 40 bytes info header + local imageSize = rowSize * height + local fileSize = headerSize + imageSize + + -- Create file + local file = io.open(filepath, "wb") + if not file then return false end - -- Get hex colors from state (remove # prefix) - local hexColors = { - background = state.colors.background:gsub("^#", ""), - foreground = state.colors.foreground:gsub("^#", ""), - } - - -- Replace colors and apply glyph settings to theme files - local themeFiles = { constants.THEME_OUTPUT_DIR .. "/scheme/global.ini" } - local glyphSettings = { - list_pad_left = state.glyphs_enabled and 42 or 20, - glyph_alpha = state.glyphs_enabled and 255 or 0, - } - for _, filepath in ipairs(themeFiles) do - if not fileUtils.replaceColor(filepath, hexColors) then - errorHandler.setError("Failed to update: " .. filepath) - return false - end - if not applyGlyphSettings(filepath, glyphSettings) then - errorHandler.setError("Failed to apply glyph settings to: " .. filepath) - return false - end - if not applyScreenWidthSettings(filepath, state.screenWidth) then - errorHandler.setError("Failed to apply screen width settings to: " .. filepath) - return false + -- Helper function to write little-endian integers + local function writeInt(value, bytes) + local result = "" + for i = 1, bytes do + result = result .. string.char(value % 256) + value = math.floor(value / 256) end + file:write(result) end - -- Find and copy the selected font file - local selectedFontFile - for _, font in ipairs(constants.FONTS) do - if font.name == state.selectedFont then - selectedFontFile = font.file - break + -- Write BMP file header (14 bytes) + file:write("BM") -- Signature + writeInt(fileSize, 4) -- File size + writeInt(0, 4) -- Reserved + writeInt(headerSize, 4) -- Pixel data offset + + -- Write BMP info header (40 bytes) + writeInt(40, 4) -- Info header size + writeInt(width, 4) -- Width + writeInt(height, 4) -- Height (positive for bottom-up) + writeInt(1, 2) -- Planes + writeInt(24, 2) -- Bits per pixel + writeInt(0, 4) -- Compression (none) + writeInt(imageSize, 4) -- Image size + writeInt(2835, 4) -- X pixels per meter + writeInt(2835, 4) -- Y pixels per meter + writeInt(0, 4) -- Colors in color table + writeInt(0, 4) -- Important color count + + -- Write pixel data (bottom-up, BGR format) + local padBytes = string.rep("\0", padding) + for y = height - 1, 0, -1 do + for x = 0, width - 1 do + local r, g, b, a = imageData:getPixel(x, y) + -- Convert from 0-1 to 0-255 range and write BGR + file:write(string.char(math.floor(b * 255), math.floor(g * 255), math.floor(r * 255))) + end + -- Add padding to align rows to 4 bytes + if padding > 0 then + file:write(padBytes) end end - -- Copy the selected font file as default.bin - local fontSourcePath = constants.ORIGINAL_TEMPLATE_DIR .. "/font/" .. selectedFontFile - local fontDestPath = constants.THEME_OUTPUT_DIR .. "/font/default.bin" - if not copyFile(fontSourcePath, fontDestPath, "Failed to copy font file: " .. selectedFontFile) then - return false + file:close() + return true +end + +-- Function to create startup image with dynamic colors and centered SVG +local function createStartImage() + -- Record start of function for debugging + themeCreator.debugLog("Starting createStartImage function") + + -- Access the LOG_DIR from environment variable with fallback + local logDir = os.getenv("LOG_DIR") + if not logDir or logDir == "" then + logDir = "/tmp" + print("Warning: LOG_DIR not set, using /tmp instead") end - -- Create preview image with dynamic resolution path - local screenWidth = state.screenWidth - local screenHeight = state.screenHeight - local resolutionDir = screenWidth .. "x" .. screenHeight + -- Create logs directory if it doesn't exist + os.execute('mkdir -p "' .. logDir .. '"') - -- Create directory if it doesn't exist - ensureDir(constants.THEME_OUTPUT_DIR .. "/" .. resolutionDir) + -- Create a log buffer for LÖVE fallback logging + local logBuffer = {} - -- Set preview path based on screen resolution - local previewPath = constants.THEME_OUTPUT_DIR .. "/" .. resolutionDir .. "/preview.png" - if not createPreviewImage(previewPath) then - errorHandler.setError("Failed to create preview image") - return false + -- Try to open log file with error handling + local logFilePath = logDir .. "/svg_debug.log" + print("Attempting to create log file at: " .. logFilePath) + local logFile, openError = io.open(logFilePath, "w") + + if not logFile then + print("ERROR: Failed to create log file: " .. (openError or "unknown error")) + -- Try alternative location + logFilePath = "/tmp/svg_debug.log" + print("Trying alternative location: " .. logFilePath) + logFile, openError = io.open(logFilePath, "w") + + if not logFile then + print("ERROR: Still failed to create log file: " .. (openError or "unknown error")) + end + else + print("Log file created successfully at: " .. logFilePath) end - -- Create and return ZIP archive - local themeDir = os.getenv("THEME_DIR") - if not themeDir then - errorHandler.setError("THEME_DIR environment variable not set") - return false + -- Check if LÖVE's filesystem is available as fallback + local loveFSAvailable = pcall(function() + return love.filesystem ~= nil + end) + if loveFSAvailable then + print("LÖVE filesystem is available as fallback") + else + print("LÖVE filesystem is NOT available as fallback") end - local themeName = "Aesthetic" - local outputPath = themeDir .. "/" .. themeName .. ".muxthm" - -- Determine the actual filename that will be used - local actualOutputPath = fileUtils.getNextAvailableFilename(outputPath) - if not actualOutputPath then - errorHandler.setError("Failed to get available filename") - return false + local function log(message) + -- Store in buffer for fallback + table.insert(logBuffer, os.date("[%Y-%m-%d %H:%M:%S] ") .. message) + + -- Try writing to regular log file + if logFile then + local status, err = pcall(function() + logFile:write(os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") + logFile:flush() -- Ensure content is written immediately + end) + + if not status then + print("Error writing to log: " .. (err or "unknown error")) + end + end + + -- Also print to console for debugging + print("SVG_LOG: " .. message) + + -- Try writing to LÖVE's save directory as fallback + if loveFSAvailable then + pcall(function() + love.filesystem.append("svg_debug_fallback.log", message .. "\n") + end) + end end - -- Extract the actual theme name from the path - local actualThemeName = actualOutputPath:match(".-/([^/]+)%.muxthm$") - if not actualThemeName then - actualThemeName = themeName -- Fallback to default name - else - -- Remove file extension - actualThemeName = actualThemeName:gsub("%.muxthm$", "") + -- Get dimensions from state + local width, height = state.screenWidth, state.screenHeight + + -- Get colors from state + local bgHex, fgHex = state.colors.background, state.colors.foreground + local r, g, b = colorUtils.hexToRgb(bgHex) + local bgColor = { r, g, b, 1 } + r, g, b = colorUtils.hexToRgb(fgHex) + local fgColor = { r, g, b, 1 } + + -- Prepare file path first - do all non-canvas operations before setting any canvas + -- TODO: Make this dynamic based on the screen resolution + local resolutionDir = "640x480" + local imageDir = resolutionDir .. "/image" + local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/bootlogo.bmp" + + -- Ensure directory exists before any drawing operations + ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) + + local canvas = love.graphics.newCanvas(width, height) + + local tove = require("tove") + + local logoPath = "assets/muOS/logo.svg" + local svgContent = love.filesystem.read(logoPath) + local logo = tove.newGraphics(svgContent) + + logo:setLineColor(fgColor[1], fgColor[2], fgColor[3], 1) + logo:stroke() + logo:setFillColor(fgColor[1], fgColor[2], fgColor[3], 1) + logo:fill() + + -- Save current graphics state + local prevCanvas = love.graphics.getCanvas() + local prevBlendMode = love.graphics.getBlendMode() + local prevColor = { love.graphics.getColor() } + + -- Drawing operations + love.graphics.setCanvas(canvas) + love.graphics.clear(bgColor) + + -- Draw logo centered correctly + love.graphics.push() + + -- Calculate center points + local screenCenterX = width / 2 + local screenCenterY = height / 2 + + -- Draw the logo with error handling + logo:draw(screenCenterX, screenCenterY, 0, 0.3, 0.3) + + love.graphics.pop() + + -- CRITICAL: Reset canvas BEFORE getting image data + love.graphics.setCanvas(prevCanvas) + love.graphics.setBlendMode(prevBlendMode) + love.graphics.setColor(prevColor) + + local imageData = canvas:newImageData() + + -- Save directly as BMP (with no active canvas) + if not saveAsBMP(imageData, outputPath) then + error("Failed to save BMP file") end - -- Create name.txt file with the theme name directly in the output directory - local nameFilePath = constants.THEME_OUTPUT_DIR .. "/name.txt" - local nameFile = io.open(nameFilePath, "w") - if not nameFile then - errorHandler.setError("Failed to create name.txt file") - return false + -- Finalize logging after successful completion + local function finalizeLogging() + if logFile then + log("Function completed successfully") + + -- Save log buffer to LÖVE filesystem regardless + if loveFSAvailable then + pcall(function() + love.filesystem.write("svg_debug_success.log", table.concat(logBuffer, "\n")) + end) + end + + logFile:flush() + logFile:close() + logFile = nil + end end - nameFile:write(actualThemeName) - nameFile:close() + -- Close log file before returning + finalizeLogging() + + -- Always return with no active canvas + return true +end + +-- Function to create theme +function themeCreator.createTheme() + local status, err = xpcall(function() + -- Clean up and prepare working directory + executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') + if not fileUtils.copyDir(constants.ORIGINAL_TEMPLATE_DIR, constants.WORKING_TEMPLATE_DIR) then + error("Failed to prepare working template directory") + end + + -- Verify directory structure + local requiredDirs = { + constants.WORKING_TEMPLATE_DIR .. "/scheme", + constants.WORKING_TEMPLATE_DIR .. "/font", + constants.WORKING_TEMPLATE_DIR .. "/640x480/image", + } + for _, dir in ipairs(requiredDirs) do + ensureDir(dir) + end + + -- Create startup image + themeCreator.debugLog("About to create startup image") + local startupImagePath = constants.WORKING_TEMPLATE_DIR .. "/640x480/image/bootlogo.bmp" + if not createStartImage() then + themeCreator.debugLog("Failed to create startup image") + error("Failed to create startup image") + end + themeCreator.debugLog("Startup image creation completed successfully") + + -- Verify startup image exists + if not love.filesystem.getInfo(startupImagePath) then + themeCreator.debugLog("Startup image file not found: " .. startupImagePath) + error("Startup image was not created at: " .. startupImagePath) + end + themeCreator.debugLog("Startup image verified at: " .. startupImagePath) + + -- Get hex colors from state (remove # prefix) + local hexColors = { + background = state.colors.background:gsub("^#", ""), + foreground = state.colors.foreground:gsub("^#", ""), + } + + -- Replace colors and apply glyph settings to theme files + local themeFiles = { constants.WORKING_TEMPLATE_DIR .. "/scheme/global.ini" } + local glyphSettings = { + list_pad_left = state.glyphs_enabled and 42 or 20, + glyph_alpha = state.glyphs_enabled and 255 or 0, + } + + for _, filepath in ipairs(themeFiles) do + if not fileUtils.replaceColor(filepath, hexColors) then + error("Failed to update colors in: " .. filepath) + end + + if not applyGlyphSettings(filepath, glyphSettings) then + error("Failed to apply glyph settings to: " .. filepath) + end + + if not applyScreenWidthSettings(filepath, state.screenWidth) then + error("Failed to apply screen width settings to: " .. filepath) + end + end + + -- Find and copy the selected font file + local selectedFontFile + for _, font in ipairs(constants.FONTS) do + if font.name == state.selectedFont then + selectedFontFile = font.file + break + end + end + + if not selectedFontFile then + error("Selected font not found: " .. tostring(state.selectedFont)) + end + + -- Copy the selected font file as default.bin + local fontSourcePath = constants.ORIGINAL_TEMPLATE_DIR .. "/font/" .. selectedFontFile + local fontDestPath = constants.WORKING_TEMPLATE_DIR .. "/font/default.bin" + if not copyFile(fontSourcePath, fontDestPath, "Failed to copy font file: " .. selectedFontFile) then + return false + end + + -- Create preview image with dynamic resolution path + local screenWidth = state.screenWidth + local screenHeight = state.screenHeight + local resolutionDir = screenWidth .. "x" .. screenHeight + + -- Create directory if it doesn't exist + local previewDir = constants.WORKING_TEMPLATE_DIR .. "/" .. resolutionDir + ensureDir(previewDir) + + -- Set preview path based on screen resolution + local previewPath = previewDir .. "/preview.png" + if not createPreviewImage(previewPath) then + error("Failed to create preview image at: " .. previewPath) + end + + -- Double check the file exists + if not love.filesystem.getInfo(previewPath) then + error("Preview image was not created at: " .. previewPath) + end + + -- Create name.txt file with the theme name + local nameFilePath = constants.WORKING_TEMPLATE_DIR .. "/name.txt" + local nameFile = io.open(nameFilePath, "w") + if not nameFile then + error("Failed to create name.txt file") + end + + nameFile:write("Aesthetic") + nameFile:close() + + -- Create and return ZIP archive + local themeDir = os.getenv("THEME_DIR") + if not themeDir then + error("THEME_DIR environment variable not set") + end + + local themeName = "Aesthetic" + local outputPath = themeDir .. "/" .. themeName .. ".muxthm" + + -- Create the ZIP archive + local actualPath = fileUtils.createZipArchive(constants.WORKING_TEMPLATE_DIR, outputPath) + if not actualPath then + error("Failed to create theme archive") + end + + return actualPath + end, debug.traceback) - -- Create the ZIP archive - local actualPath = fileUtils.createZipArchive(constants.THEME_OUTPUT_DIR, outputPath) - if not actualPath then - errorHandler.setError("Failed to create theme archive") + if not status then + errorHandler.setError(tostring(err)) return false end - return actualPath + -- Return the path from the successful execution + return err end -- Function to install the theme diff --git a/src/tove/init.lua b/src/tove/init.lua new file mode 100644 index 0000000..19ed820 --- /dev/null +++ b/src/tove/init.lua @@ -0,0 +1,3967 @@ +-- This file has been autogenerated. DO NOT CHANGE IT. +-- + +--- @module tove + +--[[ +***************************************************************** +TÖVE - Animated vector graphics for LÖVE. +https://github.com/poke1024/tove2d + +Copyright (c) 2018, Bernhard Liebl + +Distributed under the MIT license. See LICENSE file for details. + +All rights reserved. +***************************************************************** +]]-- + +local ffi = require 'ffi' + +ffi.cdef [[ +typedef uint16_t tove_gpu_float_t; +// rgba32f support: +// typedef float tove_gpu_float_t; + +typedef enum { + TOVE_REPORT_DEBUG = 1, + TOVE_REPORT_SLOW, + TOVE_REPORT_WARN, + TOVE_REPORT_ERR, + TOVE_REPORT_FATAL +} ToveReportLevel; + +typedef void (*ToveReportFunction)( + const char *s, ToveReportLevel level); + +typedef uint32_t ToveChangeFlags; + +typedef uint32_t ToveMeshUpdateFlags; + +typedef struct { + ToveMeshUpdateFlags update; +} ToveMeshResult; + +typedef enum { + TRIANGLES_LIST, + TRIANGLES_STRIP +} ToveTrianglesMode; + +typedef enum { + TOVE_GLSL2, + TOVE_GLSL3 +} ToveShaderLanguage; + +typedef enum { + TOVE_POINT, + TOVE_CURVE, + TOVE_SUBPATH, + TOVE_PATH +} ToveElementType; + +typedef uint16_t ToveVertexIndex; + +typedef struct { + ToveTrianglesMode mode; + const ToveVertexIndex *array; + int size; +} ToveTriangles; + +typedef enum { + PAINT_UNDEFINED = -1, + PAINT_NONE = 0, + PAINT_SOLID = 1, + PAINT_SHADER = 2, + PAINT_LINEAR_GRADIENT = 3, + PAINT_RADIAL_GRADIENT = 4 +} TovePaintType; + +typedef enum { + TOVE_FILLRULE_NON_ZERO = 0, + TOVE_FILLRULE_EVEN_ODD = 1 +} ToveFillRule; + +typedef enum { + TOVE_LINEJOIN_MITER, + TOVE_LINEJOIN_ROUND, + TOVE_LINEJOIN_BEVEL +} ToveLineJoin; + +typedef enum { + TOVE_LINECAP_BUTT, + TOVE_LINECAP_ROUND, + TOVE_LINECAP_SQUARE +} ToveLineCap; + +typedef enum { + TOVE_ORIENTATION_CW = 0, + TOVE_ORIENTATION_CCW = 1 +} ToveOrientation; + +typedef enum { + TOVE_HANDLE_FREE, + TOVE_HANDLE_ALIGNED +} ToveHandle; + +enum { + CHANGED_FILL_STYLE = 1, + CHANGED_LINE_STYLE = 2, + CHANGED_POINTS = 4, + CHANGED_GEOMETRY = 8, + CHANGED_LINE_ARGS = 16, + CHANGED_BOUNDS = 32, + CHANGED_EXACT_BOUNDS = 64, + CHANGED_RECREATE = 128, + CHANGED_FILL_ARGS = 256, + CHANGED_INITIAL = 1024, + CHANGED_PAINT_INDICES = 2048, + CHANGED_ANYTHING = 511, + CHANGED_COLORS = CHANGED_FILL_STYLE | CHANGED_LINE_STYLE +}; + +enum { + UPDATE_MESH_VERTICES = 1, + UPDATE_MESH_COLORS = 2, + UPDATE_MESH_TRIANGLES = 4, + UPDATE_MESH_GEOMETRY = 8, + UPDATE_MESH_EVERYTHING = 15, + UPDATE_MESH_AUTO_TRIANGLES = 128 +}; + +typedef struct { + float x, y; +} TovePoint; + +typedef struct { + void *ptr; +} TovePaintRef; + +typedef struct { + void *ptr; +} ToveSubpathRef; + +typedef struct { + void *ptr; +} ToveCommandRef; + +typedef struct { + void *ptr; +} TovePathRef; + +typedef struct { + void *ptr; +} ToveGraphicsRef; + +typedef struct { + void *ptr; +} ToveTesselatorRef; + +typedef struct { + void *ptr; +} TovePaletteRef; + +typedef struct { + void *ptr; +} ToveNameRef; + +typedef enum { + TOVE_REC_DEPTH, + TOVE_ANTIGRAIN, + TOVE_MAX_ERROR +} ToveStopCriterion; + +typedef struct { + float distanceTolerance; + float colinearityEpsilon; + float angleEpsilon; + float angleTolerance; + float cuspLimit; +} AntiGrainSettings; + +typedef struct { + ToveStopCriterion stopCriterion; + int recursionLimit; + float arcTolerance; + AntiGrainSettings antigrain; + float maximumError; + float clipperScale; +} ToveTesselationSettings; + +typedef enum { + TOVE_DITHER_NONE = 0, + TOVE_DITHER_DIFFUSION = 1, + TOVE_DITHER_ORDERED = 2 +} ToveDitherType; + +typedef struct { + ToveDitherType type; + const float *matrix; + uint16_t matrix_width; + uint16_t matrix_height; + float spread; +} ToveDither; + +typedef struct { + float tessTolerance; + float distTolerance; + struct { + ToveDither dither; + struct { + float amount; + const float *matrix; + int16_t n; + } noise; + TovePaletteRef palette; + } quality; +} ToveRasterizeSettings; + +typedef struct { + float r, g, b, a; +} ToveRGBA; + +typedef struct { + ToveRGBA rgba; + float offset; +} ToveColorStop; + +typedef struct { + float values[6]; +} ToveGradientParameters; + +typedef struct { + union { + float bounds[4]; + struct { + float x0; + float y0; + float x1; + float y1; + }; + }; +} ToveBounds; + +typedef struct { + float x, y; +} ToveVec2; + +typedef struct { + float x, y, z, w; +} ToveVec4; + +typedef struct { + float t; + float distanceSquared; +} ToveNearest; + +typedef struct { + int16_t numPaints; + int16_t numGradients; + int16_t numColors; +} TovePaintColorAllocation; + +typedef struct { + int16_t numGradients; + int16_t numColors; + int8_t matrixRows; + float *matrix; + uint8_t *colorsTexture; + int16_t colorsTextureRowBytes; + int16_t colorsTextureHeight; +} ToveGradientData; + +typedef struct { + int8_t style; // TovePaintType + ToveRGBA rgba; + ToveGradientData gradient; + void *shader; +} TovePaintData; + +typedef struct { + TovePaintData *array; + int16_t size; +} TovePaintDataArray; + +typedef struct { + int n[2]; // number of used lookup table elements for x and y + int bsearch; // number of needed (compound) bsearch iterations +} ToveLookupTableMeta; + +typedef struct { + int16_t curveIndex; + int16_t numCurves; + bool isClosed; +} ToveLineRun; + +typedef struct { + int16_t maxCurves; + int16_t numCurves; + int16_t numSubPaths; + + ToveBounds *bounds; + float strokeWidth; + float miterLimit; + int8_t fillRule; + bool fragmentShaderLine; + bool opaqueLine; + ToveLineRun *lineRuns; + + float *lookupTable[2]; + int16_t lookupTableSize; + ToveLookupTableMeta *lookupTableMeta; + +// #if TOVE_GPUX_MESH_BAND + float *bandsVertices[3]; + int16_t numBandsVertices[3]; + int16_t maxBandsVertices; +// #endif + + uint8_t *listsTexture; + int listsTextureRowBytes; + int listsTextureSize[2]; + const char *listsTextureFormat; + + tove_gpu_float_t *curvesTexture; + int curvesTextureRowBytes; + int curvesTextureSize[2]; + const char *curvesTextureFormat; +} ToveShaderGeometryData; + +typedef struct { + TovePaintData line; + TovePaintData fill; +} ToveShaderLineFillColorData; + +typedef struct { + ToveShaderLineFillColorData color; + ToveShaderGeometryData geometry; + bool hasNormalFillStrokeOrder; +} ToveShaderData; + +typedef struct { + void *ptr; +} ToveFeedRef; + +typedef struct { + void *ptr; +} ToveMeshRef; + +typedef struct { + float curvature; + float balance; + float angle1; + float angle2; +} ToveCurvature; + +typedef struct { + const char *code; + uint32_t embedded[2]; +} ToveShaderCode; + +typedef struct { + // the following values are uint32_t by design: these will be unboxed, + // will fit into Lua doubles and can act as hash table values in Lua. + // uint64_t would not work. + + // http://luajit.org/ext_ffi_semantics.html + // - Conversions from C types to Lua objects + // - cdata objects as table keys + // https://stackoverflow.com/questions/43655668/ + // are-all-integer-values-perfectly-represented-as-doubles + + // at 100 fps, version will work for > 1 year without overflowing. + + uint32_t id; // >= 1 + uint32_t version; +} ToveSendArgs; +const char *GetVersion(); +void SetReportFunction(ToveReportFunction f); +void SetReportLevel(ToveReportLevel l); + +TovePaletteRef NoPalette(); +TovePaletteRef DefaultPalette(const char *name); +bool SetRasterizeSettings(ToveRasterizeSettings *settings, const char *algorithm, + TovePaletteRef palette, float spread, float noise, const float *noiseMatrix, int noiseMatrixSize); +bool GenerateBlueNoise(int s, float *m); + +TovePaintType PaintGetType(TovePaintRef paint); +TovePaintRef ClonePaint(TovePaintRef paint); +TovePaintRef NewEmptyPaint(); +TovePaintRef NewShaderPaint(const char* s); +const ToveSendArgs *ShaderNextSendArgs(TovePaintRef shader); +int PaintGetNumColors(TovePaintRef color); +ToveColorStop PaintGetColorStop(TovePaintRef color, int i, float opacity); +TovePaintRef NewColor(float r, float g, float b, float a); +void ColorSet(TovePaintRef color, float r, float g, float b, float a); +ToveRGBA ColorGet(TovePaintRef color, float opacity); +TovePaintRef NewLinearGradient(float x1, float y1, float x2, float y2); +TovePaintRef NewRadialGradient(float cx, float cy, float fx, float fy, float r); +ToveGradientParameters GradientGetParameters(TovePaintRef gradient); +void GradientAddColorStop(TovePaintRef gradient, float offset, float r, float g, float b, float a); +void GradientSetColorStop(TovePaintRef gradient, int i, float offset, float r, float g, float b, float a); +void ReleasePaint(TovePaintRef color); + +ToveSubpathRef NewSubpath(); +ToveSubpathRef CloneSubpath(ToveSubpathRef subpath); +int SubpathGetNumCurves(ToveSubpathRef subpath); +int SubpathGetNumPoints(ToveSubpathRef subpath); +bool SubpathIsClosed(ToveSubpathRef subpath); +void SubpathSetIsClosed(ToveSubpathRef subpath, bool closed); +float *SubpathGetPointsPtr(ToveSubpathRef subpath); +void SubpathFixLoop(ToveSubpathRef subpath); +void SubpathSetPoint(ToveSubpathRef subpath, int index, float x, float y); +void SubpathSetPoints(ToveSubpathRef subpath, const float *pts, int npts); +float SubpathGetCurveValue(ToveSubpathRef subpath, int curve, int index); +void SubpathSetCurveValue(ToveSubpathRef subpath, int curve, int index, float value); +float SubpathGetPtValue(ToveSubpathRef subpath, int index, int dim); +void SubpathSetPtValue(ToveSubpathRef subpath, int index, int dim, float value); +void SubpathInvert(ToveSubpathRef subpath); +void SubpathSetOrientation(ToveSubpathRef subpath, ToveOrientation orientation); +void SubpathClean(ToveSubpathRef subpath, float eps); +int SubpathMoveTo(ToveSubpathRef subpath, float x, float y); +int SubpathLineTo(ToveSubpathRef subpath, float x, float y); +int SubpathCurveTo(ToveSubpathRef subpath, float cpx1, float cpy1, + float cpx2, float cpy2, float x, float y); +int SubpathArc(ToveSubpathRef subpath, float x, float y, float r, + float startAngle, float endAngle, bool counterclockwise); +int SubpathDrawRect(ToveSubpathRef subpath, float x, float y, + float w, float h, float rx, float ry); +int SubpathDrawEllipse(ToveSubpathRef subpath, float x, float y, float rx, float ry); +float SubpathGetCommandValue(ToveSubpathRef subpath, int command, int property); +void SubpathSetCommandValue(ToveSubpathRef subpath, int command, int property, float value); +ToveVec2 SubpathGetPosition(ToveSubpathRef subpath, float t); +ToveVec2 SubpathGetNormal(ToveSubpathRef subpath, float t); +ToveNearest SubpathNearest(ToveSubpathRef subpath, float x, float y, float dmin, float dmax); +int SubpathInsertCurveAt(ToveSubpathRef subpath, float t); +void SubpathRemoveCurve(ToveSubpathRef subpath, int curve); +int SubpathMould(ToveSubpathRef subpath, float t, float x, float y); +bool SubpathIsLineAt(ToveSubpathRef subpath, int k, int dir); +void SubpathMakeFlat(ToveSubpathRef subpath, int k, int dir); +void SubpathMakeSmooth(ToveSubpathRef subpath, int k, int dir, float a); +void SubpathMove(ToveSubpathRef subpath, int k, float x, float y, ToveHandle handle); +void SubpathCommit(ToveSubpathRef subpath); +void SubpathSet(ToveSubpathRef subpath, ToveSubpathRef source, + float a, float b, float c, float d, float e, float f); +ToveCurvature *SubpathSaveCurvature(ToveSubpathRef subpath); +void SubpathRestoreCurvature(ToveSubpathRef subpath); +void ReleaseSubpath(ToveSubpathRef subpath); + +TovePathRef NewPath(const char *d); +TovePathRef ClonePath(TovePathRef path); +ToveSubpathRef PathBeginSubpath(TovePathRef path); +void PathAddSubpath(TovePathRef path, ToveSubpathRef traj); +void PathRemoveSubpath(TovePathRef path, ToveSubpathRef traj); +void PathSetFillColor(TovePathRef path, TovePaintRef color); +void PathSetLineColor(TovePathRef path, TovePaintRef color); +TovePaintRef PathGetFillColor(TovePathRef path); +TovePaintRef PathGetLineColor(TovePathRef path); +void PathSetLineWidth(TovePathRef path, float width); +void PathSetMiterLimit(TovePathRef path, float limit); +float PathGetMiterLimit(TovePathRef path); +void PathSetLineDash(TovePathRef path, const float *dashes, int count); +void PathSetLineDashOffset(TovePathRef path, float offset); +float PathGetLineWidth(TovePathRef path); +int PathGetNumSubpaths(TovePathRef path); +ToveSubpathRef PathGetSubpath(TovePathRef path, int i); +void PathAnimate(TovePathRef path, TovePathRef a, TovePathRef b, float t); +int PathGetNumCurves(TovePathRef path); +ToveFillRule PathGetFillRule(TovePathRef path); +void PathSetFillRule(TovePathRef path, ToveFillRule rule); +float PathGetOpacity(TovePathRef path); +void PathSetOpacity(TovePathRef path, float opacity); +void PathSetOrientation(TovePathRef path, ToveOrientation orientation); +void PathClean(TovePathRef path, float eps); +bool PathIsInside(TovePathRef path, float x, float y); +void PathSet(TovePathRef path, TovePathRef source, + bool scaleLineWidth, float a, float b, float c, float d, float e, float f); +ToveLineJoin PathGetLineJoin(TovePathRef path); +void PathSetLineJoin(TovePathRef path, ToveLineJoin join); +ToveLineCap PathGetLineCap(TovePathRef path); +void PathSetLineCap(TovePathRef path, ToveLineCap cap); +const char *PathGetId(TovePathRef path); +void PathRefine(TovePathRef path, int factor); +void PathRotate(TovePathRef path, ToveElementType what, int k); +bool PathHasNormalFillStrokeOrder(TovePathRef path); +void ReleasePath(TovePathRef path); + +ToveGraphicsRef NewGraphics(const char *svg, const char* units, float dpi); +ToveGraphicsRef CloneGraphics(ToveGraphicsRef graphics, bool deep); +TovePathRef GraphicsBeginPath(ToveGraphicsRef graphics); +void GraphicsClosePath(ToveGraphicsRef graphics); +ToveSubpathRef GraphicsBeginSubpath(ToveGraphicsRef graphics); +void GraphicsCloseSubpath(ToveGraphicsRef graphics, bool close); +void GraphicsInvertSubpath(ToveGraphicsRef graphics); +TovePathRef GraphicsGetCurrentPath(ToveGraphicsRef shape); +void GraphicsAddPath(ToveGraphicsRef shape, TovePathRef path); +void GraphicsRemovePath(ToveGraphicsRef shape, TovePathRef path); +int GraphicsGetNumPaths(ToveGraphicsRef shape); +TovePathRef GraphicsGetPath(ToveGraphicsRef shape, int i); +TovePathRef GraphicsGetPathByName(ToveGraphicsRef shape, const char *name); +ToveChangeFlags GraphicsFetchChanges(ToveGraphicsRef shape, ToveChangeFlags flags); +void GraphicsSetFillColor(ToveGraphicsRef shape, TovePaintRef color); +void GraphicsSetLineColor(ToveGraphicsRef shape, TovePaintRef color); +void GraphicsSetLineWidth(ToveGraphicsRef shape, float width); +void GraphicsSetMiterLimit(ToveGraphicsRef shape, float limit); +void GraphicsSetLineDash(ToveGraphicsRef shape, const float *dashes, int count); +void GraphicsSetLineDashOffset(ToveGraphicsRef shape, float offset); +void GraphicsFill(ToveGraphicsRef shape); +void GraphicsStroke(ToveGraphicsRef shape); +void GraphicsGetBounds(ToveGraphicsRef shape, bool exact, ToveBounds *bounds); +void GraphicsSet(ToveGraphicsRef graphics, ToveGraphicsRef source, + bool scaleLineWidth, float a, float b, float c, float d, float e, float f); +void GraphicsRasterize(ToveGraphicsRef shape, uint8_t *pixels, + int width, int height, int stride, float tx, float ty, float scale, + const ToveRasterizeSettings *settings); +void GraphicsAnimate(ToveGraphicsRef shape, ToveGraphicsRef a, ToveGraphicsRef b, float t); +void GraphicsSetOrientation(ToveGraphicsRef shape, ToveOrientation orientation); +void GraphicsClean(ToveGraphicsRef shape, float eps); +TovePathRef GraphicsHit(ToveGraphicsRef graphics, float x, float y); +void GraphicsClear(ToveGraphicsRef graphics); +bool GraphicsAreColorsSolid(ToveGraphicsRef shape); +void GraphicsClearChanges(ToveGraphicsRef shape); +ToveLineJoin GraphicsGetLineJoin(ToveGraphicsRef shape); +void GraphicsSetLineJoin(ToveGraphicsRef shape, ToveLineJoin join); +bool GraphicsMorphify(const ToveGraphicsRef *graphics, int n); +void GraphicsRotate(ToveGraphicsRef graphics, ToveElementType what, int k); +void ReleaseGraphics(ToveGraphicsRef shape); + +ToveFeedRef NewColorFeed(ToveGraphicsRef graphics, float scale); +ToveFeedRef NewGeometryFeed(TovePathRef path, bool enableFragmentShaderStrokes); +ToveChangeFlags FeedBeginUpdate(ToveFeedRef link); +ToveChangeFlags FeedEndUpdate(ToveFeedRef link); +ToveShaderData *FeedGetData(ToveFeedRef link); +TovePaintColorAllocation FeedGetColorAllocation(ToveFeedRef link); +void FeedBindPaintIndices(ToveFeedRef link, const ToveGradientData *data); +void ReleaseFeed(ToveFeedRef link); + +ToveMeshRef NewMesh(ToveNameRef name); +ToveMeshRef NewColorMesh(ToveNameRef name); +ToveMeshRef NewPaintMesh(ToveNameRef name); +int MeshGetVertexCount(ToveMeshRef mesh); +void MeshSetVertexBuffer( + ToveMeshRef mesh, void *buffer, int32_t size); +ToveTrianglesMode MeshGetIndexMode(ToveMeshRef mesh); +int MeshGetIndexCount(ToveMeshRef mesh); +void MeshCopyIndexData( + ToveMeshRef mesh, void *buffer, int32_t size); +void MeshCacheKeyFrame(ToveMeshRef mesh); +void MeshSetCacheSize(ToveMeshRef mesh, int size); +void ReleaseMesh(ToveMeshRef mesh); + +void ConfigureShaderCode(ToveShaderLanguage language, int matrixRows); +const char *GetPaintShaderCode(int numPaints, int numGradients); + +ToveShaderCode GetGPUXFillShaderCode( + const ToveShaderData *data, bool fragLine, bool meshBand, bool debug); +ToveShaderCode GetGPUXLineShaderCode(const ToveShaderData *data); + +ToveTesselatorRef NewAdaptiveTesselator(float resolution, int recursionLimit); +ToveTesselatorRef NewRigidTesselator(int subdivisions); +ToveTesselatorRef NewAntiGrainTesselator(const AntiGrainSettings *settings); +ToveMeshUpdateFlags TesselatorTessGraphics(ToveTesselatorRef tess, + ToveGraphicsRef graphics, ToveMeshRef mesh, ToveMeshUpdateFlags flags); +ToveMeshUpdateFlags TesselatorTessPath(ToveTesselatorRef tess, + ToveGraphicsRef graphics, TovePathRef path, + ToveMeshRef fillMesh, ToveMeshRef lineMesh, ToveMeshUpdateFlags flags); +void TesselatorSetMaxSubdivisions(int subdivisions); +bool TesselatorHasFixedSize(ToveTesselatorRef tess); +void ReleaseTesselator(ToveTesselatorRef tess); + +TovePaletteRef NewPalette(const uint8_t *colors, int n); +void ReleasePalette(TovePaletteRef palette); + +ToveNameRef NewName(const char *s); +void ReleaseName(ToveNameRef name); +ToveNameRef CloneName(ToveNameRef name); +void NameSet(ToveNameRef name, const char *s); +const char *NameCStr(ToveNameRef name); +]] + +local tove = {} + +tove.init = function(path) + + local dynamicLibraryPathResolver = function() + + local getSystemPathSeparator = function() + if love.system.getOS() == "Windows" then + return "\\" + else + return "/" + end + end + + local libName = { + ["OS X"] = "libTove.dylib", + ["Windows"] = "libTove.dll", + ["Linux"] = "libTove.so" + } + + local envPath = os.getenv("TOVE_DYNAMIC_LIB_PREFIX") + local fileSep = getSystemPathSeparator() + + if envPath == nil then + local projectPrefix = love.filesystem.getSource() + + return projectPrefix .. fileSep .. "tove".. fileSep .. libName[love.system.getOS()] + else + return envPath .. fileSep .. libName[love.system.getOS()] + end + end + + libPath = dynamicLibraryPathResolver() + local lib = ffi.load(libPath) + tove.lib = lib + tove.getVersion = function() + return ffi.string(lib.GetVersion()) + end + + do + local reportLevel + + local levels = {"debug", "slow", "warn", "err", "fatal"} + local ilevels = {} + local outputs = {} + + for i, n in ipairs(levels) do + ilevels[n] = i + end + + tove.setReportLevel = function(level) + local l = ilevels[level] + if l ~= nil then + reportLevel = l + lib.SetReportLevel(l) + else + print("illegal report level " .. level) + end + end + + tove.getReportLevel = function() + return reportLevel + end + + local report = function(s, l) + l = tonumber(l) + if l >= reportLevel then + if outputs[l] ~= s then -- dry + outputs[l] = s + print("TÖVE [" .. levels[l] .. "] " .. s) + if l >= math.min(reportLevel + 1, lib.TOVE_REPORT_ERR) then + print(" " .. debug.traceback()) + end + end + end + end + + tove.report = report + tove.warn = function(s) + report(s, lib.TOVE_REPORT_WARN) + end + tove.slow = function(s) + report(s, lib.TOVE_REPORT_SLOW) + end + + lib.SetReportFunction(ffi.cast("ToveReportFunction", function(s, level) + report(ffi.string(s), level) + end)) + + tove.setReportLevel("slow") + end + + tove._highdpi = 1 + + tove.configure = function(config) + if config.debug ~= nil then + tove_debug = config.debug + tove.slow = tove.warn + end + if config.performancewarnings ~= nil then + tove.slow = enabled and tove.warn or function() end + end + if config.highdpi ~= nil then + tove._highdpi = config.highdpi and 2 or 1 + end + end + + local env = { + graphics = love.graphics.getSupported(), + rgba16f = love.graphics.getCanvasFormats()["rgba16f"], + matrows = 2 -- number of mat3x2 rows + } + + do + local _, _, _, device = love.graphics.getRendererInfo() + if string.find(device, "Parallels") ~= nil then + env.matrows = 4 + end + end + + env.matsize = ffi.sizeof("float[?]", 3 * env.matrows) + + lib.ConfigureShaderCode( + env.graphics.glsl3 and lib.TOVE_GLSL3 or lib.TOVE_GLSL2, + env.matrows) + + function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy + end + + local _attributes = { + cp1x = 0, + cp1y = 1, + cp2x = 2, + cp2y = 3, + x = 4, + y = 5, + x0 = -2, + y0 = -1, + + w = 6, + h = 7, + + cx = 100, + cy = 101, + rx = 102, + ry = 103, + r = 104, + } + + local function totable(u, n) + local t = {} + for i = 1, n do + t[i] = u[i - 1] + end + return t + end + + tove.Transform = {} + + tove.transformed = function(source, ...) + local args = {...} + local t + if type(args[1]) == "number" then + t = love.math.newTransform(...) + else + t = args[1] + end + local a, b, _, c, d, e, _, f = t:getMatrix() + return setmetatable({ + s = source, args = {a, b, c, d, e, f}}, tove.Transform) + end + + tove.ipairs = function(a) + local i = 1 + local n = a.count + return function() + local j = i + if j <= n then + i = i + 1 + return j, a[j] + else + return nil + end + end + end + + local bit = require("bit") + + --- The visual approach with which lines are joined. + + tove.lineJoins = { + miter = lib.TOVE_LINEJOIN_MITER, + round = lib.TOVE_LINEJOIN_ROUND, + bevel = lib.TOVE_LINEJOIN_BEVEL + } + + --- The shape used to draw the end points of lines. + + tove.lineCaps = { + butt = lib.TOVE_LINECAP_BUTT, + round = lib.TOVE_LINECAP_ROUND, + square = lib.TOVE_LINECAP_SQUARE + } + + --- The rule by which solidness in paths is defined. + + tove.fillRules = { + nonzero = lib.TOVE_FILLRULE_NON_ZERO, + evenodd = lib.TOVE_FILLRULE_EVEN_ODD + } + + tove.elements = { + curve = lib.TOVE_CURVE, + point = lib.TOVE_POINT, + subpath = lib.TOVE_SUBPATH, + path = lib.TOVE_PATH + } + + local function findEnum(enums, value) + for k, v in pairs(enums) do + if v == value then + return k + end + end + error("illegal enum value") + end + + tove.createBlueNoise = function(s) + local d = love.data.newByteData(ffi.sizeof("float[?]", s * s)) + if not lib.GenerateBlueNoise(s, d:getPointer()) then d = nil end + return d + end + + local function warmupShader(shader) + love.graphics.setShader(shader) + love.graphics.rectangle("fill", 0, 0, 0, 0) + end + + tove._str = function(name) + return ffi.string(lib.NameCStr(name)) + end + +local Paint = (function() + +local _attr = {r = 1, g = 2, b = 3, a = 4, rgba = 0} + +--- Colors and gradients used in fills and lines. + +local Paint = {} +Paint.__index = function (self, key) + if _attr[key] ~= nil then + local rgba = lib.ColorGet(self, 1.0) + if key == "rgba" then + return {rgba.r, rgba.g, rgba.b, rgba.a} + else + return rgba[key] + end + else + return Paint[key] + end +end +Paint.__newindex = function(self, key, value) + local i = _attr[key] + if i ~= nil then + local rgba = {self:get()} + rgba[i] = value + self:set(unpack(rgba)) + end +end + +local function fromRef(ref) + if ref.ptr == nil then + return nil + else + return ffi.gc(ref, lib.ReleasePaint) + end +end + +Paint._fromRef = fromRef + +ffi.metatype("TovePaintRef", Paint) + +local noColor = fromRef(lib.NewEmptyPaint()) + +local newColor = function(r, g, b, a) + if r == nil then + return noColor + else + return fromRef(lib.NewColor(r, g or 0, b or 0, a or 1)) + end +end + +--- Create a new color. + +tove.newColor = newColor + +--- Create a linear gradient. + +tove.newLinearGradient = function(x0, y0, x1, y1) + return fromRef(lib.NewLinearGradient(x0, y0, x1, y1)) +end + +--- Create a radial gradient. + +tove.newRadialGradient = function(cx, cy, fx, fy, r) + return fromRef(lib.NewRadialGradient(cx, cy, fx, fy, r)) +end + +local function unpackRGBA(rgba) + return rgba.r, rgba.g, rgba.b, rgba.a +end + +--- Get RGBA components. + +function Paint:get(opacity) + return unpackRGBA(lib.ColorGet(self, opacity or 1)) +end + +--- Set to RGBA. + +function Paint:set(r, g, b, a) + lib.ColorSet(self, r, g, b, a or 1) +end + +--- types of paint + +local paintTypes = { + none = lib.PAINT_NONE, + solid = lib.PAINT_SOLID, + linear = lib.PAINT_LINEAR_GRADIENT, + radial = lib.PAINT_RADIAL_GRADIENT, + shader = lib.PAINT_SHADER +} + +--- Query paint type. + +function Paint:getType() + local t = lib.PaintGetType(self) + for name, enum in pairs(paintTypes) do + if t == enum then + return name + end + end +end + +--- Get number of colors. + +function Paint:getNumColors() + return lib.PaintGetNumColors(self) +end + +--- Get i-th color stop. + +function Paint:getColorStop(i, opacity) + local s = lib.PaintGetColorStop(self, i - 1, opacity or 1) + return s.offset, unpackRGBA(s.rgba) +end + +function Paint:getGradientParameters() + local t = lib.PaintGetType(self) + local v = lib.GradientGetParameters(self).values + if t == lib.PAINT_LINEAR_GRADIENT then + return v[0], v[1], v[2], v[3] + elseif t == lib.PAINT_RADIAL_GRADIENT then + return v[0], v[1], v[2], v[3], v[4] + end +end + +--- Add new color stop. + +function Paint:addColorStop(offset, r, g, b, a) + lib.GradientAddColorStop(self, offset, r, g, b, a or 1) +end + +--- Clone. + +function Paint:clone() + return lib.ClonePaint(self) +end + +local function exportGradientColors(paint) + local n = paint:getNumColors() + local colors = {} + for i = 1, n do + local stop = paint:getColorStop(i) + table.insert(colors, {stop.offset, unpackRGBA(stop.rgba)}) + end + return colors +end + +local function importGradientColors(g, colors) + for _, c in ipairs(colors) do + g:addColorStop(unpack(c)) + end +end + +function Paint:serialize() + local t = lib.PaintGetType(self) + if t == lib.PAINT_SOLID then + return {type = "solid", color = {self:get()}} + elseif t == lib.PAINT_LINEAR_GRADIENT then + local x0, y0, x1, y1 = self:getGradientParameters() + return {type = "linear", + x0 = x0, y0 = y0, x1 = x1, y1 = y1, + colors = exportGradientColors(self)} + elseif t == lib.PAINT_RADIAL_GRADIENT then + local cx, cy, fx, fy, r = self:getGradientParameters() + return {type = "radial", + cx = cx, cy = cy, fx = fx, fy = fy, r = r, + colors = exportGradientColors(self)} + end + return nil +end + +tove.newPaint = function(p) + if p.type == "solid" then + return newColor(unpack(p.color)) + elseif p.type == "linear" then + local g = tove.newLinearGradient(p.x0, p.y0, p.x1, p.y1) + importGradientColors(g, p.colors) + return g + elseif p.type == "radial" then + local g = tove.newRadialGradient(p.cx, p.cy, p.fx, p.fy, p.r) + importGradientColors(g, p.colors) + return g + end +end + + +local _sent = {} +tove._sent = _sent + +--- Send data to custom shader. + +function Paint:send(k, ...) + local args = lib.ShaderNextSendArgs(self) + _sent[args.id][k] = {args.version, {...}} +end + +--- Create new custom shader. +-- uniform float time; +-- vec4 COLOR(vec2 pos) { +-- } + +tove.newShader = function(source) + local function releaseShader(self) + local args = lib.ShaderNextSendArgs(self) + _sent[args.id] = nil + lib.ReleasePaint(self) + end + + local shader = lib.NewShaderPaint(source) + local args = lib.ShaderNextSendArgs(shader) + _sent[args.id] = {} + return ffi.gc(shader, releaseShader) +end + + +Paint._wrap = function(r, g, b, a) + if ffi.istype("TovePaintRef", r) then + return r + end + local t = type(r) + if t == "number" then + return newColor(r, g, b, a) + elseif t == "string" and r:sub(1, 1) == '#' then + r = r:gsub("#","") + return newColor( + tonumber("0x" .. r:sub(1, 2)) / 255, + tonumber("0x" .. r:sub(3, 4)) / 255, + tonumber("0x" .. r:sub(5, 6)) / 255) + elseif t == "nil" then + return noColor + else + error("tove: cannot parse color: " .. tostring(r)) + end +end + +return Paint +end)() +local newCommand = (function() + +--- Represents a graphics primitive, for example a circle or a curve. + +--- width + +--- height + +--- x coordinate of center + +--- y coordinate of center + +--- x radius + +--- y radius + +--- radius + +--- @section Curves + +--- x coordinate of curve point P0 + +--- y coordinate of curve point P0 + +--- x coordinate of first control point P1 + +--- y coordinate of first control point P1 + +--- x coordinate of second control point P2 + +--- y coordinate of second control point P2 + +--- x coordinate of curve point P3 + +--- y coordinate of curve point P3 + +local Command = {} +Command.__index = function(self, key) + local a = _attributes[key] + if a ~= nil then + return lib.SubpathGetCommandValue(self._t, self._c, a) + else + return Command[key] + end +end +Command.__newindex = function(self, key, value) + lib.SubpathSetCommandValue( + rawget(self, "_t"), rawget(self, "_c"), _attributes[key], value) +end + +function Command:commit() + lib.SubpathCommit(self._t) +end + +return function(trajectory, command) + return setmetatable({_t = trajectory, _c = command}, Command) +end +end)() +local Subpath = (function() + +--- A vector graphics subpath (sometimes called trajectory), usually lives inside a @{Path}. + +--- @{tove.List} of @{Curve}s in this @{Subpath} + +--- is this subpath closed? + + +local _pt = { + x = 0, + y = 1 +} + +local Point = {} +Point.__index = function (self, key) + return lib.SubpathGetPtValue(self.traj, self.i, _pt[key] or -1) +end +Point.__newindex = function (self, key, value) + lib.SubpathSetPtValue(self.traj, self.i, _pt[key] or -1, value) +end + +local Points = {} +Points.__index = function (self, i) + if i == "count" then + return lib.SubpathGetNumPoints(self.traj) + else + return setmetatable({traj = self.traj, i = self.i0 + i - 1}, Point) + end +end + +local Curve = {} +Curve.__index = function (self, key) + if key == "p" then + return setmetatable({traj = self.traj, i0 = self.curve * 4}, Points) + end + local i = _attributes[key] + if i == nil then return nil end + return lib.SubpathGetCurveValue( + self.traj, self.curve, i) +end +Curve.__newindex = function (self, key, value) + local i = _attributes[key] + if i == nil then return nil end + return lib.SubpathSetCurveValue( + self.traj, self.curve, i, value) +end + +function Curve:split(t) + lib.SubpathInsertCurveAt(self.traj, self.curve + t) +end + +function Curve:remove() + lib.SubpathRemoveCurve(self.traj, self.curve) +end + +function Curve:isLine(dir) + return lib.SubpathIsLineAt(self.traj, self.curve, dir or 0) +end + +function Curve:makeFlat(dir) + return lib.SubpathMakeFlat(self.traj, self.curve, dir or 0) +end + +function Curve:makeSmooth(a, dir) + return lib.SubpathMakeSmooth(self.traj, self.curve, dir or 0, a or 0.5) +end + + +local Curves = {} +Curves.__index = function (self, curve) + if curve == "count" then + return lib.SubpathGetNumCurves(self.traj) + else + return setmetatable({traj = self.traj, curve = curve - 1}, Curve) + end +end + + +local Subpath = {} +Subpath.__index = function(self, key) + if key == "curves" then + return setmetatable({traj = self}, Curves) + elseif key == "points" then + return setmetatable({traj = self, i0 = 0}, Points) + elseif key == "isClosed" then + return lib.SubpathIsClosed(self) + else + return Subpath[key] + end +end +Subpath.__newindex = function(self, key, value) + if key == "isClosed" then + lib.SubpathSetIsClosed(self, value) + end +end + +--- Evaluate position at t. + +function Subpath:position(t) + local v = lib.SubpathGetPosition(self, t) + return v.x, v.y +end + +--- Evaluate normal at t. + +function Subpath:normal(t) + local v = lib.SubpathGetNormal(self, t) + return v.x, v.y +end + +--- Find nearest point. + +function Subpath:nearest(x, y, dmax, dmin) + local n = lib.SubpathNearest(self, x, y, dmin or 1e-4, dmax or 1e50) + return n.t, math.sqrt(n.distanceSquared) +end + +Subpath.insertCurveAt = lib.SubpathInsertCurveAt +Subpath.removeCurve = lib.SubpathRemoveCurve + +--- Mould curve. + +Subpath.mould = lib.SubpathMould + +Subpath.commit = lib.SubpathCommit + +--- Move to position (x, y). + +Subpath.moveTo = lib.SubpathMoveTo + +--- Draw a line to (x, y). + +Subpath.lineTo = lib.SubpathLineTo + +--- Draw a cubic bezier curve to (x, y). + +Subpath.curveTo = lib.SubpathCurveTo + +local handles = { + free = lib.TOVE_HANDLE_FREE, + aligned = lib.TOVE_HANDLE_ALIGNED +} + +function Subpath:move(k, x, y, h) + lib.SubpathMove(self, k, x, y, h and handles[h] or lib.TOVE_HANDLE_FREE) +end + +--- Draw an arc. + +function Subpath:arc(x, y, r, a1, a2, ccw) + lib.SubpathArc(self, x, y, r, a1, a2, ccw or false) +end + +--- Draw a rectangle. + +function Subpath:drawRect(x, y, w, h, rx, ry) + return newCommand(self, lib.SubpathDrawRect( + self, x, y, w, h or w, rx or 0, ry or 0)) +end + +--- Draw a circle. + +function Subpath:drawCircle(x, y, r) + return newCommand(self, lib.SubpathDrawEllipse( + self, x, y, r, r)) +end + +--- Draw an ellipse. + +function Subpath:drawEllipse(x, y, rx, ry) + return newCommand(self, lib.SubpathDrawEllipse( + self, x, y, rx, ry or rx)) +end + +function Subpath:isLineAt(k, dir) + return lib.SubpathIsLineAt(self, k, dir or 0) +end + +function Subpath:makeFlat(k, dir) + return lib.SubpathMakeFlat(self, k, dir or 0) +end + +function Subpath:makeSmooth(k, a, dir) + return lib.SubpathMakeSmooth(self, k, dir or 0, a or 0.5) +end + +function Subpath:set(arg) + if getmetatable(arg) == tove.Transform then + lib.SubpathSet( + self, + arg.s, + unpack(arg.args)) + else + lib.SubpathSet( + self, + arg, + 1, 0, 0, 0, 1, 0) + end +end + +--- Transform this @{Subpath}. + +function Subpath:transform(...) + self:set(tove.transformed(self, ...)) +end + +--- Invert. + +function Subpath:invert() + lib.SubpathInvert(self) +end + +--- Set points. + +function Subpath:setPoints(...) + local p = {...} + local n = #p + local f = ffi.new("float[?]", n) + for i = 1, n do + f[i - 1] = p[i] + end + lib.SubpathSetPoints(self, f, n / 2) +end + +--- Warp. + +function Subpath:warp(f) + local c = lib.SubpathSaveCurvature(self) + local n = lib.SubpathGetNumPoints(self) + local p = lib.SubpathGetPointsPtr(self) + local j = 0 + for i = 0, n - 1, 3 do + x, y, curvature = f(p[2 * i + 0], p[2 * i + 1], c[j].curvature) + p[2 * i + 0] = x + p[2 * i + 1] = y + if curvature ~= nil then c[j].curvature = curvature end + j = j + 1 + end + lib.SubpathFixLoop(self) + lib.SubpathRestoreCurvature(self) +end + +ffi.metatype("ToveSubpathRef", Subpath) + +--- Create new subpath. + +tove.newSubpath = function(t) + local self = ffi.gc(lib.NewSubpath(), lib.ReleaseSubpath) + if type(t) == "table" and t.points ~= nil then + self:setPoints(unpack(t.points)) + self.isClosed = t.closed + elseif type(t) == "table" and #t > 0 then + self:setPoints(unpack(t)) + end + return self +end + +--- Clone. + +function Subpath:clone() + return lib.CloneSubpath(self) +end + +function Subpath:serialize() + local n = lib.SubpathGetNumPoints(self) + local p = lib.SubpathGetPointsPtr(self) + local q = {} + if self.isClosed then + n = n - 1 + end + for i = 1, n * 2 do + q[i] = p[i - 1] + end + return { + points = q, + closed = self.isClosed + } +end + +return Subpath +end)() +local Path = (function() + +--- A vector graphics path, usually lives inside a @{Graphics}. + +--- @{tove.List} of @{Subpath}s in this @{Path} + +--- name of this path + +local Subpaths = {} +Subpaths.__index = function (self, i) + if i == "count" then + return lib.PathGetNumSubpaths(self.path) + else + return ffi.gc(lib.PathGetSubpath(self.path, i), lib.ReleaseSubpath) + end +end + +local Path = {} +Path.__index = function (path, key) + if key == "subpaths" then + return setmetatable({path = path}, Subpaths) + elseif key == "id" then + return ffi.string(lib.PathGetId(path)) + else + return Path[key] + end +end + +--- Create a deep copy. + +Path.clone = lib.ClonePath + +--- Set line dash offset. + +Path.setLineDashOffset = lib.PathSetLineDashOffset + +--- Get line width. + +Path.getLineWidth = lib.PathGetLineWidth + +--- Set line width. + +Path.setLineWidth = lib.PathSetLineWidth + +--- Set miter limit. + +Path.setMiterLimit = lib.PathSetMiterLimit + +--- Get miter limit. + +Path.getMiterLimit = lib.PathGetMiterLimit + +--- Get opacity. + +Path.getOpacity = lib.PathGetOpacity + +--- Set opacity. + +Path.setOpacity = lib.PathSetOpacity + +--- Check if inside. + +Path.inside = lib.PathIsInside + +--- Refine curves. + +Path.refine = lib.PathRefine + +function Path:beginSubpath() + return ffi.gc(lib.PathBeginSubpath(self), lib.ReleaseSubpath) +end + +--- Add a @{Subpath}. + +function Path:addSubpath(t) + lib.PathAddSubpath(self, t) +end + +--- Remove a @{Subpath}. + +function Path:removeSubpath(t) + lib.PathRemoveSubpath(self, t) +end + +--- Move to position (x, y). + +function Path:moveTo(x, y) + lib.SubpathMoveTo(self:beginSubpath(), x, y) +end + +--- Draw a line to (x, y). + +function Path:lineTo(x, y) + lib.SubpathLineTo(self:beginSubpath(), x, y) +end + +--- Draw a cubic bezier curve to (x, y). + +function Path:curveTo(...) + lib.SubpathCurveTo(self:beginSubpath(), ...) +end + +--- Get fill color. + +function Path:getFillColor() + return Paint._fromRef(lib.PathGetFillColor(self)) +end + +--- Get line color. + +function Path:getLineColor() + return Paint._fromRef(lib.PathGetLineColor(self)) +end + +--- Set fill color. + +function Path:setFillColor(r, g, b, a) + lib.PathSetFillColor(self, Paint._wrap(r, g, b, a)) +end + +--- Set line color. + +function Path:setLineColor(r, g, b, a) + lib.PathSetLineColor(self, Paint._wrap(r, g, b, a)) +end + +--- Animate between two @{Path}s. + +function Path:animate(a, b, t) + lib.PathAnimate(self, a, b, t) +end + +--- Warp points. + +function Path:warp(f) + local subpaths = self.subpaths + for i = 1, subpaths.count do + subpaths[i]:warp(f) + end +end + +--- Rotate elements. + +function Path:rotate(w, k) + lib.PathRotate(self, tove.elements[w], k) +end + +--- Find nearest point. + +function Path:nearest(x, y, max, min) + local n = lib.PathGetNumSubpaths(self) + local subpaths = self.subpaths + for i = 1, n do + local traj = subpaths[i] + local t, d = traj:nearest(x, y, max, min) + if t >= 0 then + return d, t, traj + end + end + return false +end + +function Path:set(arg, swl) + if getmetatable(arg) == tove.Transform then + lib.PathSet( + self, + arg.s, + swl or false, + unpack(arg.args)) + else + lib.PathSet( + self, + arg, + false, 1, 0, 0, 0, 1, 0) + end +end + +--- Transform this @{Path}. + +function Path:transform(...) + self:set(tove.transformed(self, ...)) +end + +--- Get line join. + +function Path:getLineJoin() + return findEnum(tove.lineJoins, lib.PathGetLineJoin(self)) +end + +--- Set line join. + +function Path:setLineJoin(join) + lib.PathSetLineJoin(self, tove.lineJoins[join]) +end + +--- Get line cap. + +function Path:getLineCap() + return findEnum(tove.lineCaps, lib.PathGetLineCap(self)) +end + +--- Set line cap. + +function Path:setLineCap(cap) + lib.PathSetLineCap(self, tove.lineCaps[cap]) +end + +--- Get fill rule. + +function Path:getFillRule() + return findEnum(tove.fillRules, lib.PathGetFillRule(self)) +end + +--- Set fill rule. + +function Path:setFillRule(rule) + lib.PathSetFillRule(self, tove.fillRules[rule]) +end + +function Path:serialize() + local subpaths = self.subpaths + local s = {} + for i = 1, subpaths.count do + s[i] = subpaths[i]:serialize() + end + local line = nil + local lineColor = self:getLineColor() + if lineColor then + line = { + paint = lineColor:serialize(), + join = self:getLineJoin(), + miter = self:getMiterLimit(), + width = self:getLineWidth() + } + end + local fill = nil + local fillColor = self:getFillColor() + if fillColor then + fill = { + paint = fillColor:serialize(), + rule = self:getFillRule() + } + end + local opacity = self:getOpacity() + return { + line = line, + fill = fill, + opacity = opacity < 1 and opacity or nil, + subpaths = s + } +end + +function Path:deserialize(t) + for _, s in ipairs(t.subpaths) do + self:addSubpath(tove.newSubpath(s)) + end + if t.line then + self:setLineColor(tove.newPaint(t.line.paint)) + self:setLineJoin(t.line.join) + self:setMiterLimit(t.line.miter) + self:setLineWidth(t.line.width) + end + if t.fill then + self:setFillColor(tove.newPaint(t.fill.paint)) + self:setFillRule(t.fill.rule) + end + self:setOpacity(t.opacity or 1) +end + +ffi.metatype("TovePathRef", Path) + +tove.newPath = function(data) + local t = type(data) + local p = ffi.gc(lib.NewPath( + t == "string" and data or nil), lib.ReleasePath) + if t == "table" then + p:deserialize(data) + end + return p +end + +return Path +end)() + +local _mesh = (function() + +local floatSize = ffi.sizeof("float") +local indexSize = ffi.sizeof("ToveVertexIndex") + +local function getTrianglesMode(cmesh) + return lib.MeshGetIndexMode(cmesh) == lib.TRIANGLES_LIST + and "triangles" or "strip" +end + + +local AbstractMesh = {} +AbstractMesh.__index = AbstractMesh + +function AbstractMesh:getNumTriangles() + return lib.MeshGetIndexCount(self._tovemesh) / 3 +end + +function AbstractMesh:getUsage(what) + return self._usage[what] +end + +function AbstractMesh:updateVertices() + local mesh = self._mesh + if mesh ~= nil then + local vdata = self._vdata + lib.MeshSetVertexBuffer( + self._tovemesh, vdata:getPointer(), vdata:getSize()) + mesh:setVertices(vdata) + end +end + +function AbstractMesh:updateTriangles() + local mesh = self._mesh + if mesh ~= nil then + local indexCount = lib.MeshGetIndexCount(self._tovemesh) + if indexCount < 1 then + return + end + local size = indexCount * indexSize + + if size ~= self._idatasize then + self._idata = love.data.newByteData(size) + self._idatasize = size + end + + local idata = self._idata + lib.MeshCopyIndexData( + self._tovemesh, idata:getPointer(), idata:getSize()) + + mesh:setVertexMap(idata, indexSize == 2 and "uint16" or "uint32") + else + self:getMesh() + end +end + +function AbstractMesh:cacheKeyFrame() + lib.MeshCacheKeyFrame(self._tovemesh) +end + +function AbstractMesh:setCacheSize(size) + lib.MeshSetCacheSize(self._tovemesh, size) +end + +function AbstractMesh:getMesh() + if self._mesh ~= nil then + return self._mesh + end + + local n = lib.MeshGetVertexCount(self._tovemesh) + if n < 1 then + return nil + end + + local ni = lib.MeshGetIndexCount(self._tovemesh) + if ni < 1 then + return nil + end + + local mesh = love.graphics.newMesh( + self._attributes, n, getTrianglesMode(self._tovemesh), self:getMeshUsage()) + self._mesh = mesh + self._vdata = love.data.newByteData(n * self._vertexByteSize) + + self:updateVertices() + self:updateTriangles() + + return mesh +end + + +local PositionMesh = {} +PositionMesh.__index = PositionMesh +setmetatable(PositionMesh, {__index = AbstractMesh}) +PositionMesh._attributes = {{"VertexPosition", "float", 2}} +PositionMesh._vertexByteSize = 2 * floatSize + +function PositionMesh:getMeshUsage() + return self._usage.points or "static" +end + +tove.newPositionMesh = function(name, usage) + return setmetatable({ + _name = name, + _tovemesh = ffi.gc(lib.NewMesh(name), lib.ReleaseMesh), + _mesh = nil, + _usage = usage or {}, + _vdata = nil}, PositionMesh) +end + + +local PaintMesh = {} +PaintMesh.__index = PaintMesh +setmetatable(PaintMesh, {__index = AbstractMesh}) +PaintMesh._attributes = { + {"VertexPosition", "float", 2}, + {"VertexPaint", "byte", 4}} +PaintMesh._vertexByteSize = 3 * floatSize + +function PaintMesh:getMeshUsage() + return self._usage.points or "static" +end + +tove.newPaintMesh = function(name, usage) + return setmetatable({ + _name = name, + _tovemesh = ffi.gc(lib.NewPaintMesh(name), lib.ReleaseMesh), + _mesh = nil, + _usage = usage or {}, + _vdata = nil}, PaintMesh) +end + + +local ColorMesh = {} +ColorMesh.__index = ColorMesh +setmetatable(ColorMesh, {__index = AbstractMesh}) +ColorMesh._attributes = { + {"VertexPosition", "float", 2}, + {"VertexColor", "byte", 4}} +ColorMesh._vertexByteSize = 2 * floatSize + 4 + +function ColorMesh:getMeshUsage() + local u = self._usage + local p = u.points + local c = u.colors + if p == "stream" or c == "stream" then + return "stream" + elseif p == "dynamic" or c == "dynamic" then + return "dynamic" + else + return "static" + end +end + +tove.newColorMesh = function(name, usage, tess) + local cmesh = ffi.gc(lib.NewColorMesh(name), lib.ReleaseMesh) + tess(cmesh, -1) + return setmetatable({ + _name = name, _tovemesh = cmesh, _mesh = nil, + _tess = tess, _usage = usage, + _vdata = nil}, ColorMesh) +end + +function ColorMesh:retesselate(flags) + local updated = self._tess(self._tovemesh, flags) + if bit.band(updated, lib.UPDATE_MESH_GEOMETRY) ~= 0 then + self._mesh = nil + return true -- the underlying mesh changed + end + + if bit.band(updated, + lib.UPDATE_MESH_VERTICES + + lib.UPDATE_MESH_COLORS) ~= 0 then + self:updateVertices() + end + if bit.band(updated, lib.UPDATE_MESH_TRIANGLES) ~= 0 then + self:updateTriangles() + end + + return false +end +end)() +local _shaders = (function() + +local lg = love.graphics + +local function createSendSync(shader, code, sync) + local embedded = code.embedded + local sent = {} + for i = 0, 1 do + local k = embedded[i] + if k ~= 0 then + table.insert(sent, tove._sent[k]) + end + end + if #sent == 0 then + return sync + else + local version = 0 + local max = math.max + return function() + local nversion = version + for _, s in ipairs(sent) do + for name, values in pairs(s) do + local v = values[1] + if v > version then + nversion = max(nversion, v) + shader:send(name, unpack(values[2])) + end + end + end + version = nversion + if sync ~= nil then + sync() + end + end + end +end + +local function newGeometryFillShader(data, sync, fragLine, meshBand, debug) + local geometry = data.geometry + + local code = lib.GetGPUXFillShaderCode( + data, fragLine, meshBand, debug) + + local shader = lg.newShader(ffi.string(code.code)) + + shader:send("constants", {geometry.maxCurves, + geometry.listsTextureSize[0], geometry.listsTextureSize[1]}) + + return shader, createSendSync(shader, code, sync) +end + +local function newGeometryLineShader(data, sync) + local style = data.color.line.style + if style < 1 then + return nil + end + + local code = lib.GetGPUXLineShaderCode(data) + + local shader = lg.newShader(ffi.string(code.code)) + + shader:send("max_curves", data.geometry.maxCurves) + + return shader, createSendSync(shader, code, sync) +end + +local function newPaintShader(numPaints, numGradients) + return lg.newShader(ffi.string(lib.GetPaintShaderCode(numPaints, numGradients))) +end + +local feed = (function() + +local function fillGradientData(gradient) + local n = gradient.numColors + + local matrixData = love.data.newByteData(env.matsize) + gradient.matrix = matrixData:getPointer() + + local imageData = love.image.newImageData(1, n, "rgba8") + gradient.numGradients = 1 + gradient.colorsTexture = imageData:getPointer() + gradient.colorsTextureRowBytes = imageData:getSize() / n + gradient.colorsTextureHeight = n + + local s = 0.5 / n + return {numColors = n, matrixData = matrixData, + imageData = imageData, texture = nil, cscale = {s, 1 - 2 * s}} +end + +local function newGradientTexture(d) + d.texture = lg.newImage(d.imageData) + d.texture:setFilter("nearest", "linear") + d.texture:setWrap("clamp", "clamp") +end + +local function reloadGradientTexture(d) + d.texture:replacePixels(d.imageData) +end + +local function sendColor(shader, uniform, rgba) + shader:send(uniform, {rgba.r, rgba.g, rgba.b, rgba.a}) +end + +local function makeSendLUT(feed, shader) + local bounds = feed.boundsByteData + local lutX, lutY = unpack(feed.lookupTableByteData) + local n = feed.data.lookupTableMeta.n + local floatSize = ffi.sizeof("float[?]", 1) + local meta = feed.lookupTableMetaByteData + + return function() + shader:send("bounds", bounds) + shader:send("lutX", lutX, 0, n[0] * floatSize) + shader:send("lutY", lutY, 0, n[1] * floatSize) + shader:send("tablemeta", meta) + end +end + +local function sendLineArgs(shader, data) + shader:send("lineargs", {data.strokeWidth / 2, data.miterLimit}) +end + + +local NullColorFeed = {} +NullColorFeed.__index = NullColorFeed + +function NullColorFeed:beginInit() +end +function NullColorFeed:endInit(path) +end +function NullColorFeed:updateUniforms(chg1, path) +end + + +local ColorSend = {} +ColorSend.__index = ColorSend + +local _flags = { + fill = lib.CHANGED_FILL_STYLE, + line = lib.CHANGED_LINE_STYLE +} + +local _uniforms = { + fill = {}, + line = {} +} + +for _, name in ipairs({"color", "colors", "matrix", "cscale"}) do + _uniforms.fill[name] = "fill" .. name + _uniforms.line[name] = "line" .. name +end + +local function newColorSend(shader, type, colorData) + if shader == nil then + return setmetatable({}, NullColorFeed) + end + return setmetatable({shader = shader, colorData = colorData, + uniforms = _uniforms[type], flag = _flags[type]}, ColorSend) +end + +function ColorSend:beginInit() + local colorData = self.colorData + if colorData.style >= lib.PAINT_LINEAR_GRADIENT then + self.gradientData = fillGradientData(colorData.gradient) + end +end + +function ColorSend:endInit(path) + local gradientData = self.gradientData + + if gradientData ~= nil then + newGradientTexture(gradientData) + end + + local colorData = self.colorData + local shader = self.shader + local uniforms = self.uniforms + + if colorData.style == lib.PAINT_SOLID then + sendColor(shader, uniforms.color, colorData.rgba) + elseif colorData.style >= lib.PAINT_LINEAR_GRADIENT then + shader:send(uniforms.colors, gradientData.texture) + shader:send(uniforms.matrix, gradientData.matrixData) + shader:send(uniforms.cscale, gradientData.cscale) + end +end + +function ColorSend:updateUniforms(chg1, path) + if bit.band(chg1, self.flag) ~= 0 then + local shader = self.shader + local uniforms = self.uniforms + local colorData = self.colorData + if colorData.style == lib.PAINT_SOLID then + sendColor(shader, uniforms.color, colorData.rgba) + elseif colorData.style >= lib.PAINT_LINEAR_GRADIENT then + local gradientData = self.gradientData + reloadGradientTexture(gradientData) + shader:send(uniforms.matrix, gradientData.matrixData) + shader:send(uniforms.cscale, gradientData.cscale) + end + end +end + + + +local MeshBands = {} +MeshBands.__index = MeshBands + +MeshBands.FLOATS_PER_VERTEX = {4, 2, 4} + +local function newMeshBands(data) + return setmetatable({ + data = data, + meshes = {nil, nil, nil}, + bandsVertexByteData = {nil, nil, nil}, + bandsVertexViewCache = {{}, {}, {}} + }, MeshBands) +end + +function MeshBands:initData() + local data = self.data + for i = 1, 3 do + local bandDataSize = ffi.sizeof( + "float[?]", data.maxBandsVertices * MeshBands.FLOATS_PER_VERTEX[i]) + local bandsByteData = love.data.newByteData(bandDataSize) + self.bandsVertexByteData[i] = bandsByteData + data.bandsVertices[i - 1] = bandsByteData:getPointer() + end +end + +function MeshBands:createMeshes(fillShader) + local data = self.data + + self.meshes[1] = love.graphics.newMesh( + {{"VertexPosition", "float", 2}, {"VertexTexCoord", "float", 2}}, + data.maxBandsVertices, + "triangles") + + self.meshes[2] = love.graphics.newMesh( + {{"VertexPosition", "float", 2}}, + data.maxBandsVertices, + "triangles") + + self.meshes[3] = love.graphics.newMesh( + {{"VertexPosition", "float", 2}, {"VertexTexCoord", "float", 2}}, + data.maxBandsVertices, + "triangles") + + local lg = love.graphics + + local drawUnsafeBands = function(...) + lg.setShader() + lg.draw(self.meshes[2], ...) + end + + return function(...) + lg.stencil(drawUnsafeBands, "replace", 1) + + lg.setShader(fillShader) + lg.draw(self.meshes[1], ...) + lg.setStencilTest("greater", 0) + lg.draw(self.meshes[3], ...) + lg.setStencilTest() + end +end + +local function bandsGetVertexView(self, i) + local size = self.data.numBandsVertices[i - 1] + local cache = self.bandsVertexViewCache[i] + local view = cache[size] + if view == nil and size > 0 then + view = love.data.newDataView( + self.bandsVertexByteData[i], 0, ffi.sizeof( + "float[?]", size * MeshBands.FLOATS_PER_VERTEX[i])) + cache[size] = view + end + return view, size +end + +function MeshBands:update() + for i, mesh in ipairs(self.meshes) do + local view, n = bandsGetVertexView(self, i) + if n > 0 then + mesh:setDrawRange(1, n) + mesh:setVertices(view) + end + end +end + + +local GeometrySend = {} +GeometrySend.__index = GeometrySend + +local function newGeometrySend(fillShader, lineShader, data, meshBand) + return setmetatable({ + fillShader = fillShader, + lineShader = lineShader, + numLineSegments = 0, + data = data, + bands = meshBand and newMeshBands(data) or nil, + boundsByteData = nil, + listsImageData = nil, + curvesImageData = nil, + lookupTableByteData = {nil, nil}, + lookupTableMetaByteData = nil, + _warmup = false}, GeometrySend) +end + +function GeometrySend:warmup() + if not self._warmup then + if self.fillShader ~= nil then + warmupShader(self.fillShader) + end + if self.lineShader ~= nil and self.lineShader ~= self.fillShader then + warmupShader(self.lineShader) + end + self._warmup = true + return true + else + return false + end +end + +function GeometrySend:beginInit() + local data = self.data + + + self.boundsByteData = love.data.newByteData(ffi.sizeof("ToveBounds")) + data.bounds = self.boundsByteData:getPointer() + + local listsImageData = love.image.newImageData( + data.listsTextureSize[0], data.listsTextureSize[1], + ffi.string(data.listsTextureFormat)) + data.listsTextureRowBytes = listsImageData:getSize() / data.listsTextureSize[1] + + local curvesImageData = love.image.newImageData( + data.curvesTextureSize[0], data.curvesTextureSize[1], + ffi.string(data.curvesTextureFormat)) + data.curvesTextureRowBytes = curvesImageData:getSize() / data.curvesTextureSize[1] + + data.listsTexture = listsImageData:getPointer() + data.curvesTexture = curvesImageData:getPointer() + + self.listsImageData = listsImageData + self.curvesImageData = curvesImageData + + for i = 1, 2 do + local lutData = love.data.newByteData( + ffi.sizeof("float[?]", data.lookupTableSize)) + self.lookupTableByteData[i] = lutData + data.lookupTable[i - 1] = lutData:getPointer() + end + + self.lookupTableMetaByteData = love.data.newByteData( + ffi.sizeof("ToveLookupTableMeta")) + data.lookupTableMeta = self.lookupTableMetaByteData:getPointer() + + if self.bands ~= nil then + self.bands:initData() + end +end + +local function makeDrawLine(feed) + local lineShader = feed.lineShader + local geometry = feed.data + local lg = love.graphics + + local lineMesh = love.graphics.newMesh( + {{0, -1}, {0, 1}, {1, -1}, {1, 1}}, "strip") + local lineJoinMesh = love.graphics.newMesh( + {{0, 0}, {1, -1}, {1, 1}, {-1, -1}, {-1, 1}}, "strip") + + local drawLine = function(...) + local lineRuns = geometry.lineRuns + if lineRuns == nil then + return + end + + lg.setShader(lineShader) + + local numSegments = feed.numLineSegments + for i = 0, geometry.numSubPaths - 1 do + local run = lineRuns[i] + local numCurves = run.numCurves + local numInstances = numSegments * numCurves + + lineShader:send("curve_index", run.curveIndex) + lineShader:send("num_curves", numCurves) + + lineShader:send("draw_mode", 0) + lg.drawInstanced(lineMesh, numInstances, ...) + + lineShader:send("draw_mode", 1) + lg.drawInstanced(lineJoinMesh, + numCurves - (run.isClosed and 0 or 1), ...) + end + end + + local bounds = ffi.cast("ToveBounds*", geometry.bounds) + + local drawTransparentLine = function(...) + local border = geometry.strokeWidth + geometry.miterLimit * 2 + lg.stencil(drawLine, "replace", 1) + lg.setStencilTest("greater", 0) + local x0, y0 = bounds.x0, bounds.y0 + lineShader:send("draw_mode", 2) + lg.rectangle("fill", + x0 - border, y0 - border, + bounds.x1 - x0 + 2 * border, + bounds.y1 - y0 + 2 * border) + lg.setStencilTest() + end + + return function(...) + if geometry.opaqueLine then + drawLine(...) + else + drawTransparentLine() + end + end +end + +function GeometrySend:endInit(lineStyle) + local listsTexture = love.graphics.newImage(self.listsImageData) + local curvesTexture = love.graphics.newImage(self.curvesImageData) + listsTexture:setFilter("nearest", "nearest") + listsTexture:setWrap("clamp", "clamp") + curvesTexture:setFilter("nearest", "nearest") + curvesTexture:setWrap("clamp", "clamp") + self.listsTexture = listsTexture + self.curvesTexture = curvesTexture + + local fillShader = self.fillShader + local lineShader = self.lineShader + local data = self.data + + if fillShader == nil then + self.drawFill = function() end + else + if self.bands == nil then + local mesh = love.graphics.newMesh( + {{"VertexPosition", "float", 2}}, + {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, "strip") + + local lg = love.graphics + + self.drawFill = function(...) + lg.setShader(fillShader) + lg.draw(mesh, ...) + end + else + self.drawFill = self.bands:createMeshes(fillShader) + end + end + + if fillShader ~= lineShader and lineShader ~= nil then + self.drawLine = makeDrawLine(self) + else + self.drawLine = function() end + end + + if self.bands == nil then + if fillShader ~= nil then + self._sendUniforms = makeSendLUT(self, fillShader) + else + self._sendUniforms = function() end + end + else + self._sendUniforms = function() self.bands:update() end + end + + self._sendUniforms() + + if fillShader ~= nil then + fillShader:send("lists", listsTexture) + fillShader:send("curves", curvesTexture) + end + + if lineShader ~= fillShader and lineShader ~= nil then + lineShader:send("curves", curvesTexture) + end + + if lineStyle > 0 and lineShader ~= nil then + sendLineArgs(lineShader, data) + end +end + +function GeometrySend:updateUniforms(flags) + if bit.band(flags, lib.CHANGED_POINTS) ~= 0 then + self._sendUniforms() + + if bit.band(flags, lib.CHANGED_LINE_ARGS) ~= 0 then + local fillShader = self.fillShader + local lineShader = self.lineShader + + if lineShader ~= nil then + sendLineArgs(lineShader, self.data) + elseif fillShader ~= nil then + sendLineArgs(fillShader, self.data) + end + end + + self.listsTexture:replacePixels(self.listsImageData) + self.curvesTexture:replacePixels(self.curvesImageData) + end +end + +return { + newColorSend = newColorSend, + newGeometrySend = newGeometrySend +} +end)() + +local MeshShader = {} +MeshShader.__index = MeshShader + +local function newMeshFeedData(name, graphics, tess, usage, resolution) + local mesh = tove.newPaintMesh(name, usage) + tess(mesh._tovemesh, lib.UPDATE_MESH_EVERYTHING) + + local link = ffi.gc( + lib.NewColorFeed(graphics._ref, resolution), lib.ReleaseFeed) + + local alloc = lib.FeedGetColorAllocation(link) + local matrixData = love.data.newByteData( + (1 + alloc.numGradients) * env.matsize) + local imageData = love.image.newImageData( + alloc.numPaints, alloc.numColors, "rgba8") + local colorsTexture = lg.newImage(imageData) + local gradientData = ffi.new("ToveGradientData") + gradientData.numColors = alloc.numColors + gradientData.numGradients = alloc.numGradients + gradientData.matrix = matrixData:getPointer() + gradientData.matrixRows = env.matrows + gradientData.colorsTexture = imageData:getPointer() + gradientData.colorsTextureRowBytes = imageData:getSize() / alloc.numColors + gradientData.colorsTextureHeight = alloc.numColors + lib.FeedBindPaintIndices(link, gradientData) + local paintShader = newPaintShader(alloc.numPaints, alloc.numGradients) + colorsTexture:setFilter("nearest", "linear") + colorsTexture:setWrap("clamp", "clamp") + + lib.FeedEndUpdate(link) + + colorsTexture:replacePixels(imageData) + paintShader:send("matrix", matrixData) + paintShader:send("colors", colorsTexture) + paintShader:send("cstep", 0.5 / gradientData.colorsTextureHeight) + + lib.GraphicsClearChanges(graphics._ref) + + return { + link = link, + mesh = mesh, + shader = paintShader, + + matrixData = matrixData, + imageData = imageData, + colorsTexture = colorsTexture + } +end + +local newMeshShader = function(name, graphics, tess, usage, resolution) + return setmetatable({ + graphics = graphics, tess = tess, usage = usage, _name = name, + resolution = resolution, + linkdata = newMeshFeedData( + name, graphics, tess, usage, resolution)}, MeshShader) +end + +function MeshShader:getMesh() + return self.linkdata.mesh +end + +function MeshShader:recreate() + tove.warn("full mesh recreation triggered in " .. tove._str(self._name)) + self.linkdata = newMeshFeedData( + self.name, self.graphics, self.tess, self.usage, self.resolution) +end + +function MeshShader:update() + local linkdata = self.linkdata + local graphics = self.graphics + + local flags = graphics:fetchChanges(lib.CHANGED_POINTS + lib.CHANGED_GEOMETRY) + + if bit.band(flags, lib.CHANGED_GEOMETRY) ~= 0 then + self:recreate() + return + elseif bit.band(flags, lib.CHANGED_POINTS) ~= 0 then + if self.usage["points"] == "static" then + tove.slow("static mesh points changed in " .. tove._str(self._name)) + self:recreate() + return + end + + local tessFlags = lib.UPDATE_MESH_VERTICES + if self.usage["triangles"] ~= "static" then + tessFlags = bit.bor(tessFlags, lib.UPDATE_MESH_AUTO_TRIANGLES) + end + local updated = self.tess(linkdata.mesh._tovemesh, tessFlags) + + linkdata.mesh:updateVertices() + if bit.band(updated, lib.UPDATE_MESH_TRIANGLES) ~= 0 then + linkdata.mesh:updateTriangles() + end + end + + local link = linkdata.link + local chg1 = lib.FeedBeginUpdate(link) + + if chg1 ~= 0 then + if bit.band(chg1, lib.CHANGED_RECREATE) ~= 0 then + self:recreate() + return + end + + lib.FeedEndUpdate(link) + linkdata.colorsTexture:replacePixels(linkdata.imageData) + local shader = linkdata.shader + shader:send("matrix", linkdata.matrixData) + end +end + +function MeshShader:draw(...) + local linkdata = self.linkdata + local mesh = linkdata.mesh:getMesh() + if mesh ~= nil then + lg.setShader(linkdata.shader) + lg.draw(mesh, ...) + lg.setShader(nil) + end +end + +function MeshShader:warmup(...) + warmupShader(self.linkdata.shader) +end + +local function setLineQuality(linkData, lineQuality) + linkData.lineQuality = lineQuality + if linkData.data.color.line.style > 0 then + if linkData.lineShader == linkData.fillShader then + linkData.fillShader:send("line_quality", lineQuality) + else + local numSegments = math.max(2, math.ceil(50 * lineQuality)) + linkData.lineShader:send("segments_per_curve", numSegments) + linkData.geometryFeed.numLineSegments = numSegments + end + end +end + +local ComputeShader = {} +ComputeShader.__index = ComputeShader + +local function parseQuality(q) + local lineType = "fragment" + local lineQuality = 1.0 + if type(q) == "table" then + lineType = q[1] or "fragment" + lineQuality = q[2] or 1.0 + if lineType == "vertex" then + if not env.graphics.instancing then + tove.warn("falling back on fragment line mode.") + lineType = "fragment" + lineQuality = 1 + end + elseif lineType ~= "fragment" then + error("line type must be \"fragment\" or \"vertex\".") + end + end + return lineType, lineQuality +end + +local function newComputeFeedData(path, quality, debug) + local lineType, lineQuality = parseQuality(quality) + local fragLine = (lineType == "fragment") + local syncShader = nil + + local meshBand = false + + local link = ffi.gc( + lib.NewGeometryFeed(path, fragLine), lib.ReleaseFeed) + local data = lib.FeedGetData(link) + + lib.FeedBeginUpdate(link) + + local fillShader = nil + if fragLine or data.color.fill.style > 0 then + fillShader, syncShader = newGeometryFillShader( + data, nil, fragLine, meshBand, debug or false) + end + + local lineShader + if fragLine then + lineShader = fillShader + else + lineShader, syncShader = newGeometryLineShader(data, syncShader) + end + + local lineColorSend = feed.newColorSend( + lineShader, "line", data.color.line) + lineColorSend:beginInit() + local fillColorSend = feed.newColorSend( + fillShader, "fill", data.color.fill) + fillColorSend:beginInit() + + local geometryFeed = feed.newGeometrySend( + fillShader, lineShader, data.geometry, meshBand) + geometryFeed:beginInit() + + lib.FeedEndUpdate(link) + + lineColorSend:endInit(path) + fillColorSend:endInit(path) + geometryFeed:endInit(data.color.line.style) + + local linkData = { + link = link, + data = data, + fillShader = fillShader, + lineShader = lineShader, + syncShader = syncShader, + lineType = lineType, + quality = quality, + lineQuality = lineQuality, + geometryFeed = geometryFeed, + lineColorSend = lineColorSend, + fillColorSend = fillColorSend, + paintOrder = lib.PathHasNormalFillStrokeOrder(path) + } + setLineQuality(linkData, lineQuality) + return linkData +end + +local newComputeShader = function(path, quality) + return setmetatable({ + path = path, + linkdata = newComputeFeedData(path, quality) + }, ComputeShader) +end + +function ComputeShader:update() + local path = self.path + local linkdata = self.linkdata + local link = linkdata.link + + local sync = linkdata.syncShader + if sync ~= nil then sync() end + + local chg1 = lib.FeedBeginUpdate(link) + + if bit.band(chg1, lib.CHANGED_RECREATE) ~= 0 then + self.linkdata = newComputeFeedData(path, linkdata.quality) + return + end + + local chg2 = lib.FeedEndUpdate(link) + + linkdata.lineColorSend:updateUniforms(chg1, path) + linkdata.fillColorSend:updateUniforms(chg1, path) + + linkdata.geometryFeed:updateUniforms(chg2) +end + +function ComputeShader:updateQuality(quality) + local linkdata = self.linkdata + linkdata.quality = quality + local lineType, lineQuality = parseQuality(quality) + if lineType == linkdata.lineType then + setLineQuality(linkdata, lineQuality) + return true + else + return false + end +end + +function ComputeShader:draw(...) + local linkdata = self.linkdata + local feed = linkdata.geometryFeed + if linkdata.paintOrder then + feed.drawFill(...) + feed.drawLine(...) + else + feed.drawLine(...) + feed.drawFill(...) + end +end + +function ComputeShader:warmup(...) + return self.linkdata.geometryFeed:warmup(...) +end + +function ComputeShader:debug(curve) + if curve == "off" then + self.linkdata = newComputeFeedData( + self.path, self.linkdata.quality, false) + self.debugging = nil + return + end + if self.debugging == nil then + self.debugging = true + + self.linkdata = newComputeFeedData( + self.path, self.linkdata.quality, true) + end + self.linkdata.fillShader:send("debug_curve", curve) +end + +return { + newMeshShader = newMeshShader, + newComputeShader = newComputeShader +} +end)() +local Graphics = (function() + +--- A vector graphics. + +local createTesselator = (function() + +tove.newAdaptiveTesselator = function(resolution, recursionLimit) + return ffi.gc(lib.NewAdaptiveTesselator( + resolution or 128, recursionLimit or 8), lib.ReleaseTesselator) +end + +tove.newRigidTesselator = function(subdivisions) + return ffi.gc(lib.NewRigidTesselator( + subdivisions), lib.ReleaseTesselator) +end + +return function (usage, quality, ...) + local t = type(quality) + if t == "string" then + if quality == "rigid" then + return tove.newRigidTesselator(...) + elseif quality == "adaptive" then + return tove.newAdaptiveTesselator(...) + else + error("tesselator must be \"rigid\" or \"adaptive\".") + end + elseif t == "number" then + if usage["points"] ~= "static" then + return tove.newRigidTesselator( + math.log(quality) / math.log(2), "cw") + else + return tove.newAdaptiveTesselator(quality) + end + elseif t == "nil" then + if usage["points"] ~= "static" then + return tove.newRigidTesselator(4, "cw") + else + return tove.newAdaptiveTesselator(128) + end + else + return quality + end +end +end)() + +local function gcpath(p) + return p and ffi.gc(p, lib.ReleasePath) +end + +---@{tove.List} of @{Path}s in this @{Graphics} + +local Paths = {} +Paths.__index = function (self, i) + if i == "count" then + return lib.GraphicsGetNumPaths(self._ref) + else + local t = type(i) + if t == "number" then + return gcpath(lib.GraphicsGetPath(self._ref, i)) + elseif t == "string" then + return gcpath(lib.GraphicsGetPathByName(self._ref, i)) + end + end +end + +local Graphics = {} +Graphics.__index = Graphics + +local function bind(methodName, libFuncName) + Graphics[methodName] = function(self, ...) + lib[libFuncName](self._ref, ...) + return self + end +end + +local function newUsage() + return {points = "static", colors = "static"} +end + +--- Create a new Graphics. +tove.newGraphics = function(data, size) + local svg = nil + if type(data) == "string" then + svg = data + end + local name = "unnamed" + if tove.getReportLevel() == lib.TOVE_REPORT_DEBUG then + name = "Graphics originally created at " .. debug.traceback() + end + local ref = ffi.gc(lib.NewGraphics(svg, "px", 72), lib.ReleaseGraphics) + local graphics = setmetatable({ + _ref = ref, + _cache = nil, + _display = {mode = "texture", quality = {}}, + _resolution = 1, + _usage = newUsage(), + _name = ffi.gc(lib.NewName(name), lib.ReleaseName), + paths = setmetatable({_ref = ref}, Paths)}, Graphics) + if type(data) == "table" then + for _, p in ipairs(data.paths) do + graphics:addPath(tove.newPath(p)) + end + mode, quality = unpack(data.display) + graphics:setDisplay(mode, unpack(quality)) + for k, v in pairs(data.usage) do + graphics:setUsage(k, v) + end + end + if data then + if size == "copy" then + elseif type(size) == "number" then + graphics:rescale(size) + elseif size == nil or size == "auto" then + local x0, y0, x1, y1 = graphics:computeAABB() + graphics:rescale(math.min(1024, math.max(x1 - x0, y1 - y0))) + end + end + return graphics +end + +--- Remove all @{Path}s. +function Graphics:clear() + lib.GraphicsClear(self._ref) +end + +local function attachTesselator(display, usage) + if display.mode == "mesh" then + display.tesselator = createTesselator(usage, unpack(display.quality)) + end + return display +end + +local function makeDisplay(mode, quality, usage) + local clonedQuality = quality + if type(quality) == "table" then + clonedQuality = deepcopy(quality) + else + quality = quality or 1 + end + return attachTesselator({mode = mode, quality = clonedQuality, + tesselator = nil}, usage) +end + +--- Set name. +function Graphics:setName(name) + lib.NameSet(self._name, name) +end + +--- Create a deep copy. +function Graphics:clone() + local ref = lib.CloneGraphics(self._ref, true) + local d = self._display + local g = setmetatable({ + _ref = ref, + _cache = nil, + _display = makeDisplay(d.mode, d.quality, self._usage), + _resolution = self._resolution, + _usage = newUsage(), + _name = ffi.gc(lib.CloneName(self._name), lib.ReleaseName), + paths = setmetatable({_ref = ref}, Paths)}, Graphics) + for k, v in pairs(self._usage) do + g._usage[k] = v + end + return g +end + +--- Start a fresh @{Path} for drawing. +function Graphics:beginPath() + return ffi.gc(lib.GraphicsBeginPath(self._ref), lib.ReleasePath) +end + +--- Close the current @{Path}, thereby creating a loop. + +bind("closePath", "GraphicsClosePath") + +--- Inside the current @{Path}, start a fresh @{Subpath}. + +function Graphics:beginSubpath() + return ffi.gc(lib.GraphicsBeginSubpath(self._ref), lib.ReleaseSubpath) +end + +--- Inside the current @{Path}, close the current @{Subpath}, thereby creating a loop. + +function Graphics:closeSubpath() + lib.GraphicsCloseSubpath(self._ref, true) +end +bind("invertSubpath", "GraphicsInvertSubpath") + +--- Get the current @{Path} for drawing. + +function Graphics:getCurrentPath() + return gcpath(lib.GraphicsGetCurrentPath(self._ref)) +end + +--- Add a @{Path}. + +bind("addPath", "GraphicsAddPath") + +--- Remove a @{Path}. + +bind("removePath", "GraphicsRemovePath") + +function Graphics:fetchChanges(flags) + return lib.GraphicsFetchChanges(self._ref, flags) +end + +--- Move to position (x, y). + +function Graphics:moveTo(x, y) + lib.GraphicsCloseSubpath(self._ref, false) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathMoveTo(t, x, y)) +end + +--- Draw a line to (x, y). + +function Graphics:lineTo(x, y) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathLineTo(t, x, y)) +end + +--- Draw a cubic Bézier curve to (x, y). + +function Graphics:curveTo(...) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathCurveTo(t, ...)) +end + +--- Draw an arc. + +function Graphics:arc(x, y, r, startAngle, endAngle, ccw) + lib.SubpathArc(self:beginSubpath(), x, y, r, startAngle, endAngle, ccw or false) +end + +--- Draw a rectangle. + +function Graphics:drawRect(x, y, w, h, rx, ry) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathDrawRect(t, x, y, w, h or w, rx or 0, ry or 0)) +end + +--- Draw a circle. + +function Graphics:drawCircle(x, y, r) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathDrawEllipse(t, x, y, r, r)) +end + +--- Draw an ellipse. + +function Graphics:drawEllipse(x, y, rx, ry) + local t = self:beginSubpath() + return newCommand(t, lib.SubpathDrawEllipse(t, x, y, rx, ry or rx)) +end + +--- Set fill color. + +function Graphics:setFillColor(r, g, b, a) + local color = Paint._wrap(r, g, b, a) + lib.GraphicsSetFillColor(self._ref, color) + return color +end + +--- Set line dash pattern. + +function Graphics:setLineDash(...) + local dashes = {...} + local n = #dashes + local data = ffi.new("float[" .. tostring(n) .. "]", dashes) + lib.GraphicsSetLineDash(self._ref, data, n) + return self +end + +--- Set line width. + +bind("setLineWidth", "GraphicsSetLineWidth") + +--- Set miter limit. + +bind("setMiterLimit", "GraphicsSetMiterLimit") + +--- Set line dash offset. + +bind("setLineDashOffset", "GraphicsSetLineDashOffset") + +--- Rotate elements. + +function Graphics:rotate(w, k) + lib.GraphicsRotate(tove.elements[w], k) +end + +--- Set line color. + +function Graphics:setLineColor(r, g, b, a) + local color = Paint._wrap(r, g, b, a) + lib.GraphicsSetLineColor(self._ref, color) + return color +end + +--- Add fill to shape. + +bind("fill", "GraphicsFill") + +--- Add stroke to shape. + +bind("stroke", "GraphicsStroke") + +--- Compute bounding box. + +function Graphics:computeAABB(prec) + local bounds = ffi.new("ToveBounds") + lib.GraphicsGetBounds(self._ref, prec == "high", bounds) + return bounds.x0, bounds.y0, bounds.x1, bounds.y1 +end + +--- Get width. + +function Graphics:getWidth(prec) + local bounds = ffi.new("ToveBounds") + lib.GraphicsGetBounds(self._ref, prec == "high", bounds) + return bounds.x1 - bounds.x0 +end + +--- Get height. + +function Graphics:getHeight(prec) + local bounds = ffi.new("ToveBounds") + lib.GraphicsGetBounds(self._ref, prec == "high", bounds) + return bounds.y1 - bounds.y0 +end + +--- Set display mode. + +function Graphics:setDisplay(mode, ...) + local quality = {...} + if mode.__index == Graphics then + local g = mode + mode = g._display.mode + quality = g._display.quality + end + if self._cache ~= nil and mode == self._display.mode then + if self._cache.updateQuality(quality) then + self._display = makeDisplay(mode, quality, self._usage) + return + end + end + self._cache = nil + self._display = makeDisplay(mode, quality, self._usage) + self:setResolution(1) +end + +--- Get display mode. + +function Graphics:getDisplay() + return self._display.mode, unpack(self._display.quality) +end + +--- Get display quality. + +function Graphics:getQuality() + return unpack(self._display.quality) +end + +--- Get usage. + +function Graphics:getUsage() + return self._usage +end + +--- Set resolution. + +function Graphics:setResolution(resolution) + if resolution ~= self._resolution then + self._cache = nil + self._resolution = resolution + end +end + +--- Set usage. + +function Graphics:setUsage(what, usage) + if what.__index == Graphics then + for k, v in pairs(what._usage) do + self:setUsage(k, v) + end + end + if usage ~= self._usage[what] then + self._cache = nil + self._usage[what] = usage + if what == "points" then + self._usage["triangles"] = usage + end + attachTesselator(self._display, self._usage) + end +end + +--- Clear internal drawing cache. + +function Graphics:clearCache() + self._cache = nil +end + +--- Cache the current shape as key frame. + +function Graphics:cacheKeyFrame() + self:_create() + self._cache.cacheKeyFrame(self._cache) +end + +--- Set internal key frame cache size. + +function Graphics:setCacheSize(size) + self:_create() + self._cache.setCacheSize(self._cache, size) +end + +function Graphics:set(arg, swl) + if getmetatable(arg) == tove.Transform then + lib.GraphicsSet( + self._ref, + arg.s._ref, + swl or false, + unpack(arg.args)) + else + lib.GraphicsSet( + self._ref, + arg._ref, + false, 1, 0, 0, 0, 1, 0) + end +end + +--- Transform this @{Graphics}. + +function Graphics:transform(...) + self:set(tove.transformed(self, ...)) +end + +--- Rescale to given size. + +function Graphics:rescale(size, center) + local x0, y0, x1, y1 = self:computeAABB() + local r = math.max(x1 - x0, y1 - y0) + if math.abs(r) > 1e-8 then + local s = size / r + if center or true then + self:set(tove.transformed( + self, 0, 0, 0, s, s, (x0 + x1) / 2, (y0 + y1) / 2), true) + else + self:set(tove.transformed(self, 0, 0, 0, s, s), true) + end + end +end + +--- Get number of triangles. + +function Graphics:getNumTriangles() + self:_create() + if self._cache ~= nil and self._cache.mesh ~= nil then + return self._cache.mesh:getNumTriangles() + else + return 2 + end +end + +--- Draw to screen. + +function Graphics:draw(x, y, r, sx, sy) + self:_create().draw(x, y, r, sx, sy) +end + +--- Warm-up shaders. + +function Graphics:warmup() + local r = self:_create().warmup() + love.graphics.setShader() + return r +end + +--- Rasterize as bitmap. + +function Graphics:rasterize(width, height, tx, ty, scale, settings) + if width == "default" then + settings = height -- second arg + + local resolution = self._resolution * tove._highdpi + local x0, y0, x1, y1 = self:computeAABB("high") + + x0 = math.floor(x0) + y0 = math.floor(y0) + x1 = math.ceil(x1) + y1 = math.ceil(y1) + + if x1 - x0 < 1 or y1 - y0 < 1 then + return nil + end + + return self:rasterize( + resolution * (x1 - x0), + resolution * (y1 - y0), + -x0 * resolution, + -y0 * resolution, + resolution, settings), x0, y0, x1, y1, resolution + end + + width = math.ceil(width) + height = math.ceil(height) + + local imageData = love.image.newImageData(width, height, "rgba8") + local stride = imageData:getSize() / height + lib.GraphicsRasterize( + self._ref, imageData:getPointer(), width, height, stride, + tx or 0, ty or 0, scale or 1, settings) + + return imageData +end + +--- Animate between two @{Graphics}. + +function Graphics:animate(a, b, t) + lib.GraphicsAnimate(self._ref, a._ref, b._ref, t or 0) +end + +--- Warp points. + +function Graphics:warp(f) + local paths = self.paths + for i = 1, paths.count do + paths[i]:warp(f) + end +end + +local orientations = { + cw = lib.TOVE_ORIENTATION_CW, + ccw = lib.TOVE_ORIENTATION_CCW +} + +--- Set orientation of all @{Subpath}s. + +function Graphics:setOrientation(orientation) + lib.GraphicsSetOrientation(self._ref, orientations[orientation]) +end + +--- Clean paths. + +function Graphics:clean(eps) + lib.GraphicsClean(self._ref, eps or 1e-2) +end + +--- Check if inside. + +function Graphics:hit(x, y) + local path = lib.GraphicsHit(self._ref, x, y) + if path.ptr ~= nil then + return gcpath(path) + else + return nil + end +end + +function Graphics:shaders(gen) + local npaths = lib.GraphicsGetNumPaths(self._ref) + local shaders = {} + for i = 1, npaths do + shaders[i] = gen(lib.GraphicsGetPath(self._ref, i)) + end + return shaders +end + +--- Set all colors to one. + +function Graphics:setMonochrome(r, g, b) + local paths = self.paths + r = r or 1 + g = g or 1 + b = b or 1 + for i = 1, paths.count do + local p = paths[i] + if p:getFillColor() ~= nil then + p:setFillColor(r, g, b) + end + p:setLineColor(r, g, b) + end +end + +function Graphics:setAnchor(dx, dy, prec) + dx = dx or 0 + dy = dy or 0 + local x0, y0, x1, y1 = self:computeAABB(prec) + local ox = ((dx <= 0 and x0 or x1) + (dx < 0 and x0 or x1)) / 2 + local oy = ((dy <= 0 and y0 or y1) + (dy < 0 and y0 or y1)) / 2 + self:set(tove.transformed(self, -ox, -oy)) +end + +function Graphics:serialize() + local paths = self.paths + local p = {} + for i = 1, paths.count do + p[i] = paths[i]:serialize() + end + local d = self._display + return {version = 1, + paths = p, + display = {d.mode, d.quality}, + usage = self._usage} +end + +function Graphics:debug(...) + if self._cache ~= nil and self._cache.debug ~= nil then + self._cache.debug(...) + end +end + +local create = (function() + +local function createDrawMesh(mesh, x0, y0, s) + if mesh == nil then + return function (x, y, r, sx, sy) + end + else + local draw = love.graphics.draw + return function (x, y, r, sx, sy) + sx = sx or 1 + sy = sy or 1 + x = (x or 0) + x0 * sx + y = (y or 0) + y0 * sy + draw(mesh, x, y, r or 0, s * sx, s * sy) + end + end +end + +local function createDrawShaders(shaders) + local setShader = love.graphics.setShader + return function(...) + for _, s in ipairs(shaders) do + s:draw(...) + end + setShader() + end +end + +local function _updateBitmap(graphics) + return graphics:fetchChanges(lib.CHANGED_ANYTHING) ~= 0 +end + +local function _makeDrawFlatMesh(mesh) + return createDrawMesh(mesh:getMesh(), 0, 0, 1) +end + +local function _updateFlatMesh(graphics) + local flags = graphics:fetchChanges(lib.CHANGED_ANYTHING) + if flags >= lib.CHANGED_GEOMETRY then + return true -- recreate from scratch + end + + if bit.band(flags, lib.CHANGED_FILL_STYLE + lib.CHANGED_LINE_STYLE) ~= 0 then + return true -- recreate from scratch (might no longer be flat) + end + + if bit.band(flags, lib.CHANGED_POINTS) ~= 0 then + local mesh = graphics._cache.mesh + if mesh:getUsage("points") == "static" then + tove.slow("static mesh points changed in " .. tove._str(graphics._name)) + end + local tessFlags = lib.UPDATE_MESH_VERTICES + if graphics._usage["triangles"] ~= "static" then + tessFlags = bit.bor(tessFlags, lib.UPDATE_MESH_AUTO_TRIANGLES) + end + if mesh:retesselate(tessFlags) then + graphics._cache.draw = _makeDrawFlatMesh(mesh) + end + end + + return false +end + +local function _updateShaders(graphics) + if graphics:fetchChanges(lib.CHANGED_GEOMETRY) ~= 0 then + return true + end + for _, s in ipairs(graphics._cache.shaders) do + s:update() + end + return false +end + +local create = {} + +local function _noCache() +end + +create.texture = function(self) + local quality = self._display.quality + local settings = ffi.new("ToveRasterizeSettings") + local palette -- keep until rasterized + local mode = quality[1] + + if mode == "fast" then + lib.SetRasterizeSettings(settings, "fast", lib.NoPalette(), 1, 0, nil, 0) + elseif (mode or "best") == "best" then + local _, noise, spread, algo, palette = unpack(quality) + local noiseData, noiseDataSize = nil, 0 + if type(noise) == "table" then + local data, amount = unpack(noise) + noise = amount + noiseData = data:getPointer() + noiseDataSize = math.floor(math.sqrt(data:getSize() / ffi.sizeof("float"))) + end + if not lib.SetRasterizeSettings( + settings, algo or "jarvis", palette or lib.NoPalette(), spread or 1, + noise or 0.01, noiseData, noiseDataSize) then + error(table.concat({"illegal rasterize settings:", unpack(quality)}, " ")) + end + elseif mode == "retro" then + local _, ipal, algo, spread, noise = unpack(quality) + local size + if ipal == nil then + palette = lib.NoPalette() + elseif type(ipal) == "string" then + palette = lib.DefaultPalette(ipal) + elseif type(ipal) == "table" then + size = #ipal + local colors = ffi.new("uint8_t[?]", size * 3) + local i = 0 + for _, c in ipairs(ipal) do + if type(c) == "table" then + colors[i] = c[1] * 255 + colors[i + 1] = c[2] * 255 + colors[i + 2] = c[3] * 255 + elseif c:sub(1, 1) == '#' then + colors[i] = tonumber("0x" .. c:sub(2, 3)) + colors[i + 1] = tonumber("0x" .. c:sub(4, 5)) + colors[i + 2] = tonumber("0x" .. c:sub(6, 7)) + end + i = i + 3 + end + palette = ffi.gc(lib.NewPalette(colors, size), lib.ReleasePalette) + else + palette = ipal + end + + if not lib.SetRasterizeSettings( + settings, algo or "stucki", palette, spread or 1, noise or 0, nil, 0) then + error(table.concat({"illegal rasterize settings:", unpack(quality)}, " ")) + end + else + error("illegal texture quality " .. tostring(quality[1])) + end + + local imageData, x0, y0, x1, y1, resolution = + self:rasterize("default", settings) + + if imageData == nil then + return { + draw = function() end, + update = _updateBitmap, + cacheKeyFrame = _noCache, + setCacheSize = _noCache + } + end + + local image = love.graphics.newImage(imageData) + image:setFilter("linear", "linear") + + return { + mesh = image, + draw = createDrawMesh(image, x0, y0, 1 / resolution), + warmup = function() end, + update = _updateBitmap, + updateQuality = function() return false end, + cacheKeyFrame = _noCache, + setCacheSize = _noCache + } +end + +local function _cacheMeshKeyFrame(data) + data.mesh:cacheKeyFrame() +end + +local function _setMeshCashSize(data, size) + data.mesh:setCacheSize(size) +end + +create.mesh = function(self) + local display = self._display + local tsref = display.tesselator + local usage = self._usage + local name = self._name + + local gref = self._ref + local tess = function(cmesh, flags) + return lib.TesselatorTessGraphics(tsref, gref, cmesh, flags) + end + + if lib.GraphicsAreColorsSolid(self._ref) or + usage["shaders"] == "avoid" then + + local mesh = tove.newColorMesh(name, usage, tess) + local x0, y0, x1, y1 = self:computeAABB() + return { + mesh = mesh, + draw = _makeDrawFlatMesh(mesh), + warmup = function() end, + update = _updateFlatMesh, + updateQuality = function() return false end, + cacheKeyFrame = _cacheMeshKeyFrame, + setCacheSize = _setMeshCashSize + } + else + local shader = _shaders.newMeshShader( + name, self, tess, usage, 1) + + return { + mesh = shader:getMesh(), + draw = function(...) shader:draw(...) end, + warmup = function() + if shader:warmup() then + return 1 + end + end, + update = function() shader:update() end, + updateQuality = function() return false end, + cacheKeyFrame = _cacheMeshKeyFrame, + setCacheSize = _setMeshCashSize + } + end +end + +create.gpux = function(self) + local quality = self._display.quality + local shaders = self:shaders(function(path) + return _shaders.newComputeShader(path, quality) + end) + return { + shaders = shaders, + draw = createDrawShaders(shaders), + warmup = function(...) + for i, s in ipairs(shaders) do + if s:warmup(...) then + return i / #shaders + end + end + end, + update = _updateShaders, + updateQuality = function(quality) + for _, s in ipairs(shaders) do + if not s:updateQuality(quality) then + return false + end + end + return true + end, + debug = function(i, ...) + shaders[i]:debug(...) + end, + cacheKeyFrame = _noCache, + setCacheSize = _noCache + } +end + +return function(self) + local cache = self._cache + if cache ~= nil then + if not cache.update(self) then + return cache + end + self._cache = nil + cache = nil + end + + local mode = self._display.mode + local f = create[mode] + if f ~= nil then + self._cache = f(self) + else + error("invalid tove display mode: " .. (mode or "nil")) + end + self:fetchChanges(lib.CHANGED_ANYTHING) -- clear all changes + return self._cache +end +end)() +Graphics._create = create +end)() +local Shape = (function() + + +--- @module stage + +--- A container which allows you to draw a couple of things with one draw call. + +local g = love.graphics + +local Container = {} +Container.__index = Container + +--- x position + +--- y position + +--- rotation in radians + +--- x scale factor + +--- y scale factor + +--- Create new container. +tove.newContainer = function() + return setmetatable({x = 0, y = 0, r = 0, sx = 1, sy = 1, + _children = {}}, Container) +end + +--- Draw container and its children. +function Container:draw() + if next(self._children) ~= nil then + g.push("transform") + + g.translate(self.x, self.y) + g.rotate(self.r) + g.scale(self.sx, self.sy) + + for _, child in ipairs(self._children) do + child:draw() + end + + g.pop() + end +end + +--- Add child(ren). +function Container:addChild(...) + for _, child in ipairs({...}) do + table.insert(self._children, child) + end +end + +--- Add child(ren) at position. +function Container:addChildAt(...) + local args = {...} + local at = args[#p] + args[#p] = nil + for i, child in ipairs(args) do + table.insert(self._children, at + i - 1, child) + end +end + +local function remove(t, x) + for i, y in ipairs(t) do + if x == y then + table.remove(t, i) + break + end + end +end + +--- Remove child(ren). +function Container:removeChild(...) + for _, child in ipairs({...}) do + remove(self._children, child) + end +end + +--- Remove child(ren) at position. + +function Container:removeChildAt(...) + local j = {...} + table.sort(j, function(a, b) return a > b end) + for _, i in ipairs(j) do + table.remove(self._children, i) + end +end + +--- Move child to position. +function Container:setChildIndex(child, index) + self:removeChild(child) + self:addChildAt(child, index) +end + +--- @type Stage + +--- Create new stage. + +tove.newStage = function() + return tove.newContainer() +end + + +--- @type Shape + +local Shape = {} +Shape.__index = Shape + +---@number x x position + +---@number y y position + +---@number rotation rotation in radians + +---@number sx x scale factor + +---@number sy y scale factor + +--- Create new shape. + +tove.newShape = function(graphics) + if graphics == nil then + graphics = tove.newGraphics() + end + return setmetatable({graphics = graphics, x = 0, y = 0, + r = 0, sx = 1, sy = 1, animation = nil}, Shape) +end + +function Shape:animate(t) + if self.animation ~= nil then + if not self.animation:animate(self, t) then + self.animation = nil + end + end + + for _, child in ipairs(self.children) do + child:animate(t) + end +end + +--- Draw. + +function Shape:draw() + self.graphics:draw(self.x, self.y, self.r, self.sx, self.sy) +end + +--- Set display mode. + +function Shape:setDisplay(...) + self.graphics:setDisplay(...) +end + +function Shape:setFillColor(...) + for _, path in self._graphics.paths do + path:setFillColor(...) + end +end + +return Shape +end)() + +local Animation = (function() + +local function _linear(x) + return x +end + + +--- @module animation + +--- A tween. + +local Tween = {} +Tween.__index = Tween + +--- Create new tween. + +tove.newTween = function(graphics) + return setmetatable({_graphics0 = graphics, _to = {}, _duration = 0, _morph = false}, Tween) +end + +tove.newMorph = function(graphics) + local t = tove.newTween(graphics) + t._morph = true + return t +end + +--- Add new tween step. + +function Tween:to(graphics, duration, ease) + table.insert(self._to, {graphics = graphics, duration = duration, ease = ease or _linear}) + self._duration = self._duration + duration + return self +end + +local function morphify(graphics) + local n = #graphics + local refs = ffi.new("ToveGraphicsRef[?]", n) + for i, g in ipairs(graphics) do + refs[i - 1] = g._ref + end + lib.GraphicsMorphify(refs, n) +end + +local function createGraphics(graphics) + if type(graphics) == "string" then + graphics = tove.newGraphics(graphics) + end + return graphics +end + + +--- A flipbook. + +local Flipbook = {} + +--- Create new flipbook. +tove.newFlipbook = function(fps, tween, ...) + display = {...} + if next(display) == nil then + display = {"texture"} + end + local frames = {} + local looping = tween._graphics0 == tween._to[#tween._to].graphics + for i, keyframe in ipairs(tween._to) do + duration = math.ceil(keyframe.duration * fps) + local g0 = frames[#frames] + local j0 = 1 + if i == 1 then + g0 = createGraphics(tween._graphics0) + if not looping then + j0 = 0 + duration = duration - 1 + end + end + + local g1 = createGraphics(keyframe.graphics) + local ease = keyframe.ease + + local ag0 = g0 + local ag1 = g1 + if j0 <= duration - 1 and tween._morph then + ag0 = ag0:clone() + ag1 = ag1:clone() + morphify({ag0, ag1}) + end + + for j = j0, duration - 1 do + if ease == "none" then + table.insert(frames, g0) + else + local inbetween = tove.newGraphics() + inbetween:animate(ag0, ag1, ease(j / duration)) + inbetween:setDisplay(unpack(display)) + + inbetween:cacheKeyFrame() + + table.insert(frames, inbetween) + end + end + + table.insert(frames, g1) + end + return setmetatable({_fps = fps, _frames = frames, _duration = tween._duration, _t = 0, _i = 1}, Flipbook) +end + +Flipbook.__index = function(self, key) + if key == "t" then + return self._t + else + return Flipbook[key] + end +end + +Flipbook.__newindex = function(self, key, value) + if key == "t" then + self._t = math.max(0, math.min(value, self._duration)) + self._i = math.min(math.max(1, + 1 + math.floor(value * self._fps)), #self._frames) + end +end + +--- Draw. +function Flipbook:draw(...) + self._frames[self._i]:draw(...) +end + + +local Animation = {} + +tove.newAnimation = function(tween, ...) + display = {...} + if next(display) == nil then + display = {"mesh", 0.5} -- tove.fixed(2) + end + local keyframes = {} + local graphics = tove.newGraphics() + graphics:setUsage("points", "stream") + graphics:setUsage("colors", "stream") + graphics:setDisplay(unpack(display)) + local offset = 0 + + do + local g = createGraphics(tween._graphics0) + graphics:animate(g, g, 0) + graphics:cacheKeyFrame() + table.insert(keyframes, {graphics = g, offset = 0, duration = 0, ease = _linear}) + end + + for i, keyframe in ipairs(tween._to) do + local g = createGraphics(keyframe.graphics) + keyframe.graphics = g + offset = offset + keyframe.duration + keyframe.offset = offset + graphics:animate(g, g, 0) + graphics:cacheKeyFrame() + table.insert(keyframes, keyframe) + end + + if tween._morph then + local g = {} + for i, f in ipairs(keyframes) do + table.insert(g, f.graphics) + end + morphify(g) + end + + return setmetatable({_keyframes = keyframes, _graphics = graphics, + _t = 0, _i = 1, _duration = tween._duration}, Animation) +end + +Animation.__newindex = function(self, key, value) + if key == "t" then + local t = math.max(0, math.min(value, self._duration)) + self._t = t + local f = self._keyframes + local n = #f + if n > 1 then + local lo = 0 + local hi = n + while lo < hi do + local mid = math.floor((lo + hi) / 2) + if f[mid + 1].offset < t then + lo = mid + 1 + else + hi = mid + end + end + lo = math.min(math.max(lo, 1), n) + local f0 = f[lo] + local f1 = f[lo + 1] + self._graphics:animate(f0.graphics, f1.graphics, + f1.ease((t - f0.offset) / f1.duration)) + end + end +end + +Animation.__index = function(self, key) + if key == "t" then + return self._t + elseif key == "paths" then + return self._graphics.paths + else + return Animation[key] + end +end + +function Animation:draw(...) + self._graphics:draw(...) +end + +function Animation:debug(...) + self._graphics:debug(...) +end + +function Animation:setCacheSize(s) + self._graphics:setCacheSize(s) +end + +function Animation:setName(n) + self._graphics:setName(n) +end +end)() +end + +tove.init() + +return tove + +--- A list of elements, such as e.g. @{Path}s. + +--- Total number of elements in this list. + +--- Get element at index. + +--- Get element with name. diff --git a/src/tove/libTove.so b/src/tove/libTove.so new file mode 100644 index 0000000000000000000000000000000000000000..0df1f2231e82a80981526e1c84ca2809c8330016 GIT binary patch literal 963256 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úIEy(zLknxwBOoj}90%LPirMJ`j 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 s6)be6<8K26mF?+XQf9OoI@a^Su>8|;i#dQ^X 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�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 literal 0 HcmV?d00001 From 6b7797d447cb0aa6f0e6e8d459dfa50cd23f7c58 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 27 Mar 2025 18:53:01 -0600 Subject: [PATCH 12/74] Remove logging and debugging code --- src/screen/menu/theme_creator.lua | 116 ------------------------------ 1 file changed, 116 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index f6f1b88..112713a 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -9,24 +9,6 @@ local colorUtils = require("utils.color") -- Module table to export public functions local themeCreator = {} --- Debug logging function that can be called from anywhere -function themeCreator.debugLog(message, filePath) - local logPath = filePath or "/tmp/theme_creator_debug.log" - local f = io.open(logPath, "a") - if f then - f:write(os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") - f:close() - end - print("DEBUG: " .. message) - - -- Try LÖVE filesystem as fallback - pcall(function() - if love and love.filesystem then - love.filesystem.append("theme_creator_debug.log", os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") - end - end) -end - -- Handles both Lua 5.1 (returns 0) and Lua 5.2+ (returns true) os.execute() success values local function isSuccess(result) return result == 0 or result == true @@ -259,78 +241,6 @@ end -- Function to create startup image with dynamic colors and centered SVG local function createStartImage() - -- Record start of function for debugging - themeCreator.debugLog("Starting createStartImage function") - - -- Access the LOG_DIR from environment variable with fallback - local logDir = os.getenv("LOG_DIR") - if not logDir or logDir == "" then - logDir = "/tmp" - print("Warning: LOG_DIR not set, using /tmp instead") - end - - -- Create logs directory if it doesn't exist - os.execute('mkdir -p "' .. logDir .. '"') - - -- Create a log buffer for LÖVE fallback logging - local logBuffer = {} - - -- Try to open log file with error handling - local logFilePath = logDir .. "/svg_debug.log" - print("Attempting to create log file at: " .. logFilePath) - local logFile, openError = io.open(logFilePath, "w") - - if not logFile then - print("ERROR: Failed to create log file: " .. (openError or "unknown error")) - -- Try alternative location - logFilePath = "/tmp/svg_debug.log" - print("Trying alternative location: " .. logFilePath) - logFile, openError = io.open(logFilePath, "w") - - if not logFile then - print("ERROR: Still failed to create log file: " .. (openError or "unknown error")) - end - else - print("Log file created successfully at: " .. logFilePath) - end - - -- Check if LÖVE's filesystem is available as fallback - local loveFSAvailable = pcall(function() - return love.filesystem ~= nil - end) - if loveFSAvailable then - print("LÖVE filesystem is available as fallback") - else - print("LÖVE filesystem is NOT available as fallback") - end - - local function log(message) - -- Store in buffer for fallback - table.insert(logBuffer, os.date("[%Y-%m-%d %H:%M:%S] ") .. message) - - -- Try writing to regular log file - if logFile then - local status, err = pcall(function() - logFile:write(os.date("[%Y-%m-%d %H:%M:%S] ") .. message .. "\n") - logFile:flush() -- Ensure content is written immediately - end) - - if not status then - print("Error writing to log: " .. (err or "unknown error")) - end - end - - -- Also print to console for debugging - print("SVG_LOG: " .. message) - - -- Try writing to LÖVE's save directory as fallback - if loveFSAvailable then - pcall(function() - love.filesystem.append("svg_debug_fallback.log", message .. "\n") - end) - end - end - -- Get dimensions from state local width, height = state.screenWidth, state.screenHeight @@ -396,27 +306,6 @@ local function createStartImage() error("Failed to save BMP file") end - -- Finalize logging after successful completion - local function finalizeLogging() - if logFile then - log("Function completed successfully") - - -- Save log buffer to LÖVE filesystem regardless - if loveFSAvailable then - pcall(function() - love.filesystem.write("svg_debug_success.log", table.concat(logBuffer, "\n")) - end) - end - - logFile:flush() - logFile:close() - logFile = nil - end - end - - -- Close log file before returning - finalizeLogging() - -- Always return with no active canvas return true end @@ -441,20 +330,15 @@ function themeCreator.createTheme() end -- Create startup image - themeCreator.debugLog("About to create startup image") local startupImagePath = constants.WORKING_TEMPLATE_DIR .. "/640x480/image/bootlogo.bmp" if not createStartImage() then - themeCreator.debugLog("Failed to create startup image") error("Failed to create startup image") end - themeCreator.debugLog("Startup image creation completed successfully") -- Verify startup image exists if not love.filesystem.getInfo(startupImagePath) then - themeCreator.debugLog("Startup image file not found: " .. startupImagePath) error("Startup image was not created at: " .. startupImagePath) end - themeCreator.debugLog("Startup image verified at: " .. startupImagePath) -- Get hex colors from state (remove # prefix) local hexColors = { From 9e68bee3a3e000881f322dece902275e058d08df Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Fri, 28 Mar 2025 00:28:54 -0600 Subject: [PATCH 13/74] theme_creator.lua: Remove isSuccess function --- src/screen/menu/theme_creator.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 112713a..bf63e8a 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -9,22 +9,17 @@ local colorUtils = require("utils.color") -- Module table to export public functions local themeCreator = {} --- Handles both Lua 5.1 (returns 0) and Lua 5.2+ (returns true) os.execute() success values -local function isSuccess(result) - return result == 0 or result == true -end - local function ensureDir(dir) return os.execute('mkdir -p "' .. dir .. '"') end local function executeCommand(command, errorMessage) local result = os.execute(command) - if not isSuccess(result) and errorMessage then + if not result and errorMessage then errorHandler.setError(errorMessage) return false end - return isSuccess(result) + return result end -- Copy a file and create destination directory if needed From b2f75055eb936cb0ce6363c7a4cd41b29a531007 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Fri, 28 Mar 2025 00:42:56 -0600 Subject: [PATCH 14/74] Clean up --- src/screen/menu/theme_creator.lua | 46 ++++++++++++++----------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index bf63e8a..6a5a1e2 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -9,6 +9,11 @@ local colorUtils = require("utils.color") -- Module table to export public functions local themeCreator = {} +-- Utility function to get resolution directory based on current dimensions +local function getResolutionDir() + return state.screenWidth .. "x" .. state.screenHeight +end + local function ensureDir(dir) return os.execute('mkdir -p "' .. dir .. '"') end @@ -127,10 +132,7 @@ local function applyScreenWidthSettings(filepath, screenWidth) local content = file:read("*all") file:close() - -- Define content padding value local contentPadding = 4 - - -- Calculate content width (screen width minus padding on both sides) local contentWidth = screenWidth - (contentPadding * 2) -- Replace content-padding placeholder @@ -247,8 +249,7 @@ local function createStartImage() local fgColor = { r, g, b, 1 } -- Prepare file path first - do all non-canvas operations before setting any canvas - -- TODO: Make this dynamic based on the screen resolution - local resolutionDir = "640x480" + local resolutionDir = getResolutionDir() local imageDir = resolutionDir .. "/image" local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/bootlogo.bmp" @@ -280,16 +281,14 @@ local function createStartImage() -- Draw logo centered correctly love.graphics.push() - -- Calculate center points + -- Draw the logo at the center local screenCenterX = width / 2 local screenCenterY = height / 2 - - -- Draw the logo with error handling logo:draw(screenCenterX, screenCenterY, 0, 0.3, 0.3) love.graphics.pop() - -- CRITICAL: Reset canvas BEFORE getting image data + -- Reset canvas BEFORE getting image data love.graphics.setCanvas(prevCanvas) love.graphics.setBlendMode(prevBlendMode) love.graphics.setColor(prevColor) @@ -308,6 +307,11 @@ end -- Function to create theme function themeCreator.createTheme() local status, err = xpcall(function() + local SCHEME_DIR = constants.WORKING_TEMPLATE_DIR .. "/scheme" + local FONT_DIR = constants.WORKING_TEMPLATE_DIR .. "/font" + local RESOLUTION_DIR = getResolutionDir() + local RESOLUTION_IMAGE_DIR = constants.WORKING_TEMPLATE_DIR .. "/" .. RESOLUTION_DIR .. "/image" + -- Clean up and prepare working directory executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') if not fileUtils.copyDir(constants.ORIGINAL_TEMPLATE_DIR, constants.WORKING_TEMPLATE_DIR) then @@ -316,16 +320,16 @@ function themeCreator.createTheme() -- Verify directory structure local requiredDirs = { - constants.WORKING_TEMPLATE_DIR .. "/scheme", - constants.WORKING_TEMPLATE_DIR .. "/font", - constants.WORKING_TEMPLATE_DIR .. "/640x480/image", + SCHEME_DIR, + FONT_DIR, + RESOLUTION_IMAGE_DIR, } for _, dir in ipairs(requiredDirs) do ensureDir(dir) end -- Create startup image - local startupImagePath = constants.WORKING_TEMPLATE_DIR .. "/640x480/image/bootlogo.bmp" + local startupImagePath = RESOLUTION_IMAGE_DIR .. "/bootlogo.bmp" if not createStartImage() then error("Failed to create startup image") end @@ -342,7 +346,7 @@ function themeCreator.createTheme() } -- Replace colors and apply glyph settings to theme files - local themeFiles = { constants.WORKING_TEMPLATE_DIR .. "/scheme/global.ini" } + local themeFiles = { SCHEME_DIR .. "/global.ini" } local glyphSettings = { list_pad_left = state.glyphs_enabled and 42 or 20, glyph_alpha = state.glyphs_enabled and 255 or 0, @@ -377,18 +381,13 @@ function themeCreator.createTheme() -- Copy the selected font file as default.bin local fontSourcePath = constants.ORIGINAL_TEMPLATE_DIR .. "/font/" .. selectedFontFile - local fontDestPath = constants.WORKING_TEMPLATE_DIR .. "/font/default.bin" + local fontDestPath = FONT_DIR .. "/default.bin" if not copyFile(fontSourcePath, fontDestPath, "Failed to copy font file: " .. selectedFontFile) then return false end - -- Create preview image with dynamic resolution path - local screenWidth = state.screenWidth - local screenHeight = state.screenHeight - local resolutionDir = screenWidth .. "x" .. screenHeight - -- Create directory if it doesn't exist - local previewDir = constants.WORKING_TEMPLATE_DIR .. "/" .. resolutionDir + local previewDir = constants.WORKING_TEMPLATE_DIR .. "/" .. RESOLUTION_DIR ensureDir(previewDir) -- Set preview path based on screen resolution @@ -397,11 +396,6 @@ function themeCreator.createTheme() error("Failed to create preview image at: " .. previewPath) end - -- Double check the file exists - if not love.filesystem.getInfo(previewPath) then - error("Preview image was not created at: " .. previewPath) - end - -- Create name.txt file with the theme name local nameFilePath = constants.WORKING_TEMPLATE_DIR .. "/name.txt" local nameFile = io.open(nameFilePath, "w") From 4149d1c4a3812c93db287e3e8540ddcac6292ffd Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sat, 29 Mar 2025 11:57:19 -0600 Subject: [PATCH 15/74] Add create theme boot image --- src/assets/icons/rotate-ccw.svg | 1 + src/screen/menu/theme_creator.lua | 125 +++++++++++++++++++++++------- 2 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 src/assets/icons/rotate-ccw.svg diff --git a/src/assets/icons/rotate-ccw.svg b/src/assets/icons/rotate-ccw.svg new file mode 100644 index 0000000..f0be35f --- /dev/null +++ b/src/assets/icons/rotate-ccw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 6a5a1e2..15ed814 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -6,10 +6,11 @@ local fileUtils = require("screen.menu.file_utils") local errorHandler = require("screen.menu.error_handler") local colorUtils = require("utils.color") +local tove = require("tove") + -- Module table to export public functions local themeCreator = {} --- Utility function to get resolution directory based on current dimensions local function getResolutionDir() return state.screenWidth .. "x" .. state.screenHeight end @@ -39,7 +40,6 @@ end -- Function to create a preview image with the selected background color and "muOS" text local function createPreviewImage(outputPath) - -- Image dimensions local width, height = 288, 216 local text = "muOS" @@ -169,7 +169,6 @@ end -- Function to save image data as a 24-bit BMP file local function saveAsBMP(imageData, filepath) - -- Get image dimensions local width = imageData:getWidth() local height = imageData:getHeight() @@ -236,29 +235,34 @@ local function saveAsBMP(imageData, filepath) return true end --- Function to create startup image with dynamic colors and centered SVG +local function getBackgroundColor() + local bgHex = state.colors.background + local r, g, b = colorUtils.hexToRgb(bgHex) + return { r, g, b, 1 } +end + +local function getForegroundColor() + local fgHex = state.colors.foreground + local r, g, b = colorUtils.hexToRgb(fgHex) + return { r, g, b, 1 } +end + local function createStartImage() - -- Get dimensions from state local width, height = state.screenWidth, state.screenHeight - -- Get colors from state - local bgHex, fgHex = state.colors.background, state.colors.foreground - local r, g, b = colorUtils.hexToRgb(bgHex) - local bgColor = { r, g, b, 1 } - r, g, b = colorUtils.hexToRgb(fgHex) - local fgColor = { r, g, b, 1 } + local bgColor = getBackgroundColor() + local fgColor = getForegroundColor() - -- Prepare file path first - do all non-canvas operations before setting any canvas + -- Prepare file path local resolutionDir = getResolutionDir() local imageDir = resolutionDir .. "/image" local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/bootlogo.bmp" - -- Ensure directory exists before any drawing operations ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) - local canvas = love.graphics.newCanvas(width, height) + local prevCanvas = love.graphics.getCanvas() - local tove = require("tove") + local canvas = love.graphics.newCanvas(width, height) local logoPath = "assets/muOS/logo.svg" local svgContent = love.filesystem.read(logoPath) @@ -271,8 +275,8 @@ local function createStartImage() -- Save current graphics state local prevCanvas = love.graphics.getCanvas() - local prevBlendMode = love.graphics.getBlendMode() - local prevColor = { love.graphics.getColor() } + -- local prevBlendMode = love.graphics.getBlendMode() + -- local prevColor = { love.graphics.getColor() } -- Drawing operations love.graphics.setCanvas(canvas) @@ -282,16 +286,16 @@ local function createStartImage() love.graphics.push() -- Draw the logo at the center - local screenCenterX = width / 2 - local screenCenterY = height / 2 - logo:draw(screenCenterX, screenCenterY, 0, 0.3, 0.3) + local centerX = width / 2 + local centerY = height / 2 + logo:draw(centerX, centerY, 0, 0.3, 0.3) love.graphics.pop() -- Reset canvas BEFORE getting image data love.graphics.setCanvas(prevCanvas) - love.graphics.setBlendMode(prevBlendMode) - love.graphics.setColor(prevColor) + -- love.graphics.setBlendMode(prevBlendMode) + -- love.graphics.setColor(prevColor) local imageData = canvas:newImageData() @@ -304,6 +308,76 @@ local function createStartImage() return true end +-- Function to create reboot image with dynamic colors and centered icon +local function createRebootImage() + local screenWidth, screenHeight = state.screenWidth, state.screenHeight + + local bgColor = getBackgroundColor() + local fgColor = getForegroundColor() + + -- Prepare paths + local resolutionDir = getResolutionDir() + local imageDir = resolutionDir .. "/image" + local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/reboot.png" + local svgPath = "assets/icons/rotate-ccw.svg" + + ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) + + local svg = love.filesystem.read(svgPath) + local icon = tove.newGraphics(svg, 200) + + -- Save current graphics state + local prevCanvas = love.graphics.getCanvas() + -- local prevBlendMode = love.graphics.getBlendMode() + -- local prevColor = { love.graphics.getColor() } + + -- Create a new canvas, set it as the current canvas, and clear it + local canvas = love.graphics.newCanvas(screenWidth, screenHeight) + love.graphics.setCanvas(canvas) + love.graphics.clear(bgColor) + + -- Set the icon colors + icon:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) + + -- Set up transformation for centered drawing + love.graphics.push() + + -- Draw the icon + local x = screenWidth / 2 + local y = screenHeight / 2 + 20 + icon:draw(x, y) + + -- Draw the text centered + love.graphics.setFont(state.fonts.body) + local text = "Reboot" + local textWidth = state.fonts.body:getWidth(text) + local textX = x - textWidth / 2 + local textY = y + 100 + love.graphics.print(text, textX, textY) + + love.graphics.pop() + + -- Reset graphics state BEFORE getting image data + love.graphics.setCanvas(prevCanvas) + -- love.graphics.setBlendMode(prevBlendMode) + -- love.graphics.setColor(prevColor) + + -- Get image data and encode + local imageData = canvas:newImageData() + local pngData = imageData:encode("png") + + -- Write file with error handling using direct file I/O + local file = io.open(outputPath, "wb") + if not file then + errorHandler.setError("Failed to open reboot image file for writing") + return false + end + file:write(pngData:getString()) + file:close() + + return true +end + -- Function to create theme function themeCreator.createTheme() local status, err = xpcall(function() @@ -329,14 +403,13 @@ function themeCreator.createTheme() end -- Create startup image - local startupImagePath = RESOLUTION_IMAGE_DIR .. "/bootlogo.bmp" if not createStartImage() then error("Failed to create startup image") end - -- Verify startup image exists - if not love.filesystem.getInfo(startupImagePath) then - error("Startup image was not created at: " .. startupImagePath) + -- Create reboot image + if not createRebootImage() then + error("Failed to create reboot image") end -- Get hex colors from state (remove # prefix) From 2f585bc7f8e10882ccdc87a10bbf162a91069899 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:16:28 -0600 Subject: [PATCH 16/74] Adjust reboot image --- src/screen/menu/theme_creator.lua | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 15ed814..411b976 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -324,49 +324,42 @@ local function createRebootImage() ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) local svg = love.filesystem.read(svgPath) - local icon = tove.newGraphics(svg, 200) + local iconSize = 100 + local icon = tove.newGraphics(svg, iconSize) - -- Save current graphics state local prevCanvas = love.graphics.getCanvas() - -- local prevBlendMode = love.graphics.getBlendMode() - -- local prevColor = { love.graphics.getColor() } -- Create a new canvas, set it as the current canvas, and clear it local canvas = love.graphics.newCanvas(screenWidth, screenHeight) love.graphics.setCanvas(canvas) love.graphics.clear(bgColor) - -- Set the icon colors icon:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) - -- Set up transformation for centered drawing love.graphics.push() -- Draw the icon - local x = screenWidth / 2 - local y = screenHeight / 2 + 20 - icon:draw(x, y) + local iconX = screenWidth / 2 + local iconY = screenHeight / 2 - 50 + icon:draw(iconX, iconY) -- Draw the text centered love.graphics.setFont(state.fonts.body) - local text = "Reboot" + local text = "Rebooting..." local textWidth = state.fonts.body:getWidth(text) - local textX = x - textWidth / 2 - local textY = y + 100 + local textX = iconX - textWidth / 2 + local textY = screenHeight / 2 + 100 love.graphics.print(text, textX, textY) love.graphics.pop() - -- Reset graphics state BEFORE getting image data love.graphics.setCanvas(prevCanvas) - -- love.graphics.setBlendMode(prevBlendMode) - -- love.graphics.setColor(prevColor) -- Get image data and encode local imageData = canvas:newImageData() local pngData = imageData:encode("png") - -- Write file with error handling using direct file I/O + -- Write file using direct file I/O since love.filesystem.write() doesn't work (?) local file = io.open(outputPath, "wb") if not file then errorHandler.setError("Failed to open reboot image file for writing") From b1d20602eb29c108e3740664152a836f53ca0fb7 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:25:37 -0600 Subject: [PATCH 17/74] Reduce stroke width rotate-ccw.svg --- src/assets/icons/rotate-ccw.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/icons/rotate-ccw.svg b/src/assets/icons/rotate-ccw.svg index f0be35f..99d7e6b 100644 --- a/src/assets/icons/rotate-ccw.svg +++ b/src/assets/icons/rotate-ccw.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 07603deefc0d95c2fb7bd1590633ed1163f4cc60 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:25:50 -0600 Subject: [PATCH 18/74] Add create reboot image using selected font --- src/screen/menu/theme_creator.lua | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 411b976..1f4254c 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -324,7 +324,7 @@ local function createRebootImage() ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) local svg = love.filesystem.read(svgPath) - local iconSize = 100 + local iconSize = 150 local icon = tove.newGraphics(svg, iconSize) local prevCanvas = love.graphics.getCanvas() @@ -343,12 +343,23 @@ local function createRebootImage() local iconY = screenHeight / 2 - 50 icon:draw(iconX, iconY) + -- Get the selected font from state + local selectedFontName = state.selectedFont + local fontMap = { + ["Inter"] = state.fonts.body, + ["Cascadia Code"] = state.fonts.monoBody, + ["Retro Pixel"] = state.fonts.retroPixel, + } + local font = fontMap[selectedFontName] or state.fonts.body + -- Draw the text centered - love.graphics.setFont(state.fonts.body) + local fontSize = 45 + love.graphics.setFont(font, fontSize) + love.graphics.setColor(fgColor) local text = "Rebooting..." - local textWidth = state.fonts.body:getWidth(text) + local textWidth = font:getWidth(text) local textX = iconX - textWidth / 2 - local textY = screenHeight / 2 + 100 + local textY = screenHeight / 2 + 50 love.graphics.print(text, textX, textY) love.graphics.pop() From d5b69c133094a0a05dc1952bd3612f3c19807cce Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:46:07 -0600 Subject: [PATCH 19/74] Delete reboot.png from template --- src/template/image/reboot.png | Bin 51004 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 src/template/image/reboot.png diff --git a/src/template/image/reboot.png b/src/template/image/reboot.png deleted file mode 100755 index ecaf70f405812f2ef301dccbba66e8b8f5463f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51004 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 literal 0 HcmV?d00001 diff --git a/src/template/font/29/nunito.bin b/src/template/font/29/nunito.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f1ffe46a89621ebebfe57bdb7412c26f98894a1 GIT binary patch literal 34000 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 literal 0 HcmV?d00001 diff --git a/src/template/font/36/cascadia_code.bin b/src/template/font/36/cascadia_code.bin new file mode 100644 index 0000000000000000000000000000000000000000..cf9fa3c206ad4902c1bd2e0fe649560ea46e4389 GIT binary patch literal 43592 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 rBP27P4~8EbkFONpZ{=F?dERzruqL5mJ9S2 literal 0 HcmV?d00001 diff --git a/src/template/font/36/inter.bin b/src/template/font/36/inter.bin new file mode 100644 index 0000000000000000000000000000000000000000..1905a089c96750fc5e7dac2a0e862996b567d27c GIT binary patch literal 48332 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 literal 0 HcmV?d00001 diff --git a/src/template/font/36/nunito.bin b/src/template/font/36/nunito.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4732e8ba66f858116fef5f35a2c6d30dccd4126 GIT binary patch literal 48180 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ℑ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 literal 0 HcmV?d00001 diff --git a/src/template/font/36/retro-pixel.bin b/src/template/font/36/retro-pixel.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c571a3ea93371ca213de3db94010ac05b6b2a2c GIT binary patch literal 15860 zcmd5@eQcdo89(>79d~2&V|7DdY-1fAuu?t>tO#;%TnHUoW+y>5SE&o^b_p;{M(m(5 zx9SoWQ4{{~4+93#Q2x-67$Wlzh__ui_M+P`n_;|b6jwLz^`|8>@@j~xZN8uuFUuWFYpSwf0* zFa95UYVX&Rpl$eHhyPxcz<*M%U&Zw!>T4>6)|9G4{grB!TBGh#Usiv^ohP4uZ0~;1 z6#ka0@2Fp@rxMR5x7Va<*VMjH`=8oJ>)x(=zb>`pswL-^{QR=+)bgdrmL6V~xqSNa zUoU^=id*Y@>VH_jwBhN7(S{?9KW^H+VrBF3=I?)I>&m)SzgzXqD^Fkf+GqD(wdCsQ ztN(n>3#%Wvwq{L!&A{3n>y};jhwFZ`{!q)d4VPX2>h=AtO&hmu?BDp(#_UCSyx#iop-gn#i+Ya15arU64XN1y4vaM$(wEv}Usd7}E?I=`i%_ z>>jy>O}Ny-dtJC@8dmDacXN(&CcBHGKpJ-`dFjBlrondEKHFh`IuSc0!4A~r6Sd>V zCw$S=;)2hcU&(b@YS5!??Q&~zgaxU!ROGp9}R8A-~ zK0xhrp|-xIV8l6jDoa%rrVX{?@aT-71o0c{wB{kEJ!q6^vLD%04gjYE?Toi=sDlwg z&TcjVd+Tg};1I!Sai$;4iR{zP&_Suq5u=fLkn?@u0gO+Z9?;o<+hFQV$GM0xvupEw z9^}1)j-xvR5m{vt^_|4F01XjRbCINDRFn5tY)m_252pwdG$M|KDl~op)vrj|HWLTV zqUlUxN2k(7`@r9)?HYX`jmD8vS)eqQ?JiSYwYC5L#-V+0y0TL(YKvF1Jnelp1& ztFn?Fifi9=T5MZaw=&R1rhdmEU?WOelAP&w4b9kFWfB8`!68JT^1BC>Hm_<(vhTO= zX7Hl+e6d7KRD`Kb4~P^K%{c;dx`8M$=1VB2)!5mKC(uK%y7YG@yC*ID!Ba2=$+(%G@j!eV zX{D)aBD+rjvQv*x*uT&;rzj+$2qALL2Zw13Y+t>Thig0Gj@4Qz9&_8jLcl@NF0kthq41jT!|l!q3VsZ7fvtd>%Mw(o_1yK zK~rhs;?b#`T!(nD_?4i*(LXmOUdmlRh<3%I0#t)y@e9)ldL4#WK7PXd$u)TI_3)Ka zxGh|_vbkt@LnC#Ko-*fq-A3oE?s@Z{=_jCTvBnuR%97zujJ_xP^6bUmCwK~nYStlC z8sMcqrgS+#b9;`oEU>bvaO$A$x+Lp!< zxKKW>zta8$b`zQ?^o(NV7Dq$48-DhO+KHQlD*4D#ylcDg!t(JKAPgiUYmd@M7Q)XU zPT1mxh#w8@8I9@9bcVL;#h4c7tDM(N|%|#aDiXi zImHQ0a5r;?CW)hrG(-xToP0YJt%U;AAU?A8FI%Cf;o<#S$a=nS;lMb3bK!$@{&A|W zP8csOHk*B7+6oX{j%Zv}vvZOBYm1VbX;$OSW#=w(fry)UAB#D;iJZP^wl~qF^xn+I zodWf4XA@GRWeL0+WfUy@%u5wiS4t0)Dk_@IHkDeT6)6+vC}uag#5pNDd4!ym<|z^s zO$w^z+Oh2gDTAqA-DXjX!VLsV22-W`5?;gY#9Rk?h_)9yX3LM;-u!X*L~m7KZq$!^ zkoR%{NeSHNw8Ej)MRBZzbNG3X_sO8H1#maK$LOK1gt}t-a|{ICzC4{IujS-r`*Zu3 zLTC(*Pv0*g-YbnwKabP**{zDNXlgLtH&)LfF_BlA3n=tiiUxEoUT5NiSdL@S_0%WV zh3Rj+O)c#eZSrR`eb|-Ga6b`~wvO3mQ{V(Kl=C+z}HA%a2bN z#}R$?YTGcT@#z!sU=IlZC8F9MwbC$Y!zU<+1VzqU5al%kjFhN1j8aC>5+1imOofOA z+Np1HW7^yVMdF(}G5TtD1iKM~ppL#8`kh~WOQJ8h1sjs7nr8|+Btt(c%n}u0A#N%h zL6}ivELuht3U=Ul9W3x=q(Y=HwcR{&hNZyZSz4y*FwLl`oGH*5B55ts1*lKBuxY^D zk-h{0X^=?x3ez#m;@Nrfh47+e&)-ha$|pHEqdl*mmTGR;`_$kI>JyexPKcype-;8JRbNdd-*xtAA z=|LNOKX_hW262W<5PUs~NF42?O_XreQSIFWx@7y&Gh z-pBQcw)C*5nRFBtHcY>>=6f3e3b~d%c`!dIxZ;zzzP#g%ZG)OXOpb%79^MFS>U_AX zzT13hQCZ*GYL~9nu?}>*Id^~-jZd*|$?ar3FW(<=#hwv;r|V6#Q%gT7>T72lNAiqq z#Ezs1@{OkKb3>yORqUh~si$|f^c-UJ4mMToHCc9deG%*FxnXk6xBH?W_$>mcu@ zJ-bG*{os3vD1NisJ%`u>WA*bA)g&b-kx#kX*iR91U>BE*-;7$Gh ztaDhnK1p*|uZ~4;k+eE$ku-3>rCSdG1elBzt%vZCl-apj%MHILO}mz5v|uq;wlYTR zwYX18-1WHKLc)LgoaWHMCWA0tXr)_pUyc+??UT0EZ#|?ZMeB#fA)6CSK_6X&(pdJO zaoVo;o=t((Z90DrB^iYm-$K6wj;Pvezr%t^(`I2U6b6WIb4*}lL_2Xpi`KtgYBv*H z8r}B1b_xMi&{>beaCPY&@@~L4FCMg4CEDU$u`r+FH@a3z)$U-4 zhhA`}%Qf1C0X_WqdH- zSf^53bNs!G#m!Rwj^@~)L=D`wkcHe>bsIZ}^p1t>C!lfuYE81SE|d!FpmfF|7Hqat zs|GH=s_&7h(skXIr6bd?$4guL{n&Csh_)b^*})QkBufnn+w?e9uqdxs7GGraByj!R z2iMg0vPels7Ae8Z@S?hs-K*t+*_SAEXs18seYOg9Xr&s2Pwy4>iM*dAx_}n=VPpon zVpCbpq#7BB+1)eu-hm+f(3V1eX{**B^lxyfFEGf{@ou9@_ou9mgu=A{)E1Y zp8=Jx4m-noySx5NvbX^jdc7hA@zEzYecUJ@4Y!C3gbuXGLTU~LY*9-s+DoXw@v~(? zKo=DCjdw)nKIKB&`uiildy*Z85<&u#LDd7>NTsE!5|F@rpc51dh?)M}d` z(m!Z%Qo;7W0wyS;UBDS@u_{PX`CF04W~kQc!jeI3tFVyS+2=fx^Z$H*=iJOLF1rhe z70PdSa=-W7^ZcFP>zsRYGZ;nD8K<3mYJy{L^xWt<(Kh#N{v!UK6CD(#Nsp4tmg&&L z-_iV?a^}fny#epbF=79D>{^!d0y*`kyjA{2qLcaSiOMwcp3zfI{%6wq__s3JFZy6~ zS9EXUxZcx~SESaark4Hd@(cS;Sn=@{^%cz(FJF1gsu%A2lKl?v|BdvK`#<;BUj4M! z9PqjWFFkO-gMM_-8Bc%dGqTV8ql5qakaG|H)M1w${#-^sjo`nB6$x8LjUef_83@TE6? z@OR(zrWX%wA3E~QKYH_>zc>8*r<`!h3Adkc^ogTydFLOz{SW{8j}mVkeOu*ixBu}A zPjV;y`P(PnzP_+>%o%(@)Kl^#-obzYj{NOl zPOB8FtFO4?v$uY3%axg{UjBu*eepei|F>)ESKoKd0bhF2!~v80efhQjQ2NT(|MBkY z&i|*Mel3bV{EaC3llOe^bfyD3wCCWJ&du!O+_e5yI5*YjT%Etk<^Hd_%(-&P|CN%? zjp?t~xse{{hV>U6afGi+pRd0vB7e2txy?D}wq=~#qB^5b+?QVUlU1Bfa(NqUVR|fZIZ6`rWo@$ZZB?+}5bzWYAHh-E?z* zTXcaIc8?<3o}@ox)Y5WgdOQO1W5}Z!oHMFHbcg;k-gI>QrOti*GUrzBeH;6@cC;Tu ziK10*k)dn{?d#@kD3M)>2f5t_8&bRz>c{uSy5(-B2^*v~wPnAkfEFjJjjLoMgphRE#}^Q85X zl2d+D~%YanNEn3Y{ zqUPn0Rz@wO+B=fLKV$6%T3HT{pWTAxs@shnPK9oY#P6vARaZle^Nt84{^^=SqgH7on1h zlBFULmE6ML2(U+uAU$O;mSHAZzGjWm4RaKsXVPO&jZmM?kP53$7?V^--Ui`Hi*T!$V`jk`r= zY;x4iV>7EmZVo1ta&B8<{rcgj-9$yu%P%bPiLPkws6{F>!GTj9I4yAUjwpinnmsyY zlh}eI(2$uc>0e!^ftme2mARNvstw#!jLId{i#pJ!x{eqQ9q8M%jsuQp0>X;x03%0q zobc@}3sXl6WuGi_slp~jV%hsR7yB2#7DY#K)QAq{pjMW*>@sU>;QJk6dO7yIjdZn^qI8}kt=R}*uJw^gE0Ik3cqB7ArH`r=rkM3%*2Z*N z(fnI0s*^%5n_juW1}a%4JfnHLgM(wx!Yv{D=BIaKi7VP>W|V~lF&?dn|W8oG>4 z)rjzfVoN7)BbuY0KDX{j;cSj&WZQR8A}v-I?4n!^vB zTSNaS=xLJPdXmHS^gS%4(0y;F#srM>ys(`2sF4X>6~E}*_JZ|+flN^WemBu@`9!NT zsLQaY@MV>V@=O7T+aFPYu3Qob!*mK`HN{c^O1d* z-F90Y(U^iWRm66zpGnOy-8u9?no>kQD$MKz4!VK4XffHz>r$^@6X**?-*fX{0WRz+ z?a-d(yNj}xfBOi}#ON6p{8d0fR5|Nf%q1D2vw5E{XfP)=FY0E7r~SoPuuUHjJ`onl z13U;}hX{$A@(2kS@n}E>(`XkRLHerxA{~*SK##a1#a(u!Zk5T7k9hPbIuCw80j!4zJ`_>i8_l+~Tstcb!Kcc^Fv1diteT2SQihR#j4MUc z2Y(Kcm_=&fWxC-uXIuxJ9jUo31Fnr~lqMWP-KL^3PzIH2xhz*z;&=ZOky1RSzO^iT z&ik5at!%ALQ^iK>K^Y-fOsiLU1k!qn`l7QUbe2{{V^npFfJPZH@{UH{m;5w}T9Zv8 z*4Jf#Hx>X!E9W^M!?0G7QRwo(@cPz0Xn_-EJKXeIpPKCsH zIL;m9$HV8wN*5|t^0e_!&Jj(x#dB#!H>`4Xd@lYV*u zG)ArkUlskWdXx#msnGu1KU{qlsn}zxSR7Q6(Xi&;C<}9p=Fy;kAM6>IJnf&RP$7s9 z`V~(*Jp0t?r)RlXadSRQL&%6*CQXSp7d1IrqR<<+C|M}QB3}>IOUqQBR;HT7hgzMR zsZS$^dfs`vcTHzfRQja4FwSuiB5CB^xz1f9;;oyvaFjemq0p$erY6R!-Q4O%zkD2Z z3-lh{Bz8E*>cIGKvFhj0`sTtlB+hVNj-<>(KFDjiZ7u5vrO?PcRockaH-zp&%f(=~ z7M%N=sHcIRQpMs8)HSINiZ+GuN?H{WJNJD`NAGHOel%=)kW-q`#W8T3axs*53RKRy zwx%8TK_Wb7$~w%XM1aASL!x3}pO{0OeIhKcMhTnOrngj-8R!~CxLPGa1XnzeRR{>B zQ)?nTp$EF0_K=armvNcla)0+S_9MPr>0U7zn+cGKN&S>d{!#RLj4mMycg~CYxa-CMYPi0FEO~S#{$t zl{S}-q8AG&UxKyUYkDi#7~`VC{yN=PZX$_{=Mroi@I#`dev?_0O&e~si+`V$&~K1R zOi4M6^6IXLjxUWe>iz3h5RHRL|G3wX;0@>L*kQg9iq!Ck^$XyBRX&VV(%_ruBApoX zzAY1XZ1X_3v!rPNgAV_#M&nks}=w z?_u~t$q9hat6Bn`ze)Usj_!wpJ}6pzKbe{&Xe&-=KCh!t`@9%A_p`k4nJVclp7zyQ z=~T^div&$kzu5$zl+AJ)G-RMTS-NQOAyMt-N2Ed+p-fQN-3Jr zVU%<+uLN}epLLWjW({Ow4PJHIcP(KTA3c|z>r;s^#8&x-U<+FG*iz_T)j&Z}nkd!0 ziO=QNW%zvl+Rl&i9KDlVP$d+A5X>-O+*{7MpPtcF`I?)zyyXP-FMn{X$xR6y^QhZW z)NP9n8qg`Yjcnj!eqB*3y{*e!`{fw00Y?D783n?*Zd$?Ijtb50L&P}bHVwIrLR<>S z(q>nX=JTm+&1zZZ7HD%*#%)y_<8D(w#*6V%Viimy#}RdE2+(aaALPT3!D) zPHbdJwj%uEpIw%<$)G-Ce?h>IqLDBq_yV^M4zVW=k($?$b70v+v24miTu-dOIUqhp zR0P6MQN!Ku-9ZE|uL_o%y514`i&@V$-L$gq$FM4X6_8`B1us_PILC|^wI=LDgy@{+ zMUy#V%i)qFtZKp17Zte7#Ae@?z(aIKgpgJYpsBK9fwHid0*bUo@JN$D9cX6^h;yIG z1d+l~6ooog3pJ@hH@)qOHtD8irNQe>Z)L=9ue@P}55(lGKe6!WL%%0Ks1n-S>TOo76E|B2 z&oB6P_AsDT$#ro)mxD>=*oTQL{$r_z>NZsbF^7>&@1f=6W> zX;bh&RcZ3_R$B{YoS#BAbKGT*@bD#%sC>*LDjxQzpUOSTVUj!|zVe8EZT1M=obrf% z4jaNaEGjD4!XF-#&$-Xgoe?3?0=@7^F=IgVTIhOPtPoMWnI;f9Yj;8%Ff^cG*AN}u z=n+~TdPUskvUXLx2%}_IVb-S+vdo$DTXG*Ix&l3Nzf-bu|IGz&mW#RIe8%c&x89tQ zlWW#)_vb))+0RYL97lHKu&hsO=V!#5|4pq<**A=fb0;ebR~tr$UlV2Q5|sznCP< zU4>xWRx$v*5lb3@;TV)-Fy+A_mcsJPBIX`6wg)i25WtWNAmavoo_*bj2m83H2g}^F z2R&}12T_ZCL0TuWoC~117{HJVpx?d8=UL^N9w@T4Qn17W^uq%gG`pnjp|%D7iFY?U z-^s#2h3U}WfI@7{LLa?1sz)*&3pesHOlXc~kz3EhiTA)wC^G76cT|f~X{qA^!EOn} zwdsZr0#HhnEKedLwUHQCsNcDx!UBz2mJ$zDW42NxP&P%(IVa;rA|0z2r0WVb=BP~T z3KH_PNmkIb$?Elt7<*T7Mr|@Na;UA6MWK12=%8;pt%YR!3QFCeO+`bt4<8W2iIG-) zgswG*keE$K088FFFhnF;J%%+i9wE{jyC|fkx>qq#b$@jr)fMp!(b zrjT8IIp-7_1R19uBU*kol_47KAR2Jd&n4^^)njpy07$%agPnOD*F6>ny(rO`v}u}U zBz{SDswUPZxH4!+i|!GR zkin8i3bj4z?_M2^OFYll;v3mUeV*zuT1dyJ9)W1r6y54;hy{kIPWk8yO^kWOSf@Se z(eQl_8qAAF1vu`Jro|(KYqLGkaL~1OcRQG$|LW@RzZx&;;sV378~k@%HY|E|oTNL~W~?-`vNaIW zyuX2Q_7cCEwV7TVckb33T1?%9s)I0nMxDWs@()qsb?h?S$?6IV-1JxZJgkc_j4|zy zc*X@<;oOWHSEGfl{4oNllIY2h_&6`Gf+^~X-lG8h&P`Z+oN*n$p*89j3+R?qeJ+DW z$?I$irV=ygC4il8(|;_F_Ot!AW9ridw_tNuw4w%UZVU1~DBN-zDKrK`cBe2klRylW zo*J44BHDTC52KRT)tYxe;yYv&+mj4_r(i-7jHjVuTdiRK##Aj;VkIY4ts2ska8ye! zeB~^LoN!3OzLjcC@^#QDq>JJ94@I&n3Q^HJf-2z~t`cWNO}D{&Y_HGe3M8{I&8|nV z&iKk1M$6w-Nv#W&s!yn>&so#@XU6a<*MZYn!%a6;G+s#g7nqH_CBv>96=&#k#%*K7 zBaFACV?W-qz;JS~hHnnQkvgTat4OLav{Cv{bCWAwV}?si-(uAKnbtZ}QPEBJFOGA6 zU_rBYB(m}cFb zl`!Ne1@ASBHO8j%F-WGI_9BaIj+yH1f!=G<;2 z)NO#afx}=MCSWy&xiomKg{LVimPDy_mC!McbjNIZhF;O$B$+5S9ea?LWL)c5aRm0k zGv*1&gwa%HOjN}=U7Rpp!(pk3#iej#3I>Vtd>xRIvrYhw8^XkC+LYtvAn0rT_pV>PDznLXs_ZrY3tcg zm`vTg^4+4EDZ7-yLK-l^GgOP^WHcV;fVW7-ze&r({P@j&CL`PcXvX}(4L_t=LJQw4 z(&D#iOL6br!SR4L?jq@so8CbupdZ+0`ynT79uod5-?velcV=UZ{{0G_@G$ikAJXd` z#=}#|ue-oMHz8XRt15DrH#SEM$TM8_Di+0YuY}|nkjNXM2qPXz-aSH2L#zZxymzx` zEbA{b86}TUz!{HBaXj2ZcXV^j(~jKmXiE8Rj- z_IAK+k;BC>PV1|42`-Xl7;a~Awe|g^?A#N#Kw`ixEWa+rw*Wj{IiR{kd-&eKfxmt0 z@9058q!k;9k;OjetQQj!P};;sU^42qGchQWC|g=nJ|=rCnL0tGI^R8+R5P!^hV@(P zwn<>fEYphBt3TbOPnI`|Fd&lwB1|CNcfa2vtJt=rI?eAdSWx1ijMFc-r{E=KtJX6H)z#>Kwm zUAP$EGdLdl_?VJD?AGPw-6v}_H7O5P0Ju6yw+Of~8g?5Ru#%)sUcA{%Qr^b)QSW~% zZf?l<$WX8J{VK9YXkEoml1p91>H4ICbI-A)qp&MVN)#D&GCaVxsG*A5X_7<>>5%jT zJT)t@2fjw@+^qS&7T9;Yb;F#|4D^%kvvFHB`$iV6x7UKpE!py(nmv}RLgT{}s{^7e zlB0+UqMWWljaVR<;IdD`5qUt@BySK?yf|oRls4{Pb3-dUqGch-gzv-%che1RCuj1n z>BxqWWb!U67A;@Dp6jAY+zI+M_K1_7v9|MBE2xg#qq+)eb2W8k1Ue134JCCOntY7W zhhaSrxoyD7u;!dQ+uQ7>+g7xxW7vP@Eg5x<+jyz|96y^xMFnF9p5^_fji}u=nDLV+ z(V+SY6Li4C5H)7`T`;wO(dD|_%qFfxh zJ$i7F`%yZgINiis0*2J|AfO^Jnd4(a3%>-|qGi_>KuOMWDMqHX4L={%pLqys9E#C~8v z6LiXA>htM%8q`?}!1)(AK=m$SG7FX@CJ1e?<+Ih?&`cPjzG07G z!n8+tKY4h?gD|MuQ$;sQLuoc8Q-_YLa)M&pZ`utyel>A|hbjX=#1fj4gv~ z=SP3@T@v=925Rfn0YfvS?cjlHN;E5y{E~a%yTi%U0XesM#e=0}RKQ2`L8)@0cO3HsxTd*Ef$e60d5*i zYiARTX1HJ-Zra_(szp*$HIs>4e6NwbGYtw`hyzQ;%%aUyFei3@CuPz=JXy`?ff|-I zTO>^FhGULpPDR5J*+eBuHw8v0t*_|*QyLBX!1^4G!uLU0%Q8jbXU@%!DyP1Tb(?_8 z=lD?2y+{%@VA^I$qRs*5PVu@{b8`|dTho5Ui!r9g&jNk8Nm?%%U!WjOWBV@FEJh4d zvv+UQL+dYf4B!Sn5aad)N4JF*|4l#};cbPsbL#5UvbF7tW!l?R3Mt8>$DR~faQFOX z`&?@E!QE8BEETQ)DM=ZQu06h+;BIK=wTRpiT|bAp0wJ6aU5k)3YRtnpo@Idn6R7V9 z!Ima1!ix4cX;e1|pf*X%1uVGJim2m*yUQ)O3qc18g3O4h-h;=K#EwLUrmBgH+`nkr z++w1sc~RnYg^#UD$2uR1hg5F?5;4 zu!pL|VSjn|iM_|Z5nFm}p1e)yYhR6b))N_0|(8EttBj z&&Nn*f%O(Bl@+^OICM=Ue zQH_D78Tee3TH8KXvO9;Wu|1)o4Y&^0Q`1cKl0FSsI|W`pGO&f~Rr4Ta*3RNmO=~&3 zqiW~$uq3f4YY~pUtk_adw?_T_Q!b75nl&duZy&LhV8w0Z_9eBc=$rjzuHzc)vIZKA zFW19muDftqBM-J&*GsA>#rQkq(UX>&)OH5Fthia&g(cremuIkltfuuX0B$nsZsu0_ zF@-FoCvM-4bkwn6+2+*?$ZQoB4!R4q3!|H(uW^6in0YOFk999|&qk17%v;>kICXjY za0YimvEGBd&b_-Gxxb@M^8dv`)c6{WQp@;UH1RVH*}2xXXuPBT)Ah|--Y=MF&dRrA zu$nR`0~QW9G{OB+XyP%F>ShP{zLv}v=T(M6l@qG$aQHw+;2)nF^%zX4xP?(wZ&DNP zAki=StTeT~-GIX3x<~LJpdm?($hLa&LJFSzeW;?FFIvrvm~WG*HF_}SdoZD1(Y5qa zPnUY%d-h43WT_3tPBpwF*4%c^>Lm8VMXn=>)HMw^6!lbK4A&=Z9K#wqkK3E!ZHg5( zMy^+-*dxXou~Y`J35#=58xwKzh%E#3ui?YproNp@9HB zAnnHvMAt3N`dbc=S_7(i_Vb`!%MZHmYJl~E0YFxyUr0SOq4;Um(5i2o?*Y56$rF?V zYFk#ol%4LFz;?=sZ!r;~c+WKJpHVPU?R z`EB;Lj?k>5fYGLKTuSh-0_(k~)gJL&!`8rf&5R8h#tvbxuFh(P%@4zGwMD0=bs)3# zF%#r3B+~^;#`lvc*%UuN&L`83X1mUqY}evTxW=iyHlabX+PP>)0@l9%X#5Obkh-&$JLB?{3||QHOP;e^dIF%vGaV&F$4;L$U^89_G=xLIO0r+r|b6+up z>DJ?#ImdG;q7T&Ee9jObbE7fZ$`T_@Aq-qmR;map86rsicJxYpb1A0GClA@{Z_M+W zQsi)0e+bhE@+Gr5Mz2czm61ZZoGO2lcp?4CG09I&>krnInGuo>p zmiW$Ihj^q0C(h*zzf9ni>5w}mQnWZf`j_iBtkmy2gQ zD4V=2h{iE$OjPfU(6^hd(k;DGRMW?yoxEZ$2KmgiZ3j>YLUhy_$lD`8oRm6| zn=B`u`1@weRee=nO+*P z_CBmI&XXRE=?WW2D2s&&!x}OzR%A$QYl=*H>Gh;yN-`CAUBjOv5M*llItMLLn7E_h z(_q=Cb06fbUrl{u!VGl6LbYKHs;6~Fv~ol!>iJhY#2-67@I>Ft(PWr3q_<8c>YBpD zn@h17tXNk@UE2o9Q2ca~o%>kc83D+@dXzo;U^)`eT^FZEYBfO9nj*>d58#Hn7 zj+S$~(cY^}*iWM2{osOj{?SG{VKi+lF-WI!KJojMcmZpAcjrez`=9kM%WfTxdao&= z=5juhO~-eb?D6Y5?3!iEiIR)aCw_|Aolo<`Af*nx=D|B{|G~RIM>?EnSOc9waMQOX zHLCE)Wcqn6iFr=Uj1ss9d2Zz+<21&h46}cTFy@EcEDp}K_fz1n_X;wj6~{An)h4@) zlf1cOrQ4oC$6kV#u~msuQ6oHEr5!!A6PLcR;qXpXOJ3>bn5PX*wliibu0BM4+kC}Q z5zOvmbpYnQpxODhjt#$xL2J{r{m)cqdQKJpm5%<{VqPqvk+eNvQ~ZN1^(IoWIUj1; zyGWu{_uj_%ZQoNOfXk5ckl6Mfd#uF_$qWBa4NG#EQuTH|Q5BgQ+=tVQn`Kshm?v$H z%S^{MMo?Ye{C7q?AMv!#PIM$3O?+EPN4Y%HfrP1xBMb}sKofekC*oWywXl<7&nr|D+;6^ZBE z<^hRlzn+ux$9|+v>2W@lYibCgo^HLNous{Q3eJ}$MrK+c2^vuEM06m~E)kFRUEO`b z?_Ra``nbdwigC>gyGI9XTFEQX+MknGMAyxT$ zn3x?upD}yuTkm%Fj~M&QMJ_M)oO)anBf{;xEZpnh2Hvxlc>lCxD{kYcDlkh};&H8Y z`RK6s+qZMfR!l2i9zpZ*1WoJ?b5U2)AW7JPm1iF|uGzvJ%;10?SA>C88(2j=o)F5E+vL0B~~vR9;62-CjYYFp`TqI9slq@@{xJ}@hO>#8d8^W z?Xlh)<=(U}tm$vzXZz(@TX&wvqgJ!GKCi}HA)<(FQ$g0gPI~i!5<`|yz$Od{ z^_A%%-6iT##BsQ^4j&TvwoPMbX(Iw zV=w0CCk&m{Vhn~R++x-@bh!47phVQmCZ6a`^wQ{HDekg!2u)h<-iz+)XQf&pj%{>6 zF!_$CwFo*~R@BXdlCFxtZ&$tx)v>KYkXK6~uRTHv3Qwq~gZ!3Kw^0H#BTRhkD^^>i`fNgEA02f+${%cLB zg`X!`6lL6^T~vrLpC{pMY*O4!IDu-Gd!L0$l$qPD#)T?velJ7K?ln?@9N;Uz<=TVn z9KJM5SY1|yP%@0*O(i>3q=NDPrOQkIC706v!4Hi2UNohW5T?My%WO|pDd?k5K_!D9 zTDB&yE4!lOS6}RtyY8!@;X%}_<(4gC>pDsv;f~n^b9Gn)u}f^XrIck&D*+}i=`|}7j#8iF^}O*8hN+mf$dw_B zP64uv&YK%BE0?O$Af`KZzdm7ipER8J*TvGZhw^t*9?H{tewe6)ii@P$NVQzQKQKP= z)FNC(9H1r}iqf(2*N3jHunR%b(sX1V)sX){s(xWV? z&k8lVCQk+g&%TEEWc*yHC@jCV7cz}ts1{>s3;_3Nvk zWP@8w*eoChNROo|m3a}30f~!rhN55wCV4ULS4iwxGD@87ktm<{nV!;vT};P|@DM$< z@53Qtj?KDB0k<$Y3-TXT+lsQER+u!#+dG^_$UMrmW!`Njew*_HvV80fJvAK*M9-!c_@(~@6(=A ziHEAhTVYHQ20@6th0;DMX>}6^JR($Khn=0BbIuu-U-`TlDuvbC3jU5iM(encSa35T zafNLl+N?BPwLtL?DCpa&sUQv@;$*wgCVt$_ghc&lWJn|ri7K8WBK36=^JPOKVe08@ zEpfS@N+5FfdZa{jTJ(R;IomI$bTZju+lJx{)Aoc5g4a1$3W@eQr|79y{90u83U0LV zieJ$xKgpm(h%JCHcuW_Ojapb-fpf7QN6(C7J?2@vuA(6quPu_DbtfyOFL^IFE%z5R z84OV|a~A9Yv2<9DF!!MvjP^ag#KV5tENgn%Itj!?d)g`KW`A!S>GX9`u;kGmlB}Ti zD2*QOHN19lgj|ob`fewd-Wcp#+Nt*sO_~%xMcvg8yy^@p1>MkHHuHY0Y()*X=)pw1 z8nNVEef-bmr^03AwrX4fc$6c0wzUjC=tU+nEBWH_q3iF;TfT?;DEJB6!&{XLyr$0R z#Jv^9l5a2+{FQr6bYJo((XzX*;D;jaOXEsd92d3pZsMI;AaBBv5RkRxt1H-Xlz%!( z)H-?YIsSx!J%_(ulVLx~U48zKW$fp6)O5emvb4vsw8MdzR*i3a-rdMKPuq3_;`as1 zKNMn9{i^`tj-9fb&UY{MCH)pfyhFjd!0%6VcPA>&N1e#5-$|zolc9)?@mtTYu;`k*fEB~+n?Jhs} zV)5DK)o#F(gN=Ioe$Bl1_DyiVXF9;c zWu7gS8&lk=FnAK1+7ZzIa0Vl)S?o-2;iy6=snuT_0Pg}AjzKvFQyx5_-~D_Fp-Q}iuQksdfhn+ZGQi)m z8L<=G>~KiMsRXo#gWjpk(-IKXBgJV@MaZJ_q9H{~1EA|$azy?fE4il-!g*hCa7a_3 zm@58i4C2KDLEA|qAn4%IMnFvOjN}sPw`Xhef{YMp79x=wqIp3C6=4?2*zdZRKrA9= z?5PNC9W1ga&{CWGVr9xz?dFfZ4TgYnsiWNfW!Pitve8t0bJG}!y@QAgS(WgD?VGcJ zWa<>1t5yvS!nK6OAVUgwP^dpF3mH*-)8HwVKNgm+SikyrPi|q09DJd6=c98N@JncnHwr7DG04N3aXrXA@ zf!%>*n+%ze>aIMr?lpI(IL^BV{IN#>Hf(SdL|R)o*{o-rx9ASSCZ?LXr3fv`yX0uG z&%4b@+>y=gAQJI!g?O6Ji$OHHm^YE2; zIo!Hg?ODQ1s%Vg@R8-(s0O@_QWn3Z87f$oU5_>0e1NPex!+8EQ7D2LGbYs-QPzEzZ z1o(0syq-28k%zW_8!losW_WIQf(RjJzYWpAMbp{(5N%8=XwYv%hz$jtKW%mlOBYxZ+b!ubz(44o6nq;#1a=Mq^LI=ofsZZaCG` ziaq-t9lOQLM4Rqc6ZAVbVPna-&bXQF(MS6#^mxyr>0DL(>IO&S<|)j9_{eA=jzyp1 zUiU@vo_m+Czsn3zH_m}~im;^;KFAq$o%EhJ#l?Rux)eG8&yc;xar5GT4jZGCzel5+ zG$x0L4{m8r!UW+KycaVs;&s^`REU>31S6pWU*O?C5%4Kp)e&=$2jU90vP3gmTg1*| zxb=J*;yWUrS~deRZT^tH$>&JI`OL{F$Wu)#-xwIvGeU8qQmrucsJZWV!@llDX}qU% z{}lFAHLj4^`?h$zShC;@B359(YHeX?8Sb*X7O$JC`w(fOs~7)))3_!qgubG zw3M%Z5Qs2|rhpS3YOaVI@=v!Yi?LWNgUC{fY)zdn)9f-h&Vh<+v?pPZ-2^HysF21( zglop%-Y@%7{j{|s^ulYYv_K8}uuLi|4lIYtkbLIA>Qzte*NeCY|2KwIqqwk@~!}5Z5p&n76!Vvb**^HZTYjn?C+zAdG*Sg9r^6G2rzjz*;ve z!+|wM^m{nKy*)H&{cqFC4PPOKsVNaDPVV=x4&?nw*K#%jgc3VAIz1qPv%JxDZq!q$ zTr%1iC7K?w?-|lyV21CIoN(-W*$jngYC|tkDVkCiNJMz+QIr#-IQ{&~CKmZ_)5%W6 z_ZoNux52mYS!X^7dkf-p@>;$c!F2Q5Y%vn5#F3#I%vzExnvKs4npq&ym%c5N!GHUV zG&1JVUVlDG8JX+u*+@P{j2%o-;1se~30Ah@W?6{o`l!f#U|==arYF_RAWB@ykZuziHNtcy|OaC;v@1&E|7 z=QHwPe6!@758(pCODd>jqqeC69Z1bg(>ey(U7!jGc zmX^sLL2XdGz6ZymRMVb5c{rxn_602F`V&&slBvV!x>&oOVtFF%F0xcE5I-^eu)Yw+Oa_Cg4ZG~HumkPhM5nLH<`ZyU=Ys)v;jSeLsj3I+sT zh^i0qElpj_$hUyDV1Z_3pW9#2UJMm{%Q*e^bW#ku$G%iXzHh`Q zFsSKpsS!`>(hAD%)BDRyE-0$RJ}4C2!=a*jDLzfXUlJnBQfqJl9Tvi2FlP2eWd$oj z1*Ywh{hEmw2ko>x&-$_ZkQU6825(LfRPq_T;QvQeH!Xt4_CW;^qA)$iF$M?>n~$?%iWAYg~RzS z4{+WdF)F$?BCF}a43~;NGR0MLUA6G-nP6;f?ciH(GEM$^MhjE)!JaLdRA@V|h}B!k z8Feph*Yiwyo$B;}L{X;R>?sXrfs`MVMT2;XVTddc^{?}Kr0e(|CCdD%1&Hf0lXTr* zR)4KD8C0v~)W9YUCEgnb{jnPohksSuc=;&0!HXn=`vS@c8}U zA1y)p!M`5~*bn|`55fQ7-!q!}!H~x^?1$r5)O+^n@b;Qgl(_7(WMYb|*i9K&<~^M= ktE(L?x~7TBA*{@D7O1zdzi2TJ+AUGzQ$qhpgg%P?KTv{>IRF3v literal 0 HcmV?d00001 diff --git a/src/template/font/38/inter.bin b/src/template/font/38/inter.bin new file mode 100644 index 0000000000000000000000000000000000000000..c5a6d65900f913361ef4afc34eac47c887164f89 GIT binary patch literal 53256 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 literal 0 HcmV?d00001 diff --git a/src/template/font/38/nunito.bin b/src/template/font/38/nunito.bin new file mode 100644 index 0000000000000000000000000000000000000000..894a04c3520402f3a34ecca58eeb44f0395521cd GIT binary patch literal 53324 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 literal 0 HcmV?d00001 diff --git a/src/template/font/38/retro_pixel.bin b/src/template/font/38/retro_pixel.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ddf4fb7fa32fb8d491847d6d6db865c29a02e6a GIT binary patch literal 17532 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 literal 0 HcmV?d00001 From 3ca0b5fa8dee6395f5408da720d3aa8ce3572018 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Fri, 4 Apr 2025 04:37:06 -0600 Subject: [PATCH 48/74] Add Tove macOS library --- src/tove/libTove.dylib | Bin 0 -> 720528 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 src/tove/libTove.dylib diff --git a/src/tove/libTove.dylib b/src/tove/libTove.dylib new file mode 100755 index 0000000000000000000000000000000000000000..a8ef8237f6e304f1be70db641b5f42ba74b4b105 GIT binary patch literal 720528 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≪Lu3DW0k^1sTRg!JH@gavNu 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 From 0272caf4eddf7ad73284a1dd175c8ed131623118 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 00:20:20 -0600 Subject: [PATCH 20/74] Refactor theme_creator.lua --- src/screen/menu/constants.lua | 2 + src/screen/menu/theme_creator.lua | 97 +++++++++++++------------------ 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index 6b2fd8b..5f43992 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -9,6 +9,8 @@ constants.COLOR_PICKER_SCREEN = "color_picker" constants.ABOUT_SCREEN = "about" constants.FONT_SCREEN = "font" +constants.IMAGE_FONT_SIZE = 45 + -- Error display time constants.ERROR_DISPLAY_TIME_SECONDS = 5 diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 1f4254c..f7532ee 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -11,12 +11,18 @@ local tove = require("tove") -- Module table to export public functions local themeCreator = {} -local function getResolutionDir() - return state.screenWidth .. "x" .. state.screenHeight +local function getImageDir() + return constants.WORKING_TEMPLATE_DIR .. "/" .. state.screenWidth .. "x" .. state.screenHeight .. "/image" end local function ensureDir(dir) return os.execute('mkdir -p "' .. dir .. '"') + -- Extract directory from path + -- local destDir = string.match(path, "(.*)/[^/]*$") + -- if destDir then + -- love.filesystem.createDirectory(destDir) + -- end + -- love.filesystem.write(path, data) end local function executeCommand(command, errorMessage) @@ -248,94 +254,72 @@ local function getForegroundColor() end local function createStartImage() + -- Read properties from state local width, height = state.screenWidth, state.screenHeight - local bgColor = getBackgroundColor() local fgColor = getForegroundColor() - -- Prepare file path - local resolutionDir = getResolutionDir() - local imageDir = resolutionDir .. "/image" - local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/bootlogo.bmp" + local imageDir = getImageDir() + ensureDir(imageDir) + local outputPath = imageDir .. "/bootlogo.bmp" - ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) + -- Load SVG + local svg = love.filesystem.read("assets/muOS/logo.svg") + local iconSize = 200 + local logo = tove.newGraphics(svg, iconSize) + logo:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) - local prevCanvas = love.graphics.getCanvas() + local previousCanvas = love.graphics.getCanvas() + -- Create new canvas, set it as the current canvas, and clear it local canvas = love.graphics.newCanvas(width, height) - - local logoPath = "assets/muOS/logo.svg" - local svgContent = love.filesystem.read(logoPath) - local logo = tove.newGraphics(svgContent) - - logo:setLineColor(fgColor[1], fgColor[2], fgColor[3], 1) - logo:stroke() - logo:setFillColor(fgColor[1], fgColor[2], fgColor[3], 1) - logo:fill() - - -- Save current graphics state - local prevCanvas = love.graphics.getCanvas() - -- local prevBlendMode = love.graphics.getBlendMode() - -- local prevColor = { love.graphics.getColor() } - - -- Drawing operations love.graphics.setCanvas(canvas) love.graphics.clear(bgColor) - -- Draw logo centered correctly love.graphics.push() -- Draw the logo at the center local centerX = width / 2 local centerY = height / 2 - logo:draw(centerX, centerY, 0, 0.3, 0.3) + logo:draw(centerX, centerY) love.graphics.pop() - -- Reset canvas BEFORE getting image data - love.graphics.setCanvas(prevCanvas) - -- love.graphics.setBlendMode(prevBlendMode) - -- love.graphics.setColor(prevColor) + love.graphics.setCanvas(previousCanvas) local imageData = canvas:newImageData() - - -- Save directly as BMP (with no active canvas) if not saveAsBMP(imageData, outputPath) then - error("Failed to save BMP file") + errorHandler.setError("Failed to save BMP file") + return false end - -- Always return with no active canvas return true end -- Function to create reboot image with dynamic colors and centered icon local function createRebootImage() + -- Read properties from state local screenWidth, screenHeight = state.screenWidth, state.screenHeight - local bgColor = getBackgroundColor() local fgColor = getForegroundColor() - -- Prepare paths - local resolutionDir = getResolutionDir() - local imageDir = resolutionDir .. "/image" - local outputPath = constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir .. "/reboot.png" - local svgPath = "assets/icons/rotate-ccw.svg" - - ensureDir(constants.WORKING_TEMPLATE_DIR .. "/" .. imageDir) + local imageDir = getImageDir() + ensureDir(imageDir) + local outputPath = imageDir .. "/reboot.png" - local svg = love.filesystem.read(svgPath) + -- Load SVG + local svg = love.filesystem.read("assets/icons/rotate-ccw.svg") local iconSize = 150 local icon = tove.newGraphics(svg, iconSize) + icon:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) - local prevCanvas = love.graphics.getCanvas() + local previousCanvas = love.graphics.getCanvas() -- Create a new canvas, set it as the current canvas, and clear it local canvas = love.graphics.newCanvas(screenWidth, screenHeight) love.graphics.setCanvas(canvas) love.graphics.clear(bgColor) - icon:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) - love.graphics.push() -- Draw the icon @@ -344,6 +328,7 @@ local function createRebootImage() icon:draw(iconX, iconY) -- Get the selected font from state + -- TODO Refactor font code: Store fonts as pairs of name and loaded font (or find way to get name from loaded font) local selectedFontName = state.selectedFont local fontMap = { ["Inter"] = state.fonts.body, @@ -353,18 +338,17 @@ local function createRebootImage() local font = fontMap[selectedFontName] or state.fonts.body -- Draw the text centered - local fontSize = 45 - love.graphics.setFont(font, fontSize) + love.graphics.setFont(font, constants.IMAGE_FONT_SIZE) love.graphics.setColor(fgColor) local text = "Rebooting..." local textWidth = font:getWidth(text) - local textX = iconX - textWidth / 2 + local textX = (screenWidth - textWidth) / 2 local textY = screenHeight / 2 + 50 love.graphics.print(text, textX, textY) love.graphics.pop() - love.graphics.setCanvas(prevCanvas) + love.graphics.setCanvas(previousCanvas) -- Get image data and encode local imageData = canvas:newImageData() @@ -387,8 +371,7 @@ function themeCreator.createTheme() local status, err = xpcall(function() local SCHEME_DIR = constants.WORKING_TEMPLATE_DIR .. "/scheme" local FONT_DIR = constants.WORKING_TEMPLATE_DIR .. "/font" - local RESOLUTION_DIR = getResolutionDir() - local RESOLUTION_IMAGE_DIR = constants.WORKING_TEMPLATE_DIR .. "/" .. RESOLUTION_DIR .. "/image" + local IMAGE_DIR = getImageDir() -- Clean up and prepare working directory executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') @@ -400,7 +383,7 @@ function themeCreator.createTheme() local requiredDirs = { SCHEME_DIR, FONT_DIR, - RESOLUTION_IMAGE_DIR, + IMAGE_DIR, } for _, dir in ipairs(requiredDirs) do ensureDir(dir) @@ -464,11 +447,11 @@ function themeCreator.createTheme() end -- Create directory if it doesn't exist - local previewDir = constants.WORKING_TEMPLATE_DIR .. "/" .. RESOLUTION_DIR - ensureDir(previewDir) + local imageDir = getImageDir() + ensureDir(imageDir) -- Set preview path based on screen resolution - local previewPath = previewDir .. "/preview.png" + local previewPath = imageDir .. "/preview.png" if not createPreviewImage(previewPath) then error("Failed to create preview image at: " .. previewPath) end From e4530a171f87434315df0eca31e3ae347f176420 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 00:35:15 -0600 Subject: [PATCH 21/74] Set screenWidth and screenHeight state variables by reading environment variables --- mux_launch.sh | 29 ++++++----------------------- src/main.lua | 1 - src/state.lua | 5 +++-- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index 1fe3f4b..80f601f 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -5,41 +5,28 @@ # Source muOS system functions . /opt/muos/script/var/func.sh -# SCREEN_WIDTH=$(GET_VAR device mux/width) -# SCREEN_HEIGHT=$(GET_VAR device mux/height) -# SCREEN_RESOLUTION="${SCREEN_WIDTH}x${SCREEN_HEIGHT}" - -# echo app >/tmp/act_go - # Define paths ROOT_DIR="$(GET_VAR "device" "storage/rom/mount")/MUOS/application/Aesthetic/.aesthetic" THEME_DIR="/run/muos/storage/theme" BINDIR="$ROOT_DIR/bin" LOG_DIR="$ROOT_DIR/logs" +# Define variables +SCREEN_WIDTH=$(GET_VAR device mux/width) +SCREEN_HEIGHT=$(GET_VAR device mux/height) + # Create required directories mkdir -p "$THEME_DIR/active" mkdir -p "$LOG_DIR" chmod 777 "$LOG_DIR" -# Debug: Check directory creation and permissions -echo "Debug: Checking directories and permissions" > "$LOG_DIR/launch_debug.log" -echo "ROOT_DIR: $ROOT_DIR" >> "$LOG_DIR/launch_debug.log" -ls -la "$ROOT_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 -echo "Logs directory:" >> "$LOG_DIR/launch_debug.log" -ls -la "$LOG_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 -echo "Tove library:" >> "$LOG_DIR/launch_debug.log" -ls -la "$ROOT_DIR/tove" >> "$LOG_DIR/launch_debug.log" 2>&1 - # Export environment variables export SDL_GAMECONTROLLERCONFIG_FILE="/usr/lib/gamecontrollerdb.txt" export THEME_DIR export LOG_DIR export LD_LIBRARY_PATH="$ROOT_DIR/lib:$ROOT_DIR/tove:$LD_LIBRARY_PATH" - -# Debug: Print environment -echo "Environment:" >> "$LOG_DIR/launch_debug.log" -env >> "$LOG_DIR/launch_debug.log" +export SCREEN_WIDTH +export SCREEN_HEIGHT # Launch application cd "$ROOT_DIR" || exit @@ -47,7 +34,3 @@ SET_VAR "system" "foreground_process" "love" # Redirect both stdout and stderr to log files ./bin/love . > "$LOG_DIR/app.log" 2> "$LOG_DIR/error.log" - -# Debug: Check if logs were created -echo "After LÖVE execution:" >> "$LOG_DIR/launch_debug.log" -ls -la "$LOG_DIR" >> "$LOG_DIR/launch_debug.log" 2>&1 diff --git a/src/main.lua b/src/main.lua index 7efeb18..e4c86e1 100644 --- a/src/main.lua +++ b/src/main.lua @@ -78,7 +78,6 @@ local function setupFonts() end function love.load() - state.screenWidth, state.screenHeight = love.graphics.getDimensions() state.fadeDuration = 0.5 setupFonts() diff --git a/src/state.lua b/src/state.lua index d14d08c..c4bb1eb 100644 --- a/src/state.lua +++ b/src/state.lua @@ -1,9 +1,10 @@ --- Global state management module local love = require("love") + local state = { applicationName = "Aesthetic", - screenWidth = 0, -- Set in main.lua - screenHeight = 0, -- Set in main.lua + screenWidth = tonumber(os.getenv("SCREEN_WIDTH")), + screenHeight = tonumber(os.getenv("SCREEN_HEIGHT")), -- Use default font initially, set in main.lua fonts = { header = love.graphics.getFont(), From 290853965aa4361f8bcfb19ad21e3b43c088db36 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 01:41:16 -0600 Subject: [PATCH 22/74] Read screen dimensions with love.graphics --- mux_launch.sh | 7 ------- src/main.lua | 1 + src/state.lua | 4 ++-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index 80f601f..ef6fdb0 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -11,22 +11,15 @@ THEME_DIR="/run/muos/storage/theme" BINDIR="$ROOT_DIR/bin" LOG_DIR="$ROOT_DIR/logs" -# Define variables -SCREEN_WIDTH=$(GET_VAR device mux/width) -SCREEN_HEIGHT=$(GET_VAR device mux/height) - # Create required directories mkdir -p "$THEME_DIR/active" mkdir -p "$LOG_DIR" -chmod 777 "$LOG_DIR" # Export environment variables export SDL_GAMECONTROLLERCONFIG_FILE="/usr/lib/gamecontrollerdb.txt" export THEME_DIR export LOG_DIR export LD_LIBRARY_PATH="$ROOT_DIR/lib:$ROOT_DIR/tove:$LD_LIBRARY_PATH" -export SCREEN_WIDTH -export SCREEN_HEIGHT # Launch application cd "$ROOT_DIR" || exit diff --git a/src/main.lua b/src/main.lua index e4c86e1..7efeb18 100644 --- a/src/main.lua +++ b/src/main.lua @@ -78,6 +78,7 @@ local function setupFonts() end function love.load() + state.screenWidth, state.screenHeight = love.graphics.getDimensions() state.fadeDuration = 0.5 setupFonts() diff --git a/src/state.lua b/src/state.lua index c4bb1eb..c5091ba 100644 --- a/src/state.lua +++ b/src/state.lua @@ -3,8 +3,8 @@ local love = require("love") local state = { applicationName = "Aesthetic", - screenWidth = tonumber(os.getenv("SCREEN_WIDTH")), - screenHeight = tonumber(os.getenv("SCREEN_HEIGHT")), + screenWidth = 0, + screenHeight = 0, -- Use default font initially, set in main.lua fonts = { header = love.graphics.getFont(), From e94178e00e055499391e7f7f53a1deac0dce6795 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 01:57:08 -0600 Subject: [PATCH 23/74] Add state screen dimensions documentation --- src/state.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/state.lua b/src/state.lua index c5091ba..5125b22 100644 --- a/src/state.lua +++ b/src/state.lua @@ -1,11 +1,18 @@ --- Global state management module local love = require("love") +-- TODO: Ensure state variables are not added outside of this file + local state = { applicationName = "Aesthetic", + + -- Screen dimensions are set using `love.graphics.getDimensions()` + -- Alternatively, use the muOS GET_VAR function (load the file containing the GET_VAR function first) + -- $(GET_VAR device mux/width) + -- $(GET_VAR device mux/height) screenWidth = 0, screenHeight = 0, - -- Use default font initially, set in main.lua + fonts = { header = love.graphics.getFont(), body = love.graphics.getFont(), From 16e9a24b14947adf496b41e481c5aca426389f9b Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 08:30:36 -0600 Subject: [PATCH 24/74] Move shared constants used by color picker screens to dedicated module --- src/screen/color_picker.lua | 30 ++--- src/screen/color_picker/constants.lua | 6 + src/screen/color_picker/hex.lua | 9 +- src/screen/color_picker/hsv.lua | 19 +-- src/screen/color_picker/palette.lua | 166 ++++++++++++-------------- 5 files changed, 111 insertions(+), 119 deletions(-) create mode 100644 src/screen/color_picker/constants.lua diff --git a/src/screen/color_picker.lua b/src/screen/color_picker.lua index 7f457d4..d66dec2 100644 --- a/src/screen/color_picker.lua +++ b/src/screen/color_picker.lua @@ -2,7 +2,7 @@ local love = require("love") local colors = require("colors") local state = require("state") -local controls = require("controls") +local constants = require("screen.color_picker.constants") -- Import sub-screens local paletteScreen = require("screen.color_picker.palette") @@ -12,18 +12,10 @@ local hexScreen = require("screen.color_picker.hex") -- Module table to export public functions local colorPicker = {} --- Constants for tab UI -local TAB = { - HEIGHT = 40, - PADDING = 10, - MARGIN = 0, -- Move tabs to the top of the screen - CORNER_RADIUS = 8, - ACTIVE_LINE_HEIGHT = 3, -} +-- Shared constants +colorPicker.TAB_HEIGHT = constants.TAB_HEIGHT --- Store these valuesglobally for other screens to access -state.TAB_HEIGHT = TAB.MARGIN + TAB.HEIGHT -state.CONTROLS_HEIGHT = controls.HEIGHT +local TAB_ACTIVE_LINE_HEIGHT = 3 -- Tab definitions local tabs = { @@ -67,11 +59,11 @@ end function colorPicker.load() -- Calculate tab widths - local availableWidth = state.screenWidth - (TAB.MARGIN * 2) + local availableWidth = state.screenWidth local tabWidth = availableWidth / #tabs for i, tab in ipairs(tabs) do - tab.x = TAB.MARGIN + (i - 1) * tabWidth + tab.x = (i - 1) * tabWidth tab.width = tabWidth end @@ -113,7 +105,7 @@ function colorPicker.draw() -- Draw tab bar background love.graphics.setColor(colors.ui.background[1], colors.ui.background[2], colors.ui.background[3], 0.9) - love.graphics.rectangle("fill", 0, 0, state.screenWidth, TAB.HEIGHT + TAB.MARGIN) + love.graphics.rectangle("fill", 0, 0, state.screenWidth, colorPicker.TAB_HEIGHT) -- Draw tabs for _, tab in ipairs(tabs) do @@ -135,7 +127,7 @@ function colorPicker.draw() local rightRadius = 0 -- Draw tab with appropriate corner rounding (none) - love.graphics.rectangle("fill", tab.x, TAB.MARGIN, tab.width, TAB.HEIGHT, leftRadius, rightRadius) + love.graphics.rectangle("fill", tab.x, 0, tab.width, colorPicker.TAB_HEIGHT, leftRadius, rightRadius) -- Tab text if tab.active then @@ -147,7 +139,7 @@ function colorPicker.draw() love.graphics.printf( tab.name, tab.x, - TAB.MARGIN + (TAB.HEIGHT - state.fonts.body:getHeight()) / 2, + (colorPicker.TAB_HEIGHT - state.fonts.body:getHeight()) / 2, tab.width, "center" ) @@ -158,9 +150,9 @@ function colorPicker.draw() love.graphics.rectangle( "fill", tab.x, - TAB.MARGIN + TAB.HEIGHT - TAB.ACTIVE_LINE_HEIGHT, + colorPicker.TAB_HEIGHT - TAB_ACTIVE_LINE_HEIGHT, tab.width, - TAB.ACTIVE_LINE_HEIGHT, + TAB_ACTIVE_LINE_HEIGHT, 0 ) end diff --git a/src/screen/color_picker/constants.lua b/src/screen/color_picker/constants.lua new file mode 100644 index 0000000..ac8ec52 --- /dev/null +++ b/src/screen/color_picker/constants.lua @@ -0,0 +1,6 @@ +--- Color picker shared constants +local constants = {} + +constants.TAB_HEIGHT = 40 + +return constants diff --git a/src/screen/color_picker/hex.lua b/src/screen/color_picker/hex.lua index 33feaa8..16903f5 100644 --- a/src/screen/color_picker/hex.lua +++ b/src/screen/color_picker/hex.lua @@ -4,6 +4,7 @@ local colors = require("colors") local state = require("state") local controls = require("controls") local colorUtils = require("utils.color") +local constants = require("screen.color_picker.constants") local hex = {} @@ -115,10 +116,10 @@ end local function getButtonDimensions() local gridWidth = state.screenWidth - (2 * EDGE_PADDING) - LAST_COLUMN_EXTRA_PADDING local availableHeight = state.screenHeight - - state.TAB_HEIGHT + - constants.TAB_HEIGHT - TOP_PADDING - PREVIEW_HEIGHT - - state.CONTROLS_HEIGHT + - controls.HEIGHT - (2 * GRID_PADDING) local buttonWidth = (gridWidth - (4 * GRID_PADDING)) / 5 @@ -131,7 +132,7 @@ end local function getButtonPosition(row, col) local buttonWidth, buttonHeight = getButtonDimensions() local startX = EDGE_PADDING - local startY = state.TAB_HEIGHT + TOP_PADDING + PREVIEW_HEIGHT + GRID_PADDING + local startY = constants.TAB_HEIGHT + TOP_PADDING + PREVIEW_HEIGHT + GRID_PADDING local x = startX + (col - 1) * (buttonWidth + GRID_PADDING) @@ -189,7 +190,7 @@ function hex.draw() -- Draw color preview rectangle local previewX = EDGE_PADDING - local previewY = state.TAB_HEIGHT + TOP_PADDING + local previewY = constants.TAB_HEIGHT + TOP_PADDING local previewWidth = state.screenWidth - (2 * EDGE_PADDING) -- Variables for input display diff --git a/src/screen/color_picker/hsv.lua b/src/screen/color_picker/hsv.lua index bffcd67..809e48d 100644 --- a/src/screen/color_picker/hsv.lua +++ b/src/screen/color_picker/hsv.lua @@ -6,8 +6,9 @@ local menuScreen = require("screen.menu") local tween = require("tween") local colorUtils = require("utils.color") local controls = require("controls") +local constants = require("screen.color_picker.constants") -local colorpickerhsv = {} +local hsv = {} -- Constants local EDGE_PADDING = 20 @@ -143,9 +144,9 @@ local function startWiggleAnimation() }, "outElastic") end -function colorpickerhsv.load() +function hsv.load() -- Calculate available space - local availableHeight = state.screenHeight - (EDGE_PADDING * 2) - state.CONTROLS_HEIGHT - state.TAB_HEIGHT + local availableHeight = state.screenHeight - (EDGE_PADDING * 2) - controls.HEIGHT - constants.TAB_HEIGHT local availableWidth = state.screenWidth - (EDGE_PADDING * 2) -- Calculate SV square size - should be a perfect square that fits the available height @@ -175,7 +176,7 @@ function colorpickerhsv.load() -- SV square position (rightmost, ensuring consistent right edge padding) pickerState.startX = state.screenWidth - EDGE_PADDING - pickerState.squareSize -- Store all positions - pickerState.startY = EDGE_PADDING + state.TAB_HEIGHT + pickerState.startY = EDGE_PADDING + constants.TAB_HEIGHT pickerState.hueSliderX = hueSliderX pickerState.previewX = previewX @@ -193,7 +194,7 @@ function colorpickerhsv.load() startWiggleAnimation() end -function colorpickerhsv.draw() +function hsv.draw() -- Set background love.graphics.setColor(colors.ui.background) love.graphics.clear(colors.ui.background) @@ -419,7 +420,7 @@ local function updateSVSquare() pickerState.lastRenderedHue = currentState.hue end -function colorpickerhsv.update(dt) +function hsv.update(dt) -- Update any active tweens if pickerState.tweens.svCursor then pickerState.tweens.svCursor:update(dt) @@ -539,12 +540,12 @@ function colorpickerhsv.update(dt) end end -function colorpickerhsv.setScreenSwitcher(switchFunc) +function hsv.setScreenSwitcher(switchFunc) switchScreen = switchFunc end -- Function to be called when entering this screen -function colorpickerhsv.onEnter() +function hsv.onEnter() -- Get current color type state local colorType = state.lastSelectedColorButton local currentState = pickerState[colorType] or pickerState.background -- Default to background if nil @@ -567,4 +568,4 @@ function colorpickerhsv.onEnter() startWiggleAnimation() end -return colorpickerhsv +return hsv diff --git a/src/screen/color_picker/palette.lua b/src/screen/color_picker/palette.lua index 0d713a2..19a8e9e 100644 --- a/src/screen/color_picker/palette.lua +++ b/src/screen/color_picker/palette.lua @@ -5,8 +5,9 @@ local state = require("state") local menuScreen = require("screen.menu") local tween = require("tween") local controls = require("controls") +local constants = require("screen.color_picker.constants") -local colorpicker = {} +local palette = {} local switchScreen = nil local MENU_SCREEN = "menu" @@ -77,7 +78,7 @@ local function calculateGridDimensions() local gridSize = calculateGridSize() -- Calculate available space - local availableHeight = state.screenHeight - state.CONTROLS_HEIGHT - state.TAB_HEIGHT - (PADDING * 2) + local availableHeight = state.screenHeight - controls.HEIGHT - constants.TAB_HEIGHT - (PADDING * 2) local availableWidth = state.screenWidth - (PADDING * 2) - SCROLLBAR.WIDTH - SCROLLBAR.PADDING -- Calculate square size based on available width and fixed number of columns @@ -93,7 +94,7 @@ local function calculateGridDimensions() -- Calculate grid position local offsetX = math.floor((state.screenWidth - totalWidth - SCROLLBAR.WIDTH - SCROLLBAR.PADDING) / 2) - local offsetY = math.floor(state.TAB_HEIGHT + PADDING) + local offsetY = math.floor(constants.TAB_HEIGHT + PADDING) return { colorKeys = colorKeys, @@ -107,7 +108,7 @@ local function calculateGridDimensions() } end -local colorpickerState = { +local paletteState = { colorKeys = getColorKeys(), gridSize = nil, squareSize = 0, @@ -130,23 +131,23 @@ local colorpickerState = { visibleGridHeight = 0, } -function colorpicker.load() +function palette.load() -- Calculate grid dimensions and update state local dimensions = calculateGridDimensions() -- Update state with calculated dimensions - colorpickerState.colorKeys = dimensions.colorKeys - colorpickerState.gridSize = dimensions.gridSize - colorpickerState.squareSize = dimensions.squareSize - colorpickerState.visibleRows = dimensions.visibleRows - colorpickerState.totalGridHeight = dimensions.totalGridHeight - colorpickerState.visibleGridHeight = dimensions.visibleGridHeight - colorpickerState.offsetX = dimensions.offsetX - colorpickerState.offsetY = dimensions.offsetY + paletteState.colorKeys = dimensions.colorKeys + paletteState.gridSize = dimensions.gridSize + paletteState.squareSize = dimensions.squareSize + paletteState.visibleRows = dimensions.visibleRows + paletteState.totalGridHeight = dimensions.totalGridHeight + paletteState.visibleGridHeight = dimensions.visibleGridHeight + paletteState.offsetX = dimensions.offsetX + paletteState.offsetY = dimensions.offsetY -- Only reset scroll position if it hasn't been set before local colorType = state.lastSelectedColorButton - local currentState = colorpickerState[colorType] or colorpickerState.background -- Default to background if nil + local currentState = paletteState[colorType] or paletteState.background -- Default to background if nil if currentState.scrollY == nil then currentState.scrollY = 0 end @@ -155,24 +156,24 @@ end -- Helper function to draw the scrollbar local function drawScrollbar() -- Calculate scrollbar position and dimensions - local scrollbarHeight = state.screenHeight - state.CONTROLS_HEIGHT - state.TAB_HEIGHT - (PADDING * 2) + local scrollbarHeight = state.screenHeight - controls.HEIGHT - constants.TAB_HEIGHT - (PADDING * 2) local scrollbarX = state.screenWidth - SCROLLBAR.WIDTH - SCROLLBAR.PADDING - local scrollbarY = state.TAB_HEIGHT + PADDING + local scrollbarY = constants.TAB_HEIGHT + PADDING -- Draw scrollbar background love.graphics.setColor(colors.ui.foreground[1], colors.ui.foreground[2], colors.ui.foreground[3], 0.2) love.graphics.rectangle("fill", scrollbarX, scrollbarY, SCROLLBAR.WIDTH, scrollbarHeight, SCROLLBAR.CORNER_RADIUS) -- Calculate handle position and size - local contentRatio = colorpickerState.visibleGridHeight / colorpickerState.totalGridHeight + local contentRatio = paletteState.visibleGridHeight / paletteState.totalGridHeight local handleHeight = math.max(SCROLLBAR.HANDLE_MIN_HEIGHT, scrollbarHeight * contentRatio) -- Calculate handle position based on scroll position local scrollRatio = 0 local colorType = state.lastSelectedColorButton - local currentState = colorpickerState[colorType] or colorpickerState.background -- Default to background if nil - if colorpickerState.totalGridHeight > colorpickerState.visibleGridHeight then - scrollRatio = currentState.scrollY / (colorpickerState.totalGridHeight - colorpickerState.visibleGridHeight) + local currentState = paletteState[colorType] or paletteState.background -- Default to background if nil + if paletteState.totalGridHeight > paletteState.visibleGridHeight then + scrollRatio = currentState.scrollY / (paletteState.totalGridHeight - paletteState.visibleGridHeight) end local handleY = scrollbarY + (scrollbarHeight - handleHeight) * scrollRatio @@ -185,62 +186,56 @@ end -- Helper function to draw the controls background local function drawControlsBackground() love.graphics.setColor(colors.ui.background) - love.graphics.rectangle( - "fill", - 0, - state.screenHeight - state.CONTROLS_HEIGHT, - state.screenWidth, - state.CONTROLS_HEIGHT - ) + love.graphics.rectangle("fill", 0, state.screenHeight - controls.HEIGHT, state.screenWidth, controls.HEIGHT) end -function colorpicker.draw() +function palette.draw() -- Set background love.graphics.setColor(colors.ui.background) love.graphics.clear(colors.ui.background) -- Get current color type state local colorType = state.lastSelectedColorButton - local currentState = colorpickerState[colorType] or colorpickerState.background -- Default to background if nil + local currentState = paletteState[colorType] or paletteState.background -- Default to background if nil -- Calculate the first visible row based on scroll position - local firstVisibleRow = math.floor(currentState.scrollY / (colorpickerState.squareSize + SQUARE_SPACING)) + local firstVisibleRow = math.floor(currentState.scrollY / (paletteState.squareSize + SQUARE_SPACING)) -- Calculate the last visible row - local lastVisibleRow = math.min(firstVisibleRow + colorpickerState.visibleRows, colorpickerState.gridSize.rows - 1) + local lastVisibleRow = math.min(firstVisibleRow + paletteState.visibleRows, paletteState.gridSize.rows - 1) -- Calculate the offset for smooth scrolling - local scrollOffset = currentState.scrollY % (colorpickerState.squareSize + SQUARE_SPACING) + local scrollOffset = currentState.scrollY % (paletteState.squareSize + SQUARE_SPACING) -- Draw color grid (only visible rows) for row = firstVisibleRow, lastVisibleRow do - for col = 0, colorpickerState.gridSize.cols - 1 do - local colorIndex = gridPosToIndex(row, col, colorpickerState.gridSize) + for col = 0, paletteState.gridSize.cols - 1 do + local colorIndex = gridPosToIndex(row, col, paletteState.gridSize) -- Only draw if there is a color for this position - if colorIndex <= #colorpickerState.colorKeys then - local x = colorpickerState.offsetX + col * (colorpickerState.squareSize + SQUARE_SPACING) - local y = colorpickerState.offsetY - + (row - firstVisibleRow) * (colorpickerState.squareSize + SQUARE_SPACING) + if colorIndex <= #paletteState.colorKeys then + local x = paletteState.offsetX + col * (paletteState.squareSize + SQUARE_SPACING) + local y = paletteState.offsetY + + (row - firstVisibleRow) * (paletteState.squareSize + SQUARE_SPACING) - scrollOffset -- Calculate scale and offset for the selected square local scale = 1 local offset = 0 if row == currentState.selectedRow and col == currentState.selectedCol then - scale = colorpickerState.currentScale - offset = (colorpickerState.squareSize * (scale - 1)) / 2 + scale = paletteState.currentScale + offset = (paletteState.squareSize * (scale - 1)) / 2 end -- Draw the color square with scale - local currentColor = colorpickerState.colorKeys[colorIndex] + local currentColor = paletteState.colorKeys[colorIndex] love.graphics.setColor(colors.palette[currentColor]) love.graphics.rectangle( "fill", x - offset, y - offset, - colorpickerState.squareSize * scale, - colorpickerState.squareSize * scale, + paletteState.squareSize * scale, + paletteState.squareSize * scale, BORDER.CORNER_RADIUS ) @@ -255,8 +250,8 @@ function colorpicker.draw() "line", x - offset, y - offset, - colorpickerState.squareSize * scale, - colorpickerState.squareSize * scale, + paletteState.squareSize * scale, + paletteState.squareSize * scale, BORDER.CORNER_RADIUS ) end @@ -287,12 +282,12 @@ function colorpicker.draw() }) end -function colorpicker.update(dt) +function palette.update(dt) -- Update tween if it exists - if colorpickerState.scaleTween then - local complete = colorpickerState.scaleTween:update(dt) + if paletteState.scaleTween then + local complete = paletteState.scaleTween:update(dt) if complete then - colorpickerState.scaleTween = nil + paletteState.scaleTween = nil end end @@ -302,7 +297,7 @@ function colorpicker.update(dt) -- Get current color type state local colorType = state.lastSelectedColorButton - local currentState = colorpickerState[colorType] or colorpickerState.background -- Default to background if nil + local currentState = paletteState[colorType] or paletteState.background -- Default to background if nil local newRow, newCol = currentState.selectedRow, currentState.selectedCol @@ -312,7 +307,7 @@ function colorpicker.update(dt) newRow = currentState.selectedRow - 1 end elseif virtualJoystick:isGamepadDown("dpdown") then - if currentState.selectedRow < colorpickerState.gridSize.rows - 1 then + if currentState.selectedRow < paletteState.gridSize.rows - 1 then newRow = currentState.selectedRow + 1 end elseif virtualJoystick:isGamepadDown("dpleft") then @@ -320,30 +315,30 @@ function colorpicker.update(dt) newCol = currentState.selectedCol - 1 end elseif virtualJoystick:isGamepadDown("dpright") then - if currentState.selectedCol < colorpickerState.gridSize.cols - 1 then + if currentState.selectedCol < paletteState.gridSize.cols - 1 then newCol = currentState.selectedCol + 1 end end -- Only move if the new position has a color - if hasColorAt(newRow, newCol, colorpickerState.gridSize, #colorpickerState.colorKeys) then + if hasColorAt(newRow, newCol, paletteState.gridSize, #paletteState.colorKeys) then if newRow ~= currentState.selectedRow or newCol ~= currentState.selectedCol then currentState.selectedRow = newRow currentState.selectedCol = newCol moved = true -- Start new hover animation - colorpickerState.currentScale = 1 - colorpickerState.scaleTween = tween.new(ANIMATION.DURATION, colorpickerState, { + paletteState.currentScale = 1 + paletteState.scaleTween = tween.new(ANIMATION.DURATION, paletteState, { currentScale = ANIMATION.SCALE, }, "outQuad") -- Handle scrolling when selection moves out of view - local rowPosition = currentState.selectedRow * (colorpickerState.squareSize + SQUARE_SPACING) + local rowPosition = currentState.selectedRow * (paletteState.squareSize + SQUARE_SPACING) -- Calculate the visible area boundaries local visibleTop = currentState.scrollY - local visibleBottom = visibleTop + colorpickerState.visibleGridHeight - colorpickerState.squareSize + local visibleBottom = visibleTop + paletteState.visibleGridHeight - paletteState.squareSize -- Scroll up if selection is above visible area if rowPosition < visibleTop then @@ -353,18 +348,15 @@ function colorpicker.update(dt) -- Scroll down if selection is below visible area if rowPosition > visibleBottom then currentState.scrollY = rowPosition - - colorpickerState.visibleGridHeight - + colorpickerState.squareSize + - paletteState.visibleGridHeight + + paletteState.squareSize + SQUARE_SPACING end -- Ensure scroll position doesn't go out of bounds currentState.scrollY = math.max( 0, - math.min( - currentState.scrollY, - colorpickerState.totalGridHeight - colorpickerState.visibleGridHeight - ) + math.min(currentState.scrollY, paletteState.totalGridHeight - paletteState.visibleGridHeight) ) end end @@ -378,8 +370,8 @@ function colorpicker.update(dt) if virtualJoystick:isGamepadDown("a") then -- Regular color selected local selectedIndex = - gridPosToIndex(currentState.selectedRow, currentState.selectedCol, colorpickerState.gridSize) - local selectedKey = colorpickerState.colorKeys[selectedIndex] + gridPosToIndex(currentState.selectedRow, currentState.selectedCol, paletteState.gridSize) + local selectedKey = paletteState.colorKeys[selectedIndex] if selectedKey then -- Convert the selected color key to hex code local hexCode = colors.toHex(selectedKey, "palette") @@ -395,28 +387,28 @@ function colorpicker.update(dt) end end -function colorpicker.setScreenSwitcher(switchFunc) +function palette.setScreenSwitcher(switchFunc) switchScreen = switchFunc end -- Function called when entering this screen -function colorpicker.onEnter() +function palette.onEnter() -- Calculate grid dimensions and update state local dimensions = calculateGridDimensions() -- Update state with calculated dimensions - colorpickerState.colorKeys = dimensions.colorKeys - colorpickerState.gridSize = dimensions.gridSize - colorpickerState.squareSize = dimensions.squareSize - colorpickerState.visibleRows = dimensions.visibleRows - colorpickerState.totalGridHeight = dimensions.totalGridHeight - colorpickerState.visibleGridHeight = dimensions.visibleGridHeight - colorpickerState.offsetX = dimensions.offsetX - colorpickerState.offsetY = dimensions.offsetY + paletteState.colorKeys = dimensions.colorKeys + paletteState.gridSize = dimensions.gridSize + paletteState.squareSize = dimensions.squareSize + paletteState.visibleRows = dimensions.visibleRows + paletteState.totalGridHeight = dimensions.totalGridHeight + paletteState.visibleGridHeight = dimensions.visibleGridHeight + paletteState.offsetX = dimensions.offsetX + paletteState.offsetY = dimensions.offsetY -- Get current color type state local colorType = state.lastSelectedColorButton - local currentState = colorpickerState[colorType] or colorpickerState.background -- Default to background if nil + local currentState = paletteState[colorType] or paletteState.background -- Default to background if nil -- Only reset selection and scroll position if they haven't been set before -- This allows the screen to remember its position when returning to it @@ -427,12 +419,12 @@ function colorpicker.onEnter() else -- Validate that the selected position is still valid after grid size changes -- and adjust if necessary - if currentState.selectedRow >= colorpickerState.gridSize.rows then - currentState.selectedRow = colorpickerState.gridSize.rows - 1 + if currentState.selectedRow >= paletteState.gridSize.rows then + currentState.selectedRow = paletteState.gridSize.rows - 1 end - if currentState.selectedCol >= colorpickerState.gridSize.cols then - currentState.selectedCol = colorpickerState.gridSize.cols - 1 + if currentState.selectedCol >= paletteState.gridSize.cols then + currentState.selectedCol = paletteState.gridSize.cols - 1 end -- Ensure the selected position has a color @@ -440,8 +432,8 @@ function colorpicker.onEnter() not hasColorAt( currentState.selectedRow, currentState.selectedCol, - colorpickerState.gridSize, - #colorpickerState.colorKeys + paletteState.gridSize, + #paletteState.colorKeys ) then -- If not, reset to the first color @@ -450,10 +442,10 @@ function colorpicker.onEnter() end -- Ensure scroll position is still valid - if colorpickerState.totalGridHeight > colorpickerState.visibleGridHeight then + if paletteState.totalGridHeight > paletteState.visibleGridHeight then currentState.scrollY = math.max( 0, - math.min(currentState.scrollY, colorpickerState.totalGridHeight - colorpickerState.visibleGridHeight) + math.min(currentState.scrollY, paletteState.totalGridHeight - paletteState.visibleGridHeight) ) else currentState.scrollY = 0 @@ -461,10 +453,10 @@ function colorpicker.onEnter() end -- Start hover animation for the selected color - colorpickerState.currentScale = 1 - colorpickerState.scaleTween = tween.new(ANIMATION.DURATION, colorpickerState, { + paletteState.currentScale = 1 + paletteState.scaleTween = tween.new(ANIMATION.DURATION, paletteState, { currentScale = ANIMATION.SCALE, }, "outQuad") end -return colorpicker +return palette From 6c271520bd193b4375af5311c1ab2437023369b4 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 12:15:29 -0600 Subject: [PATCH 25/74] Move constant paths from theme_creator.lua to constants.lua --- mux_launch.sh | 1 + src/screen/menu/constants.lua | 45 +++++- src/screen/menu/theme_creator.lua | 240 +++++++++++++++++------------- 3 files changed, 179 insertions(+), 107 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index ef6fdb0..96d203c 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -20,6 +20,7 @@ export SDL_GAMECONTROLLERCONFIG_FILE="/usr/lib/gamecontrollerdb.txt" export THEME_DIR export LOG_DIR export LD_LIBRARY_PATH="$ROOT_DIR/lib:$ROOT_DIR/tove:$LD_LIBRARY_PATH" +export TEMPLATE_DIR="$ROOT_DIR/template" # Launch application cd "$ROOT_DIR" || exit diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index 5f43992..6fcda8a 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -70,10 +70,47 @@ constants.POPUP_BUTTONS = { }, } --- Constants for paths -constants.ORIGINAL_TEMPLATE_DIR = os.getenv("TEMPLATE_DIR") or "template" -- Store original template path -constants.WORKING_TEMPLATE_DIR = constants.ORIGINAL_TEMPLATE_DIR .. "_working" -- Add working directory path -constants.THEME_OUTPUT_DIR = constants.WORKING_TEMPLATE_DIR +-- TODO: Make os.getenv() safer +-- TODO: Create files like `name.txt` dynamically +-- TODO: You can initialize the paths here +constants.PATHS = { + TEMPLATE_DIR = os.getenv("TEMPLATE_DIR"), + THEME_DIR = os.getenv("THEME_DIR"), +} + +-- Create a local alias for easier access +local paths = constants.PATHS + +-- Working theme directory where files are written before archiving into a theme +paths.WORKING_THEME_DIR = paths.TEMPLATE_DIR .. "_working" + +-- Active theme directory where files of the currently active theme are stored +paths.THEME_ACTIVE_DIR = paths.THEME_DIR .. "/active" + +-- Generated theme path where the generated theme is written +paths.THEME_OUTPUT_PATH = paths.THEME_DIR .. "/" .. state.applicationName .. ".muxthm" + +-- Assets used by UI rather than generated theme +paths.THEME_FONT_SOURCE_DIR = paths.TEMPLATE_DIR .. "/font" + +-- `name.txt` +paths.THEME_NAME_PATH = paths.WORKING_THEME_DIR .. "/name.txt" + +-- `scheme` +paths.THEME_SCHEME_DIR = paths.WORKING_THEME_DIR .. "/scheme" +paths.THEME_SCHEME_GLOBAL_PATH = paths.THEME_SCHEME_DIR .. "/global.ini" + +-- `font` +paths.THEME_FONT_DIR = paths.WORKING_THEME_DIR .. "/font" +paths.THEME_DEFAULT_FONT_PATH = paths.THEME_FONT_DIR .. "/default.bin" + +-- `x` +paths.THEME_RESOLUTION_DIR = paths.WORKING_THEME_DIR .. "/" .. state.screenWidth .. "x" .. state.screenHeight +paths.THEME_PREVIEW_IMAGE_PATH = paths.THEME_RESOLUTION_DIR .. "/preview.png" +-- `x/image` +paths.THEME_IMAGE_DIR = paths.THEME_RESOLUTION_DIR .. "/image" +paths.THEME_BOOTLOGO_IMAGE_PATH = paths.THEME_IMAGE_DIR .. "/bootlogo.bmp" +paths.THEME_REBOOT_IMAGE_PATH = paths.THEME_IMAGE_DIR .. "/reboot.png" -- Font options constants.FONTS = { diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index f7532ee..9902bdc 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -6,17 +6,20 @@ local fileUtils = require("screen.menu.file_utils") local errorHandler = require("screen.menu.error_handler") local colorUtils = require("utils.color") +local paths = constants.PATHS + local tove = require("tove") -- Module table to export public functions local themeCreator = {} -local function getImageDir() - return constants.WORKING_TEMPLATE_DIR .. "/" .. state.screenWidth .. "x" .. state.screenHeight .. "/image" -end - local function ensureDir(dir) - return os.execute('mkdir -p "' .. dir .. '"') + local result = os.execute('mkdir -p "' .. dir .. '"') + if not result then + errorHandler.setError("Failed to create directory: " .. dir) + return false + end + return result -- Extract directory from path -- local destDir = string.match(path, "(.*)/[^/]*$") -- if destDir then @@ -39,13 +42,15 @@ local function copyFile(sourcePath, destPath, errorMessage) -- Extract directory from destination path local destDir = string.match(destPath, "(.*)/[^/]*$") if destDir then - ensureDir(destDir) + if not ensureDir(destDir) then + return false -- ensureDir already set the error + end end return executeCommand(string.format('cp "%s" "%s"', sourcePath, destPath), errorMessage) end -- Function to create a preview image with the selected background color and "muOS" text -local function createPreviewImage(outputPath) +local function createPreviewImage() local width, height = 288, 216 local text = "muOS" @@ -77,20 +82,37 @@ local function createPreviewImage(outputPath) love.graphics.print(text, (width - textWidth) / 2, (height - textHeight) / 2) love.graphics.setCanvas() - -- Save image - local tempFilename = "preview_temp.png" - local success = love.filesystem.write(tempFilename, canvas:newImageData():encode("png"):getString()) + -- Get image data and encode as PNG + local imageData = canvas:newImageData() + if not imageData then + errorHandler.setError("Failed to get image data from preview canvas") + return false + end + + local pngData = imageData:encode("png") + if not pngData then + errorHandler.setError("Failed to encode preview image to PNG") + return false + end - if not success then + -- Write file using direct file I/O + local file = io.open(paths.THEME_PREVIEW_IMAGE_PATH, "wb") + if not file then + errorHandler.setError("Failed to open preview image file for writing: " .. paths.THEME_PREVIEW_IMAGE_PATH) return false end - -- Move to final location - local tempPath = love.filesystem.getSaveDirectory() .. "/" .. tempFilename - local result = copyFile(tempPath, outputPath) - love.filesystem.remove(tempFilename) + local success, writeErr = pcall(function() + file:write(pngData:getString()) + end) + file:close() - return result + if not success then + errorHandler.setError("Failed to write preview image data: " .. tostring(writeErr)) + return false + end + + return true end -- Function to apply glyph settings to a scheme file @@ -191,6 +213,7 @@ local function saveAsBMP(imageData, filepath) -- Create file local file = io.open(filepath, "wb") if not file then + errorHandler.setError("Failed to open file for writing BMP: " .. filepath) return false end @@ -259,10 +282,6 @@ local function createStartImage() local bgColor = getBackgroundColor() local fgColor = getForegroundColor() - local imageDir = getImageDir() - ensureDir(imageDir) - local outputPath = imageDir .. "/bootlogo.bmp" - -- Load SVG local svg = love.filesystem.read("assets/muOS/logo.svg") local iconSize = 200 @@ -288,7 +307,7 @@ local function createStartImage() love.graphics.setCanvas(previousCanvas) local imageData = canvas:newImageData() - if not saveAsBMP(imageData, outputPath) then + if not saveAsBMP(imageData, paths.THEME_BOOTLOGO_IMAGE_PATH) then errorHandler.setError("Failed to save BMP file") return false end @@ -303,20 +322,29 @@ local function createRebootImage() local bgColor = getBackgroundColor() local fgColor = getForegroundColor() - local imageDir = getImageDir() - ensureDir(imageDir) - local outputPath = imageDir .. "/reboot.png" - -- Load SVG local svg = love.filesystem.read("assets/icons/rotate-ccw.svg") + if not svg then + errorHandler.setError("Failed to load reboot icon SVG file") + return false + end + local iconSize = 150 local icon = tove.newGraphics(svg, iconSize) + if not icon then + errorHandler.setError("Failed to create graphics from reboot icon SVG") + return false + end icon:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) local previousCanvas = love.graphics.getCanvas() -- Create a new canvas, set it as the current canvas, and clear it local canvas = love.graphics.newCanvas(screenWidth, screenHeight) + if not canvas then + errorHandler.setError("Failed to create canvas for reboot image") + return false + end love.graphics.setCanvas(canvas) love.graphics.clear(bgColor) @@ -336,6 +364,12 @@ local function createRebootImage() ["Retro Pixel"] = state.fonts.retroPixel, } local font = fontMap[selectedFontName] or state.fonts.body + if not font then + errorHandler.setError("Failed to get font for reboot image") + love.graphics.pop() + love.graphics.setCanvas(previousCanvas) + return false + end -- Draw the text centered love.graphics.setFont(font, constants.IMAGE_FONT_SIZE) @@ -352,51 +386,74 @@ local function createRebootImage() -- Get image data and encode local imageData = canvas:newImageData() + if not imageData then + errorHandler.setError("Failed to get image data from reboot canvas") + return false + end + local pngData = imageData:encode("png") + if not pngData then + errorHandler.setError("Failed to encode reboot image to PNG") + return false + end -- Write file using direct file I/O since love.filesystem.write() doesn't work (?) - local file = io.open(outputPath, "wb") + local file = io.open(paths.THEME_REBOOT_IMAGE_PATH, "wb") if not file then - errorHandler.setError("Failed to open reboot image file for writing") + errorHandler.setError("Failed to open reboot image file for writing: " .. paths.THEME_REBOOT_IMAGE_PATH) return false end - file:write(pngData:getString()) + + local success, writeErr = pcall(function() + file:write(pngData:getString()) + end) file:close() + if not success then + errorHandler.setError("Failed to write reboot image data: " .. tostring(writeErr)) + return false + end + return true end -- Function to create theme function themeCreator.createTheme() local status, err = xpcall(function() - local SCHEME_DIR = constants.WORKING_TEMPLATE_DIR .. "/scheme" - local FONT_DIR = constants.WORKING_TEMPLATE_DIR .. "/font" - local IMAGE_DIR = getImageDir() - -- Clean up and prepare working directory - executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') - if not fileUtils.copyDir(constants.ORIGINAL_TEMPLATE_DIR, constants.WORKING_TEMPLATE_DIR) then - error("Failed to prepare working template directory") + executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') + if not fileUtils.copyDir(paths.TEMPLATE_DIR, paths.WORKING_THEME_DIR) then + errorHandler.setError("Failed to prepare working template directory") end - -- Verify directory structure - local requiredDirs = { - SCHEME_DIR, - FONT_DIR, - IMAGE_DIR, - } - for _, dir in ipairs(requiredDirs) do - ensureDir(dir) + -- Ensure all required directories exist + for key, path in pairs(paths) do + if type(path) == "string" and string.match(path, "/$") == nil then + -- Only ensure directories for path strings that don't already end with a slash + local dirPath = string.match(path, "(.*)/[^/]*$") + if dirPath then + if not ensureDir(dirPath) then + return false -- ensureDir already set the error + end + end + end end -- Create startup image if not createStartImage() then - error("Failed to create startup image") + -- createStartImage() already sets the error handler message + return false end -- Create reboot image if not createRebootImage() then - error("Failed to create reboot image") + -- Do not set error handler message here since it is set in createRebootImage() + return false + end + + -- Set preview path based on screen resolution + if not createPreviewImage() then + return false end -- Get hex colors from state (remove # prefix) @@ -406,24 +463,23 @@ function themeCreator.createTheme() } -- Replace colors and apply glyph settings to theme files - local themeFiles = { SCHEME_DIR .. "/global.ini" } + local glyphSettings = { list_pad_left = state.glyphs_enabled and 42 or 20, glyph_alpha = state.glyphs_enabled and 255 or 0, } - - for _, filepath in ipairs(themeFiles) do - if not fileUtils.replaceColor(filepath, hexColors) then - error("Failed to update colors in: " .. filepath) - end - - if not applyGlyphSettings(filepath, glyphSettings) then - error("Failed to apply glyph settings to: " .. filepath) - end - - if not applyScreenWidthSettings(filepath, state.screenWidth) then - error("Failed to apply screen width settings to: " .. filepath) - end + local filepath = paths.THEME_SCHEME_GLOBAL_PATH + if not fileUtils.replaceColor(filepath, hexColors) then + errorHandler.setError("Failed to update colors in: " .. filepath) + return false + end + if not applyGlyphSettings(filepath, glyphSettings) then + errorHandler.setError("Failed to apply glyph settings to: " .. filepath) + return false + end + if not applyScreenWidthSettings(filepath, state.screenWidth) then + errorHandler.setError("Failed to apply screen width settings to: " .. filepath) + return false end -- Find and copy the selected font file @@ -436,52 +492,39 @@ function themeCreator.createTheme() end if not selectedFontFile then - error("Selected font not found: " .. tostring(state.selectedFont)) + errorHandler.setError("Selected font not found: " .. tostring(state.selectedFont)) + return false end -- Copy the selected font file as default.bin - local fontSourcePath = constants.ORIGINAL_TEMPLATE_DIR .. "/font/" .. selectedFontFile - local fontDestPath = FONT_DIR .. "/default.bin" - if not copyFile(fontSourcePath, fontDestPath, "Failed to copy font file: " .. selectedFontFile) then + local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile + if + not copyFile( + fontSourcePath, + paths.THEME_DEFAULT_FONT_PATH, + "Failed to copy font file: " .. selectedFontFile + ) + then return false end - -- Create directory if it doesn't exist - local imageDir = getImageDir() - ensureDir(imageDir) - - -- Set preview path based on screen resolution - local previewPath = imageDir .. "/preview.png" - if not createPreviewImage(previewPath) then - error("Failed to create preview image at: " .. previewPath) - end - -- Create name.txt file with the theme name - local nameFilePath = constants.WORKING_TEMPLATE_DIR .. "/name.txt" - local nameFile = io.open(nameFilePath, "w") + local nameFile = io.open(paths.THEME_NAME_PATH, "w") if not nameFile then - error("Failed to create name.txt file") + errorHandler.setError("Failed to create name.txt file") + return false end - - nameFile:write("Aesthetic") + nameFile:write(state.applicationName) -- Use application name as theme name nameFile:close() - -- Create and return ZIP archive - local themeDir = os.getenv("THEME_DIR") - if not themeDir then - error("THEME_DIR environment variable not set") - end - - local themeName = "Aesthetic" - local outputPath = themeDir .. "/" .. themeName .. ".muxthm" - -- Create the ZIP archive - local actualPath = fileUtils.createZipArchive(constants.WORKING_TEMPLATE_DIR, outputPath) - if not actualPath then - error("Failed to create theme archive") + local finalOutputPath = fileUtils.createZipArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) + if not finalOutputPath then + errorHandler.setError("Failed to create theme archive") + return false end - return actualPath + return finalOutputPath end, debug.traceback) if not status then @@ -495,23 +538,14 @@ end -- Function to install the theme function themeCreator.installTheme(outputPath) - local themeDir = os.getenv("THEME_DIR") - if not themeDir then - errorHandler.setError("THEME_DIR environment variable not set") - return false - end - - local themeActiveDir = themeDir .. "/active" - -- Remove existing active theme directory and create a new one - executeCommand('rm -rf "' .. themeActiveDir .. '"') + executeCommand('rm -rf "' .. paths.THEME_ACTIVE_DIR .. '"') executeCommand("sync") - ensureDir(themeActiveDir) -- Extract the theme to the active directory if not executeCommand( - string.format('unzip "%s" -d "%s"', outputPath, themeActiveDir), + string.format('unzip "%s" -d "%s"', outputPath, paths.THEME_ACTIVE_DIR), "Failed to install theme to active directory" ) then @@ -525,7 +559,7 @@ end -- Clean up working directory function themeCreator.cleanup() - executeCommand('rm -rf "' .. constants.WORKING_TEMPLATE_DIR .. '"') + executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') end return themeCreator From 5013a12b6100621545f52512d0722f834583b21b Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 12:18:16 -0600 Subject: [PATCH 26/74] Remove unnecesary mkdir commands from launch script --- mux_launch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mux_launch.sh b/mux_launch.sh index 96d203c..7d42272 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -12,7 +12,7 @@ BINDIR="$ROOT_DIR/bin" LOG_DIR="$ROOT_DIR/logs" # Create required directories -mkdir -p "$THEME_DIR/active" +# Most directories are created by the application mkdir -p "$LOG_DIR" # Export environment variables From 11f38feb47bf1f10e09b8f8cc1a2eb8238ea7a10 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 12:25:47 -0600 Subject: [PATCH 27/74] Create theme credit.txt dynamically --- src/screen/menu/constants.lua | 3 +++ src/screen/menu/theme_creator.lua | 17 +++++++++++++++++ src/template/credits.txt | 1 - 3 files changed, 20 insertions(+), 1 deletion(-) delete mode 100644 src/template/credits.txt diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index 6fcda8a..ca80a17 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -93,6 +93,9 @@ paths.THEME_OUTPUT_PATH = paths.THEME_DIR .. "/" .. state.applicationName .. ".m -- Assets used by UI rather than generated theme paths.THEME_FONT_SOURCE_DIR = paths.TEMPLATE_DIR .. "/font" +-- `credits.txt` +paths.THEME_CREDITS_PATH = paths.WORKING_THEME_DIR .. "/credits.txt" + -- `name.txt` paths.THEME_NAME_PATH = paths.WORKING_THEME_DIR .. "/name.txt" diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 9902bdc..692713b 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -417,6 +417,18 @@ local function createRebootImage() return true end +-- Function to create the credits.txt file +local function createCreditsFile() + local file = io.open(paths.THEME_CREDITS_PATH, "w") + if not file then + errorHandler.setError("Failed to create credits.txt file") + return false + end + file:write("Created using Aesthetic for muOS: https://github.com/joneavila/aesthetic") + file:close() + return true +end + -- Function to create theme function themeCreator.createTheme() local status, err = xpcall(function() @@ -517,6 +529,11 @@ function themeCreator.createTheme() nameFile:write(state.applicationName) -- Use application name as theme name nameFile:close() + -- Create credits.txt file + if not createCreditsFile() then + return false + end + -- Create the ZIP archive local finalOutputPath = fileUtils.createZipArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) if not finalOutputPath then diff --git a/src/template/credits.txt b/src/template/credits.txt deleted file mode 100644 index 56cf724..0000000 --- a/src/template/credits.txt +++ /dev/null @@ -1 +0,0 @@ -Created using Aesthetic for muOS: https://github.com/joneavila/aesthetic \ No newline at end of file From 8b800b644b68ecfdb8bdff324f9cfd48448a1fd9 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 13:14:30 -0600 Subject: [PATCH 28/74] Create theme version.txt dynamically --- src/screen/menu/constants.lua | 10 ++++++++ src/screen/menu/theme_creator.lua | 41 +++++++++++++++++++++++++++++++ src/template/version.txt | 1 - 3 files changed, 51 insertions(+), 1 deletion(-) delete mode 100755 src/template/version.txt diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index ca80a17..a57a7e1 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -90,12 +90,22 @@ paths.THEME_ACTIVE_DIR = paths.THEME_DIR .. "/active" -- Generated theme path where the generated theme is written paths.THEME_OUTPUT_PATH = paths.THEME_DIR .. "/" .. state.applicationName .. ".muxthm" +-- muOS version file path (contains version info) +paths.MUOS_VERSION_PATH = "/opt/muos/config/version.txt" +-- Theme version file path +-- Assuming the application is updated with every release, this file will contain +-- the version info read from muOS +paths.THEME_VERSION_PATH = paths.THEME_DIR .. "/version.txt" + -- Assets used by UI rather than generated theme paths.THEME_FONT_SOURCE_DIR = paths.TEMPLATE_DIR .. "/font" -- `credits.txt` paths.THEME_CREDITS_PATH = paths.WORKING_THEME_DIR .. "/credits.txt" +-- `version.txt` +paths.THEME_VERSION_PATH = paths.WORKING_THEME_DIR .. "/version.txt" + -- `name.txt` paths.THEME_NAME_PATH = paths.WORKING_THEME_DIR .. "/name.txt" diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 692713b..da64796 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -429,6 +429,42 @@ local function createCreditsFile() return true end +-- Function to create the version.txt file +local function createVersionFile() + local sourceFile = io.open(paths.MUOS_VERSION_PATH, "r") + local versionContent = "" + + if sourceFile then + -- Read the content from the source file + local content = sourceFile:read("*all") + sourceFile:close() + + -- Extract just the version number using pattern matching + -- Pattern matches: digits with zero or more periods followed by underscore + local versionNumber = content:match("(%d[%d%.]+)_") + + if versionNumber then + versionContent = versionNumber + else + errorHandler.setError("Could not parse version number from muOS version file") + return false + end + else + errorHandler.setError("Could not read muOS version file at " .. paths.MUOS_VERSION_PATH) + return false + end + + -- Write to the theme version file + local file = io.open(paths.THEME_VERSION_PATH, "w") + if not file then + errorHandler.setError("Failed to create version.txt file") + return false + end + file:write(versionContent) + file:close() + return true +end + -- Function to create theme function themeCreator.createTheme() local status, err = xpcall(function() @@ -534,6 +570,11 @@ function themeCreator.createTheme() return false end + -- Create version.txt file + if not createVersionFile() then + return false + end + -- Create the ZIP archive local finalOutputPath = fileUtils.createZipArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) if not finalOutputPath then diff --git a/src/template/version.txt b/src/template/version.txt deleted file mode 100755 index 46aa8f0..0000000 --- a/src/template/version.txt +++ /dev/null @@ -1 +0,0 @@ -2502.0 \ No newline at end of file From ac99631125898a00525ce2c64e7a61884fba90db Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 14:28:39 -0600 Subject: [PATCH 29/74] Add "Support this project" section to README --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 59657b1..341246f 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,14 @@ All Discord links redirect to muOS Discord discussion pages. - [**Bluetooth Settings**](https://github.com/nvcuong1312/bltMuos) by nvc • Bluetooth settings • [Discord](https://discord.com/channels/1152022492001603615/1326441936403435634) - [**RGB Controller**](https://github.com/JanTrueno) • Control RGB lighting • [Discord](https://discord.com/channels/1152022492001603615/1272215949474267187) +## 👍 Support this project + +You can support this project by starring the repo, sharing it with others, showcasing it in a video, or donating via Ko-fi. + +Any support is greatly appreciated – thank you for supporting open source software! + +[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/F1F51COHHT) + ## ⚖️ License -This project is licensed under the [MIT License](LICENSE). **A shoutout to the repo is always appreciated – thank you for supporting open source!** +This project is licensed under the MIT License. You are free to use, modify, and distribute this software, provided that you include the original copyright notice and a disclaimer of liability. For more details, see [LICENSE](LICENSE). From f0d7a08b869d47988986af4bdd55bdbfc25dfb86 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 17:14:50 -0600 Subject: [PATCH 30/74] Refactor theme_creator.lua --- src/screen/menu/file_utils.lua | 4 +- src/screen/menu/theme_creator.lua | 319 ++++++++++++++++-------------- src/utils/color.lua | 6 + 3 files changed, 180 insertions(+), 149 deletions(-) diff --git a/src/screen/menu/file_utils.lua b/src/screen/menu/file_utils.lua index ee2a116..13518be 100644 --- a/src/screen/menu/file_utils.lua +++ b/src/screen/menu/file_utils.lua @@ -94,8 +94,8 @@ function fileUtils.replaceColor(filepath, replacements) return true end --- Helper function to create ZIP archive -function fileUtils.createZipArchive(sourceDir, outputPath) +-- Helper function to create archive +function fileUtils.createArchive(sourceDir, outputPath) -- Get next available filename local finalPath = fileUtils.getNextAvailableFilename(outputPath) if not finalPath then diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index da64796..ffb1eb4 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -13,21 +13,22 @@ local tove = require("tove") -- Module table to export public functions local themeCreator = {} -local function ensureDir(dir) +--- Ensures a directory exists, creating it if necessary, setting an error message if it fails +--- This function calls `errorHandler.setError()` so it does not need to be called separately +local function ensurePath(path) + -- Extract directory from path if it is a file path + local dir = string.match(path, "(.*)/[^/]*$") or path + local result = os.execute('mkdir -p "' .. dir .. '"') if not result then errorHandler.setError("Failed to create directory: " .. dir) return false end return result - -- Extract directory from path - -- local destDir = string.match(path, "(.*)/[^/]*$") - -- if destDir then - -- love.filesystem.createDirectory(destDir) - -- end - -- love.filesystem.write(path, data) end +--- Executes a command and sets an error message if the command fails +--- This function calls `errorHandler.setError()` so it does not need to be called separately local function executeCommand(command, errorMessage) local result = os.execute(command) if not result and errorMessage then @@ -38,31 +39,60 @@ local function executeCommand(command, errorMessage) end -- Copy a file and create destination directory if needed -local function copyFile(sourcePath, destPath, errorMessage) +local function copyFile(sourcePath, destinationPath, errorMessage) -- Extract directory from destination path - local destDir = string.match(destPath, "(.*)/[^/]*$") - if destDir then - if not ensureDir(destDir) then - return false -- ensureDir already set the error + local destinationDir = string.match(destinationPath, "(.*)/[^/]*$") + if destinationDir then + if not ensurePath(destinationDir) then + return false end end - return executeCommand(string.format('cp "%s" "%s"', sourcePath, destPath), errorMessage) + return executeCommand(string.format('cp "%s" "%s"', sourcePath, destinationPath), errorMessage) +end + +local function createNameFile() + local nameFile = io.open(paths.THEME_NAME_PATH, "w") + if not nameFile then + errorHandler.setError("Failed to create name.txt file") + return false + end + nameFile:write(state.applicationName) -- Use application name as theme name + nameFile:close() end --- Function to create a preview image with the selected background color and "muOS" text +-- Function to create theme's preview image using the selected font and colors local function createPreviewImage() - local width, height = 288, 216 - local text = "muOS" + -- Set the preview image dimensions based on the screen resolution + local screenWidth, screenHeight = state.screenWidth, state.screenHeight + + -- Define preview dimensions based on screen resolution + -- These dimensions are based on the default 2502.0 PIXIE theme + -- Default to the 640x480 ratio if no match is found + local previewImageWidth, previewImageHeight + if screenWidth == 640 and screenHeight == 480 then + previewImageWidth, previewImageHeight = 288, 216 + elseif screenWidth == 720 and screenHeight == 480 then + previewImageWidth, previewImageHeight = 340, 227 + elseif screenWidth == 720 and screenHeight == 756 then + previewImageWidth, previewImageHeight = 340, 272 + elseif screenWidth == 720 and screenHeight == 720 then + previewImageWidth, previewImageHeight = 340, 340 + elseif screenWidth == 1024 and screenHeight == 768 then + previewImageWidth, previewImageHeight = 484, 363 + elseif screenWidth == 1280 and screenHeight == 720 then + previewImageWidth, previewImageHeight = 604, 340 + else + previewImageWidth, previewImageHeight = 288, 216 + end + + local previewImageText = "muOS" -- Get colors from state - local bgHex, fgHex = state.colors.background, state.colors.foreground - local r, g, b = colorUtils.hexToRgb(bgHex) - local bgColor = { r, g, b, 1 } - r, g, b = colorUtils.hexToRgb(fgHex) - local fgColor = { r, g, b, 1 } + local bgColor = colorUtils.hexToLove(state.colors.background) + local fgColor = colorUtils.hexToLove(state.colors.foreground) -- Create canvas and draw - local canvas = love.graphics.newCanvas(width, height) + local canvas = love.graphics.newCanvas(previewImageWidth, previewImageHeight) love.graphics.setCanvas(canvas) love.graphics.clear(bgColor) @@ -78,14 +108,16 @@ local function createPreviewImage() love.graphics.setFont(font) -- Center text - local textWidth, textHeight = font:getWidth(text), font:getHeight() - love.graphics.print(text, (width - textWidth) / 2, (height - textHeight) / 2) + local textWidth, textHeight = font:getWidth(previewImageText), font:getHeight() + local textX = (previewImageWidth - textWidth) / 2 + local textY = (previewImageHeight - textHeight) / 2 + love.graphics.print(previewImageText, textX, textY) love.graphics.setCanvas() -- Get image data and encode as PNG local imageData = canvas:newImageData() if not imageData then - errorHandler.setError("Failed to get image data from preview canvas") + errorHandler.setError("Failed to get image data from preview image canvas") return false end @@ -95,20 +127,17 @@ local function createPreviewImage() return false end - -- Write file using direct file I/O - local file = io.open(paths.THEME_PREVIEW_IMAGE_PATH, "wb") - if not file then - errorHandler.setError("Failed to open preview image file for writing: " .. paths.THEME_PREVIEW_IMAGE_PATH) - return false - end - + -- Write the preview image to its destination local success, writeErr = pcall(function() + local file = io.open(paths.THEME_PREVIEW_IMAGE_PATH, "wb") + if not file then + error("Failed to open preview image file for writing: " .. paths.THEME_PREVIEW_IMAGE_PATH) + end file:write(pngData:getString()) + file:close() end) - file:close() - if not success then - errorHandler.setError("Failed to write preview image data: " .. tostring(writeErr)) + errorHandler.setError(writeErr) return false end @@ -116,58 +145,72 @@ local function createPreviewImage() end -- Function to apply glyph settings to a scheme file -local function applyGlyphSettings(filepath, glyphSettings) - local file = io.open(filepath, "r") - if not file then - errorHandler.setError("Failed to open file for glyph settings: " .. filepath) +-- This sets scheme values to adapt to either enabled or disabled glyphs +local function applyGlyphSettings(schemeFilePath) + -- Read the scheme file content + local schemeFile, err = io.open(schemeFilePath, "r") + if not schemeFile then + errorHandler.setError("Failed to open file for glyph settings: " .. schemeFilePath) return false end - local content = file:read("*all") - file:close() + local schemeFileContent = schemeFile:read("*all") + schemeFile:close() + + local glyphSettings = { + list_pad_left = state.glyphs_enabled and 42 or 20, + glyph_alpha = state.glyphs_enabled and 255 or 0, + } -- Replace placeholders local listPadCount, glyphAlphaCount - content, listPadCount = content:gsub("{%%%s*list_pad_left%s*}", tostring(glyphSettings["list_pad_left"])) - content, glyphAlphaCount = content:gsub("%%{%s*glyph_alpha%s*}", tostring(glyphSettings["glyph_alpha"])) + schemeFileContent, listPadCount = + schemeFileContent:gsub("{%%%s*list_pad_left%s*}", tostring(glyphSettings["list_pad_left"])) + schemeFileContent, glyphAlphaCount = + schemeFileContent:gsub("%%{%s*glyph_alpha%s*}", tostring(glyphSettings["glyph_alpha"])) -- Check if replacements were successful - if listPadCount == 0 or glyphAlphaCount == 0 then - errorHandler.setError("Failed to replace glyph settings in template") + if listPadCount == 0 then + errorHandler.setError("Failed to replace list pad left in template") + return false + end + if glyphAlphaCount == 0 then + errorHandler.setError("Failed to replace glyph alpha in template") return false end -- Write the updated content back to the file - file = io.open(filepath, "w") - if not file then - errorHandler.setError("Failed to write file for glyph settings: " .. filepath) + schemeFile, err = io.open(schemeFilePath, "w") + if not schemeFile then + errorHandler.setError("Failed to write file for glyph settings: " .. schemeFilePath) return false end - file:write(content) - file:close() + schemeFile:write(schemeFileContent) + schemeFile:close() return true end -- Function to apply screen width settings to a scheme file -local function applyScreenWidthSettings(filepath, screenWidth) - local file = io.open(filepath, "r") - if not file then - errorHandler.setError("Failed to open file for screen width settings: " .. filepath) +-- This sets scheme values to adapt to the screen width +local function applyScreenWidthSettings(schemeFilePath, screenWidth) + -- Read the scheme file content + local schemeFile, err = io.open(schemeFilePath, "r") + if not schemeFile then + errorHandler.setError("Failed to open file for screen width settings: " .. schemeFilePath) return false end - local content = file:read("*all") - file:close() + local schemeFileContent = schemeFile:read("*all") + schemeFile:close() local contentPadding = 4 local contentWidth = screenWidth - (contentPadding * 2) -- Replace content-padding placeholder local contentPaddingCount - content, contentPaddingCount = content:gsub("%%{%s*content%-padding%s*}", tostring(contentPadding)) - - -- Check if replacement was successful + schemeFileContent, contentPaddingCount = + schemeFileContent:gsub("%%{%s*content%-padding%s*}", tostring(contentPadding)) if contentPaddingCount == 0 then errorHandler.setError("Failed to replace content padding settings in template") return false @@ -175,27 +218,27 @@ local function applyScreenWidthSettings(filepath, screenWidth) -- Replace screen-width placeholder local screenWidthCount - content, screenWidthCount = content:gsub("%%{%s*screen%-width%s*}", tostring(contentWidth)) - - -- Check if replacement was successful + schemeFileContent, screenWidthCount = schemeFileContent:gsub("%%{%s*screen%-width%s*}", tostring(contentWidth)) if screenWidthCount == 0 then errorHandler.setError("Failed to replace screen width settings in template") return false end -- Write the updated content back to the file - file = io.open(filepath, "w") - if not file then - errorHandler.setError("Failed to write file for screen width settings: " .. filepath) + schemeFile, err = io.open(schemeFilePath, "w") + if not schemeFile then + errorHandler.setError("Failed to write file for screen width settings: " .. schemeFilePath) return false end - file:write(content) - file:close() + schemeFile:write(schemeFileContent) + schemeFile:close() return true end -- Function to save image data as a 24-bit BMP file +-- Currently LÖVE does not support encoding BMP +-- TODO: Consider using https://github.com/max1220/lua-bitmap local function saveAsBMP(imageData, filepath) local width = imageData:getWidth() local height = imageData:getHeight() @@ -264,27 +307,15 @@ local function saveAsBMP(imageData, filepath) return true end -local function getBackgroundColor() - local bgHex = state.colors.background - local r, g, b = colorUtils.hexToRgb(bgHex) - return { r, g, b, 1 } -end - -local function getForegroundColor() - local fgHex = state.colors.foreground - local r, g, b = colorUtils.hexToRgb(fgHex) - return { r, g, b, 1 } -end - -local function createStartImage() - -- Read properties from state +-- Function to create theme's boot logo image using selected font and colors +local function createBootImage() local width, height = state.screenWidth, state.screenHeight - local bgColor = getBackgroundColor() - local fgColor = getForegroundColor() + local bgColor = colorUtils.hexToLove(state.colors.background) + local fgColor = colorUtils.hexToLove(state.colors.foreground) - -- Load SVG + -- Load muOS logo SVG, set size and color local svg = love.filesystem.read("assets/muOS/logo.svg") - local iconSize = 200 + local iconSize = 180 local logo = tove.newGraphics(svg, iconSize) logo:setMonochrome(fgColor[1], fgColor[2], fgColor[3]) @@ -308,27 +339,26 @@ local function createStartImage() local imageData = canvas:newImageData() if not saveAsBMP(imageData, paths.THEME_BOOTLOGO_IMAGE_PATH) then - errorHandler.setError("Failed to save BMP file") + errorHandler.setError("Failed to save BMP file: " .. paths.THEME_BOOTLOGO_IMAGE_PATH) return false end return true end --- Function to create reboot image with dynamic colors and centered icon +-- Function to create theme's reboot image with dynamic colors and centered icon local function createRebootImage() -- Read properties from state local screenWidth, screenHeight = state.screenWidth, state.screenHeight - local bgColor = getBackgroundColor() - local fgColor = getForegroundColor() + local bgColor = colorUtils.hexToLove(state.colors.background) + local fgColor = colorUtils.hexToLove(state.colors.foreground) - -- Load SVG + -- Load reboot icon SVG, set size and color local svg = love.filesystem.read("assets/icons/rotate-ccw.svg") if not svg then - errorHandler.setError("Failed to load reboot icon SVG file") + errorHandler.setError("Failed to load reboot icon SVG file: " .. paths.THEME_REBOOT_ICON_SVG_PATH) return false end - local iconSize = 150 local icon = tove.newGraphics(svg, iconSize) if not icon then @@ -356,7 +386,8 @@ local function createRebootImage() icon:draw(iconX, iconY) -- Get the selected font from state - -- TODO Refactor font code: Store fonts as pairs of name and loaded font (or find way to get name from loaded font) + -- TODO: Refactor font code – Store fonts as pairs of name and loaded font + -- (or find way to get name from loaded font) local selectedFontName = state.selectedFont local fontMap = { ["Inter"] = state.fonts.body, @@ -371,9 +402,11 @@ local function createRebootImage() return false end - -- Draw the text centered + -- Set the font, size and color love.graphics.setFont(font, constants.IMAGE_FONT_SIZE) love.graphics.setColor(fgColor) + + -- Draw the text centered local text = "Rebooting..." local textWidth = font:getWidth(text) local textX = (screenWidth - textWidth) / 2 @@ -397,17 +430,16 @@ local function createRebootImage() return false end - -- Write file using direct file I/O since love.filesystem.write() doesn't work (?) - local file = io.open(paths.THEME_REBOOT_IMAGE_PATH, "wb") - if not file then - errorHandler.setError("Failed to open reboot image file for writing: " .. paths.THEME_REBOOT_IMAGE_PATH) + -- Write the PNG data to the reboot image file + local rebootImageFile = io.open(paths.THEME_REBOOT_IMAGE_PATH, "wb") + if not rebootImageFile then + errorHandler.setError("Failed to open reboot image file: " .. paths.THEME_REBOOT_IMAGE_PATH) return false end - local success, writeErr = pcall(function() - file:write(pngData:getString()) + rebootImageFile:write(pngData:getString()) end) - file:close() + rebootImageFile:close() if not success then errorHandler.setError("Failed to write reboot image data: " .. tostring(writeErr)) @@ -417,19 +449,20 @@ local function createRebootImage() return true end --- Function to create the credits.txt file +-- Function to create theme's `credits.txt` file local function createCreditsFile() - local file = io.open(paths.THEME_CREDITS_PATH, "w") - if not file then - errorHandler.setError("Failed to create credits.txt file") + local creditsFile = io.open(paths.THEME_CREDITS_PATH, "w") + if not creditsFile then + errorHandler.setError("Failed to create `credits.txt` file: " .. paths.THEME_CREDITS_PATH) return false end - file:write("Created using Aesthetic for muOS: https://github.com/joneavila/aesthetic") - file:close() + local creditsText = "Created using Aesthetic for muOS: https://github.com/joneavila/aesthetic" + creditsFile:write(creditsText) + creditsFile:close() return true end --- Function to create the version.txt file +-- Function to create theme's `version.txt` file local function createVersionFile() local sourceFile = io.open(paths.MUOS_VERSION_PATH, "r") local versionContent = "" @@ -455,13 +488,13 @@ local function createVersionFile() end -- Write to the theme version file - local file = io.open(paths.THEME_VERSION_PATH, "w") - if not file then - errorHandler.setError("Failed to create version.txt file") + local versionFile = io.open(paths.THEME_VERSION_PATH, "w") + if not versionFile then + errorHandler.setError("Failed to create `version.txt` file: " .. paths.THEME_VERSION_PATH) return false end - file:write(versionContent) - file:close() + versionFile:write(versionContent) + versionFile:close() return true end @@ -480,26 +513,24 @@ function themeCreator.createTheme() -- Only ensure directories for path strings that don't already end with a slash local dirPath = string.match(path, "(.*)/[^/]*$") if dirPath then - if not ensureDir(dirPath) then - return false -- ensureDir already set the error + if not ensurePath(dirPath) then + return false end end end end - -- Create startup image - if not createStartImage() then - -- createStartImage() already sets the error handler message + -- Create theme's boot image + if not createBootImage() then return false end - -- Create reboot image + -- Create theme's reboot image if not createRebootImage() then - -- Do not set error handler message here since it is set in createRebootImage() return false end - -- Set preview path based on screen resolution + -- Create theme's preview image if not createPreviewImage() then return false end @@ -511,22 +542,20 @@ function themeCreator.createTheme() } -- Replace colors and apply glyph settings to theme files - - local glyphSettings = { - list_pad_left = state.glyphs_enabled and 42 or 20, - glyph_alpha = state.glyphs_enabled and 255 or 0, - } - local filepath = paths.THEME_SCHEME_GLOBAL_PATH - if not fileUtils.replaceColor(filepath, hexColors) then - errorHandler.setError("Failed to update colors in: " .. filepath) + if not fileUtils.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, hexColors) then + errorHandler.setError("Failed to update colors in: " .. paths.THEME_SCHEME_GLOBAL_PATH) return false end - if not applyGlyphSettings(filepath, glyphSettings) then - errorHandler.setError("Failed to apply glyph settings to: " .. filepath) + + -- Set theme's glyph settings + if not applyGlyphSettings(paths.THEME_SCHEME_GLOBAL_PATH) then + errorHandler.setError("Failed to apply glyph settings to: " .. paths.THEME_SCHEME_GLOBAL_PATH) return false end - if not applyScreenWidthSettings(filepath, state.screenWidth) then - errorHandler.setError("Failed to apply screen width settings to: " .. filepath) + + -- Set theme's screen width settings + if not applyScreenWidthSettings(paths.THEME_SCHEME_GLOBAL_PATH, state.screenWidth) then + errorHandler.setError("Failed to apply screen width settings to: " .. paths.THEME_SCHEME_GLOBAL_PATH) return false end @@ -538,7 +567,6 @@ function themeCreator.createTheme() break end end - if not selectedFontFile then errorHandler.setError("Selected font not found: " .. tostring(state.selectedFont)) return false @@ -556,33 +584,29 @@ function themeCreator.createTheme() return false end - -- Create name.txt file with the theme name - local nameFile = io.open(paths.THEME_NAME_PATH, "w") - if not nameFile then - errorHandler.setError("Failed to create name.txt file") + -- Create theme's `credits.txt` file + if not createCreditsFile() then return false end - nameFile:write(state.applicationName) -- Use application name as theme name - nameFile:close() - -- Create credits.txt file - if not createCreditsFile() then + -- Create theme's `version.txt` file + if not createVersionFile() then return false end - -- Create version.txt file - if not createVersionFile() then + -- Create theme's `name.txt` file + if not createNameFile() then return false end -- Create the ZIP archive - local finalOutputPath = fileUtils.createZipArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) - if not finalOutputPath then + local outputThemePath = fileUtils.createArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) + if not outputThemePath then errorHandler.setError("Failed to create theme archive") return false end - return finalOutputPath + return outputThemePath end, debug.traceback) if not status then @@ -595,6 +619,7 @@ function themeCreator.createTheme() end -- Function to install the theme +-- TODO: Reference new PIXIE code to update and fix bugs function themeCreator.installTheme(outputPath) -- Remove existing active theme directory and create a new one executeCommand('rm -rf "' .. paths.THEME_ACTIVE_DIR .. '"') diff --git a/src/utils/color.lua b/src/utils/color.lua index 87c638d..cff4c35 100644 --- a/src/utils/color.lua +++ b/src/utils/color.lua @@ -230,4 +230,10 @@ function color.rgbToHex(r, g, b) return "#" .. hexR .. hexG .. hexB end +-- Convert hex string directly to LÖVE-compatible color array +function color.hexToLove(hexString, alpha) + local r, g, b = color.hexToRgb(hexString) + return { r, g, b, alpha or 1 } +end + return color From cf46b5bb763747ee153e8140c2a0d656684e8199 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 17:28:14 -0600 Subject: [PATCH 31/74] Refactor: Move IO functions to util file.lua and commands functions to util commands.lua --- src/screen/menu/theme_creator.lua | 71 +++++-------------- src/utils/commands.lua | 14 ++++ .../menu/file_utils.lua => utils/file.lua} | 31 +++++++- 3 files changed, 62 insertions(+), 54 deletions(-) create mode 100644 src/utils/commands.lua rename src/{screen/menu/file_utils.lua => utils/file.lua} (76%) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index ffb1eb4..de83c8e 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -2,9 +2,10 @@ local love = require("love") local state = require("state") local constants = require("screen.menu.constants") -local fileUtils = require("screen.menu.file_utils") +local fileUtils = require("utils.file") local errorHandler = require("screen.menu.error_handler") local colorUtils = require("utils.color") +local commands = require("utils.commands") local paths = constants.PATHS @@ -13,43 +14,7 @@ local tove = require("tove") -- Module table to export public functions local themeCreator = {} ---- Ensures a directory exists, creating it if necessary, setting an error message if it fails ---- This function calls `errorHandler.setError()` so it does not need to be called separately -local function ensurePath(path) - -- Extract directory from path if it is a file path - local dir = string.match(path, "(.*)/[^/]*$") or path - - local result = os.execute('mkdir -p "' .. dir .. '"') - if not result then - errorHandler.setError("Failed to create directory: " .. dir) - return false - end - return result -end - ---- Executes a command and sets an error message if the command fails ---- This function calls `errorHandler.setError()` so it does not need to be called separately -local function executeCommand(command, errorMessage) - local result = os.execute(command) - if not result and errorMessage then - errorHandler.setError(errorMessage) - return false - end - return result -end - --- Copy a file and create destination directory if needed -local function copyFile(sourcePath, destinationPath, errorMessage) - -- Extract directory from destination path - local destinationDir = string.match(destinationPath, "(.*)/[^/]*$") - if destinationDir then - if not ensurePath(destinationDir) then - return false - end - end - return executeCommand(string.format('cp "%s" "%s"', sourcePath, destinationPath), errorMessage) -end - +-- Function to create `name.txt` containing the theme's name local function createNameFile() local nameFile = io.open(paths.THEME_NAME_PATH, "w") if not nameFile then @@ -60,7 +25,7 @@ local function createNameFile() nameFile:close() end --- Function to create theme's preview image using the selected font and colors +-- Function to create preview image displayed in muOS theme selection menu local function createPreviewImage() -- Set the preview image dimensions based on the screen resolution local screenWidth, screenHeight = state.screenWidth, state.screenHeight @@ -307,7 +272,7 @@ local function saveAsBMP(imageData, filepath) return true end --- Function to create theme's boot logo image using selected font and colors +-- Function to create boot logo image shown during boot local function createBootImage() local width, height = state.screenWidth, state.screenHeight local bgColor = colorUtils.hexToLove(state.colors.background) @@ -346,7 +311,7 @@ local function createBootImage() return true end --- Function to create theme's reboot image with dynamic colors and centered icon +-- Function to create reboot image shown during reboot local function createRebootImage() -- Read properties from state local screenWidth, screenHeight = state.screenWidth, state.screenHeight @@ -449,7 +414,7 @@ local function createRebootImage() return true end --- Function to create theme's `credits.txt` file +-- Function to create `credits.txt` file containing the theme's credits local function createCreditsFile() local creditsFile = io.open(paths.THEME_CREDITS_PATH, "w") if not creditsFile then @@ -462,7 +427,7 @@ local function createCreditsFile() return true end --- Function to create theme's `version.txt` file +-- Function to create `version.txt` file containing the compatible muOS version local function createVersionFile() local sourceFile = io.open(paths.MUOS_VERSION_PATH, "r") local versionContent = "" @@ -498,11 +463,11 @@ local function createVersionFile() return true end --- Function to create theme +-- Main function to create theme function themeCreator.createTheme() local status, err = xpcall(function() -- Clean up and prepare working directory - executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') + commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') if not fileUtils.copyDir(paths.TEMPLATE_DIR, paths.WORKING_THEME_DIR) then errorHandler.setError("Failed to prepare working template directory") end @@ -513,7 +478,7 @@ function themeCreator.createTheme() -- Only ensure directories for path strings that don't already end with a slash local dirPath = string.match(path, "(.*)/[^/]*$") if dirPath then - if not ensurePath(dirPath) then + if not fileUtils.ensurePath(dirPath) then return false end end @@ -575,7 +540,7 @@ function themeCreator.createTheme() -- Copy the selected font file as default.bin local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile if - not copyFile( + not fileUtils.copyFile( fontSourcePath, paths.THEME_DEFAULT_FONT_PATH, "Failed to copy font file: " .. selectedFontFile @@ -618,16 +583,16 @@ function themeCreator.createTheme() return err end --- Function to install the theme +-- Function to install the theme to muOS active theme directory -- TODO: Reference new PIXIE code to update and fix bugs function themeCreator.installTheme(outputPath) -- Remove existing active theme directory and create a new one - executeCommand('rm -rf "' .. paths.THEME_ACTIVE_DIR .. '"') - executeCommand("sync") + commands.executeCommand('rm -rf "' .. paths.THEME_ACTIVE_DIR .. '"') + commands.executeCommand("sync") -- Extract the theme to the active directory if - not executeCommand( + not commands.executeCommand( string.format('unzip "%s" -d "%s"', outputPath, paths.THEME_ACTIVE_DIR), "Failed to install theme to active directory" ) @@ -636,13 +601,13 @@ function themeCreator.installTheme(outputPath) end -- Sync to ensure all writes are complete - executeCommand("sync") + commands.executeCommand("sync") return true end -- Clean up working directory function themeCreator.cleanup() - executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') + commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') end return themeCreator diff --git a/src/utils/commands.lua b/src/utils/commands.lua new file mode 100644 index 0000000..a72c2ca --- /dev/null +++ b/src/utils/commands.lua @@ -0,0 +1,14 @@ +--- Executes a command and sets an error message if the command fails +--- This function calls `errorHandler.setError()` so it does not need to be called separately + +local commands = {} +function commands.executeCommand(command, errorMessage) + local result = os.execute(command) + if not result and errorMessage then + commands.setError(errorMessage) + return false + end + return result +end + +return commands diff --git a/src/screen/menu/file_utils.lua b/src/utils/file.lua similarity index 76% rename from src/screen/menu/file_utils.lua rename to src/utils/file.lua index 13518be..aaee7ed 100644 --- a/src/screen/menu/file_utils.lua +++ b/src/utils/file.lua @@ -1,5 +1,8 @@ ---- Menu file utilities +--- File utilities +--- Some functions avoid using LÖVE's `love.filesystem` since files are outside of sandbox + local errorHandler = require("screen.menu.error_handler") +local commands = require("utils.commands") local fileUtils = {} @@ -139,4 +142,30 @@ function fileUtils.copyDir(src, dest) return success == 0 or success == true end +--- Ensures a directory exists, creating it if necessary, setting an error message if it fails +--- This function calls `errorHandler.setError()` so it does not need to be called separately +function fileUtils.ensurePath(path) + -- Extract directory from path if it is a file path + local dir = string.match(path, "(.*)/[^/]*$") or path + + local result = os.execute('mkdir -p "' .. dir .. '"') + if not result then + errorHandler.setError("Failed to create directory: " .. dir) + return false + end + return result +end + +-- Copy a file and create destination directory if needed +function fileUtils.copyFile(sourcePath, destinationPath, errorMessage) + -- Extract directory from destination path + local destinationDir = string.match(destinationPath, "(.*)/[^/]*$") + if destinationDir then + if not fileUtils.ensurePath(destinationDir) then + return false + end + end + return commands.executeCommand(string.format('cp "%s" "%s"', sourcePath, destinationPath), errorMessage) +end + return fileUtils From 5980a624385950577352ab22e4ed5f8cd3bab9c1 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 23:45:38 -0600 Subject: [PATCH 32/74] Set color picker tabs height as a percentage of screen height --- src/screen/color_picker.lua | 2 +- src/screen/color_picker/constants.lua | 22 +++++++++++++++++++++- src/screen/color_picker/hex.lua | 21 +++++++++++---------- src/screen/color_picker/hsv.lua | 10 ++++++---- src/screen/color_picker/palette.lua | 16 ++++++++++------ 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/screen/color_picker.lua b/src/screen/color_picker.lua index d66dec2..f9b6cd3 100644 --- a/src/screen/color_picker.lua +++ b/src/screen/color_picker.lua @@ -13,7 +13,7 @@ local hexScreen = require("screen.color_picker.hex") local colorPicker = {} -- Shared constants -colorPicker.TAB_HEIGHT = constants.TAB_HEIGHT +colorPicker.TAB_HEIGHT = constants.getTabHeight() local TAB_ACTIVE_LINE_HEIGHT = 3 diff --git a/src/screen/color_picker/constants.lua b/src/screen/color_picker/constants.lua index ac8ec52..ca65849 100644 --- a/src/screen/color_picker/constants.lua +++ b/src/screen/color_picker/constants.lua @@ -1,6 +1,26 @@ --- Color picker shared constants +local state = require("state") + local constants = {} -constants.TAB_HEIGHT = 40 +-- Calculate tab height as a percentage of the screen height +local TAB_HEIGHT_PERCENT = 0.9 +local TAB_HEIGHT = math.floor(state.screenHeight * TAB_HEIGHT_PERCENT) + +-- Function to provide tab height to main color picker screen +constants.getTabHeight = function() + return TAB_HEIGHT +end + +-- Function to calculate the content area dimensions for sub-screens (tab views) +constants.calculateContentArea = function() + local controls = require("controls") + return { + x = 0, + y = TAB_HEIGHT, + width = state.screenWidth, + height = state.screenHeight - TAB_HEIGHT - controls.HEIGHT, + } +end return constants diff --git a/src/screen/color_picker/hex.lua b/src/screen/color_picker/hex.lua index 16903f5..5b3b0a5 100644 --- a/src/screen/color_picker/hex.lua +++ b/src/screen/color_picker/hex.lua @@ -114,13 +114,10 @@ end -- Helper function to get button dimensions local function getButtonDimensions() - local gridWidth = state.screenWidth - (2 * EDGE_PADDING) - LAST_COLUMN_EXTRA_PADDING - local availableHeight = state.screenHeight - - constants.TAB_HEIGHT - - TOP_PADDING - - PREVIEW_HEIGHT - - controls.HEIGHT - - (2 * GRID_PADDING) + local contentArea = constants.calculateContentArea() + + local gridWidth = contentArea.width - (2 * EDGE_PADDING) - LAST_COLUMN_EXTRA_PADDING + local availableHeight = contentArea.height - TOP_PADDING - PREVIEW_HEIGHT - (2 * GRID_PADDING) local buttonWidth = (gridWidth - (4 * GRID_PADDING)) / 5 local buttonHeight = (availableHeight - (3 * GRID_PADDING)) / 4 @@ -130,9 +127,11 @@ end -- Helper function to get button position local function getButtonPosition(row, col) + local contentArea = constants.calculateContentArea() + local buttonWidth, buttonHeight = getButtonDimensions() local startX = EDGE_PADDING - local startY = constants.TAB_HEIGHT + TOP_PADDING + PREVIEW_HEIGHT + GRID_PADDING + local startY = contentArea.y + TOP_PADDING + PREVIEW_HEIGHT + GRID_PADDING local x = startX + (col - 1) * (buttonWidth + GRID_PADDING) @@ -184,14 +183,16 @@ function hex.draw() love.graphics.setColor(colors.ui.background) love.graphics.clear(colors.ui.background) + local contentArea = constants.calculateContentArea() + -- Get current color type state local colorType = state.lastSelectedColorButton local currentState = hexState[colorType] or hexState.background -- Default to background if nil -- Draw color preview rectangle local previewX = EDGE_PADDING - local previewY = constants.TAB_HEIGHT + TOP_PADDING - local previewWidth = state.screenWidth - (2 * EDGE_PADDING) + local previewY = contentArea.y + TOP_PADDING + local previewWidth = contentArea.width - (2 * EDGE_PADDING) -- Variables for input display local inputStartX = previewX + (previewWidth - ((INPUT_RECT_WIDTH * 6) + (INPUT_RECT_SPACING * 5))) / 2 diff --git a/src/screen/color_picker/hsv.lua b/src/screen/color_picker/hsv.lua index 809e48d..f147198 100644 --- a/src/screen/color_picker/hsv.lua +++ b/src/screen/color_picker/hsv.lua @@ -145,9 +145,11 @@ local function startWiggleAnimation() end function hsv.load() + local contentArea = constants.calculateContentArea() + -- Calculate available space - local availableHeight = state.screenHeight - (EDGE_PADDING * 2) - controls.HEIGHT - constants.TAB_HEIGHT - local availableWidth = state.screenWidth - (EDGE_PADDING * 2) + local availableHeight = contentArea.height - (EDGE_PADDING * 2) + local availableWidth = contentArea.width - (EDGE_PADDING * 2) -- Calculate SV square size - should be a perfect square that fits the available height pickerState.squareSize = availableHeight @@ -174,9 +176,9 @@ function hsv.load() -- Hue slider position (after preview) local hueSliderX = previewX + pickerState.previewWidth + ELEMENT_SPACING + CURSOR.TRIANGLE_HEIGHT -- SV square position (rightmost, ensuring consistent right edge padding) - pickerState.startX = state.screenWidth - EDGE_PADDING - pickerState.squareSize + pickerState.startX = contentArea.width - EDGE_PADDING - pickerState.squareSize -- Store all positions - pickerState.startY = EDGE_PADDING + constants.TAB_HEIGHT + pickerState.startY = contentArea.y + EDGE_PADDING pickerState.hueSliderX = hueSliderX pickerState.previewX = previewX diff --git a/src/screen/color_picker/palette.lua b/src/screen/color_picker/palette.lua index 19a8e9e..f82df79 100644 --- a/src/screen/color_picker/palette.lua +++ b/src/screen/color_picker/palette.lua @@ -77,9 +77,11 @@ local function calculateGridDimensions() local colorKeys = getColorKeys() local gridSize = calculateGridSize() + local contentArea = constants.calculateContentArea() + -- Calculate available space - local availableHeight = state.screenHeight - controls.HEIGHT - constants.TAB_HEIGHT - (PADDING * 2) - local availableWidth = state.screenWidth - (PADDING * 2) - SCROLLBAR.WIDTH - SCROLLBAR.PADDING + local availableHeight = contentArea.height - (PADDING * 2) + local availableWidth = contentArea.width - (PADDING * 2) - SCROLLBAR.WIDTH - SCROLLBAR.PADDING -- Calculate square size based on available width and fixed number of columns local squareSize = math.floor((availableWidth - (SQUARE_SPACING * (gridSize.cols - 1))) / gridSize.cols) @@ -93,8 +95,8 @@ local function calculateGridDimensions() local visibleGridHeight = (visibleRows * squareSize) + (visibleRows - 1) * SQUARE_SPACING -- Calculate grid position - local offsetX = math.floor((state.screenWidth - totalWidth - SCROLLBAR.WIDTH - SCROLLBAR.PADDING) / 2) - local offsetY = math.floor(constants.TAB_HEIGHT + PADDING) + local offsetX = math.floor((contentArea.width - totalWidth - SCROLLBAR.WIDTH - SCROLLBAR.PADDING) / 2) + local offsetY = math.floor(contentArea.y + PADDING) return { colorKeys = colorKeys, @@ -155,10 +157,12 @@ end -- Helper function to draw the scrollbar local function drawScrollbar() + local contentArea = constants.calculateContentArea() + -- Calculate scrollbar position and dimensions - local scrollbarHeight = state.screenHeight - controls.HEIGHT - constants.TAB_HEIGHT - (PADDING * 2) + local scrollbarHeight = contentArea.height - (PADDING * 2) local scrollbarX = state.screenWidth - SCROLLBAR.WIDTH - SCROLLBAR.PADDING - local scrollbarY = constants.TAB_HEIGHT + PADDING + local scrollbarY = contentArea.y + PADDING -- Draw scrollbar background love.graphics.setColor(colors.ui.foreground[1], colors.ui.foreground[2], colors.ui.foreground[3], 0.2) From bea37fcbe7dd69e77484f494fe7d0f4fbf506a01 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Sun, 30 Mar 2025 23:55:12 -0600 Subject: [PATCH 33/74] Clean up path constants --- mux_launch.sh | 2 -- src/screen/menu/constants.lua | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index 7d42272..fd78b36 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -7,7 +7,6 @@ # Define paths ROOT_DIR="$(GET_VAR "device" "storage/rom/mount")/MUOS/application/Aesthetic/.aesthetic" -THEME_DIR="/run/muos/storage/theme" BINDIR="$ROOT_DIR/bin" LOG_DIR="$ROOT_DIR/logs" @@ -17,7 +16,6 @@ mkdir -p "$LOG_DIR" # Export environment variables export SDL_GAMECONTROLLERCONFIG_FILE="/usr/lib/gamecontrollerdb.txt" -export THEME_DIR export LOG_DIR export LD_LIBRARY_PATH="$ROOT_DIR/lib:$ROOT_DIR/tove:$LD_LIBRARY_PATH" export TEMPLATE_DIR="$ROOT_DIR/template" diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index a57a7e1..f3d59c3 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -75,12 +75,14 @@ constants.POPUP_BUTTONS = { -- TODO: You can initialize the paths here constants.PATHS = { TEMPLATE_DIR = os.getenv("TEMPLATE_DIR"), - THEME_DIR = os.getenv("THEME_DIR"), } -- Create a local alias for easier access local paths = constants.PATHS +-- muOS themes directory +paths.THEME_DIR = "/run/muos/storage/theme" + -- Working theme directory where files are written before archiving into a theme paths.WORKING_THEME_DIR = paths.TEMPLATE_DIR .. "_working" From c5f160f2fb5ebed543bad4977131e72f3001cfc3 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Mon, 31 Mar 2025 00:04:12 -0600 Subject: [PATCH 34/74] Rename file.lua to system.lua --- src/screen/menu/theme_creator.lua | 12 ++++---- src/utils/{file.lua => system.lua} | 47 ++++++++++++++++++------------ 2 files changed, 35 insertions(+), 24 deletions(-) rename src/utils/{file.lua => system.lua} (79%) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index de83c8e..d6a1501 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -2,7 +2,7 @@ local love = require("love") local state = require("state") local constants = require("screen.menu.constants") -local fileUtils = require("utils.file") +local system = require("utils.system") local errorHandler = require("screen.menu.error_handler") local colorUtils = require("utils.color") local commands = require("utils.commands") @@ -468,7 +468,7 @@ function themeCreator.createTheme() local status, err = xpcall(function() -- Clean up and prepare working directory commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') - if not fileUtils.copyDir(paths.TEMPLATE_DIR, paths.WORKING_THEME_DIR) then + if not system.copyDir(paths.TEMPLATE_DIR, paths.WORKING_THEME_DIR) then errorHandler.setError("Failed to prepare working template directory") end @@ -478,7 +478,7 @@ function themeCreator.createTheme() -- Only ensure directories for path strings that don't already end with a slash local dirPath = string.match(path, "(.*)/[^/]*$") if dirPath then - if not fileUtils.ensurePath(dirPath) then + if not system.ensurePath(dirPath) then return false end end @@ -507,7 +507,7 @@ function themeCreator.createTheme() } -- Replace colors and apply glyph settings to theme files - if not fileUtils.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, hexColors) then + if not system.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, hexColors) then errorHandler.setError("Failed to update colors in: " .. paths.THEME_SCHEME_GLOBAL_PATH) return false end @@ -540,7 +540,7 @@ function themeCreator.createTheme() -- Copy the selected font file as default.bin local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile if - not fileUtils.copyFile( + not system.copyFile( fontSourcePath, paths.THEME_DEFAULT_FONT_PATH, "Failed to copy font file: " .. selectedFontFile @@ -565,7 +565,7 @@ function themeCreator.createTheme() end -- Create the ZIP archive - local outputThemePath = fileUtils.createArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) + local outputThemePath = system.createArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) if not outputThemePath then errorHandler.setError("Failed to create theme archive") return false diff --git a/src/utils/file.lua b/src/utils/system.lua similarity index 79% rename from src/utils/file.lua rename to src/utils/system.lua index aaee7ed..7cc97ef 100644 --- a/src/utils/file.lua +++ b/src/utils/system.lua @@ -1,19 +1,20 @@ ---- File utilities ---- Some functions avoid using LÖVE's `love.filesystem` since files are outside of sandbox - +--- System utilities +--- This module avoids using `love.filesystem` since most functions are not sandboxed local errorHandler = require("screen.menu.error_handler") local commands = require("utils.commands") -local fileUtils = {} +local system = {} + +-- TODO: Add a function for reading, writing files and update theme_creator.lua -- Helper function to escape pattern special characters -function fileUtils.escapePattern(str) +function system.escapePattern(str) -- Escape these special characters: ^$()%.[]*+-? return str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1") end -- Function to check if file exists -function fileUtils.fileExists(path) +function system.fileExists(path) local file = io.open(path, "r") if file then file:close() @@ -23,9 +24,9 @@ function fileUtils.fileExists(path) end -- Function to find next available filename -function fileUtils.getNextAvailableFilename(basePath) +function system.getNextAvailableFilename(basePath) -- Try without number first - if not fileUtils.fileExists(basePath) then + if not system.fileExists(basePath) then return basePath end @@ -39,7 +40,7 @@ function fileUtils.getNextAvailableFilename(basePath) local i = 1 while true do local newPath = string.format("%s (%d)%s", baseName, i, extension) - if not fileUtils.fileExists(newPath) then + if not system.fileExists(newPath) then return newPath end i = i + 1 @@ -52,7 +53,7 @@ function fileUtils.getNextAvailableFilename(basePath) end -- Helper function to replace color in file (text replacement) -function fileUtils.replaceColor(filepath, replacements) +function system.replaceColor(filepath, replacements) local file = io.open(filepath, "r") if not file then errorHandler.setError("Cannot read theme file: " .. filepath) @@ -72,7 +73,7 @@ function fileUtils.replaceColor(filepath, replacements) local totalReplacements = 0 for placeholder, hexColor in pairs(replacements) do - local escapedPlaceholder = fileUtils.escapePattern(placeholder) + local escapedPlaceholder = system.escapePattern(placeholder) local pattern = "%%{" .. escapedPlaceholder .. "}" local count newContent, count = string.gsub(newContent, pattern, hexColor) @@ -98,9 +99,9 @@ function fileUtils.replaceColor(filepath, replacements) end -- Helper function to create archive -function fileUtils.createArchive(sourceDir, outputPath) +function system.createArchive(sourceDir, outputPath) -- Get next available filename - local finalPath = fileUtils.getNextAvailableFilename(outputPath) + local finalPath = system.getNextAvailableFilename(outputPath) if not finalPath then errorHandler.setError("Failed to get available filename") return false @@ -131,7 +132,7 @@ function fileUtils.createArchive(sourceDir, outputPath) end -- Helper function to copy directory contents -function fileUtils.copyDir(src, dest) +function system.copyDir(src, dest) -- Create destination directory os.execute('mkdir -p "' .. dest .. '"') @@ -144,7 +145,7 @@ end --- Ensures a directory exists, creating it if necessary, setting an error message if it fails --- This function calls `errorHandler.setError()` so it does not need to be called separately -function fileUtils.ensurePath(path) +function system.ensurePath(path) -- Extract directory from path if it is a file path local dir = string.match(path, "(.*)/[^/]*$") or path @@ -157,15 +158,25 @@ function fileUtils.ensurePath(path) end -- Copy a file and create destination directory if needed -function fileUtils.copyFile(sourcePath, destinationPath, errorMessage) +function system.copyFile(sourcePath, destinationPath, errorMessage) -- Extract directory from destination path local destinationDir = string.match(destinationPath, "(.*)/[^/]*$") if destinationDir then - if not fileUtils.ensurePath(destinationDir) then + if not system.ensurePath(destinationDir) then return false end end return commands.executeCommand(string.format('cp "%s" "%s"', sourcePath, destinationPath), errorMessage) end -return fileUtils +-- Get environment variable, setting error if not found +function system.getRequiredEnv(name) + local value = os.getenv(name) + if value == nil then + errorHandler.setError("Environment variable not found: " .. name) + return nil + end + return value +end + +return system From df62e9e275a42fd70fc03cfc41b87027cf937f0c Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Mon, 31 Mar 2025 00:10:57 -0600 Subject: [PATCH 35/74] Redirect stdout and stderr to log file --- mux_launch.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index fd78b36..cf590c9 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -24,5 +24,6 @@ export TEMPLATE_DIR="$ROOT_DIR/template" cd "$ROOT_DIR" || exit SET_VAR "system" "foreground_process" "love" -# Redirect both stdout and stderr to log files -./bin/love . > "$LOG_DIR/app.log" 2> "$LOG_DIR/error.log" +# Redirect stdout and stderr to log file +LOG_FILE="$LOG_DIR/$(date +%Y%m%d_%H%M%S).log" +./bin/love . > "$LOG_FILE" 2>&1 From 3e54cd679ab719803e2ffd857e2ac7cc931cb53e Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Mon, 31 Mar 2025 00:12:27 -0600 Subject: [PATCH 36/74] Delete muxstart.png --- src/template/image/wall/muxstart.png | Bin 45998 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 src/template/image/wall/muxstart.png diff --git a/src/template/image/wall/muxstart.png b/src/template/image/wall/muxstart.png deleted file mode 100755 index c44ccdf9a0dd198c831e336ceb3a8de99eedd4bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45998 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 y!2Am$`oFjTI|u(a4*qW%{Qv(_@ZK)|_90k Date: Mon, 31 Mar 2025 00:20:36 -0600 Subject: [PATCH 37/74] Draw error in popup rather than background --- src/screen/menu.lua | 3 --- src/screen/menu/error_handler.lua | 15 +++++---------- src/screen/menu/ui.lua | 32 ------------------------------- src/utils/commands.lua | 4 +++- 4 files changed, 8 insertions(+), 46 deletions(-) diff --git a/src/screen/menu.lua b/src/screen/menu.lua index 3308c35..d0698ae 100644 --- a/src/screen/menu.lua +++ b/src/screen/menu.lua @@ -133,9 +133,6 @@ function menu.draw() end end - -- Draw error message if present - ui.drawError() - -- Draw popup if active if ui.isPopupVisible() then ui.drawPopup() diff --git a/src/screen/menu/error_handler.lua b/src/screen/menu/error_handler.lua index b8a07a5..4008d24 100644 --- a/src/screen/menu/error_handler.lua +++ b/src/screen/menu/error_handler.lua @@ -1,16 +1,17 @@ --- Menu error handler -local constants = require("screen.menu.constants") +local ui = require("screen.menu.ui") local errorHandler = {} -- Error state local errorMessage = nil -local errorTimer = 0 -- Function to set error message function errorHandler.setError(message) errorMessage = message - errorTimer = constants.ERROR_DISPLAY_TIME_SECONDS + + -- Show error in popup with an Exit button that quits the application + ui.showPopup(message, { { text = "Exit", selected = true } }) end -- Get current error message @@ -18,14 +19,8 @@ function errorHandler.getErrorMessage() return errorMessage end --- Update error timer function errorHandler.update(dt) - if errorMessage and errorTimer > 0 then - errorTimer = errorTimer - dt - if errorTimer <= 0 then - errorMessage = nil - end - end + -- No timer logic needed end return errorHandler diff --git a/src/screen/menu/ui.lua b/src/screen/menu/ui.lua index 351dbbb..1ab32ac 100644 --- a/src/screen/menu/ui.lua +++ b/src/screen/menu/ui.lua @@ -5,7 +5,6 @@ local state = require("state") local colorUtils = require("utils.color") local constants = require("screen.menu.constants") -local errorHandler = require("screen.menu.error_handler") -- Module table to export public functions local ui = {} @@ -259,37 +258,6 @@ function ui.drawPopup() end end --- Draw error message if present -function ui.drawError() - local errorMessage = errorHandler.getErrorMessage() - if errorMessage then - love.graphics.push() - - -- Use a smaller font - local smallFont = love.graphics.newFont(14) - love.graphics.setFont(smallFont) - - -- Calculate dimensions for error box - local padding = 10 - local maxWidth = state.screenWidth - (padding * 2) - - -- Wrap the text - local wrappedText = love.graphics.newText(smallFont) - wrappedText:setf(errorMessage, maxWidth, "left") - local textHeight = wrappedText:getHeight() - - -- Draw semi-transparent background - love.graphics.setColor(0, 0, 0, 0.8) - love.graphics.rectangle("fill", padding, padding, maxWidth, textHeight + (padding * 2)) - - -- Draw error text - love.graphics.setColor(1, 0.3, 0.3, 1) -- Red-ish color - love.graphics.draw(wrappedText, padding * 2, padding * 2) - - love.graphics.pop() - end -end - -- Show popup with message function ui.showPopup(message, buttons, verticalButtons) showPopup = true diff --git a/src/utils/commands.lua b/src/utils/commands.lua index a72c2ca..8cd3969 100644 --- a/src/utils/commands.lua +++ b/src/utils/commands.lua @@ -1,11 +1,13 @@ --- Executes a command and sets an error message if the command fails --- This function calls `errorHandler.setError()` so it does not need to be called separately +local errorHandler = require("screen.menu.error_handler") + local commands = {} function commands.executeCommand(command, errorMessage) local result = os.execute(command) if not result and errorMessage then - commands.setError(errorMessage) + errorHandler.setError(errorMessage) return false end return result From 5a293975481768a692a55518bfeec0fa6cdf851e Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:20:09 -0600 Subject: [PATCH 38/74] Extract archive automatically in build script --- build.sh | 103 ++++++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 65 deletions(-) diff --git a/build.sh b/build.sh index dd23d51..92a8d20 100755 --- a/build.sh +++ b/build.sh @@ -5,6 +5,20 @@ # If --clean is provided, the script will delete files from the device (left over from previous builds) # before building a new version +echoHeader() { + local text="$1" + local PURPLE="\033[35m" + local RESET="\033[0m" + echo -e "${PURPLE}${text}...${RESET}" +} + +echoSuccess() { + local text="$1" + local GREEN="\033[32m" + local RESET="\033[0m" + echo -e "${GREEN}${text}${RESET}" +} + # Check for --clean option if [[ "$1" == "--clean" ]]; then CLEAN=true @@ -17,15 +31,12 @@ PRIVATE_KEY_PATH=$1 DEVICE_IP=$2 APPLICATION_DIR=mnt/mmc/MUOS/application/Aesthetic - LOG_DIR="${APPLICATION_DIR}/.aesthetic/logs" -mkdir -p "${LOG_DIR}" - - GLYPH_DIR=opt/muos/default/MUOS/theme/active/glyph/muxapp -ARCHIVE_BASE_NAME=Aesthetic +ARCHIVE_BASE_NAME=Aesthetic +mkdir -p "${LOG_DIR}" # Get version from src/version.lua MAJOR=$(awk '/version.major =/ {print $3}' src/version.lua) @@ -40,9 +51,7 @@ fi # Items to delete with --clean ITEMS_TO_DELETE=( - "/.local/share/love/Aesthetic" "/mnt/mmc/MUOS/application/Aesthetic" - "/run/muos/storage/theme/Aesthetic.muxthm" "/mnt/sdcard/MUOS/theme/active/glyph/muxapp/aesthetic.png" "/mnt/sdcard/MUOS/theme/Aesthetic*.muxthm" "/mnt/mmc/ARCHIVE/Aesthetic_*.muxupd" @@ -56,7 +65,7 @@ if [ "$CLEAN" = true ]; then exit 1 fi - echo "Cleaning..." + echoHeader "[0/6] Removing existing files" # Execute delete commands one by one to better handle wildcards for file in "${ITEMS_TO_DELETE[@]}"; do @@ -65,81 +74,45 @@ if [ "$CLEAN" = true ]; then # Handle files with wildcards differently if [[ "$remote_file" == *"*"* ]]; then - ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "for f in ${remote_file}; do if [ -e \"\$f\" ]; then echo \"Found: \$f\"; rm -rf \"\$f\" && echo \"Deleted: \$f\"; else echo \"No matching files for pattern: ${remote_file}\"; fi; done" + ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "for f in ${remote_file}; do if [ -e \"\$f\" ]; then rm -rf \"\$f\" && echo \"\$f\"; fi; done" else - ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "if [ -e '${remote_file}' ]; then rm -rf '${remote_file}' && echo 'Deleted: ${remote_file}'; else echo 'Not found: ${remote_file}'; fi" + ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "if [ -e '${remote_file}' ]; then rm -rf '${remote_file}' && echo '${remote_file}'; fi" fi done - - echo "Clean completed." fi mkdir -p .dist mkdir -p .build/"${APPLICATION_DIR}" -rsync -a mux_launch.sh .build/"${APPLICATION_DIR}" -rsync -av src/ .build/"${APPLICATION_DIR}"/.aesthetic/ - -# Debug: Check if SVG was copied -if [ -f ".build/${APPLICATION_DIR}/.aesthetic/assets/muOS/logo.svg" ]; then - echo "SVG file copied successfully" - ls -l ".build/${APPLICATION_DIR}/.aesthetic/assets/muOS/logo.svg" -else - echo "ERROR: SVG file not found in build directory!" - exit 1 -fi - -rsync -a bin/ .build/"${APPLICATION_DIR}"/.aesthetic/bin -rsync -a lib/ .build/"${APPLICATION_DIR}"/.aesthetic/lib -rsync -a src/tove/ .build/"${APPLICATION_DIR}"/.aesthetic/tove -# rsync -a src/ .build/"${APPLICATION_DIR}" - -# Check for required directories and files -if [ ! -d "src/tove" ]; then - echo "ERROR: 'tove' directory not found!" - echo "Please ensure the Tove library is installed in the 'tove' directory" - echo "Expected location: ./tove/libTove.so" - exit 1 -fi - -if [ ! -f "src/tove/libTove.so" ]; then - echo "ERROR: 'libTove.so' not found!" - echo "Please ensure the Tove library is installed at: ./src/tove/libTove.so" - exit 1 -fi - - - -# Debug: Check if Tove library exists and has correct permissions -if [ -f ".build/${APPLICATION_DIR}/.aesthetic/tove/libTove.so" ]; then - echo "Tove library found" - ls -l ".build/${APPLICATION_DIR}/.aesthetic/tove/libTove.so" -else - echo "ERROR: Tove library not found!" - exit 1 -fi - -# Copy application glyph mkdir -p .build/"${GLYPH_DIR}" -rsync -a src/template/glyph/muxapp/aesthetic.png .build/"${GLYPH_DIR}" +echoHeader "Copying files to build directory" +rsync -aq mux_launch.sh .build/"${APPLICATION_DIR}" && echo "mux_launch.sh" || { echo "Failed to copy mux_launch.sh"; exit 1; } +rsync -aq src/ .build/"${APPLICATION_DIR}"/.aesthetic/ && echo "src/" || { echo "Failed to copy src/"; exit 1; } +rsync -aq bin/ .build/"${APPLICATION_DIR}"/.aesthetic/bin && echo "bin/" || { echo "Failed to copy bin/"; exit 1; } +rsync -aq lib/ .build/"${APPLICATION_DIR}"/.aesthetic/lib && echo "lib/" || { echo "Failed to copy lib/"; exit 1; } +rsync -aq src/tove/ .build/"${APPLICATION_DIR}"/.aesthetic/tove && echo "src/tove/" || { echo "Failed to copy src/tove/"; exit 1; } +rsync -aq src/template/glyph/muxapp/aesthetic.png .build/"${GLYPH_DIR}" && echo "aesthetic.png" || { echo "Failed to copy aesthetic.png"; exit 1; } + +echoHeader "Creating archive" # Create archive, exclude macOS system files -(cd .build && zip -9r "../.dist/${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" * -x "*.DS_Store" -x "._*") +(cd .build && zip -9qr "../.dist/${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" * -x "*.DS_Store" -x "._*") && echo "${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" || { echo "Failed to create archive"; exit 1; } +echoHeader "Cleaning up" # Delete temporary build directory -rm -rf .build +rm -rf .build && echo "Removed build directory" || echo "Failed to remove build directory" +echoHeader "Uploading to $DEVICE_IP" if [ -z "$PRIVATE_KEY_PATH" ]; then - echo "No PRIVATE_KEY_PATH provided, skipping SCP upload" + echo "No PRIVATE_KEY_PATH provided" exit 0 elif [ -z "$DEVICE_IP" ]; then - echo "No DEVICE_IP provided, skipping SCP upload" + echo "No DEVICE_IP provided" exit 0 else - echo "Uploading to $DEVICE_IP" scp -i "${PRIVATE_KEY_PATH}" .dist/"${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" root@"${DEVICE_IP}":/mnt/mmc/ARCHIVE - - # Set proper permissions for libraries - ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "chmod 755 /mnt/mmc/MUOS/application/Aesthetic/.aesthetic/tove/libTove.so" + echoHeader "Extracting on $DEVICE_IP" + ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "bash /opt/muos/script/mux/extract.sh /mnt/mmc/ARCHIVE/${ARCHIVE_BASE_NAME}_${VERSION}.muxupd" fi -echo "Done!" \ No newline at end of file +# echoHeader "Running application" +# ssh -i "${PRIVATE_KEY_PATH}" root@"${DEVICE_IP}" "bash /mnt/mmc/MUOS/application/Aesthetic/mux_launch.sh" \ No newline at end of file From 3396b5933c64bdd015dd2e21b69d8052a80e583f Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:24:39 -0600 Subject: [PATCH 39/74] Fix: Update color picker tab height from 90% to 8% screen height --- src/screen/color_picker/constants.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screen/color_picker/constants.lua b/src/screen/color_picker/constants.lua index ca65849..f857884 100644 --- a/src/screen/color_picker/constants.lua +++ b/src/screen/color_picker/constants.lua @@ -4,7 +4,7 @@ local state = require("state") local constants = {} -- Calculate tab height as a percentage of the screen height -local TAB_HEIGHT_PERCENT = 0.9 +local TAB_HEIGHT_PERCENT = 0.08 local TAB_HEIGHT = math.floor(state.screenHeight * TAB_HEIGHT_PERCENT) -- Function to provide tab height to main color picker screen From dc530dc50f8cd7e78743207efebda9cac580076a Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:31:11 -0600 Subject: [PATCH 40/74] Replace generic error message with error handler message if set --- src/screen/menu.lua | 2 +- src/screen/menu/error_handler.lua | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/screen/menu.lua b/src/screen/menu.lua index d0698ae..3a54bfd 100644 --- a/src/screen/menu.lua +++ b/src/screen/menu.lua @@ -175,7 +175,7 @@ function menu.update(dt) ) else -- Show error popup - ui.showPopup("Error creating theme.") + errorHandler.showErrorPopup("Error creating theme") end return -- Skip the rest of the update to avoid input processing elseif waitingState == "install_theme" then diff --git a/src/screen/menu/error_handler.lua b/src/screen/menu/error_handler.lua index 4008d24..9f2b0a3 100644 --- a/src/screen/menu/error_handler.lua +++ b/src/screen/menu/error_handler.lua @@ -9,9 +9,6 @@ local errorMessage = nil -- Function to set error message function errorHandler.setError(message) errorMessage = message - - -- Show error in popup with an Exit button that quits the application - ui.showPopup(message, { { text = "Exit", selected = true } }) end -- Get current error message @@ -19,6 +16,15 @@ function errorHandler.getErrorMessage() return errorMessage end +-- Function to show error popup +function errorHandler.showErrorPopup(prefix) + local message = errorMessage or "Unknown error" + if prefix then + message = prefix .. ": " .. message + end + ui.showPopup(message, { { text = "Exit", selected = true } }) +end + function errorHandler.update(dt) -- No timer logic needed end From e9ed2b35baf03cfc53ff179e81c21d3b29da9460 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 00:18:39 -0600 Subject: [PATCH 41/74] Fix: Theme creation errors due to bad paths --- src/screen/menu/constants.lua | 5 ++++ src/screen/menu/theme_creator.lua | 38 +++++++++++++++++++++---------- src/utils/system.lua | 25 ++++++++++++++++---- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index f3d59c3..6c020c1 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -113,12 +113,17 @@ paths.THEME_NAME_PATH = paths.WORKING_THEME_DIR .. "/name.txt" -- `scheme` paths.THEME_SCHEME_DIR = paths.WORKING_THEME_DIR .. "/scheme" +paths.THEME_SCHEME_SOURCE_DIR = paths.TEMPLATE_DIR .. "/scheme" paths.THEME_SCHEME_GLOBAL_PATH = paths.THEME_SCHEME_DIR .. "/global.ini" -- `font` paths.THEME_FONT_DIR = paths.WORKING_THEME_DIR .. "/font" paths.THEME_DEFAULT_FONT_PATH = paths.THEME_FONT_DIR .. "/default.bin" +-- `glyph` +paths.THEME_GLYPH_SOURCE_PATH = paths.TEMPLATE_DIR .. "/glyph" +paths.THEME_GLYPH_PATH = paths.WORKING_THEME_DIR .. "/glyph" + -- `x` paths.THEME_RESOLUTION_DIR = paths.WORKING_THEME_DIR .. "/" .. state.screenWidth .. "x" .. state.screenHeight paths.THEME_PREVIEW_IMAGE_PATH = paths.THEME_RESOLUTION_DIR .. "/preview.png" diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index d6a1501..5134dd0 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -18,11 +18,13 @@ local themeCreator = {} local function createNameFile() local nameFile = io.open(paths.THEME_NAME_PATH, "w") if not nameFile then - errorHandler.setError("Failed to create name.txt file") + errorHandler.setError("Failed to create `name.txt` file: " .. paths.THEME_NAME_PATH) return false end - nameFile:write(state.applicationName) -- Use application name as theme name + local content = state.applicationName -- Use application name as theme name + nameFile:write(content) nameFile:close() + return true end -- Function to create preview image displayed in muOS theme selection menu @@ -468,20 +470,33 @@ function themeCreator.createTheme() local status, err = xpcall(function() -- Clean up and prepare working directory commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') - if not system.copyDir(paths.TEMPLATE_DIR, paths.WORKING_THEME_DIR) then - errorHandler.setError("Failed to prepare working template directory") + + -- Create the working theme directory + system.ensurePath(paths.WORKING_THEME_DIR) + + -- Copy glyph directory and contents + if not system.copyDir(paths.THEME_GLYPH_SOURCE_PATH, paths.THEME_GLYPH_PATH) then + errorHandler.setError("Failed to copy glyph directory") + return false + end + + -- Copy scheme directory and contents + if not system.copyDir(paths.THEME_SCHEME_SOURCE_DIR, paths.THEME_SCHEME_DIR) then + errorHandler.setError("Failed to copy scheme directory") + return false end -- Ensure all required directories exist for key, path in pairs(paths) do - if type(path) == "string" and string.match(path, "/$") == nil then - -- Only ensure directories for path strings that don't already end with a slash - local dirPath = string.match(path, "(.*)/[^/]*$") - if dirPath then - if not system.ensurePath(dirPath) then - return false - end + if type(path) == "string" then + -- print("[Directory] Ensuring path exists: " .. path) + print("") + if not system.ensurePath(path) then + print("[Directory] Failed to create path: " .. path) + return false end + print("[Directory] Successfully created/verified path: " .. path) + print("") end end @@ -508,7 +523,6 @@ function themeCreator.createTheme() -- Replace colors and apply glyph settings to theme files if not system.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, hexColors) then - errorHandler.setError("Failed to update colors in: " .. paths.THEME_SCHEME_GLOBAL_PATH) return false end diff --git a/src/utils/system.lua b/src/utils/system.lua index 7cc97ef..e04c518 100644 --- a/src/utils/system.lua +++ b/src/utils/system.lua @@ -143,18 +143,33 @@ function system.copyDir(src, dest) return success == 0 or success == true end ---- Ensures a directory exists, creating it if necessary, setting an error message if it fails ---- This function calls `errorHandler.setError()` so it does not need to be called separately +--- Ensures a directory exists, creating it if necessary +--- If path points to a file, creates the parent directory +--- If path points to a directory, creates that directory function system.ensurePath(path) - -- Extract directory from path if it is a file path - local dir = string.match(path, "(.*)/[^/]*$") or path + if not path then + errorHandler.setError("No path provided to ensurePath") + return false + end + + -- If path ends with a slash, treat as directory path + -- Otherwise, extract parent directory from potential file path + local dir + if path:match("/$") then + dir = path:sub(1, -2) -- Remove trailing slash + else + dir = path:match("(.+)/[^/]+$") or path + end local result = os.execute('mkdir -p "' .. dir .. '"') if not result then + print( + "[ensurePath] Failed to create directory: " .. dir .. " (os.execute returned: " .. tostring(result) .. ")" + ) errorHandler.setError("Failed to create directory: " .. dir) return false end - return result + return true end -- Copy a file and create destination directory if needed From 1317977dc3ad29e9e2abddbb98c394a64096eab6 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 09:17:43 -0600 Subject: [PATCH 42/74] Add removeDir function to system.lua --- src/screen/menu/theme_creator.lua | 6 ++---- src/utils/system.lua | 9 +++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 5134dd0..93963a1 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -469,9 +469,7 @@ end function themeCreator.createTheme() local status, err = xpcall(function() -- Clean up and prepare working directory - commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') - - -- Create the working theme directory + system.removeDir(paths.WORKING_THEME_DIR) system.ensurePath(paths.WORKING_THEME_DIR) -- Copy glyph directory and contents @@ -621,7 +619,7 @@ end -- Clean up working directory function themeCreator.cleanup() - commands.executeCommand('rm -rf "' .. paths.WORKING_THEME_DIR .. '"') + system.removeDir(paths.WORKING_THEME_DIR) end return themeCreator diff --git a/src/utils/system.lua b/src/utils/system.lua index e04c518..9fcb958 100644 --- a/src/utils/system.lua +++ b/src/utils/system.lua @@ -194,4 +194,13 @@ function system.getRequiredEnv(name) return value end +-- Remove a directory and all its contents recursively +function system.removeDir(dir) + if not dir then + errorHandler.setError("No directory path provided to removeDir") + return false + end + return commands.executeCommand('rm -rf "' .. dir .. '"') +end + return system From 869732337af7903ebaaeb85217410d926db9e156 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 09:23:03 -0600 Subject: [PATCH 43/74] Create copySelecetdFont function in theme_creator.lua --- src/screen/menu/theme_creator.lua | 58 ++++++++++++++++++------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 93963a1..439606b 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -465,6 +465,36 @@ local function createVersionFile() return true end +-- Function to find and copy the selected font file to theme directory +local function copySelectedFont() + -- Find and copy the selected font file + local selectedFontFile + for _, font in ipairs(constants.FONTS) do + if font.name == state.selectedFont then + selectedFontFile = font.file + break + end + end + if not selectedFontFile then + errorHandler.setError("Selected font not found: " .. tostring(state.selectedFont)) + return false + end + + -- Copy the selected font file as default.bin + local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile + if + not system.copyFile( + fontSourcePath, + paths.THEME_DEFAULT_FONT_PATH, + "Failed to copy font file: " .. selectedFontFile + ) + then + return false + end + + return true +end + -- Main function to create theme function themeCreator.createTheme() local status, err = xpcall(function() @@ -514,13 +544,13 @@ function themeCreator.createTheme() end -- Get hex colors from state (remove # prefix) - local hexColors = { + local colorReplacementts = { background = state.colors.background:gsub("^#", ""), foreground = state.colors.foreground:gsub("^#", ""), } -- Replace colors and apply glyph settings to theme files - if not system.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, hexColors) then + if not system.replaceColor(paths.THEME_SCHEME_GLOBAL_PATH, colorReplacementts) then return false end @@ -536,28 +566,8 @@ function themeCreator.createTheme() return false end - -- Find and copy the selected font file - local selectedFontFile - for _, font in ipairs(constants.FONTS) do - if font.name == state.selectedFont then - selectedFontFile = font.file - break - end - end - if not selectedFontFile then - errorHandler.setError("Selected font not found: " .. tostring(state.selectedFont)) - return false - end - - -- Copy the selected font file as default.bin - local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile - if - not system.copyFile( - fontSourcePath, - paths.THEME_DEFAULT_FONT_PATH, - "Failed to copy font file: " .. selectedFontFile - ) - then + -- Copy the selected font file + if not copySelectedFont() then return false end From 736d2bfab8b9dec92db5f5f458ec5623a70d994d Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 09:25:26 -0600 Subject: [PATCH 44/74] Update print when removing existing files in build script --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 92a8d20..e465a5f 100755 --- a/build.sh +++ b/build.sh @@ -65,7 +65,7 @@ if [ "$CLEAN" = true ]; then exit 1 fi - echoHeader "[0/6] Removing existing files" + echoHeader "Removing existing files" # Execute delete commands one by one to better handle wildcards for file in "${ITEMS_TO_DELETE[@]}"; do From 939f7046256405301e33047d2ac94836474da3d8 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 11:19:45 -0600 Subject: [PATCH 45/74] Remove prints from theme_creator.lua --- src/screen/menu/theme_creator.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index 439606b..c425b0b 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -517,14 +517,9 @@ function themeCreator.createTheme() -- Ensure all required directories exist for key, path in pairs(paths) do if type(path) == "string" then - -- print("[Directory] Ensuring path exists: " .. path) - print("") if not system.ensurePath(path) then - print("[Directory] Failed to create path: " .. path) return false end - print("[Directory] Successfully created/verified path: " .. path) - print("") end end From e4e2331f3768f81dca1156248546d526c23e53b7 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:35:24 -0600 Subject: [PATCH 46/74] Fix: Install theme automatically --- mux_launch.sh | 1 + src/screen/menu.lua | 3 ++- src/screen/menu/theme_creator.lua | 27 +++++++++------------------ 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/mux_launch.sh b/mux_launch.sh index cf590c9..f6e4487 100755 --- a/mux_launch.sh +++ b/mux_launch.sh @@ -4,6 +4,7 @@ # Source muOS system functions . /opt/muos/script/var/func.sh +. -n /opt/muos/script/package/theme.sh # Define paths ROOT_DIR="$(GET_VAR "device" "storage/rom/mount")/MUOS/application/Aesthetic/.aesthetic" diff --git a/src/screen/menu.lua b/src/screen/menu.lua index 3a54bfd..415d8ee 100644 --- a/src/screen/menu.lua +++ b/src/screen/menu.lua @@ -180,7 +180,8 @@ function menu.update(dt) return -- Skip the rest of the update to avoid input processing elseif waitingState == "install_theme" then -- Execute theme installation - local success = themeCreator.installTheme(waitingThemePath) + local waitingThemeName = waitingThemePath and string.match(waitingThemePath, "([^/]+)%.muxthm$") + local success = themeCreator.installTheme(waitingThemeName) waitingState = "none" waitingThemePath = nil diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index c425b0b..b75529c 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -584,10 +584,12 @@ function themeCreator.createTheme() -- Create the ZIP archive local outputThemePath = system.createArchive(paths.WORKING_THEME_DIR, paths.THEME_OUTPUT_PATH) if not outputThemePath then - errorHandler.setError("Failed to create theme archive") return false end + -- Call sync to make the theme available + commands.executeCommand("sync") + return outputThemePath end, debug.traceback) @@ -602,24 +604,13 @@ end -- Function to install the theme to muOS active theme directory -- TODO: Reference new PIXIE code to update and fix bugs -function themeCreator.installTheme(outputPath) - -- Remove existing active theme directory and create a new one - commands.executeCommand('rm -rf "' .. paths.THEME_ACTIVE_DIR .. '"') - commands.executeCommand("sync") - - -- Extract the theme to the active directory - if - not commands.executeCommand( - string.format('unzip "%s" -d "%s"', outputPath, paths.THEME_ACTIVE_DIR), - "Failed to install theme to active directory" - ) - then - return false - end +function themeCreator.installTheme(themeName) + local status, err = xpcall(function() + local cmd = string.format('/opt/muos/script/package/theme.sh install "%s"', themeName) + commands.executeCommand(cmd) + end, debug.traceback) - -- Sync to ensure all writes are complete - commands.executeCommand("sync") - return true + return status, err end -- Clean up working directory From f9fae6181684f65488022149e242bdf6e48cfc44 Mon Sep 17 00:00:00 2001 From: Jonathan Avila <31858207+joneavila@users.noreply.github.com> Date: Fri, 4 Apr 2025 04:36:49 -0600 Subject: [PATCH 47/74] Determine font size based on screen resolution --- src/main.lua | 11 ++++-- src/screen/menu.lua | 5 ++- src/screen/menu/constants.lua | 35 +++++++++++++++++-- src/screen/menu/error_handler.lua | 12 ++++++- src/screen/menu/theme_creator.lua | 13 +++++-- src/template/font/{ => 24}/cascadia_code.bin | Bin src/template/font/{ => 24}/inter.bin | Bin src/template/font/{ => 24}/nunito.bin | Bin src/template/font/{ => 24}/retro_pixel.bin | Bin src/template/font/29/cascadia_code.bin | Bin 0 -> 28900 bytes src/template/font/29/inter.bin | Bin 0 -> 32804 bytes src/template/font/29/nunito.bin | Bin 0 -> 34000 bytes src/template/font/29/retro-pixel.bin | Bin 0 -> 10980 bytes src/template/font/36/cascadia_code.bin | Bin 0 -> 43592 bytes src/template/font/36/inter.bin | Bin 0 -> 48332 bytes src/template/font/36/nunito.bin | Bin 0 -> 48180 bytes src/template/font/36/retro-pixel.bin | Bin 0 -> 15860 bytes src/template/font/38/cascadia_code.bin | Bin 0 -> 48248 bytes src/template/font/38/inter.bin | Bin 0 -> 53256 bytes src/template/font/38/nunito.bin | Bin 0 -> 53324 bytes src/template/font/38/retro_pixel.bin | Bin 0 -> 17532 bytes 21 files changed, 66 insertions(+), 10 deletions(-) rename src/template/font/{ => 24}/cascadia_code.bin (100%) rename src/template/font/{ => 24}/inter.bin (100%) rename src/template/font/{ => 24}/nunito.bin (100%) rename src/template/font/{ => 24}/retro_pixel.bin (100%) create mode 100644 src/template/font/29/cascadia_code.bin create mode 100644 src/template/font/29/inter.bin create mode 100644 src/template/font/29/nunito.bin create mode 100644 src/template/font/29/retro-pixel.bin create mode 100644 src/template/font/36/cascadia_code.bin create mode 100644 src/template/font/36/inter.bin create mode 100644 src/template/font/36/nunito.bin create mode 100644 src/template/font/36/retro-pixel.bin create mode 100644 src/template/font/38/cascadia_code.bin create mode 100644 src/template/font/38/inter.bin create mode 100644 src/template/font/38/nunito.bin create mode 100644 src/template/font/38/retro_pixel.bin diff --git a/src/main.lua b/src/main.lua index 7efeb18..9ab96a0 100644 --- a/src/main.lua +++ b/src/main.lua @@ -38,11 +38,16 @@ local function updateInputTimer(dt) end local function setupFonts() - -- See: https://love2d.org/wiki/love.graphics.newFont -- Calculate font sizes as a percentage of the screen height - -- All muOS Ambernic supported devices have height of 480 - local maxScreenHeight = 480 + -- The default muOS Pixie theme includes the following resolutions: + -- 640x480 + -- 720x480 + -- 720x576 + -- 720x720 + -- 1024x768 + -- 1280x720 + local maxScreenHeight = 768 local fontSizeHeader = 32 * (state.screenHeight / maxScreenHeight) local fontHeader = love.graphics.newFont("assets/fonts/inter/Inter_24pt-SemiBold.ttf", fontSizeHeader) diff --git a/src/screen/menu.lua b/src/screen/menu.lua index 415d8ee..4a3a2e8 100644 --- a/src/screen/menu.lua +++ b/src/screen/menu.lua @@ -5,10 +5,13 @@ local state = require("state") local controls = require("controls") local constants = require("screen.menu.constants") -local ui = require("screen.menu.ui") local errorHandler = require("screen.menu.error_handler") +local ui = require("screen.menu.ui") local themeCreator = require("screen.menu.theme_creator") +-- Initialize errorHandler with UI reference +errorHandler.setUI(ui) + -- Module table to export public functions local menu = {} diff --git a/src/screen/menu/constants.lua b/src/screen/menu/constants.lua index 6c020c1..8a3ce35 100644 --- a/src/screen/menu/constants.lua +++ b/src/screen/menu/constants.lua @@ -9,7 +9,32 @@ constants.COLOR_PICKER_SCREEN = "color_picker" constants.ABOUT_SCREEN = "about" constants.FONT_SCREEN = "font" -constants.IMAGE_FONT_SIZE = 45 +-- Screen height to font size mapping +constants.SCREEN_HEIGHT_MAPPING = { + [768] = { fontSizeDir = "38", imageFontSize = 45 }, + [720] = { fontSizeDir = "36", imageFontSize = 42 }, + [576] = { fontSizeDir = "29", imageFontSize = 34 }, + [480] = { fontSizeDir = "24", imageFontSize = 28 }, +} + +-- Helper function to get font size info based on screen height +constants.getFontSizeInfo = function(height) + local sizeInfo = constants.SCREEN_HEIGHT_MAPPING[height] + if not sizeInfo then + -- Simple error message without using errorHandler + print("Unexpected screen height: " .. height) + return nil + end + return sizeInfo +end + +-- Image font size based on screen height +constants.getImageFontSize = function() + local sizeInfo = constants.getFontSizeInfo(state.screenHeight) + return sizeInfo and sizeInfo.imageFontSize +end + +constants.IMAGE_FONT_SIZE = constants.getImageFontSize() -- Error display time constants.ERROR_DISPLAY_TIME_SECONDS = 5 @@ -74,7 +99,8 @@ constants.POPUP_BUTTONS = { -- TODO: Create files like `name.txt` dynamically -- TODO: You can initialize the paths here constants.PATHS = { - TEMPLATE_DIR = os.getenv("TEMPLATE_DIR"), + -- Since the environment variable is set in the run script it will not be set when debugging + TEMPLATE_DIR = os.getenv("TEMPLATE_DIR") or "some/path", } -- Create a local alias for easier access @@ -102,6 +128,11 @@ paths.THEME_VERSION_PATH = paths.THEME_DIR .. "/version.txt" -- Assets used by UI rather than generated theme paths.THEME_FONT_SOURCE_DIR = paths.TEMPLATE_DIR .. "/font" +-- Create font size directory paths from the mapping +for _, info in pairs(constants.SCREEN_HEIGHT_MAPPING) do + paths["THEME_FONT_SIZE_" .. info.fontSizeDir .. "_DIR"] = paths.THEME_FONT_SOURCE_DIR .. "/" .. info.fontSizeDir +end + -- `credits.txt` paths.THEME_CREDITS_PATH = paths.WORKING_THEME_DIR .. "/credits.txt" diff --git a/src/screen/menu/error_handler.lua b/src/screen/menu/error_handler.lua index 9f2b0a3..8674914 100644 --- a/src/screen/menu/error_handler.lua +++ b/src/screen/menu/error_handler.lua @@ -1,10 +1,15 @@ --- Menu error handler -local ui = require("screen.menu.ui") local errorHandler = {} -- Error state local errorMessage = nil +local ui = nil -- Will be set when initialized + +-- Function to set UI module reference (called after UI is loaded) +function errorHandler.setUI(uiModule) + ui = uiModule +end -- Function to set error message function errorHandler.setError(message) @@ -18,6 +23,11 @@ end -- Function to show error popup function errorHandler.showErrorPopup(prefix) + if not ui then + print("Error: UI module not set in errorHandler") + return + end + local message = errorMessage or "Unknown error" if prefix then message = prefix .. ": " .. message diff --git a/src/screen/menu/theme_creator.lua b/src/screen/menu/theme_creator.lua index b75529c..f48b0f6 100644 --- a/src/screen/menu/theme_creator.lua +++ b/src/screen/menu/theme_creator.lua @@ -465,7 +465,7 @@ local function createVersionFile() return true end --- Function to find and copy the selected font file to theme directory +-- Function to find and copy the selected font file to theme directory based on screen height local function copySelectedFont() -- Find and copy the selected font file local selectedFontFile @@ -480,13 +480,20 @@ local function copySelectedFont() return false end + -- Determine font size based on screen height + local sizeInfo = constants.getFontSizeInfo(state.screenHeight) + if not sizeInfo then + return false + end + local fontSizeDir = sizeInfo.fontSizeDir + -- Copy the selected font file as default.bin - local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. selectedFontFile + local fontSourcePath = paths.THEME_FONT_SOURCE_DIR .. "/" .. fontSizeDir .. "/" .. selectedFontFile if not system.copyFile( fontSourcePath, paths.THEME_DEFAULT_FONT_PATH, - "Failed to copy font file: " .. selectedFontFile + "Failed to copy font file: " .. selectedFontFile .. " (size " .. fontSizeDir .. ")" ) then return false diff --git a/src/template/font/cascadia_code.bin b/src/template/font/24/cascadia_code.bin similarity index 100% rename from src/template/font/cascadia_code.bin rename to src/template/font/24/cascadia_code.bin diff --git a/src/template/font/inter.bin b/src/template/font/24/inter.bin similarity index 100% rename from src/template/font/inter.bin rename to src/template/font/24/inter.bin diff --git a/src/template/font/nunito.bin b/src/template/font/24/nunito.bin similarity index 100% rename from src/template/font/nunito.bin rename to src/template/font/24/nunito.bin diff --git a/src/template/font/retro_pixel.bin b/src/template/font/24/retro_pixel.bin similarity index 100% rename from src/template/font/retro_pixel.bin rename to src/template/font/24/retro_pixel.bin diff --git a/src/template/font/29/cascadia_code.bin b/src/template/font/29/cascadia_code.bin new file mode 100644 index 0000000000000000000000000000000000000000..c05bf04e267cce29662303b4be18af62c7f81098 GIT binary patch literal 28900 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