From 3d2ef7aa6adb8a21d1a4bbe223f6a8f8de81e13e Mon Sep 17 00:00:00 2001 From: Maschell Date: Wed, 19 Feb 2020 20:19:46 +0100 Subject: [PATCH] Add basic rendering of a screen with particles --- .gitignore | 4 + LICENSE | 674 +++++++++++++++++++++++++++++++++ Makefile | 163 ++++++++ data/fonts/font.ttf | Bin 0 -> 55620 bytes data/sounds/bgMusic.ogg | Bin 0 -> 198557 bytes filelist.sh | 81 ++++ src/Application.cpp | 301 +++++++++++++++ src/Application.h | 79 ++++ src/common/common.h | 15 + src/entry.cpp | 20 + src/fs/CFile.cpp | 175 +++++++++ src/fs/CFile.hpp | 61 +++ src/fs/DirList.cpp | 218 +++++++++++ src/fs/DirList.h | 106 ++++++ src/fs/FSUtils.cpp | 142 +++++++ src/fs/FSUtils.h | 16 + src/gui/GuiIconGrid.cpp | 53 +++ src/gui/GuiIconGrid.h | 43 +++ src/gui/GuiTitleBrowser.h | 16 + src/menu/MainDrcButtonsFrame.h | 111 ++++++ src/menu/MainWindow.cpp | 243 ++++++++++++ src/menu/MainWindow.h | 140 +++++++ src/resources/Resources.cpp | 168 ++++++++ src/resources/Resources.h | 33 ++ src/resources/filelist.h | 34 ++ src/system/CMutex.h | 67 ++++ src/system/CThread.h | 138 +++++++ src/utils/AsyncExecutor.cpp | 15 + src/utils/AsyncExecutor.h | 26 ++ src/utils/StringTools.cpp | 211 +++++++++++ src/utils/StringTools.h | 80 ++++ src/utils/logger.c | 82 ++++ src/utils/logger.h | 38 ++ src/utils/strings.c | 184 +++++++++ src/utils/strings.h | 24 ++ src/utils/utils.c | 41 ++ src/utils/utils.h | 35 ++ 37 files changed, 3837 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 data/fonts/font.ttf create mode 100644 data/sounds/bgMusic.ogg create mode 100644 filelist.sh create mode 100644 src/Application.cpp create mode 100644 src/Application.h create mode 100644 src/common/common.h create mode 100644 src/entry.cpp create mode 100644 src/fs/CFile.cpp create mode 100644 src/fs/CFile.hpp create mode 100644 src/fs/DirList.cpp create mode 100644 src/fs/DirList.h create mode 100644 src/fs/FSUtils.cpp create mode 100644 src/fs/FSUtils.h create mode 100644 src/gui/GuiIconGrid.cpp create mode 100644 src/gui/GuiIconGrid.h create mode 100644 src/gui/GuiTitleBrowser.h create mode 100644 src/menu/MainDrcButtonsFrame.h create mode 100644 src/menu/MainWindow.cpp create mode 100644 src/menu/MainWindow.h create mode 100644 src/resources/Resources.cpp create mode 100644 src/resources/Resources.h create mode 100644 src/resources/filelist.h create mode 100644 src/system/CMutex.h create mode 100644 src/system/CThread.h create mode 100644 src/utils/AsyncExecutor.cpp create mode 100644 src/utils/AsyncExecutor.h create mode 100644 src/utils/StringTools.cpp create mode 100644 src/utils/StringTools.h create mode 100644 src/utils/logger.c create mode 100644 src/utils/logger.h create mode 100644 src/utils/strings.c create mode 100644 src/utils/strings.h create mode 100644 src/utils/utils.c create mode 100644 src/utils/utils.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae8977b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.cbp +*.elf +*.rpx +build/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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. But first, please read +. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3653eca --- /dev/null +++ b/Makefile @@ -0,0 +1,163 @@ +#------------------------------------------------------------------------------- +.SUFFIXES: +#------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) + +include $(DEVKITPRO)/wut/share/wut_rules + +#------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := src \ + src/fs \ + src/gui \ + src/menu \ + src/resources \ + src/system \ + src/utils +DATA := data \ + data/images \ + data/sounds \ + data/fonts +INCLUDES := src + +#------------------------------------------------------------------------------- +# options for code generation +#------------------------------------------------------------------------------- +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(MACHDEP) + +CFLAGS += $(INCLUDE) -D__WIIU__ -D__WUT__ + +CXXFLAGS := $(CFLAGS) + +ASFLAGS := -g $(ARCH) +LDFLAGS = -g $(ARCH) $(RPXSPECS) -Wl,-Map,$(notdir $*.map) + +LIBS := -lgui -lfreetype -lgd -lpng -ljpeg -lz -lmad -lvorbisidec -logg -lbz2 -lwut + +#------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level +# containing include and lib +#------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(WUT_ROOT) $(WUT_ROOT)/usr + +#------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#------------------------------------------------------------------------------- +FILELIST := $(shell bash ./filelist.sh) +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#------------------------------------------------------------------------------- + export LD := $(CC) +#------------------------------------------------------------------------------- +else +#------------------------------------------------------------------------------- + export LD := $(CXX) +#------------------------------------------------------------------------------- +endif +#------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) -I$(PORTLIBS_PATH)/ppc/include/freetype2 + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean all + +#------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).rpx $(TARGET).elf + +#------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#------------------------------------------------------------------------------- +# main targets +#------------------------------------------------------------------------------- +all : $(OUTPUT).rpx + +$(OUTPUT).rpx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin + @echo $(notdir $<) + @$(bin2o) + +%.png.o %_png.h : %.png + @echo $(notdir $<) + @$(bin2o) + +%.jpg.o %_jpg.h : %.jpg + @echo $(notdir $<) + @$(bin2o) + +%.ogg.o %_ogg.h : %.ogg + @echo $(notdir $<) + @$(bin2o) + +%.mp3.o %_mp3.h : %.mp3 + @echo $(notdir $<) + @$(bin2o) + +%.ttf.o %_ttf.h : %.ttf + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#------------------------------------------------------------------------------- +endif +#------------------------------------------------------------------------------- diff --git a/data/fonts/font.ttf b/data/fonts/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..01ce58166c4c97ca7ed556833ac8ecd30a40823c GIT binary patch literal 55620 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

2kn2N! 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 z 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

E`d;r7fq!jIXBKFewM(r^jXO6) z%>lZ!UzSvWu|zs<>TNs#6i44+9s;ve6fzUthyQ^26##ICZ~P=wt=50J`gM}O<$kN! zH9yeL<6!9SduZVp3F-6$>Exdf#lp|;fH$NGa>cC)|F#ifF;7YW080^e z1NE|p@V-Rrd;__q`y&dVe+?we03UKFXzv?bpZutA7Qg;3nC>1}X_I{Rc0nEB)lGg5 ze(|yoRWr6Dlz02|akeYo)$&5z_8lI&hW++q#nOQTmHv+iy98*cwmGf~ADNwQtI<(l zb3Lgy5@&%PG!MxOKhMfSPB4VfUeQF6Bwju0tpG3BBUU*yulv@hEOcBfUa{(bKI7(>IG9V zS=69<$M5$|h5N3CJVg!Yc3h7?=tfQHQP%K00Q@gA1APDG=+p_OnSUF6$Mq@Msnl*> zr8!pxqEtFFf?RI!mAP6}>69uq$9~Hwk>kduh7^GG1Fq=66l6uina^!PKH?1mTKO|k zv_SAHL$t5dTm4-WMGHbaoWbg_<>gy9-V z(%`pSZ%pSZXcsOn|DH@j%xjn5ktebwruHK`@rW;b%JX&>{HNy&!O9=~yq5I6G)=07 zo=Fbrh%yw$l7S^#ElU82AoN$W24GYl2C-oX6@UDG*;Cl)=y>xwe?!*Iweho^ZShGw zSorm_>Sljt225<-{`T0{n^!fx&(u;ubw2x)E*NC=+B%aYt8RRt*hp3VK;%iP%JBj$ z%^0tS7i=5Z^!c7oyC=D`d2hMy*jy46Rw&)1{!LOxkyMM^qe8PALD<(42a5#%l!^!3 z%N=1u>@yFl2Fe0%mZDr*9SrEAj~EMcN!D zkmpC%iod~15$Mb~2x#i#@6O42$7YwiwHX`a;gHwJ{=A->mwCms#D}|~$bZ_A%iyu^ zmFu>4uo8REH6Qs@ut|K&^h#g>z92?Xdzri7rd=0NH}Nhe;MK^YDT)~>B0y$Ytkz#+ zkDb}0iX&8vj_Xatpk2J>YIFT(cL7IPahN)yz;C*i!VBlmf~06FU3 zZ5=%_p)oHxXyk4@N+KNV!-*b(T*$j;A1mij@oXT)8Tli6AY}~rCre2fJPIsltS}my z8$oqJ2{5zFDwhD8TindsaMil(y-OB))|lj0R9vbg_ITQjms$?KoXIM~D{8bN)w4}VghoKEKgk*0Ju-d z9g}e9BOv9pc+R0`konnhRX0IN)NIOK8dQ8MNwvu-u>8S6kAi(jOfMj59rdlH^$^Rjo?BQL47S+ivB&B)d z>`O>r)1=}u)h`*&OHGX*#xN8ZBG{MMZX{Q^HI||yQ}%YDuAX`JdJ(ccfWjC?Ed93cxCOP!0oLf@XR|3&Nzzv|Ozy0fH!r^I2(E}d+CWj)fDw;nud z+`ZkCk&&~gG@i2=1EUbcm_)uvx*TairQ*m6FSVVmJRHm&JTNOo-b9Q>W&47#|I zC$lK{s?95X_o2xi=q4&e;3l|!Q@=tNp7#PLdT(nwkum7i`mg=s&NgzcE906?^}tcI}Wo1fIN@gdZ* zD8Nf|dDT!T8n(gFQt{CyG7hV|-;YSqo`T5FvX4`5a}d-0*sjDx%9w>k#LDOt>HOzB z0!g3byfjac3P3NSd;Wzzi)9kN!o=I(3{}Mgq40|GP%v6c zPg#_AP+&u8UxCasMez+m{i}R%GSGmSp$c4Qs_MST12YX~LTs9oY9N7lL#+S}s3efJ z@^RQ?)ye#LxdSUR2+dg(@H}XIAX1dCdEIY*F}s$B681~r?W5K_5jJ5)AK$u`}PdFIBa^QMDN+O zC7xV6^z9nMUEivbCkor#NKMZVDqx?$BUMdp(S^rQZrFw6a2?4ew}AveVg_YvD=DJT z#k8wi*k$9h0dr~Nt0;aY|g$dit}?1%*3O9MIcUVxjx0G350zGOr+`fUZ@kAjFZwVB&^gNa#nj=T^x-r1Fl6?Mo(JJ19{}fRr1Ou7@ zD_M}0NGrZQcdn}J>Fn&(c}1eDo4#f0QdQ|@C#u*uw*0{%da(9p7HrUpZAZ4-sQO8r{FS z`Kyd4arN`{CtIbzsv>J$k4AS=HmU~NZ7x<;Rsay=MM0H6>CgnqGBf z!%#>$DL^J-xIru{SE8XK*Mf6c)tVs1sw1b{DZW~o=>iu>*NN8g$`nAJS$@G@R;F(t zKLgl**X*u#S67eEPObO;dT!4?#d9us^9YKDFR#bB;ZM8E_xjmh#R`94}Pl4}W& zB8_m$0E3aC0Yd*7o-eHrp*x$#_%<%Ox$QOo%j>wUnCnF@h;{PPq52z)_1*s6|Gb*{ znE{n?h0X#Y9b;X5C_uz?Vaoy9VX2N=KmdS_r>p`ijre<B>vI*gLW`nS`fWZTkO4g8fP~>AZ9p7<$vc@@75^HHsiK9TF=t6-qeyh`O8u^W zuxSWDyXJmyK*;_m_?6aUYkZg0tpXrSYyeao(oZ4D0V}HwSYleRZDd%Ae}@$y6|b z&Kz=rA&f@nYGJZE`DM*UbiqA<7MyX3)I(+$zRs)d(RnN3Yn=D`FfF{de&`St4D>?A zipDn`Kn9AGY{MDBTweLDyhJux^rgir?bm;wL{RZ|LKQ@WHm*2UphY#W24?}_29@yfRx zCWqUvZ&O`hdfMCMciFt_SlRDQ7tFc>6gIDOOPL!qq5B9i*f3gARCME>UKt1*0O>@b zAcs9R6T0B#Q-Vk_1P!Ur1ep%$FqSU%tJ`~0kzLCxWRZ+iV({nWB1c7`x`aF#JmxR) z*%#yP5WSbm95Aobdyc1Rd!f3~$16X(rqIYgFPTswZVBGAGqqO$mxXu*w#{|{0VtwC zgIOsSNfZN66(xYB?}E3`I3EotSElUs4+v60vi$XBp{m8NPw914dd@hs=fu4v-1-oE zH6Wf0`^@I1<6yAEW9s&P_~GsvSa0?9zV%=35!UWFm=XikuX&;8wz+=okK*s|_XFF{ zgnOC8%Ct)G|gzwlH2 zgCQx%zXwFqplRD3x?Mx{(kG>F(~5Mp7E2yJYE3 z=>};*kdzLkq@+PQ1Syf0KJ%V)zUzDbnd_R}nT?rw;{M$MYKZ>pd^iJXqJc4}k4 zW(Nn1wV;bC>G@ZYf_LxU=;yu|M_3Af!kjY zH9`i^UlZq%ikpX%lSfwKk%f~-MnYKh5$kAsmxW&l+}=GB^GfAo+^-d1wRiZ+8=O9b zgb18n2YDO~HdxaUYnD(y{&!CQcs?eE_d;6r_84gz(!op+q!v9ex>{V21%6#n&@8yW)R70N*fC#TJP;W|k$!C)D4f+Bz)2@l{OW zcmM20mngO#_Rh*PKLtZ@;4|02d3)uspY_gd_kj2$J#ZUrZ9PJfF#c(AcBI9fuwfaq z5CZo@^U|a1ELl%c=~3A?w86F}g_+!ZsRAhmB*Z2sNe~ykrEKUesl2FOMzw0oV*;5F5ogL7_4D{5Iqw)dyK6iBcZPJE0 zdr6KZTIO!ckX&ClWvcSKfMR)iVS%6^u6;KBr4yrB}w zzZ>8X2^#d%N+=B!eVu2N+WAYUaHC|MNv8_(MAeka@V}Y^07M!z{j%otU414@s%7bW z%{8#~_n)WQhx;n3t4vds&4kTyRiaS>Z|)!O{khHc7!7i%1De$Nv3|pOa9|vNcqS5` z1=~wJ5!En5HTj2gZp)1Fqfnwe@`errpm-M$7kktyA|D?}<}Shl5J-FuXqm6;g&`bJ zwIMNAeU0+UcIG=1!zjztntuB&6g||A*};*YZTc?xB46?%wI*isgK}>!!F9n_=6gF^ zL?K0`0r1mug?rvb(?%p)#FBeJr|C)I6!T_;kj<%Iq;GfqM;tBpBQ0O1=M>)Y2eF?R z&T?~WiX+O);fluN4~0d+_J@S{xZXl>WTn%?ovBbtu2M@D@r9vlFAc(zhlBi4&?ywI(PoDyL4Nf}*4ve6|3{jV7iDU4`SGYYFQs1nd82%jP= zhJUgk0OyKU(NL875eBh+3fN*vD+^3tNj;}U{@Ko(Mv(z$fM3+$cq^2nwu&b&@i;_>Z4C=~#P%LR;f~Sw+YOWF8@2@zX$V3wYf^r;^aCwaYatfjA*_H_yd!?D~`OO!al-=*zg2F<3i(S|{ z>5Sb77d<~7kq`{Za(y68Q8({)n116f5b3UxMEXUn={HMcqe*ye%kf5}-kLD6tX|Jr z!DGkT#6hCBvQ$jcRgB3w=Y+#MKjQK9Pc@hX^1Jy(&;0&U(eRs4lousNG63#@csW+B zLyOL9%eKys9%8p#zjkwMxcP%rOK8M{*hNPUFT9%+b^39?`*=dRY&t4ATYgkAHm`T; zIFWVmP8f|8Gvl5rJk+ppciiEET^EP7Xu2Xlx*{)!4%99jS@8lw;~aw}5jrq$CaUyk z%14FmFFsjkf_WyKJPqzk-Co``R9Cb5jz3JTix?POHwD#olTa_`y0=~rl+EN`h}&cf_VDxs za7Nl)7M)pI9o5QQ)VRfnoE`O$W;$i9#g_*{Kmao(>d$>9$NKVYo|P+pG?Tspz@A>{ zCzQ4!389^1H%^5XXG0*r+XCkT8?4^_a1-~^(0K8}{9-Y<7XYx#{7NP>y%^CL!jz}y z!D$un*9Z{>3diPq;pjAD?4=Uss1z`1Wg1QS$ztV%Tjt{`DQ;%K>4^!UfyW}%T}t#( zpt|Q|X$lkJv14b>c%g@?aVi~nPq{QM$a~21Pf`lLvnnD+jMUzT zCFyTxK9hvj4vRIeqU98M%7E3+`6AX7R^wSq|EvB*mPbcllEa?3+1Q0#j1acb{eDV>Bi4B9sJ^b8|F3+SB{l*pGBUx->pazz4}%%(wFKOM`9_I<&OO{e1U){oKM2Y!-CuFn zBOH(GKU!VCW>2a$QdS5i+0-xg>*Q!5CVRad=K*=HLXtqqLzGntm~V?jD{FL^iYW>}s2ykS^FNkSEmn0s!> zIr_woRZPwBy0rLSZ!eg@1+dK*q?`nOZP^~hTv@QPrg6k#wVkeSdo;0*35Ba)X@n}J zf<>WOHe?0-ubk!+q@4B4QwyE{$T`qw3-~p$FoyQeEW*r5pO<~`hSuSJ%+R_yxstSD z0xnGnhq%2{4!<0?(QSgcDoHT2r#dPOmZ2h>2ACPF=$U*;ud=HuA0X{BUeo!;aK}@B zz;=`c5By8iR_V`~d>u?W;ku7_C#(OGglMVtWT97CYOiE(g~p02qz}~$B_G3h$h2tr z<`_ku!&1uT)SId0;kE}4_SC8{J2eelQ0z%9@QGmQOJwr!+ND|O(1PrJf_WryVRSEm z3DKk%!T=~s7l)G|U}%vd2u~(uGfTyQ3?u@q0-rvGJ`TndfHX?v3p{Hrg*OUOEkGiL zM8pvr2|QPbexrn7CLpP>7mNn_gs$Tiw%x+8zx3o;GI0x_ArT7i2GVw88J%cSA=@@r zTU3mmpI!=%m)~bxZ)*DyPid5r?&&3UQh$^jPccu`J&1|Nr6q57 z;8)1|y+hFs1ww@Gd09JTcL5g(7O%hvlK1*Z-2-_50A?#u&59RMZNcoow`=?%G9WTb zkh@aJOh*<05={v3ic_n7r&^7i`|=#0N&oTyhz0%U6&jomBgL(V^0lfAQz*g zOGF~@?U>?1g)YPZeF$Vven58Of%Hl!43K z5B3@s>a(PglCeZJj}DPr|Gq*oS!ez4^6E=(gyx9aWgTHJ;2NMK?HI3I@gj@Y<-z{d zFP2R*zZLeYwd{u{DM#}g^?o%b8|r)_vmd&3lnV9}r)Jj=n*(n$p%9Kd9L@TVkT-X` z)IaQDLqu>_R^OesGOeY%YMa`s=|)~5=UjC$b*y4zoP#UgJSBFeZRht}4Yks7jpxvH zJYRaQHPiZ=3CpeRxW~lyWg>A8S4fLA|6_h!*-X4=)rx?dxqUp#1wye?ImB>MM^tg2 zN5$#u>W)6!$<(=vSXSpBg;&&SRW=@c@aBtfU7^B4ppG06BVD;(GgkZj;2&l6aq~O9 z$H%)WYny{^*(NKGzwjAL`ecw7`${w%7f9V@#CQDSXe04l^h0Hg4k#`M+nze7sw2NA zMJS(qNsXCC!3YXcSLFq?FWDSi>YoPq@Bx7B&-@u7AgLEqp)lmHB`XQ?g#jTJa70wU zjFBGtBDvy9skZJ^l4y3ClqIWKHrOb2@9Z{r1?zR7QtKOr-FaoAysYt9z&jOY$3TL5%@e5 zIS*-dMYH_=D5MW9B8LwDPQ$y0t@a`FgmC8CeeO%n2Qf(=_%6E!5uEND+UwS&93Qq6 zG#_P{(eGfnP!keuhBOVG5(!DXhRqW_b@xU!E=j2p;a*Za5dVM;Mi{d|BevAR8qmL! z`aKXJd1pEdf$U`NKDV2feesQ$zKK74>$Ei(!zFfReOF&3p6X{(maO_li~5I-0{@q( zg5q1MYET1jyQ?K%*Pk6;@oX-s>d#L@s@l~3++(@UrpmiB@c3UPR+F^Ek@MX~qL#b{ zBLkhF(qcFJCy1VuIGA5tA2COt6m$F8Xeyfn>?rar*9B3;vjO(=YYfXlZ=#A&0Fl`X z@k(diV91%k=#KTtEBbEWrk5VaVqZvAUj3aKkVx?`xPwqvUN4jP_H zL`xSGIGhh~9<6o9%gKQ4RkBCN-d|#npf$O*7BIbAIkM__SKAu~kVRn~`~i@+%vBPk zfWjw=!HpR~8*3|joYzG&l@ze^*}V6|D@16K#n#{$_=fg2_opzeuXUoad(1Pvcd8HS zuF?ZKCkDI9X&!F%`z*nKQa(9qH7$7#EbNf93RnL-c&nC2>E2ebk}R2$VqZhJFGd#I zs&K{+{kmQ1K&_1|lsg4BR0y?j0n&&*bk+W!F$zE~<}|+7+DeM?q0+EJDRQyTz_r+n zCgBo;Jg#9OY5N1R7y{-c^oJMEn$_n0{#y+zXkoc}PXL0*RnSS9?v5;+#re0|vnoXx zDm$p!I%ocSIuFZYoE_!>Y&iUl(yzKD0h@AE8?hexA%qVL^!#FFqN_Qjdh}2Ku-=NO zgHZhE-!_)K|FRImI{U3Q4`7N@i^z+#-Jr$$k^iARxcx84@DhBO#=m9^(#uJLxuvLJ zga*CI}A2xNqSx{08yW{dQ zVW(gDGP`=$-@GV}e24xWP-%a66Ua8V(%_@NO>{qT5WUx(?>xSoec3H0hic;I2B#Ku z=@wetq8UTUPEXxn;Y%r4BmHKNDK}`K)%2L9sz!vle^EpzL z{cKcUwsV*zIBCQM^hU?zKmlFH1u+l745OL(ahvJ0{@v~KvgYYt&42f%roWDZvM1-u z>%n$TGtp-iPZW4|ysW1-M$FkYYz1TZqZ29hg`ulRNzNM7 z!ueV^&+TnXXv1S9#pB6^^L>{EE_%<$MhB_l8ZE z$S$|8O1)a(r?&xsj$-}9QQcy}5*>|T9zNgy*0dVZ1LNaS0Bku>n7TlE&)JZ!*F9Pr zUq3{(E#@}m{XJFvsdB*-<4fC;0AN>1w4ReC)o>35&@=4{-TQjv6uRn;%`}NeTbWW7 zg8&NgZbm*l?iL*8TJzsG?{dYg&0z{cfv5yOHi!!9QxM@3yNw|RkP^Wv!@ep(MYz3H zWv}*00j}J!e|P;HI|8>H6f_lwkkkF1jso+1#kSX4YHNDZkBaPRABu_urM=(Xo7;bF zHZo~4ade0N7XJYsrO;^rb*xhyf=zZW;WXpA2tZk`aDJirT*VuJRec0W!%R_hIjGu2 z8|`V>8qhoZwS2+OMtfX@Nj51%n0~k!k3FwzOH~Y%#|@>Yw+1^uqa#^9gN60+o!$wP z#umFTb4$K;z)1#4)GWcT(?Uv%@EIIEGvz`)zzKSukKI;O0%pw9!jPlKqp^bPpQz*V z(dbH9Uk_npj}(KNVj4f4l~i~g3nLupslmko2j}4rK1`Iqx8*E^x>QthB7P0NCCS{m z!mxRFs!(Va!KmJwBW=o!QgGZTt2e;`@0_v$Qzj_73YON+me=Homdkup#|#Y41UE_{ zwlqFuHa&v70=5(wF49}?GBvure}Rf_S{I^0XKMD)kS~W$-ml^?e|Tpsqs1e&{>=3) zU&2vgP-MvhTl3v#XDBw&kcU9P;fiEmw%Ha=ls(lO8akj(3CT&y0f&s1j))gp>=tWtFAcrUn`ccHZ$iR3=p0Q!D8#x8<3?$Qz<&c@-hsIa((-=y0 zuk`e?4EKrN3q~$wuSC}-43CrT$jnPk$k>brS3WRYXdBI|d>uBgAf2e4aus*kPp2s3 z?YO@2R>wukZ^wl?Cs;V`W=@N=3qc`YO_)^0&iY*D!P5;8d ztI#u)saLYD5=$x^2GsbVc!~Zluom3*JBLG{fD34EAc@f$GmHiF-X=1`C~RCn_L9i( z=hL=}$0w?ZWd)7w1~WFZPd`1fvuWxfK&MZ=7?~^?%3flil1xGy-)uNvnQuERMrRfi zqA~l9oSeacEt+$ybGBHrZg?}47!F|B06jiiZ~%!cG=u?FFPPGveq@^~31iPS9&W2V z^xV=;elGY(U9kH#a~cJWha=GbAU5{48y9Ql4_Rh#iQPX{Dlx0BN}GYR-Xl9Z_x4;X zy;qgo>YkVFFOYr}tDb!28T%B^rJn{|yL`2t_`2+t9MWSrdk~+O%SRT3jV4V=hIk19 zfPwFYuM68ytXaq!o;i}^U_M*_*XhF8^~+sECf*sqJia96s|g>t*67dy1TkPX63aqc zC{_2w3~$Lms!C+QLT5I|eD@mtw?0YZ)6qkn{D1vxGT-=%}X z+_#q6AfFAYgAI<>kiv~8X{pwhqy(dQ(!atlNkDcqVDSTo=46r|tZrzYz0ZbXq9+;C zf=z<8|6|wB|4FYc6 ziq-VSwB&#q#AhSA-Wbdl3U|T~Y=tvw^uqKh(3`u%mA6&+QA~oXngQ4UMZ`{eP&W_# zS2T_HFy^e^CxEEJ7e$GTIIcA9Ph?eu_UI&??G@N$BX1OWwCi6?_D9P>Qy@U})!G3x z%I>Tf04gT2tIz-_p|idcYN6*4zu$A~aiRxhHSFylWM+3G(SLIH4v%A9w?^0)cOB)g zFMF(JHP|gh+lQDr_4st!V_&W+s;XJXmAV!CFJ}e<`6~ZD+fDO4tx-ApbZC$7lVT5W z^r61dqe5`U5PC1jn_c*|5ERP*4Zo7^qZZEb3O5d`o;Rs$_r%P2#_osbGR3?0OzGlj- zCizsa@iRXD5k_w-MpBlhqT+w7F3p&vervg^2y^-cmA|Md70a5e$V71)Kmy|Do;R-h zq46Y8FAcRP=DR;QcT?L=dGbSsWjm}oK=&BS-_Cw>6w>y=`d5BAa`I+-N=p@Hk(u$e z!NM&6$k45vtzx-uu*covxV*k$@0E;BLS90)jGb^akE)J0W$jmzrTjArb(Xy8$dJQv zLq-S!jKC3c7&-j0R<&74pv?({G}=E2h0);P&H1Wg&84KFdhR!xx#Vr8u_SY&ONO!} z*i|P!nU89lY;xn1mozBw%v26vEj+d{Co6n>5~AOL#0E961}n0-Bkr`Xe#S8ne{vR@ zzPZAG_EPUHf`AFiO^;iLsN>*jD1jM)bS`M&MGi4{HO6LSE-yp$;$FquX9|-uT7~F0 zxn!?~UJ^$D8bFA)2v4Ep$igcry_%%T>S=>6ceM|fvx34ieAGDbF%|pMGW;mlkhaX> zs-Kk9`q@<_`q6EfMVgdWR8{LfL~iz|%exdW^|%1vdDLW%l~Iai$F48}Y&g$ir$pC~ z9N*^go1=*CdxED`{QAU0sKc=4P!}6)0J0uz2@|;)<$DbwyLE@Q-}vLm6w-N<5!(wW zhJR3X$_tgw)pYxClo|TWc$X(PvM(F8boD8wFQrByL@YwYOuR|h23`pAxB}01ZjM7$ z(ndm6(JT8=mNUa8<+DH?a8;F1I3}jcU9*x`^?XhTt>@TYosOktBkTh~*eguJ!bxcg z_=Nia8JyBNE;Tj->Bk(2GyXVJB{`MFFRy`jrPn2OcRD5=yTqVlw~t z^3T?*^Rt-12=e(W4HN*Pk5DE1EyrmS9C6l;Miyw1y>dt6i8C|j{^6s!&1e3X6G=;W z9=mSjmeL`{137cKBiB)YoH%@GC|ZUL6V$t=)0-3Z8Yw6)Dw3ryTis(5?ssj+jes#% zMscjN10FCZvm<=j_(M!R2JNP2g-L~(Z^?srsXLxd5V^Tt)kkduR{t{T^+J9uY&{jX z+9Ti|S$*U$j5A8c<^kO7zdZqd7ha!xO5|ka)_@*%`E13z-_ma}EU>(b}rUB}q)xBWrw#$aow>Fo^&^2Mrkc9&R$`!c^p z{+TU=xDP#a-4?6NVbrcWPcz2AY&{!HN*6(7w_yn?``leEU)3(BI&kYr;!Dy4Nt}O= z8W}ioIneq>pDeE45mwz>o>e4CCrqGvDc2->^$3*e-|0Ss$x{=AeJiY23-1q?{JZtB zW|%&dsZxS;$zJ_!c$u4u$hTJ47qWWv7CKc`COGD!qbzt1&X~{usUk1Ux_~CYi)2x~tak2=QN? zM)b<^`JUEG(lfp)QpyKx+2f(u}=IdVLWkCyJfljz^+y=adDG&N>+v$K}dMwlkRSq?~6jC!3%Q5GKRcLKaPyMKI`UZ&QuU3K}&p z{LvF;P)M3+YhOweAUaAl!jqld{}~oV7Ssu#jY@HI{Kd>6+VFl;g{~N;2T7u0uUs|B zbeWye5R=2IW@6#)&0}uj|GHh-aj|(o_8K?ZhYU_SQeK3j1b7-AaYo0 zUUHPT(4;%N?r)~|?00o`em$(!AhyiTQ~Av9ol*_&(SSG_&!P>VbtmI($XUFTYU&F* zH0e|bg7BNZR+FAl)3IR3rv$pZa%%bMAcZ|WFyF88MtJgy$X7vRPmf4sg zfK0e`oU(juy5G~VGToUfz)a8uA@}AfXs%ynH*W^X+`p$SV|HAmx6n= zcxK|LIrgv3tirDs@a(=klX0FLx4jl0ca;0Vr$NJZd6)LHn`8=asynmgM9jl!_rryH z@)AO^0Ta@ighcPo&WMyrY#WrcMJ;j%u6?7fZ9^!xHwf8E3=Fg2q!Pl+o->e!s^%gn0%c7BeZ zFmD}h^y_7nrR)8+ijbFwYLzy0K?1pUwDBXoD15>G&YbdAHNh9e|!ld z3|NoY{5-O!6%~M)N~oqME7Cqy zD&~8S3rOYRPlx8fRbG0?Y4?M+`{0?)Wa0@wpofqV4(oHrXu=Rc-7ix@fKpW!0w{Qm zgJhwqC^W#E-?Q+Ju4J1ieEroFrbKWW8Of6QA|o??lQ}W1FT}x8W`{?AE>#6DhLqeI zU>8ufj7mc<+)N|r+rmiI$CQA%w&O9TLD^u(8$N3vU4}(AjQn}A-j`OZuH`z1{`zXd zR}g}#a?re?uWw($w@)BM@CKDE3Q9l==%Uwb9A{P@s!#Gs(l(+7y>F`zGDk5TswPUy zu6{pT{dz`DQdedMy$eVxM^->HacQ`@ip>tXTJmwTg zh-~_6beW`uAu6B-bpR7CVQ2zNQQ)w}RH}m_(y_*LeK}JHF}Kwe3hLoy&DPARk(=y$ zhUN)=i`MYBJ!Wit6(0@9&S}}F;w$xyjppWN#)>fEsXjq#z`5KK>SVo&h7uYHq6dNl zYGT=~ZI1H~2q(s^_z&dpgHedVg_*!6N%fdpV^~fct!^5+x?T`T$Vz~|JW#y`UT15qn-|Yi;`CwMI z@|%TU5M)IFkrFCU73fUcOGv_DeD;)d)`I^fX?MX8L&j>EuYJ-8&o0h1ZXok^%HaJw z5gz;1g3fn-ANj$D8D+cm;O=^7Yd6RX*BupKwEBpJ)mRq83y;%!JIIzR+(wmL@!qM9Aovgn z2TU?3xUa@B?jLcFU?=cof*OXaJ6^H8W3(uCAs5*t{q}D-g1qkPpL%A@R8xUnj^Fqn z(zKN;nCWAlO1$X|&U)AlZt3rsR`T?YzT-qsdIHeMV^3%$HQTAdfF6{2olyW#!WL&W zKv2@404|sRv;lx9$u7ekC1JwMZ(;xWg37>V5dV!vWx%0bA@C;?e~o51>=pC-Gj_%v znUuI=D!$yJFKj{*Hsf9L@|qOLnU@t5zjF=sC$M=UTAGF zf2xuqlm*DBJC&<)nrpriAUM##%iFFeLu1KL3I{wwkeE!s=VU|pXTBHs(`%ERoWRC< z6$JRfgDQyoNVPLS^3)zJuf?p;ZCXN02T04Sj%2mjYRgp=D+np^lO9Nd*>}u!G}c_J zwVV~b7n}brvVV(0vt`FDaj;Fu-(MCvrozPnnxCQg`fy#lSFd#n#1I*KQ6Fx+1;G;Z zA9kY@bl627)Ix$8mH_;#HKt`XK?xJJ}VP2Fz6^Yx#-j& z%u-%x4V+IGs|w;WkVTx?26D>C0NOgL4)&!+Y(%kk<-^1NyL*)SH3Bs~35lvSl@KHW z@f!d+vd{baZA9E;Bc{(Pb2G_#Waz@AfhZOM%09(hUX6x6!vv$dp{Z(P8Nt{{VvVzO zJ)X?AK8fExJ~3Q;p2&L*g+~aqV2cgtQ#>2ocTTj*Eg^<+XN)%`8MQez`aYvkHK{s~ z)sgHs`-;G-PU1XrE|i*}qg($hDF?<5&Q6cP?o@91GZQ^!G*(b&n#RZv(FaVXf@^5s zHd8^erLJw0Xuf&@uzvXHEZ3FVp~#5UDX@OR4BW7yyL_~Z3k&`d0(n-MU~+Y<@ObG+ zmyGf2R~wswg0Ss}zp?=AtMAz>4$c1#!wD!~N~786C8Pn$B5C$Z?A`cAyeZoQ|Fi^( z8~|A-{U<&xQr!NMkZ&@Hr+M!0wjT6eWS)1mz1@B02NwB&IBurZ?WX1>W0BQeU$HM2 z0Y5;Cp!<9NYhv^;SR&q?*F~%DbbfO=W zZX_uWWqaMG*@Nn5qf3khV=Xrs4Ziu#54-ORUOzHXiJ_g&9q72*a!P#rc$}mON#ea}!C`9YZY z0n;Wa#1>1@4T1RYTZOsy*%A#R#$IUzhEuE@83bW zX%~f9pr3ot_r(;e_T6jsRd$n(AFmby?{6+zh4`q@O5_UMUi+dZ^kY1nTsqTnarIG_ zLJ`aC#c$^2%@L?4ySFXJ^LqKsFLqm;s6_+2?kU0~Nwoi5n|Au~O3$91mYVdR{es`5 zRbM4u#X|wpVZTS8VBL<(Up3(e!_IEMT7spgWjt1+C(PR1J&+rqN7XK{X+NHm2-FS z*~6^r&RLdSe&+L?N3pI)*MQ@5(@3yvbo={X!IppdW7qA&Zg=AGqhOc!&GFW4!T-Do zeDNNP0}xNZEq|Q3y1P2LPu%*tCq8(!Bi>~yFP8A=(Y8}?9|GlF1 zKOfy}P#Fw-U+9;0zL@0F5q-b0t5Q32uBO~}^ZP@2>D`DzI92SE+nc)@=;n&MwEoDdO&{S(J5`%M*mGuh5q~0M7%7Mr=kDS0z8CmE Ds6oDu literal 0 HcmV?d00001 diff --git a/filelist.sh b/filelist.sh new file mode 100644 index 0000000..15addd3 --- /dev/null +++ b/filelist.sh @@ -0,0 +1,81 @@ +#! /bin/bash +# +# Automatic resource file list generation +# Created by Dimok + +outFile="./src/resources/filelist.h" +count_old=$(cat $outFile 2>/dev/null | tr -d '\n\n' | sed 's/[^0-9]*\([0-9]*\).*/\1/') + +count=0 +if [[ $OSTYPE == darwin* ]]; +then + +for i in $(gfind ./data/images/ ./data/sounds/ ./data/fonts/ -maxdepth 1 -type f \( ! -printf "%f\n" \) | sort -f) +do + files[count]=$i + count=$((count+1)) +done + +else + +for i in $(find ./data/images/ ./data/sounds/ ./data/fonts/ -maxdepth 1 -type f \( ! -printf "%f\n" \) | sort -f) +do + files[count]=$i + count=$((count+1)) +done + +fi + +if [ "$count_old" != "$count" ] || [ ! -f $outFile ] +then + +echo "Generating filelist.h for $count files." >&2 +cat < $outFile +/**************************************************************************** + * Loadiine resource files. + * This file is generated automatically. + * Includes $count files. + * + * NOTE: + * Any manual modification of this file will be overwriten by the generation. + ****************************************************************************/ +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +typedef struct _RecourceFile +{ + const char *filename; + const unsigned char *DefaultFile; + const unsigned int &DefaultFileSize; + unsigned char *CustomFile; + unsigned int CustomFileSize; +} RecourceFile; + +EOF + +for i in ${files[@]} +do + filename=${i%.*} + extension=${i##*.} + echo 'extern const unsigned char '$filename'_'$extension'[];' >> $outFile + echo 'extern const unsigned int '$filename'_'$extension'_size;' >> $outFile + echo '' >> $outFile +done + +echo 'static RecourceFile RecourceList[] =' >> $outFile +echo '{' >> $outFile + +for i in ${files[@]} +do + filename=${i%.*} + extension=${i##*.} + echo -e '\t{"'$i'", '$filename'_'$extension', '$filename'_'$extension'_size, NULL, 0},' >> $outFile +done + +echo -e '\t{NULL, NULL, 0, NULL, 0}' >> $outFile +echo '};' >> $outFile + +echo '' >> $outFile +echo '#endif' >> $outFile + +fi diff --git a/src/Application.cpp b/src/Application.cpp new file mode 100644 index 0000000..65ed9b0 --- /dev/null +++ b/src/Application.cpp @@ -0,0 +1,301 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#include +#include +#include +#include +#include +#include "Application.h" +#include "common/common.h" +#include +#include +#include +#include "resources/Resources.h" +#include +#include +#include "utils/logger.h" +#include "utils/AsyncExecutor.h" +#include + +#define HBL_TITLE_ID (0x0005000013374842) +#define MII_MAKER_JPN_TITLE_ID (0x000500101004A000) +#define MII_MAKER_USA_TITLE_ID (0x000500101004A100) +#define MII_MAKER_EUR_TITLE_ID (0x000500101004A200) + +Application *Application::applicationInstance = NULL; +bool Application::exitApplication = false; +bool Application::quitRequest = false; + +Application::Application() + : CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff, 0, 0x20000) + , bgMusic(NULL) + , video(NULL) + , mainWindow(NULL) + , fontSystem(NULL) + , exitCode(0) { + controller[0] = new VPadController(GuiTrigger::CHANNEL_1); + controller[1] = new WPadController(GuiTrigger::CHANNEL_2); + controller[2] = new WPadController(GuiTrigger::CHANNEL_3); + controller[3] = new WPadController(GuiTrigger::CHANNEL_4); + controller[4] = new WPadController(GuiTrigger::CHANNEL_5); + + //! create bgMusic + bgMusic = new GuiSound(Resources::GetFile("bgMusic.ogg"), Resources::GetFileSize("bgMusic.ogg")); + bgMusic->SetLoop(true); + bgMusic->Play(); + bgMusic->SetVolume(50); + + exitApplication = false; + + uint64_t titleID = OSGetTitleID(); + + // Homebrew Launcher does not like the standard ProcUI application loop, + // so instead we disable the home buttom menu and use the home button + // to trigger an exit. + if (titleID == HBL_TITLE_ID || + titleID == MII_MAKER_JPN_TITLE_ID || + titleID == MII_MAKER_USA_TITLE_ID || + titleID == MII_MAKER_EUR_TITLE_ID) { + // Important: OSEnableHomeButtonMenu must come before ProcUIInitEx. + OSEnableHomeButtonMenu(FALSE); + sFromHBL = TRUE; + } + + ProcUIInit(OSSavesDone_ReadyToRelease); +} + +Application::~Application() { + DEBUG_FUNCTION_LINE("Destroy music\n"); + delete bgMusic; + + DEBUG_FUNCTION_LINE("Destroy controller\n"); + + for(int32_t i = 0; i < 5; i++) + delete controller[i]; + + DEBUG_FUNCTION_LINE("Clear resources\n"); + Resources::Clear(); + + DEBUG_FUNCTION_LINE("Stop sound handler\n"); + SoundHandler::DestroyInstance(); + + DEBUG_FUNCTION_LINE("Clear AsyncExecutor\n"); + AsyncExecutor::destroyInstance(); + + ProcUIShutdown(); +} + +int32_t Application::exec() { + //! start main GX2 thread + resumeThread(); + //! now wait for thread to finish + shutdownThread(); + + return exitCode; +} + +void Application::quit(int32_t code) { + exitCode = code; + exitApplication = true; + quitRequest = true; +} + +void Application::fadeOut() { + GuiImage fadeOut(video->getTvWidth(), video->getTvHeight(), (GX2Color) { + 0, 0, 0, 255 + }); + + for(int32_t i = 0; i < 255; i += 10) { + if(i > 255) + i = 255; + + fadeOut.setAlpha(i / 255.0f); + + //! start rendering DRC + video->prepareDrcRendering(); + mainWindow->drawDrc(video); + + GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_ALWAYS); + fadeOut.draw(video); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); + + video->drcDrawDone(); + + //! start rendering TV + video->prepareTvRendering(); + + mainWindow->drawTv(video); + + GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_ALWAYS); + fadeOut.draw(video); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); + + video->tvDrawDone(); + + //! as last point update the effects as it can drop elements + mainWindow->updateEffects(); + + video->waitForVSync(); + } + + //! one last cleared black screen + video->prepareDrcRendering(); + video->drcDrawDone(); + video->prepareTvRendering(); + video->tvDrawDone(); + video->waitForVSync(); + video->tvEnable(false); + video->drcEnable(false); +} + +bool Application::procUI(void) { + bool executeProcess = false; + + switch(ProcUIProcessMessages(true)) { + case PROCUI_STATUS_EXITING: { + DEBUG_FUNCTION_LINE("PROCUI_STATUS_EXITING\n"); + exitCode = EXIT_SUCCESS; + exitApplication = true; + break; + } + case PROCUI_STATUS_RELEASE_FOREGROUND: { + DEBUG_FUNCTION_LINE("PROCUI_STATUS_RELEASE_FOREGROUND\n"); + if(video != NULL) { + // we can turn of the screen but we don't need to and it will display the last image + video->tvEnable(true); + video->drcEnable(true); + + DEBUG_FUNCTION_LINE("delete fontSystem\n"); + delete fontSystem; + fontSystem = NULL; + + DEBUG_FUNCTION_LINE("delete video\n"); + delete video; + video = NULL; + + DEBUG_FUNCTION_LINE("deinitialze memory\n"); + libgui_memoryRelease(); + ProcUIDrawDoneRelease(); + } else { + ProcUIDrawDoneRelease(); + } + break; + } + case PROCUI_STATUS_IN_FOREGROUND: { + if(!quitRequest) { + if(video == NULL) { + DEBUG_FUNCTION_LINE("PROCUI_STATUS_IN_FOREGROUND\n"); + DEBUG_FUNCTION_LINE("initialze memory\n"); + libgui_memoryInitialize(); + + DEBUG_FUNCTION_LINE("Initialize video\n"); + video = new CVideo(GX2_TV_SCAN_MODE_720P, GX2_DRC_RENDER_MODE_SINGLE); + DEBUG_FUNCTION_LINE("Video size %i x %i\n", video->getTvWidth(), video->getTvHeight()); + + //! setup default Font + DEBUG_FUNCTION_LINE("Initialize main font system\n"); + FreeTypeGX *fontSystem = new FreeTypeGX(Resources::GetFile("font.ttf"), Resources::GetFileSize("font.ttf"), true); + GuiText::setPresetFont(fontSystem); + + if(mainWindow == NULL) { + DEBUG_FUNCTION_LINE("Initialize main window\n"); + mainWindow = new MainWindow(video->getTvWidth(), video->getTvHeight()); + } + + } + executeProcess = true; + } + break; + } + case PROCUI_STATUS_IN_BACKGROUND: + default: + break; + } + + return executeProcess; +} + +void Application::executeThread(void) { + DEBUG_FUNCTION_LINE("Entering main loop\n"); + + //! main GX2 loop (60 Hz cycle with max priority on core 1) + while(!exitApplication) { + if(procUI() == false) { + continue; + } + + mainWindow->lockGUI(); + mainWindow->process(); + + //! Read out inputs + for(int32_t i = 0; i < 5; i++) { + if(controller[i]->update(video->getTvWidth(), video->getTvHeight()) == false) + continue; + + //! update controller states + mainWindow->update(controller[i]); + + if(controller[i]->data.buttons_d & VPAD_BUTTON_HOME) { + if (sFromHBL) { + SYSRelaunchTitle(0, NULL); + } + } + } + + //! start rendering DRC + video->prepareDrcRendering(); + mainWindow->drawDrc(video); + video->drcDrawDone(); + + //! start rendering TV + video->prepareTvRendering(); + mainWindow->drawTv(video); + video->tvDrawDone(); + + //! enable screen after first frame render + if(video->getFrameCount() == 0) { + video->tvEnable(true); + video->drcEnable(true); + } + + //! as last point update the effects as it can drop elements + mainWindow->updateEffects(); + mainWindow->unlockGUI(); + + video->waitForVSync(); + } + + //! in case we exit to a homebrew let's smoothly fade out + if(video) { + fadeOut(); + } + + DEBUG_FUNCTION_LINE("delete mainWindow\n"); + delete mainWindow; + mainWindow = NULL; + + DEBUG_FUNCTION_LINE("delete fontSystem\n"); + delete fontSystem; + fontSystem = NULL; + + DEBUG_FUNCTION_LINE("delete video\n"); + delete video; + video = NULL; + + DEBUG_FUNCTION_LINE("deinitialize memory\n"); + libgui_memoryRelease(); +} diff --git a/src/Application.h b/src/Application.h new file mode 100644 index 0000000..c1a5798 --- /dev/null +++ b/src/Application.h @@ -0,0 +1,79 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#ifndef _APPLICATION_H +#define _APPLICATION_H + +#include "menu/MainWindow.h" +#include +#include "system/CThread.h" + +// forward declaration +class FreeTypeGX; + +class Application : public CThread { +public: + static Application * instance() { + if(!applicationInstance) + applicationInstance = new Application(); + return applicationInstance; + } + static void destroyInstance() { + if(applicationInstance) { + delete applicationInstance; + applicationInstance = NULL; + } + } + + CVideo *getVideo(void) const { + return video; + } + MainWindow *getMainWindow(void) const { + return mainWindow; + } + + GuiSound *getBgMusic(void) const { + return bgMusic; + } + + int exec(void); + void fadeOut(void); + + void quit(int code); + +private: + Application(); + virtual ~Application(); + + bool procUI(void); + + static Application *applicationInstance; + static bool exitApplication; + static bool quitRequest; + + void executeThread(void); + + GuiSound *bgMusic; + CVideo *video; + MainWindow *mainWindow; + FreeTypeGX *fontSystem; + GuiController *controller[5]; + int exitCode; + BOOL sFromHBL = FALSE; + +}; + +#endif //_APPLICATION_H diff --git a/src/common/common.h b/src/common/common.h new file mode 100644 index 0000000..7cda38b --- /dev/null +++ b/src/common/common.h @@ -0,0 +1,15 @@ +#ifndef COMMON_H +#define COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define LAUNCHIINE_VERSION "v0.1" + +#ifdef __cplusplus +} +#endif + +#endif /* COMMON_H */ + diff --git a/src/entry.cpp b/src/entry.cpp new file mode 100644 index 0000000..7e019c2 --- /dev/null +++ b/src/entry.cpp @@ -0,0 +1,20 @@ +#include +#include +#include "utils/logger.h" +#include "common/common.h" +#include "Application.h" + +int32_t main(int32_t argc, char **argv) { + socket_lib_init(); + log_init(); + DEBUG_FUNCTION_LINE("Starting launchiine " LAUNCHIINE_VERSION "\n"); + + DEBUG_FUNCTION_LINE("Start main application\n"); + Application::instance()->exec(); + + DEBUG_FUNCTION_LINE("Main application stopped\n"); + Application::destroyInstance(); + + DEBUG_FUNCTION_LINE("Peace out...\n"); + return 0; +} diff --git a/src/fs/CFile.cpp b/src/fs/CFile.cpp new file mode 100644 index 0000000..c2a7ae6 --- /dev/null +++ b/src/fs/CFile.cpp @@ -0,0 +1,175 @@ + +#include +#include +#include +#include +#include + +CFile::CFile() { + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; +} + +CFile::CFile(const std::string & filepath, eOpenTypes mode) { + iFd = -1; + this->open(filepath, mode); +} + +CFile::CFile(const uint8_t * mem, int32_t size) { + iFd = -1; + this->open(mem, size); +} + +CFile::~CFile() { + this->close(); +} + +int32_t CFile::open(const std::string & filepath, eOpenTypes mode) { + this->close(); + int32_t openMode = 0; + + // This depend on the devoptab implementation. + // see https://github.com/devkitPro/wut/blob/master/libraries/wutdevoptab/devoptab_fs_open.c#L21 fpr reference + + switch(mode) { + default: + case ReadOnly: // file must exist + openMode = O_RDONLY; + break; + case WriteOnly: // file will be created / zerod + openMode = O_TRUNC | O_CREAT | O_WRONLY; + break; + case ReadWrite: // file must exist + openMode = O_RDWR; + break; + case Append: // append to file, file will be created if missing. write only + openMode = O_CREAT | O_APPEND | O_WRONLY; + break; + } + + //! Using fopen works only on the first launch as expected + //! on the second launch it causes issues because we don't overwrite + //! the .data sections which is needed for a normal application to re-init + //! this will be added with launching as RPX + iFd = ::open(filepath.c_str(), openMode); + if(iFd < 0) + return iFd; + + + filesize = ::lseek(iFd, 0, SEEK_END); + ::lseek(iFd, 0, SEEK_SET); + + return 0; +} + +int32_t CFile::open(const uint8_t * mem, int32_t size) { + this->close(); + + mem_file = mem; + filesize = size; + + return 0; +} + +void CFile::close() { + if(iFd >= 0) + ::close(iFd); + + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; +} + +int32_t CFile::read(uint8_t * ptr, size_t size) { + if(iFd >= 0) { + int32_t ret = ::read(iFd, ptr,size); + if(ret > 0) + pos += ret; + return ret; + } + + int32_t readsize = size; + + if(readsize > (int64_t) (filesize-pos)) + readsize = filesize-pos; + + if(readsize <= 0) + return readsize; + + if(mem_file != NULL) { + memcpy(ptr, mem_file+pos, readsize); + pos += readsize; + return readsize; + } + + return -1; +} + +int32_t CFile::write(const uint8_t * ptr, size_t size) { + if(iFd >= 0) { + size_t done = 0; + while(done < size) { + int32_t ret = ::write(iFd, ptr, size - done); + if(ret <= 0) + return ret; + + ptr += ret; + done += ret; + pos += ret; + } + return done; + } + + return -1; +} + +int32_t CFile::seek(long int offset, int32_t origin) { + int32_t ret = 0; + int64_t newPos = pos; + + if(origin == SEEK_SET) { + newPos = offset; + } else if(origin == SEEK_CUR) { + newPos += offset; + } else if(origin == SEEK_END) { + newPos = filesize+offset; + } + + if(newPos < 0) { + pos = 0; + } else { + pos = newPos; + } + + if(iFd >= 0) + ret = ::lseek(iFd, pos, SEEK_SET); + + if(mem_file != NULL) { + if(pos > filesize) { + pos = filesize; + } + } + + return ret; +} + +int32_t CFile::fwrite(const char *format, ...) { + char tmp[512]; + tmp[0] = 0; + int32_t result = -1; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + result = this->write((uint8_t *)tmp, strlen(tmp)); + } + va_end(va); + + + return result; +} + + diff --git a/src/fs/CFile.hpp b/src/fs/CFile.hpp new file mode 100644 index 0000000..8816a49 --- /dev/null +++ b/src/fs/CFile.hpp @@ -0,0 +1,61 @@ +#ifndef CFILE_HPP_ +#define CFILE_HPP_ + +#include +#include +#include +#include +#include +#include + +class CFile { +public: + enum eOpenTypes { + ReadOnly, + WriteOnly, + ReadWrite, + Append + }; + + CFile(); + CFile(const std::string & filepath, eOpenTypes mode); + CFile(const uint8_t * memory, int32_t memsize); + virtual ~CFile(); + + int32_t open(const std::string & filepath, eOpenTypes mode); + int32_t open(const uint8_t * memory, int32_t memsize); + + BOOL isOpen() const { + if(iFd >= 0) + return true; + + if(mem_file) + return true; + + return false; + } + + void close(); + + int32_t read(uint8_t * ptr, size_t size); + int32_t write(const uint8_t * ptr, size_t size); + int32_t fwrite(const char *format, ...); + int32_t seek(long int offset, int32_t origin); + uint64_t tell() { + return pos; + }; + uint64_t size() { + return filesize; + }; + void rewind() { + this->seek(0, SEEK_SET); + }; + +protected: + int32_t iFd; + const uint8_t * mem_file; + uint64_t filesize; + uint64_t pos; +}; + +#endif diff --git a/src/fs/DirList.cpp b/src/fs/DirList.cpp new file mode 100644 index 0000000..450d4b6 --- /dev/null +++ b/src/fs/DirList.cpp @@ -0,0 +1,218 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * 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. + * + * DirList Class + * for WiiXplorer 2010 + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +DirList::DirList() { + Flags = 0; + Filter = 0; + Depth = 0; +} + +DirList::DirList(const std::string & path, const char *filter, uint32_t flags, uint32_t maxDepth) { + this->LoadPath(path, filter, flags, maxDepth); + this->SortList(); +} + +DirList::~DirList() { + ClearList(); +} + +BOOL DirList::LoadPath(const std::string & folder, const char *filter, uint32_t flags, uint32_t maxDepth) { + if(folder.empty()) + return false; + + Flags = flags; + Filter = filter; + Depth = maxDepth; + + std::string folderpath(folder); + uint32_t length = folderpath.size(); + + //! clear path of double slashes + StringTools::RemoveDoubleSlashs(folderpath); + + //! remove last slash if exists + if(length > 0 && folderpath[length-1] == '/') + folderpath.erase(length-1); + + //! add root slash if missing + if(folderpath.find('/') == std::string::npos) { + folderpath += '/'; + } + + return InternalLoadPath(folderpath); +} + +BOOL DirList::InternalLoadPath(std::string &folderpath) { + if(folderpath.size() < 3) + return false; + + struct dirent *dirent = NULL; + DIR *dir = NULL; + + dir = opendir(folderpath.c_str()); + if (dir == NULL) + return false; + + while ((dirent = readdir(dir)) != 0) { + BOOL isDir = dirent->d_type & DT_DIR; + const char *filename = dirent->d_name; + + if(isDir) { + if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) + continue; + + if((Flags & CheckSubfolders) && (Depth > 0)) { + int32_t length = folderpath.size(); + if(length > 2 && folderpath[length-1] != '/') { + folderpath += '/'; + } + folderpath += filename; + + Depth--; + InternalLoadPath(folderpath); + folderpath.erase(length); + Depth++; + } + + if(!(Flags & Dirs)) + continue; + } else if(!(Flags & Files)) { + continue; + } + + if(Filter) { + char * fileext = strrchr(filename, '.'); + if(!fileext) + continue; + + if(StringTools::strtokcmp(fileext, Filter, ",") == 0) + AddEntrie(folderpath, filename, isDir); + } else { + AddEntrie(folderpath, filename, isDir); + } + } + closedir(dir); + + return true; +} + +void DirList::AddEntrie(const std::string &filepath, const char * filename, BOOL isDir) { + if(!filename) + return; + + int32_t pos = FileInfo.size(); + + FileInfo.resize(pos+1); + + FileInfo[pos].FilePath = (char *) malloc(filepath.size()+strlen(filename)+2); + if(!FileInfo[pos].FilePath) { + FileInfo.resize(pos); + return; + } + + sprintf(FileInfo[pos].FilePath, "%s/%s", filepath.c_str(), filename); + FileInfo[pos].isDir = isDir; +} + +void DirList::ClearList() { + for(uint32_t i = 0; i < FileInfo.size(); ++i) { + if(FileInfo[i].FilePath) { + free(FileInfo[i].FilePath); + FileInfo[i].FilePath = NULL; + } + } + + FileInfo.clear(); + std::vector().swap(FileInfo); +} + +const char * DirList::GetFilename(int32_t ind) const { + if (!valid(ind)) + return ""; + + return StringTools::FullpathToFilename(FileInfo[ind].FilePath); +} + +static BOOL SortCallback(const DirEntry & f1, const DirEntry & f2) { + if(f1.isDir && !(f2.isDir)) + return true; + if(!(f1.isDir) && f2.isDir) + return false; + + if(f1.FilePath && !f2.FilePath) + return true; + if(!f1.FilePath) + return false; + + if(strcasecmp(f1.FilePath, f2.FilePath) > 0) + return false; + + return true; +} + +void DirList::SortList() { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); +} + +void DirList::SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)) { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortFunc); +} + +uint64_t DirList::GetFilesize(int32_t index) const { + struct stat st; + const char *path = GetFilepath(index); + + if(!path || stat(path, &st) != 0) + return 0; + + return st.st_size; +} + +int32_t DirList::GetFileIndex(const char *filename) const { + if(!filename) + return -1; + + for (uint32_t i = 0; i < FileInfo.size(); ++i) { + if (strcasecmp(GetFilename(i), filename) == 0) + return i; + } + + return -1; +} diff --git a/src/fs/DirList.h b/src/fs/DirList.h new file mode 100644 index 0000000..b9559aa --- /dev/null +++ b/src/fs/DirList.h @@ -0,0 +1,106 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * 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. + * + * DirList Class + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef ___DIRLIST_H_ +#define ___DIRLIST_H_ + +#include +#include +#include + +typedef struct { + char * FilePath; + BOOL isDir; +} DirEntry; + +class DirList { +public: + //!Constructor + DirList(void); + //!\param path Path from where to load the filelist of all files + //!\param filter A fileext that needs to be filtered + //!\param flags search/filter flags from the enum + DirList(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //!Destructor + virtual ~DirList(); + //! Load all the files from a directory + BOOL LoadPath(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //! Get a filename of the list + //!\param list index + const char * GetFilename(int32_t index) const; + //! Get the a filepath of the list + //!\param list index + const char *GetFilepath(int32_t index) const { + if (!valid(index)) + return ""; + else + return FileInfo[index].FilePath; + } + //! Get the a filesize of the list + //!\param list index + uint64_t GetFilesize(int32_t index) const; + //! Is index a dir or a file + //!\param list index + BOOL IsDir(int32_t index) const { + if(!valid(index)) + return false; + return FileInfo[index].isDir; + }; + //! Get the filecount of the whole list + int32_t GetFilecount() const { + return FileInfo.size(); + }; + //! Sort list by filepath + void SortList(); + //! Custom sort command for custom sort functions definitions + void SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)); + //! Get the index of the specified filename + int32_t GetFileIndex(const char *filename) const; + //! Enum for search/filter flags + enum { + Files = 0x01, + Dirs = 0x02, + CheckSubfolders = 0x08, + }; +protected: + // Internal parser + BOOL InternalLoadPath(std::string &path); + //!Add a list entrie + void AddEntrie(const std::string &filepath, const char * filename, BOOL isDir); + //! Clear the list + void ClearList(); + //! Check if valid pos is requested + inline BOOL valid(uint32_t pos) const { + return (pos < FileInfo.size()); + }; + + uint32_t Flags; + uint32_t Depth; + const char *Filter; + std::vector FileInfo; +}; + +#endif diff --git a/src/fs/FSUtils.cpp b/src/fs/FSUtils.cpp new file mode 100644 index 0000000..5a0579f --- /dev/null +++ b/src/fs/FSUtils.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include "fs/FSUtils.h" +#include "fs/CFile.hpp" +#include "utils/logger.h" + +int32_t FSUtils::LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size) { + //! always initialze input + *inbuffer = NULL; + if(size) + *size = 0; + + int32_t iFd = open(filepath, O_RDONLY); + if (iFd < 0) + return -1; + + uint32_t filesize = lseek(iFd, 0, SEEK_END); + lseek(iFd, 0, SEEK_SET); + + uint8_t *buffer = (uint8_t *) malloc(filesize); + if (buffer == NULL) { + close(iFd); + return -2; + } + + uint32_t blocksize = 0x4000; + uint32_t done = 0; + int32_t readBytes = 0; + + while(done < filesize) { + if(done + blocksize > filesize) { + blocksize = filesize - done; + } + readBytes = read(iFd, buffer + done, blocksize); + if(readBytes <= 0) + break; + done += readBytes; + } + + close(iFd); + + if (done != filesize) { + free(buffer); + buffer = NULL; + return -3; + } + + *inbuffer = buffer; + + //! sign is optional input + if(size) { + *size = filesize; + } + + return filesize; +} + +int32_t FSUtils::CheckFile(const char * filepath) { + if(!filepath) + return 0; + + struct stat filestat; + + char dirnoslash[strlen(filepath)+2]; + snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); + + while(dirnoslash[strlen(dirnoslash)-1] == '/') + dirnoslash[strlen(dirnoslash)-1] = '\0'; + + char * notRoot = strrchr(dirnoslash, '/'); + if(!notRoot) { + strcat(dirnoslash, "/"); + } + + if (stat(dirnoslash, &filestat) == 0) + return 1; + + return 0; +} + +int32_t FSUtils::CreateSubfolder(const char * fullpath) { + if(!fullpath) + return 0; + + int32_t result = 0; + + char dirnoslash[strlen(fullpath)+1]; + strcpy(dirnoslash, fullpath); + + int32_t pos = strlen(dirnoslash)-1; + while(dirnoslash[pos] == '/') { + dirnoslash[pos] = '\0'; + pos--; + } + + if(CheckFile(dirnoslash)) { + return 1; + } else { + char parentpath[strlen(dirnoslash)+2]; + strcpy(parentpath, dirnoslash); + char * ptr = strrchr(parentpath, '/'); + + if(!ptr) { + //!Device root directory (must be with '/') + strcat(parentpath, "/"); + struct stat filestat; + if (stat(parentpath, &filestat) == 0) + return 1; + + return 0; + } + + ptr++; + ptr[0] = '\0'; + + result = CreateSubfolder(parentpath); + } + + if(!result) + return 0; + + if (mkdir(dirnoslash, 0777) == -1) { + return 0; + } + + return 1; +} + +int32_t FSUtils::saveBufferToFile(const char * path, void * buffer, uint32_t size) { + CFile file(path, CFile::WriteOnly); + if (!file.isOpen()) { + DEBUG_FUNCTION_LINE("Failed to open %s\n",path); + return 0; + } + int32_t written = file.write((const uint8_t*) buffer, size); + file.close(); + return written; +} + diff --git a/src/fs/FSUtils.h b/src/fs/FSUtils.h new file mode 100644 index 0000000..9ee748a --- /dev/null +++ b/src/fs/FSUtils.h @@ -0,0 +1,16 @@ +#ifndef __FS_UTILS_H_ +#define __FS_UTILS_H_ + +#include + +class FSUtils { +public: + static int32_t LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size); + + //! todo: C++ class + static int32_t CreateSubfolder(const char * fullpath); + static int32_t CheckFile(const char * filepath); + static int32_t saveBufferToFile(const char * path, void * buffer, uint32_t size); +}; + +#endif // __FS_UTILS_H_ diff --git a/src/gui/GuiIconGrid.cpp b/src/gui/GuiIconGrid.cpp new file mode 100644 index 0000000..116d638 --- /dev/null +++ b/src/gui/GuiIconGrid.cpp @@ -0,0 +1,53 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#include +#include +#include "common/common.h" +#include "Application.h" +#include + +GuiIconGrid::GuiIconGrid(int32_t w, int32_t h, int32_t GameIndex) + : GuiTitleBrowser(w, h, GameIndex), + particleBgImage(w, h, 50, 60.0f, 90.0f, 0.6f, 1.0f) { + append(&particleBgImage); + +} + +GuiIconGrid::~GuiIconGrid() { + +} + +void GuiIconGrid::setSelectedGame(int32_t idx) { + this->selectedGame = idx; +} + +int32_t GuiIconGrid::getSelectedGame(void) { + return selectedGame; +} + + +void GuiIconGrid::process() { + GuiFrame::process(); +} + +void GuiIconGrid::update(GuiController * c) { + GuiFrame::update(c); +} + +void GuiIconGrid::draw(CVideo *pVideo) { + GuiFrame::draw(pVideo); +} diff --git a/src/gui/GuiIconGrid.h b/src/gui/GuiIconGrid.h new file mode 100644 index 0000000..4335980 --- /dev/null +++ b/src/gui/GuiIconGrid.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#pragma once + +#include +#include "gui/GuiTitleBrowser.h" +#include + +class GuiIconGrid : public GuiTitleBrowser, public sigslot::has_slots<> { +public: + GuiIconGrid(int32_t w, int32_t h, int32_t GameIndex); + virtual ~GuiIconGrid(); + + void setSelectedGame(int32_t idx); + int32_t getSelectedGame(void); + + void update(GuiController * t); + void draw(CVideo *pVideo); + void process(); +private: + static const int32_t MAX_ROWS = 3; + static const int32_t MAX_COLS = 5; + + GuiSound *buttonClickSound; + + int32_t selectedGame = 0; + + GuiParticleImage particleBgImage; +}; diff --git a/src/gui/GuiTitleBrowser.h b/src/gui/GuiTitleBrowser.h new file mode 100644 index 0000000..8866340 --- /dev/null +++ b/src/gui/GuiTitleBrowser.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +class GuiTitleBrowser : public GuiFrame { +public: + GuiTitleBrowser(int32_t w, int32_t h, int32_t GameIndex) : GuiFrame(w, h) {} + virtual ~GuiTitleBrowser() {} + + virtual void setSelectedGame(int32_t idx) = 0; + virtual int32_t getSelectedGame(void) = 0; + + sigslot::signal2 gameLaunchClicked; + sigslot::signal2 gameSelectionChanged; +}; diff --git a/src/menu/MainDrcButtonsFrame.h b/src/menu/MainDrcButtonsFrame.h new file mode 100644 index 0000000..684af2b --- /dev/null +++ b/src/menu/MainDrcButtonsFrame.h @@ -0,0 +1,111 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#ifndef _MAIN_DRC_BUTTONS_FRAME_H_ +#define _MAIN_DRC_BUTTONS_FRAME_H_ + +#include "gui/Gui.h" +#include "resources/Resources.h" + +class MainDrcButtonsFrame : public GuiFrame, public sigslot::has_slots<> +{ +public: + MainDrcButtonsFrame(int32_t w, int32_t h) + : GuiFrame(w, h) + , buttonClickSound(Resources::GetSound("settings_click_2.mp3")) + , screenSwitchSound(Resources::GetSound("screenSwitchSound.mp3")) + , switchIconData(Resources::GetImageData("layoutSwitchButton.png")) + , settingsIconData(Resources::GetImageData("settingsButton.png")) + , switchIcon(switchIconData) + , settingsIcon(settingsIconData) + , switchLayoutButton(switchIcon.getWidth(), switchIcon.getHeight()) + , settingsButton(settingsIcon.getWidth(), settingsIcon.getHeight()) + , gameImageDownloadButton(w, h) + , touchTrigger(GuiTrigger::CHANNEL_1, GuiTrigger::VPAD_TOUCH) + , wpadTouchTrigger(GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5, GuiTrigger::BUTTON_A) + , settingsTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_ZL, true) + , switchLayoutTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_ZR, true) + , plusTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_PLUS, true) + { + settingsButton.setClickable(true); + settingsButton.setImage(&settingsIcon); + settingsButton.setTrigger(&touchTrigger); + settingsButton.setTrigger(&wpadTouchTrigger); + settingsButton.setTrigger(&settingsTrigger); + settingsButton.setAlignment(ALIGN_LEFT | ALIGN_BOTTOM); + settingsButton.setSoundClick(buttonClickSound); + settingsButton.setEffectGrow(); + settingsButton.clicked.connect(this, &MainDrcButtonsFrame::OnSettingsButtonClick); + append(&settingsButton); + + switchLayoutButton.setClickable(true); + switchLayoutButton.setImage(&switchIcon); + switchLayoutButton.setTrigger(&touchTrigger); + switchLayoutButton.setTrigger(&wpadTouchTrigger); + switchLayoutButton.setTrigger(&switchLayoutTrigger); + switchLayoutButton.setAlignment(ALIGN_RIGHT | ALIGN_BOTTOM); + switchLayoutButton.setSoundClick(screenSwitchSound); + switchLayoutButton.setEffectGrow(); + switchLayoutButton.clicked.connect(this, &MainDrcButtonsFrame::OnLayoutSwithClick); + append(&switchLayoutButton); + + gameImageDownloadButton.setClickable(true); + gameImageDownloadButton.setSoundClick(buttonClickSound); + gameImageDownloadButton.setTrigger(&plusTrigger); + gameImageDownloadButton.clicked.connect(this, &MainDrcButtonsFrame::OnGameImageDownloadButtonClicked); + append(&gameImageDownloadButton); + } + virtual ~MainDrcButtonsFrame() + { + Resources::RemoveImageData(switchIconData); + Resources::RemoveImageData(settingsIconData); + Resources::RemoveSound(buttonClickSound); + Resources::RemoveSound(screenSwitchSound); + } + + sigslot::signal1 settingsButtonClicked; + sigslot::signal1 layoutSwitchClicked; + sigslot::signal1 gameImageDownloadClicked; +private: + void OnSettingsButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *) { + settingsButtonClicked(this); + } + void OnLayoutSwithClick(GuiButton *button, const GuiController *controller, GuiTrigger *) { + layoutSwitchClicked(this); + } + void OnGameImageDownloadButtonClicked(GuiButton *button, const GuiController *controller, GuiTrigger *) { + gameImageDownloadClicked(this); + } + + GuiSound *buttonClickSound; + GuiSound *screenSwitchSound; + GuiImageData *switchIconData; + GuiImageData *settingsIconData; + GuiImage switchIcon; + GuiImage settingsIcon; + + GuiButton switchLayoutButton; + GuiButton settingsButton; + GuiButton gameImageDownloadButton; + + GuiTrigger touchTrigger; + GuiTrigger wpadTouchTrigger; + GuiTrigger settingsTrigger; + GuiTrigger switchLayoutTrigger; + GuiTrigger plusTrigger; +}; + +#endif //_SETTINGS_WINDOW_H_ diff --git a/src/menu/MainWindow.cpp b/src/menu/MainWindow.cpp new file mode 100644 index 0000000..22cf3d3 --- /dev/null +++ b/src/menu/MainWindow.cpp @@ -0,0 +1,243 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#include "MainWindow.h" +#include "Application.h" +#include "utils/logger.h" +#include "utils/StringTools.h" +#include "resources/Resources.h" +#include "gui/GuiTitleBrowser.h" +#include "gui/GuiIconGrid.h" +#include +#include +#include "utils/AsyncExecutor.h" + +MainWindow::MainWindow(int32_t w, int32_t h) + : width(w) + , height(h) + , gameClickSound(Resources::GetSound("game_click.mp3")) + , mainSwitchButtonFrame(NULL) + , currentTvFrame(NULL) + , currentDrcFrame(NULL) { + for(int32_t i = 0; i < 4; i++) { + std::string filename = StringTools::strfmt("player%i_point.png", i+1); + pointerImgData[i] = Resources::GetImageData(filename.c_str()); + pointerImg[i] = new GuiImage(pointerImgData[i]); + pointerImg[i]->setScale(1.5f); + pointerValid[i] = false; + } + SetupMainView(); +} + +MainWindow::~MainWindow() { + while(!tvElements.empty()) { + delete tvElements[0]; + remove(tvElements[0]); + } + while(!drcElements.empty()) { + delete drcElements[0]; + remove(drcElements[0]); + } + for(int32_t i = 0; i < 4; i++) { + delete pointerImg[i]; + Resources::RemoveImageData(pointerImgData[i]); + } + + Resources::RemoveSound(gameClickSound); +} + +void MainWindow::updateEffects() { + //! dont read behind the initial elements in case one was added + uint32_t tvSize = tvElements.size(); + uint32_t drcSize = drcElements.size(); + + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { + drcElements[i]->updateEffects(); + } + + //! only update TV elements that are not updated yet because they are on DRC + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { + uint32_t n; + for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) { + if(tvElements[i] == drcElements[n]) + break; + } + if(n == drcElements.size()) { + tvElements[i]->updateEffects(); + } + } +} + +void MainWindow::process() { + //! dont read behind the initial elements in case one was added + uint32_t tvSize = tvElements.size(); + uint32_t drcSize = drcElements.size(); + + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { + drcElements[i]->process(); + } + + //! only update TV elements that are not updated yet because they are on DRC + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { + uint32_t n; + for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) { + if(tvElements[i] == drcElements[n]) + break; + } + if(n == drcElements.size()) { + tvElements[i]->process(); + } + } +} + +void MainWindow::update(GuiController *controller) { + //! dont read behind the initial elements in case one was added + //uint32_t tvSize = tvElements.size(); + + if(controller->chan & GuiTrigger::CHANNEL_1) { + uint32_t drcSize = drcElements.size(); + + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { + drcElements[i]->update(controller); + } + } else { + uint32_t tvSize = tvElements.size(); + + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { + tvElements[i]->update(controller); + } + } + +// //! only update TV elements that are not updated yet because they are on DRC +// for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) +// { +// uint32_t n; +// for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) +// { +// if(tvElements[i] == drcElements[n]) +// break; +// } +// if(n == drcElements.size()) +// { +// tvElements[i]->update(controller); +// } +// } + + if(controller->chanIdx >= 1 && controller->chanIdx <= 4 && controller->data.validPointer) { + int32_t wpadIdx = controller->chanIdx - 1; + float posX = controller->data.x; + float posY = controller->data.y; + pointerImg[wpadIdx]->setPosition(posX, posY); + pointerImg[wpadIdx]->setAngle(controller->data.pointerAngle); + pointerValid[wpadIdx] = true; + } +} + +void MainWindow::drawDrc(CVideo *video) { + for(uint32_t i = 0; i < drcElements.size(); ++i) { + drcElements[i]->draw(video); + } + + for(int32_t i = 0; i < 4; i++) { + if(pointerValid[i]) { + pointerImg[i]->setAlpha(0.5f); + pointerImg[i]->draw(video); + pointerImg[i]->setAlpha(1.0f); + } + } +} + +void MainWindow::drawTv(CVideo *video) { + for(uint32_t i = 0; i < tvElements.size(); ++i) { + tvElements[i]->draw(video); + } + + for(int32_t i = 0; i < 4; i++) { + if(pointerValid[i]) { + pointerImg[i]->draw(video); + pointerValid[i] = false; + } + } +} + +void MainWindow::SetupMainView() { + currentTvFrame = new GuiIconGrid(width, height,0); + + currentTvFrame->setEffect(EFFECT_FADE, 10, 255); + currentTvFrame->setState(GuiElement::STATE_DISABLED); + currentTvFrame->effectFinished.connect(this, &MainWindow::OnOpenEffectFinish); + appendTv(currentTvFrame); + + currentDrcFrame = currentTvFrame; + + + if(currentTvFrame != currentDrcFrame) { + currentDrcFrame->setEffect(EFFECT_FADE, 10, 255); + currentDrcFrame->setState(GuiElement::STATE_DISABLED); + currentDrcFrame->effectFinished.connect(this, &MainWindow::OnOpenEffectFinish); + } + + //! reconnect only to DRC game selection change + currentTvFrame->gameSelectionChanged.disconnect(this); + currentDrcFrame->gameSelectionChanged.disconnect(this); + currentTvFrame->gameLaunchClicked.disconnect(this); + currentDrcFrame->gameLaunchClicked.disconnect(this); + + + if(currentTvFrame != currentDrcFrame) { + currentTvFrame->gameSelectionChanged.connect(this, &MainWindow::OnGameSelectionChange); + currentTvFrame->gameLaunchClicked.connect(this, &MainWindow::OnGameLaunch); + } + + currentDrcFrame->gameSelectionChanged.connect(this, &MainWindow::OnGameSelectionChange); + currentDrcFrame->gameLaunchClicked.connect(this, &MainWindow::OnGameLaunch); + + mainSwitchButtonFrame = new MainDrcButtonsFrame(width, height); + mainSwitchButtonFrame->setState(GuiElement::STATE_DISABLED); + mainSwitchButtonFrame->setEffect(EFFECT_FADE, 10, 255); + mainSwitchButtonFrame->setState(GuiElement::STATE_DISABLED); + mainSwitchButtonFrame->effectFinished.connect(this, &MainWindow::OnOpenEffectFinish); + + appendDrc(currentDrcFrame); + append(mainSwitchButtonFrame); +} + +void MainWindow::OnOpenEffectFinish(GuiElement *element) { + //! once the menu is open reset its state and allow it to be "clicked/hold" + element->effectFinished.disconnect(this); + element->clearState(GuiElement::STATE_DISABLED); +} + +void MainWindow::OnCloseEffectFinish(GuiElement *element) { + //! remove element from draw list and push to delete queue + remove(element); + AsyncExecutor::pushForDelete(element); +} + +void MainWindow::OnGameSelectionChange(GuiTitleBrowser *element, int32_t selectedIdx) { + if(!currentDrcFrame || !currentTvFrame) + return; + + if(element == currentDrcFrame && currentDrcFrame != currentTvFrame) { + currentTvFrame->setSelectedGame(selectedIdx); + } else if(element == currentTvFrame && currentDrcFrame != currentTvFrame) { + currentDrcFrame->setSelectedGame(selectedIdx); + } +} + +void MainWindow::OnGameLaunch(GuiTitleBrowser *element, int32_t selectedIdx) { + +} diff --git a/src/menu/MainWindow.h b/src/menu/MainWindow.h new file mode 100644 index 0000000..f0a6f25 --- /dev/null +++ b/src/menu/MainWindow.h @@ -0,0 +1,140 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#ifndef _MAIN_WINDOW_H_ +#define _MAIN_WINDOW_H_ + +#include +#include +#include +#include "system/CMutex.h" +#include "gui/GuiTitleBrowser.h" +#include "MainDrcButtonsFrame.h" + +class CVideo; + +class MainWindow : public sigslot::has_slots<> { +public: + MainWindow(int32_t w, int32_t h); + virtual ~MainWindow(); + + void appendTv(GuiElement *e) { + if(!e) + return; + + removeTv(e); + tvElements.push_back(e); + } + void appendDrc(GuiElement *e) { + if(!e) + return; + + removeDrc(e); + drcElements.push_back(e); + } + + void append(GuiElement *e) { + appendTv(e); + appendDrc(e); + } + + void insertTv(uint32_t pos, GuiElement *e) { + if(!e) + return; + + removeTv(e); + tvElements.insert(tvElements.begin() + pos, e); + } + void insertDrc(uint32_t pos, GuiElement *e) { + if(!e) + return; + + removeDrc(e); + drcElements.insert(drcElements.begin() + pos, e); + } + + void insert(uint32_t pos, GuiElement *e) { + insertTv(pos, e); + insertDrc(pos, e); + } + + void removeTv(GuiElement *e) { + for(uint32_t i = 0; i < tvElements.size(); ++i) { + if(e == tvElements[i]) { + tvElements.erase(tvElements.begin() + i); + break; + } + } + } + void removeDrc(GuiElement *e) { + for(uint32_t i = 0; i < drcElements.size(); ++i) { + if(e == drcElements[i]) { + drcElements.erase(drcElements.begin() + i); + break; + } + } + } + + void remove(GuiElement *e) { + removeTv(e); + removeDrc(e); + } + void removeAll() { + tvElements.clear(); + drcElements.clear(); + } + + void drawDrc(CVideo *video); + void drawTv(CVideo *video); + void update(GuiController *controller); + void updateEffects(); + void process(); + + void lockGUI() { + guiMutex.lock(); + } + void unlockGUI() { + guiMutex.unlock(); + } + +private: + void SetupMainView(void); + + void OnOpenEffectFinish(GuiElement *element); + void OnCloseEffectFinish(GuiElement *element); + + void OnGameLaunch(GuiTitleBrowser *element, int32_t gameIdx); + void OnGameSelectionChange(GuiTitleBrowser *element, int32_t selectedIdx); + + int32_t width, height; + std::vector drcElements; + std::vector tvElements; + + GuiSound *gameClickSound; + + MainDrcButtonsFrame *mainSwitchButtonFrame; + + GuiTitleBrowser * currentTvFrame; + GuiTitleBrowser * currentDrcFrame; + + GuiImageData *pointerImgData[4]; + GuiImage *pointerImg[4]; + bool pointerValid[4]; + + CMutex guiMutex; +}; + +#endif //_MAIN_WINDOW_H_ diff --git a/src/resources/Resources.cpp b/src/resources/Resources.cpp new file mode 100644 index 0000000..fe703b7 --- /dev/null +++ b/src/resources/Resources.cpp @@ -0,0 +1,168 @@ +#include +#include +#include "Resources.h" +#include "filelist.h" +#include +#include +#include "fs/FSUtils.h" +#include "utils/AsyncExecutor.h" + +#include +#include +#include +#include + + +Resources * Resources::instance = NULL; + +void Resources::Clear() { + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + if(RecourceList[i].CustomFile) { + free(RecourceList[i].CustomFile); + RecourceList[i].CustomFile = NULL; + } + + if(RecourceList[i].CustomFileSize != 0) + RecourceList[i].CustomFileSize = 0; + } + + if(instance) + delete instance; + + instance = NULL; +} + +bool Resources::LoadFiles(const char * path) { + if(!path) + return false; + + bool result = false; + Clear(); + + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + std::string fullpath(path); + fullpath += "/"; + fullpath += RecourceList[i].filename; + + uint8_t * buffer = NULL; + uint32_t filesize = 0; + + FSUtils::LoadFileToMem(fullpath.c_str(), &buffer, &filesize); + + RecourceList[i].CustomFile = buffer; + RecourceList[i].CustomFileSize = (uint32_t) filesize; + result |= (buffer != 0); + } + + return result; +} + +const uint8_t * Resources::GetFile(const char * filename) { + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + if(strcasecmp(filename, RecourceList[i].filename) == 0) { + return (RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile); + } + } + + return NULL; +} + +uint32_t Resources::GetFileSize(const char * filename) { + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + if(strcasecmp(filename, RecourceList[i].filename) == 0) { + return (RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize); + } + } + return 0; +} + +GuiImageData * Resources::GetImageData(const char * filename) { + if(!instance) + instance = new Resources; + + std::map >::iterator itr = instance->imageDataMap.find(std::string(filename)); + if(itr != instance->imageDataMap.end()) { + itr->second.first++; + return itr->second.second; + } + + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + if(strcasecmp(filename, RecourceList[i].filename) == 0) { + const uint8_t * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; + const uint32_t size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; + + if(buff == NULL) + return NULL; + + GuiImageData * image = new GuiImageData(buff, size); + instance->imageDataMap[std::string(filename)].first = 1; + instance->imageDataMap[std::string(filename)].second = image; + + return image; + } + } + + return NULL; +} + +void Resources::RemoveImageData(GuiImageData * image) { + std::map >::iterator itr; + + for(itr = instance->imageDataMap.begin(); itr != instance->imageDataMap.end(); itr++) { + if(itr->second.second == image) { + itr->second.first--; + + if(itr->second.first == 0) { + AsyncExecutor::pushForDelete(itr->second.second); + + instance->imageDataMap.erase(itr); + } + break; + } + } +} + +GuiSound * Resources::GetSound(const char * filename) { + if(!instance) + instance = new Resources; + + std::map >::iterator itr = instance->soundDataMap.find(std::string(filename)); + if(itr != instance->soundDataMap.end()) { + itr->second.first++; + return itr->second.second; + } + + for(int32_t i = 0; RecourceList[i].filename != NULL; ++i) { + if(strcasecmp(filename, RecourceList[i].filename) == 0) { + const uint8_t * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; + const uint32_t size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; + + if(buff == NULL) + return NULL; + + GuiSound * sound = new GuiSound(buff, size); + instance->soundDataMap[std::string(filename)].first = 1; + instance->soundDataMap[std::string(filename)].second = sound; + + return sound; + } + } + + return NULL; +} + +void Resources::RemoveSound(GuiSound * sound) { + std::map >::iterator itr; + + for(itr = instance->soundDataMap.begin(); itr != instance->soundDataMap.end(); itr++) { + if(itr->second.second == sound) { + itr->second.first--; + + if(itr->second.first == 0) { + AsyncExecutor::pushForDelete(itr->second.second); + instance->soundDataMap.erase(itr); + } + break; + } + } +} diff --git a/src/resources/Resources.h b/src/resources/Resources.h new file mode 100644 index 0000000..e4f5158 --- /dev/null +++ b/src/resources/Resources.h @@ -0,0 +1,33 @@ +#ifndef RECOURCES_H_ +#define RECOURCES_H_ + +#include +#include + +//! forward declaration +class GuiImageData; +class GuiSound; + +class Resources { +public: + static void Clear(); + static bool LoadFiles(const char * path); + static const uint8_t * GetFile(const char * filename); + static uint32_t GetFileSize(const char * filename); + + static GuiImageData * GetImageData(const char * filename); + static void RemoveImageData(GuiImageData * image); + + static GuiSound * GetSound(const char * filename); + static void RemoveSound(GuiSound * sound); +private: + static Resources *instance; + + Resources() {} + ~Resources() {} + + std::map > imageDataMap; + std::map > soundDataMap; +}; + +#endif diff --git a/src/resources/filelist.h b/src/resources/filelist.h new file mode 100644 index 0000000..0f0f6dc --- /dev/null +++ b/src/resources/filelist.h @@ -0,0 +1,34 @@ +/**************************************************************************** + * Loadiine resource files. + * This file is generated automatically. + * Includes 2 files. + * + * NOTE: + * Any manual modification of this file will be overwriten by the generation. + ****************************************************************************/ +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +typedef struct _RecourceFile +{ + const char *filename; + const unsigned char *DefaultFile; + const unsigned int &DefaultFileSize; + unsigned char *CustomFile; + unsigned int CustomFileSize; +} RecourceFile; + +extern const unsigned char bgMusic_ogg[]; +extern const unsigned int bgMusic_ogg_size; + +extern const unsigned char font_ttf[]; +extern const unsigned int font_ttf_size; + +static RecourceFile RecourceList[] = +{ + {"bgMusic.ogg", bgMusic_ogg, bgMusic_ogg_size, NULL, 0}, + {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, + {NULL, NULL, 0, NULL, 0} +}; + +#endif diff --git a/src/system/CMutex.h b/src/system/CMutex.h new file mode 100644 index 0000000..b1ec2a7 --- /dev/null +++ b/src/system/CMutex.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#ifndef _CMUTEX_H_ +#define _CMUTEX_H_ + +#include +#include + +class CMutex { +public: + CMutex() { + pMutex = (OSMutex*) malloc(sizeof(OSMutex)); + if(!pMutex) + return; + + OSInitMutex(pMutex); + } + virtual ~CMutex() { + if(pMutex) + free(pMutex); + } + + void lock(void) { + if(pMutex) + OSLockMutex(pMutex); + } + void unlock(void) { + if(pMutex) + OSUnlockMutex(pMutex); + } + bool tryLock(void) { + if(!pMutex) + return false; + + return (OSTryLockMutex(pMutex) != 0); + } +private: + OSMutex *pMutex; +}; + +class CMutexLock { +public: + CMutexLock() { + mutex.lock(); + } + virtual ~CMutexLock() { + mutex.unlock(); + } +private: + CMutex mutex; +}; + +#endif // _CMUTEX_H_ diff --git a/src/system/CThread.h b/src/system/CThread.h new file mode 100644 index 0000000..4d5acc1 --- /dev/null +++ b/src/system/CThread.h @@ -0,0 +1,138 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * 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 3 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, see . + ****************************************************************************/ +#ifndef CTHREAD_H_ +#define CTHREAD_H_ + +#include +#include +#include + +class CThread { +public: + typedef void (* Callback)(CThread *thread, void *arg); + + //! constructor + CThread(int32_t iAttr, int32_t iPriority = 16, int32_t iStackSize = 0x8000, CThread::Callback callback = NULL, void *callbackArg = NULL) + : pThread(NULL) + , pThreadStack(NULL) + , pCallback(callback) + , pCallbackArg(callbackArg) { + //! save attribute assignment + iAttributes = iAttr; + //! allocate the thread + pThread = (OSThread*)memalign(8, sizeof(OSThread)); + //! allocate the stack + pThreadStack = (uint8_t *) memalign(0x20, iStackSize); + //! create the thread + if(pThread && pThreadStack) + OSCreateThread(pThread, &CThread::threadCallback, 1, (char*)this, pThreadStack+iStackSize, iStackSize, iPriority, iAttributes); + } + + //! destructor + virtual ~CThread() { + shutdownThread(); + } + + static CThread *create(CThread::Callback callback, void *callbackArg, int32_t iAttr = eAttributeNone, int32_t iPriority = 16, int32_t iStackSize = 0x8000) { + return ( new CThread(iAttr, iPriority, iStackSize, callback, callbackArg) ); + } + + //! Get thread ID + virtual void* getThread() const { + return pThread; + } + //! Thread entry function + virtual void executeThread(void) { + if(pCallback) + pCallback(this, pCallbackArg); + } + //! Suspend thread + virtual void suspendThread(void) { + if(isThreadSuspended()) + return; + if(pThread) + OSSuspendThread(pThread); + } + //! Resume thread + virtual void resumeThread(void) { + if(!isThreadSuspended()) + return; + if(pThread) + OSResumeThread(pThread); + } + //! Set thread priority + virtual void setThreadPriority(int32_t prio) { + if(pThread) + OSSetThreadPriority(pThread, prio); + } + //! Check if thread is suspended + virtual bool isThreadSuspended(void) const { + if(pThread) + return OSIsThreadSuspended(pThread); + return false; + } + //! Check if thread is terminated + virtual bool isThreadTerminated(void) const { + if(pThread) + return OSIsThreadTerminated(pThread); + return false; + } + //! Check if thread is running + virtual bool isThreadRunning(void) const { + return !isThreadSuspended() && !isThreadRunning(); + } + //! Shutdown thread + virtual void shutdownThread(void) { + //! wait for thread to finish + if(pThread && !(iAttributes & eAttributeDetach)) { + if(isThreadSuspended()) + resumeThread(); + + OSJoinThread(pThread, NULL); + } + //! free the thread stack buffer + if(pThreadStack) + free(pThreadStack); + if(pThread) + free(pThread); + + pThread = NULL; + pThreadStack = NULL; + } + //! Thread attributes + enum eCThreadAttributes { + eAttributeNone = 0x07, + eAttributeAffCore0 = 0x01, + eAttributeAffCore1 = 0x02, + eAttributeAffCore2 = 0x04, + eAttributeDetach = 0x08, + eAttributePinnedAff = 0x10 + }; +private: + static int32_t threadCallback(int32_t argc, const char **argv) { + //! After call to start() continue with the internal function + ((CThread *) argv)->executeThread(); + return 0; + } + int32_t iAttributes; + OSThread *pThread; + uint8_t *pThreadStack; + Callback pCallback; + void *pCallbackArg; +}; + +#endif diff --git a/src/utils/AsyncExecutor.cpp b/src/utils/AsyncExecutor.cpp new file mode 100644 index 0000000..2458ae5 --- /dev/null +++ b/src/utils/AsyncExecutor.cpp @@ -0,0 +1,15 @@ +#include "AsyncExecutor.h" +#include "utils/logger.h" + +AsyncExecutor * AsyncExecutor::instance = NULL; + +void AsyncExecutor::pushForDelete(GuiElement * ptr) { + execute([ptr] {delete ptr;}); +} + +void AsyncExecutor::execute(std::function func) { + if(!instance) { + instance = new AsyncExecutor(); + } + instance->elements.push_back(std::async(std::launch::async,func)); +} diff --git a/src/utils/AsyncExecutor.h b/src/utils/AsyncExecutor.h new file mode 100644 index 0000000..4b70be3 --- /dev/null +++ b/src/utils/AsyncExecutor.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +class AsyncExecutor { +public: + static void pushForDelete(GuiElement * element); + static void execute(std::function func); + + static void destroyInstance() { + if(instance) { + delete instance; + instance = NULL; + } + } + +private: + static AsyncExecutor *instance; + + AsyncExecutor() {} + ~AsyncExecutor() {} + + std::vector> elements; +}; diff --git a/src/utils/StringTools.cpp b/src/utils/StringTools.cpp new file mode 100644 index 0000000..4ed2ba0 --- /dev/null +++ b/src/utils/StringTools.cpp @@ -0,0 +1,211 @@ +/*************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * 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. + * + * for WiiXplorer 2010 + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +BOOL StringTools::EndsWith(const std::string& a, const std::string& b) { + if (b.size() > a.size()) + return false; + return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin()); +} + +const char * StringTools::byte_to_binary(int32_t x) { + static char b[9]; + b[0] = '\0'; + + int32_t z; + for (z = 128; z > 0; z >>= 1) { + strcat(b, ((x & z) == z) ? "1" : "0"); + } + + return b; +} + +std::string StringTools::removeCharFromString(std::string& input,char toBeRemoved) { + std::string output = input; + size_t position; + while(1) { + position = output.find(toBeRemoved); + if(position == std::string::npos) + break; + output.erase(position, 1); + } + return output; +} + +const char * StringTools::fmt(const char * format, ...) { + static char strChar[512]; + strChar[0] = 0; + + va_list va; + va_start(va, format); + if((vsprintf(strChar, format, va) >= 0)) { + va_end(va); + return (const char *) strChar; + } + va_end(va); + + return NULL; +} + +const wchar_t * StringTools::wfmt(const char * format, ...) { + static char tmp[512]; + static wchar_t strWChar[512]; + strWChar[0] = 0; + tmp[0] = 0; + + if(!format) + return (const wchar_t *) strWChar; + + if(strcmp(format, "") == 0) + return (const wchar_t *) strWChar; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + int32_t bt; + int32_t strlength = strlen(tmp); + bt = mbstowcs(strWChar, tmp, (strlength < 512) ? strlength : 512 ); + + if(bt > 0) { + strWChar[bt] = 0; + return (const wchar_t *) strWChar; + } + } + va_end(va); + + return NULL; +} + +int32_t StringTools::strprintf(std::string &str, const char * format, ...) { + static char tmp[512]; + tmp[0] = 0; + int32_t result = 0; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + str = tmp; + result = str.size(); + } + va_end(va); + + return result; +} + +std::string StringTools::strfmt(const char * format, ...) { + std::string str; + static char tmp[512]; + tmp[0] = 0; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + str = tmp; + } + va_end(va); + + return str; +} + +BOOL StringTools::char2wchar_t(const char * strChar, wchar_t * dest) { + if(!strChar || !dest) + return false; + + int32_t bt; + bt = mbstowcs(dest, strChar, strlen(strChar)); + if (bt > 0) { + dest[bt] = 0; + return true; + } + + return false; +} + +int32_t StringTools::strtokcmp(const char * string, const char * compare, const char * separator) { + if(!string || !compare) + return -1; + + char TokCopy[512]; + strncpy(TokCopy, compare, sizeof(TokCopy)); + TokCopy[511] = '\0'; + + char * strTok = strtok(TokCopy, separator); + + while (strTok != NULL) { + if (strcasecmp(string, strTok) == 0) { + return 0; + } + strTok = strtok(NULL,separator); + } + + return -1; +} + +int32_t StringTools::strextcmp(const char * string, const char * extension, char seperator) { + if(!string || !extension) + return -1; + + char *ptr = strrchr(string, seperator); + if(!ptr) + return -1; + + return strcasecmp(ptr + 1, extension); +} + + +std::vector StringTools::stringSplit(const std::string & inValue, const std::string & splitter) { + std::string value = inValue; + std::vector result; + while (true) { + uint32_t index = value.find(splitter); + if (index == std::string::npos) { + result.push_back(value); + break; + } + std::string first = value.substr(0, index); + result.push_back(first); + if (index + splitter.size() == value.length()) { + result.push_back(""); + break; + } + if(index + splitter.size() > value.length()) { + break; + } + value = value.substr(index + splitter.size(), value.length()); + } + return result; +} diff --git a/src/utils/StringTools.h b/src/utils/StringTools.h new file mode 100644 index 0000000..1f0e336 --- /dev/null +++ b/src/utils/StringTools.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * 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. + * + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef __STRING_TOOLS_H +#define __STRING_TOOLS_H + +#include +#include +#include + +class StringTools { +public: + static BOOL EndsWith(const std::string& a, const std::string& b); + static const char * byte_to_binary(int32_t x); + static std::string removeCharFromString(std::string& input,char toBeRemoved); + static const char * fmt(const char * format, ...); + static const wchar_t * wfmt(const char * format, ...); + static int32_t strprintf(std::string &str, const char * format, ...); + static std::string strfmt(const char * format, ...); + static BOOL char2wchar_t(const char * src, wchar_t * dest); + static int32_t strtokcmp(const char * string, const char * compare, const char * separator); + static int32_t strextcmp(const char * string, const char * extension, char seperator); + + static const char * FullpathToFilename(const char *path) { + if(!path) + return path; + + const char * ptr = path; + const char * Filename = ptr; + + while(*ptr != '\0') { + if(ptr[0] == '/' && ptr[1] != '\0') + Filename = ptr+1; + + ++ptr; + } + + return Filename; + } + + static void RemoveDoubleSlashs(std::string &str) { + uint32_t length = str.size(); + + //! clear path of double slashes + for(uint32_t i = 1; i < length; ++i) { + if(str[i-1] == '/' && str[i] == '/') { + str.erase(i, 1); + i--; + length--; + } + } + } + + static std::vector stringSplit(const std::string & value, const std::string & splitter); +}; + +#endif /* __STRING_TOOLS_H */ + diff --git a/src/utils/logger.c b/src/utils/logger.c new file mode 100644 index 0000000..c443edc --- /dev/null +++ b/src/utils/logger.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static int32_t log_socket __attribute__((section(".data")))= -1; +static struct sockaddr_in connect_addr __attribute__((section(".data"))); +static volatile int32_t log_lock __attribute__((section(".data"))) = 0; + +void log_init_() { + int32_t broadcastEnable = 1; + log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (log_socket < 0) + return; + + setsockopt(log_socket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); + + memset(&connect_addr, 0, sizeof(struct sockaddr_in)); + connect_addr.sin_family = AF_INET; + connect_addr.sin_port = 4405; + connect_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); +} + +void log_print_(const char *str) { + // socket is always 0 initially as it is in the BSS + if(log_socket < 0) { + return; + } + + while(log_lock) + OSSleepTicks(OSMicrosecondsToTicks(1000)); + log_lock = 1; + + int32_t len = strlen(str); + int32_t ret; + while (len > 0) { + int32_t block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet + ret = sendto(log_socket, str, block, 0, (struct sockaddr *)&connect_addr, sizeof(struct sockaddr_in)); + if(ret < 0) + break; + + len -= ret; + str += ret; + } + + log_lock = 0; +} + +void OSFatal_printf(const char *format, ...) { + char tmp[512]; + tmp[0] = 0; + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + OSFatal(tmp); + } + va_end(va); +} + +void log_printf_(const char *format, ...) { + if(log_socket < 0) { + return; + } + + char tmp[512]; + tmp[0] = 0; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + log_print_(tmp); + } + va_end(va); +} + diff --git a/src/utils/logger.h b/src/utils/logger.h new file mode 100644 index 0000000..d026b05 --- /dev/null +++ b/src/utils/logger.h @@ -0,0 +1,38 @@ +#ifndef __LOGGER_H_ +#define __LOGGER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void log_init_(); +//void log_deinit_(void); +void log_print_(const char *str); +void log_printf_(const char *format, ...); +void OSFatal_printf(const char *format, ...); + +#define __FILENAME_X__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILENAME_X__) + +#define OSFATAL_FUNCTION_LINE(FMT, ARGS...)do { \ + OSFatal_printf("[%s]%s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \ + } while (0) + + + +#define log_init() log_init_() +//#define log_deinit() log_deinit_() +#define log_print(str) log_print_(str) +#define log_printf(FMT, ARGS...) log_printf_(FMT, ## ARGS); + +#define DEBUG_FUNCTION_LINE(FMT, ARGS...)do { \ + log_printf("[%23s]%30s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \ + } while (0) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/utils/strings.c b/src/utils/strings.c new file mode 100644 index 0000000..4d88bd2 --- /dev/null +++ b/src/utils/strings.c @@ -0,0 +1,184 @@ +#include "strings.h" + +void* m_memcpy(void *dst, const void *src, uint32_t len) { + const unsigned char *src_ptr = (const unsigned char *)src; + unsigned char *dst_ptr = (unsigned char *)dst; + + while(len) { + *dst_ptr++ = *src_ptr++; + --len; + } + return dst; +} + +void* m_memset(void *dst, int32_t val, uint32_t bytes) { + unsigned char *dst_ptr = (unsigned char *)dst; + uint32_t i = 0; + while(i < bytes) { + dst_ptr[i] = val; + ++i; + } + return dst; +} + +int32_t m_memcmp(const void * ptr1, const void * ptr2, uint32_t num) { + const unsigned char *ptr1_cpy = (const unsigned char *)ptr1; + const unsigned char *ptr2_cpy = (const unsigned char *)ptr2; + + while(num) { + int32_t diff = (int32_t)*ptr1_cpy - (int32_t)*ptr2_cpy; + if(diff != 0) { + return diff; + } + ptr1_cpy++; + ptr2_cpy++; + --num; + } + return 0; +} + +int32_t m_strnlen(const char* str, uint32_t max_len) { + uint32_t i = 0; + while (str[i] && (i < max_len)) { + i++; + } + return i; +} + +int32_t m_strlen(const char* str) { + uint32_t i = 0; + while (str[i]) { + i++; + } + return i; +} + +int32_t m_strlcpy(char *s1, const char *s2, uint32_t max_size) { + if(!s1 || !s2 || !max_size) + return 0; + + uint32_t len = 0; + while(s2[len] && (len < (max_size-1))) { + s1[len] = s2[len]; + len++; + } + s1[len] = 0; + return len; +} + +int32_t m_strncpy(char *dst, const char *src, uint32_t max_size) { + return m_strlcpy(dst, src, max_size); // this is not correct, but mostly we need a terminating zero +} + + +int32_t m_strncasecmp(const char *s1, const char *s2, uint32_t max_len) { + if(!s1 || !s2) { + return -1; + } + + uint32_t len = 0; + while(*s1 && *s2 && len < max_len) { + int32_t diff = m_toupper(*s1) - m_toupper(*s2); + if(diff != 0) { + return diff; + } + + s1++; + s2++; + len++; + } + + if(len == max_len) { + return 0; + } + + int32_t diff = m_toupper(*s1) - m_toupper(*s2); + if(diff != 0) { + return diff; + } + return 0; +} + + +int32_t m_strncmp(const char *s1, const char *s2, uint32_t max_len) { + if(!s1 || !s2) { + return -1; + } + + uint32_t len = 0; + while(*s1 && *s2 && len < max_len) { + int32_t diff = *s1 - *s2; + if(diff != 0) { + return diff; + } + + s1++; + s2++; + len++; + } + + if(len == max_len) { + return 0; + } + + int32_t diff = *s1 - *s2; + if(diff != 0) { + return diff; + } + return 0; +} + + +const char *m_strcasestr(const char *str, const char *pattern) { + if(!str || !pattern) { + return 0; + } + + int32_t len = m_strnlen(pattern, 0x1000); + + while(*str) { + if(m_strncasecmp(str, pattern, len) == 0) { + return str; + } + str++; + } + return 0; +} + +long long m_strtoll(const char *str, char **end, int32_t base) { + long long value = 0; + int32_t sign = 1; + + // skip initial spaces only + while(*str == ' ') + str++; + + if(*str == '-') { + sign = -1; + str++; + } + + while(*str) { + if(base == 16 && m_toupper(*str) == 'X') { + str++; + continue; + } + + if(!(*str >= '0' && *str <= '9') && !(base == 16 && m_toupper(*str) >= 'A' && m_toupper(*str) <= 'F')) + break; + + value *= base; + + if(m_toupper(*str) >= 'A' && m_toupper(*str) <= 'F') + value += m_toupper(*str) - 'A' + 10; + else + value += *str - '0'; + + str++; + } + + if(end) + *end = (char*) str; + + return value * sign; +} diff --git a/src/utils/strings.h b/src/utils/strings.h new file mode 100644 index 0000000..c61b081 --- /dev/null +++ b/src/utils/strings.h @@ -0,0 +1,24 @@ +#ifndef __STRINGS_H_ +#define __STRINGS_H_ + +#include + +static inline int32_t m_toupper(int32_t c) { + return (c >= 'a' && c <= 'z') ? (c - 0x20) : c; +} + +void* m_memcpy(void *dst, const void *src, uint32_t len); +void* m_memset(void *dst, int32_t val, uint32_t len); +int32_t m_memcmp (const void * ptr1, const void * ptr2, uint32_t num); + +/* string functions */ +int32_t m_strncasecmp(const char *s1, const char *s2, uint32_t max_len); +int32_t m_strncmp(const char *s1, const char *s2, uint32_t max_len); +int32_t m_strncpy(char *dst, const char *src, uint32_t max_size); +int32_t m_strlcpy(char *s1, const char *s2, uint32_t max_size); +int32_t m_strnlen(const char* str, uint32_t max_size); +int32_t m_strlen(const char* str); +const char *m_strcasestr(const char *str, const char *pattern); +long long m_strtoll(const char *str, char **end, int32_t base); + +#endif // __STRINGS_H_ diff --git a/src/utils/utils.c b/src/utils/utils.c new file mode 100644 index 0000000..0042415 --- /dev/null +++ b/src/utils/utils.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include +#include + +// https://gist.github.com/ccbrown/9722406 +void dumpHex(const void* data, size_t size) { + char ascii[17]; + size_t i, j; + ascii[16] = '\0'; + DEBUG_FUNCTION_LINE("0x%08X (0x0000): ", data); + for (i = 0; i < size; ++i) { + log_printf("%02X ", ((unsigned char*)data)[i]); + if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') { + ascii[i % 16] = ((unsigned char*)data)[i]; + } else { + ascii[i % 16] = '.'; + } + if ((i+1) % 8 == 0 || i+1 == size) { + log_printf(" "); + if ((i+1) % 16 == 0) { + log_printf("| %s \n", ascii); + if(i + 1 < size) { + DEBUG_FUNCTION_LINE("0x%08X (0x%04X); ", data + i + 1,i+1); + } + } else if (i+1 == size) { + ascii[(i+1) % 16] = '\0'; + if ((i+1) % 16 <= 8) { + log_printf(" "); + } + for (j = (i+1) % 16; j < 16; ++j) { + log_printf(" "); + } + log_printf("| %s \n", ascii); + } + } + } +} diff --git a/src/utils/utils.h b/src/utils/utils.h new file mode 100644 index 0000000..26caaaf --- /dev/null +++ b/src/utils/utils.h @@ -0,0 +1,35 @@ +#ifndef __UTILS_H_ +#define __UTILS_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define LIMIT(x, min, max) \ + ({ \ + typeof( x ) _x = x; \ + typeof( min ) _min = min; \ + typeof( max ) _max = max; \ + ( ( ( _x ) < ( _min ) ) ? ( _min ) : ( ( _x ) > ( _max ) ) ? ( _max) : ( _x ) ); \ +}) + +#define DegToRad(a) ( (a) * 0.01745329252f ) +#define RadToDeg(a) ( (a) * 57.29577951f ) + +#define ALIGN4(x) (((x) + 3) & ~3) +#define ALIGN32(x) (((x) + 31) & ~31) + +#define le16(i) ((((uint16_t) ((i) & 0xFF)) << 8) | ((uint16_t) (((i) & 0xFF00) >> 8))) +#define le32(i) ((((uint32_t)le16((i) & 0xFFFF)) << 16) | ((uint32_t)le16(((i) & 0xFFFF0000) >> 16))) +#define le64(i) ((((uint64_t)le32((i) & 0xFFFFFFFFLL)) << 32) | ((uint64_t)le32(((i) & 0xFFFFFFFF00000000LL) >> 32))) + +//Needs to have log_init() called beforehand. +void dumpHex(const void* data, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif // __UTILS_H_