From b9ea9450f10aad0a3f5ec2df1ca2f7affc6b9e33 Mon Sep 17 00:00:00 2001 From: elasota Date: Sat, 24 Oct 2020 23:39:55 -0400 Subject: [PATCH] Add license browser, improve touchscreen UI --- ACKNOWLEDGMENTS.txt | 36 -- ApplicationResourcePatches/DITL/2000.json | 8 + ApplicationResourcePatches/DITL/2005.json | 181 +++++++ ApplicationResourcePatches/DITL/2006.json | 13 + ApplicationResourcePatches/LICS/1000.txt | 202 ++++++++ ApplicationResourcePatches/LICS/1001.txt | 339 ++++++++++++ ApplicationResourcePatches/LICS/1002.txt | 165 ++++++ ApplicationResourcePatches/LICS/1003.txt | 91 ++++ ApplicationResourcePatches/LICS/1004.txt | 107 ++++ ApplicationResourcePatches/LICS/1005.txt | 17 + ApplicationResourcePatches/LICS/1006.txt | 20 + ApplicationResourcePatches/manifest.json | 11 +- Documentation/license_ofl.txt | 94 ++++ Documentation/readme.txt | 25 +- GpApp/About.cpp | 397 +++++++++++++- GpApp/Android.mk | 1 + GpApp/Events.cpp | 15 +- GpApp/Externs.h | 1 + GpApp/GliderDefines.h | 2 +- GpApp/GliderProtos.h | 5 +- GpApp/GliderStructs.h | 3 +- GpApp/GpApp.vcxproj | 2 + GpApp/GpApp.vcxproj.filters | 6 + GpApp/InterfaceInit.cpp | 9 +- GpApp/Main.cpp | 5 + GpApp/MainMenuUI.cpp | 489 ++++++++++++++++++ GpApp/MainMenuUI.h | 10 + GpApp/MainWindow.cpp | 10 +- GpApp/Menu.cpp | 12 + GpApp/SourceExport.cpp | 3 +- PortabilityLayer/FontManager.cpp | 37 +- PortabilityLayer/FontManager.h | 2 + PortabilityLayer/MenuManager.cpp | 9 +- PortabilityLayer/PLCore.cpp | 3 + PortabilityLayer/PLQDraw.cpp | 18 + PortabilityLayer/PLQDraw.h | 2 + PortabilityLayer/PLResourceManager.cpp | 2 +- PortabilityLayer/WindowManager.cpp | 3 +- .../Fonts/GochiHand/GochiHand-Regular.ttf | Bin 0 -> 35908 bytes Resources/Fonts/GochiHand/OFL.txt | 94 ++++ Resources/Fonts/Roboto/LICENSE.txt | 202 ++++++++ Resources/Fonts/Roboto/RobotoMono-Regular.ttf | Bin 0 -> 86908 bytes 42 files changed, 2582 insertions(+), 69 deletions(-) delete mode 100644 ACKNOWLEDGMENTS.txt create mode 100644 ApplicationResourcePatches/DITL/2005.json create mode 100644 ApplicationResourcePatches/DITL/2006.json create mode 100644 ApplicationResourcePatches/LICS/1000.txt create mode 100644 ApplicationResourcePatches/LICS/1001.txt create mode 100644 ApplicationResourcePatches/LICS/1002.txt create mode 100644 ApplicationResourcePatches/LICS/1003.txt create mode 100644 ApplicationResourcePatches/LICS/1004.txt create mode 100644 ApplicationResourcePatches/LICS/1005.txt create mode 100644 ApplicationResourcePatches/LICS/1006.txt create mode 100644 Documentation/license_ofl.txt create mode 100644 GpApp/MainMenuUI.cpp create mode 100644 GpApp/MainMenuUI.h create mode 100644 Resources/Fonts/GochiHand/GochiHand-Regular.ttf create mode 100644 Resources/Fonts/GochiHand/OFL.txt create mode 100644 Resources/Fonts/Roboto/LICENSE.txt create mode 100644 Resources/Fonts/Roboto/RobotoMono-Regular.ttf diff --git a/ACKNOWLEDGMENTS.txt b/ACKNOWLEDGMENTS.txt deleted file mode 100644 index 15dffc9..0000000 --- a/ACKNOWLEDGMENTS.txt +++ /dev/null @@ -1,36 +0,0 @@ -Open Sans font: -(c)2011 Google -Distributed under the Apache License (see Resources/Fonts/OpenSans/LICENSE) - - -stb_image_write: -Created by Sean Barrett - - -MacRomanConversion uses a table from LIBICONV: -Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc. - -Distributed under the LGPLv2 license (See MacRomanConversion/LICENSE.txt) - - -RapidJSON: -Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. - -Distributed under the MIT license (See rapidjson/license.txt) - - -zlib: -(C) 1995-2017 Jean-loup Gailly and Mark Adler -Distributed under zlib license (See zlib/README) - - -The Unarchiver: -Copyright (C) 2006-2013 Dag Ă…gren - -Distributed under the LGPLv2 license (See unpacktool/LICENSE.txt) - - -MACE Audio decoder: -Copyright (c) 2002 Laszlo Torok - -Distributed under the LGPLv2 license (See macedec.cpp comments) diff --git a/ApplicationResourcePatches/DITL/2000.json b/ApplicationResourcePatches/DITL/2000.json index 34d2153..17357ac 100644 --- a/ApplicationResourcePatches/DITL/2000.json +++ b/ApplicationResourcePatches/DITL/2000.json @@ -8,6 +8,14 @@ "size" : [ 58, 20 ], "id" : 1, "enabled" : true + }, + { + "name" : "Third Party/Licensing Info...", + "itemType" : "Button", + "pos" : [ 176, 240 ], + "size" : [ 190, 20 ], + "id" : 1, + "enabled" : true } ] } \ No newline at end of file diff --git a/ApplicationResourcePatches/DITL/2005.json b/ApplicationResourcePatches/DITL/2005.json new file mode 100644 index 0000000..f3fa8ce --- /dev/null +++ b/ApplicationResourcePatches/DITL/2005.json @@ -0,0 +1,181 @@ +{ + "items" : + [ + { + "name" : "Okay", + "itemType" : "Button", + "pos" : [ 438, 292 ], + "size" : [ 58, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Export Source Code to ZIP Archive...", + "itemType" : "Button", + "pos" : [ 205, 292 ], + "size" : [ 226, 20 ], + "id" : 1, + "enabled" : false + }, + { + "name" : "Aerofoil (c)2019-2020 Eric Lasota", + "itemType" : "Label", + "pos" : [ 16, 21 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 16 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Based on Glider PRO (c)1994-2000 Casady & Greene, Inc., created by John Calhoun", + "itemType" : "Label", + "pos" : [ 16, 44 ], + "size" : [ 398, 28 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 44 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Open Sans font (c)2011 Google", + "itemType" : "Label", + "pos" : [ 16, 77 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 72 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Roboto Mono font (c)2011 Google", + "itemType" : "Label", + "pos" : [ 16, 101 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 96 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Gochi Hand font (c)2011 Juan Pablo del Peral", + "itemType" : "Label", + "pos" : [ 16, 125 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 120 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "LIBICONV (c)1999-2001, 2016 Free Software Foundation, Inc.", + "itemType" : "Label", + "pos" : [ 16, 149 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 144 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "RapidJSON (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.", + "itemType" : "Label", + "pos" : [ 16, 172 ], + "size" : [ 406, 28 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 172 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "zlib (c)1995-2017 Jean-loup Gailly and Mark Adler", + "itemType" : "Label", + "pos" : [ 16, 205 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 200 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "FreeType (c)2020 The FreeType Project", + "itemType" : "Label", + "pos" : [ 16, 229 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 224 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "Simple DirectMedia Layer (c)1997-2020 Sam Lantinga", + "itemType" : "Label", + "pos" : [ 16, 253 ], + "size" : [ 406, 20 ], + "id" : 1, + "enabled" : true + }, + { + "name" : "License...", + "itemType" : "Button", + "pos" : [ 430, 248 ], + "size" : [ 66, 20 ], + "id" : 1, + "enabled" : true + } + ] +} \ No newline at end of file diff --git a/ApplicationResourcePatches/DITL/2006.json b/ApplicationResourcePatches/DITL/2006.json new file mode 100644 index 0000000..ea5a322 --- /dev/null +++ b/ApplicationResourcePatches/DITL/2006.json @@ -0,0 +1,13 @@ +{ + "items" : + [ + { + "name" : "Okay", + "itemType" : "Button", + "pos" : [ 454, 360 ], + "size" : [ 58, 20 ], + "id" : 1, + "enabled" : true + } + ] +} \ No newline at end of file diff --git a/ApplicationResourcePatches/LICS/1000.txt b/ApplicationResourcePatches/LICS/1000.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1000.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ApplicationResourcePatches/LICS/1001.txt b/ApplicationResourcePatches/LICS/1001.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1001.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ApplicationResourcePatches/LICS/1002.txt b/ApplicationResourcePatches/LICS/1002.txt new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1002.txt @@ -0,0 +1,165 @@ + GNU LESSER 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. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/ApplicationResourcePatches/LICS/1003.txt b/ApplicationResourcePatches/LICS/1003.txt new file mode 100644 index 0000000..77b1731 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1003.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/ApplicationResourcePatches/LICS/1004.txt b/ApplicationResourcePatches/LICS/1004.txt new file mode 100644 index 0000000..24ab41c --- /dev/null +++ b/ApplicationResourcePatches/LICS/1004.txt @@ -0,0 +1,107 @@ +Tencent is pleased to support the open source community by making RapidJSON +available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All +rights reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please + note that the RapidJSON binary is licensed under the MIT License. +If you have downloaded a copy of the RapidJSON source code from Tencent, +please note that RapidJSON source code is licensed under the MIT License, +except for the third-party components listed below which are subject to +different license terms. Your integration of RapidJSON into your own +projects may require compliance with the MIT License, as well as the other +licenses applicable to the third-party components included within RapidJSON. +To avoid the problematic JSON license in your own projects, it's sufficient +to exclude the bin/jsonchecker/ directory, as it's the only code under the +JSON license. +A copy of the MIT License is included in this file. + +Other dependencies and licenses: + +Open Source Software Licensed Under the BSD License: +-------------------------------------------------------------------- + +The msinttypes r29 +Copyright (c) 2006-2013 Alexander Chemeris +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of copyright holder nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Open Source Software Licensed Under the JSON License: +-------------------------------------------------------------------- + +json.org +Copyright (c) 2002 JSON.org +All Rights Reserved. + +JSON_checker +Copyright (c) 2002 JSON.org +All Rights Reserved. + + +Terms of the JSON License: +--------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Terms of the MIT License: +-------------------------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ApplicationResourcePatches/LICS/1005.txt b/ApplicationResourcePatches/LICS/1005.txt new file mode 100644 index 0000000..6a19e00 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1005.txt @@ -0,0 +1,17 @@ + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + 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. \ No newline at end of file diff --git a/ApplicationResourcePatches/LICS/1006.txt b/ApplicationResourcePatches/LICS/1006.txt new file mode 100644 index 0000000..0e2bef3 --- /dev/null +++ b/ApplicationResourcePatches/LICS/1006.txt @@ -0,0 +1,20 @@ + +Simple DirectMedia Layer +Copyright (C) 1997-2020 Sam Lantinga + +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. + diff --git a/ApplicationResourcePatches/manifest.json b/ApplicationResourcePatches/manifest.json index 4047566..9bd1a17 100644 --- a/ApplicationResourcePatches/manifest.json +++ b/ApplicationResourcePatches/manifest.json @@ -7,6 +7,8 @@ "DITL/2002.json" : "ApplicationResourcePatches/DITL/2002.json", "DITL/2003.json" : "ApplicationResourcePatches/DITL/2003.json", "DITL/2004.json" : "ApplicationResourcePatches/DITL/2004.json", + "DITL/2005.json" : "ApplicationResourcePatches/DITL/2005.json", + "DITL/2006.json" : "ApplicationResourcePatches/DITL/2006.json", "PICT/1973.bmp" : "ApplicationResourcePatches/PICT/1973.bmp", "PICT/1974.bmp" : "ApplicationResourcePatches/PICT/1974.bmp", "PICT/1975.bmp" : "ApplicationResourcePatches/PICT/1975.bmp", @@ -21,7 +23,14 @@ "PICT/1984.bmp" : "ApplicationResourcePatches/PICT/1984.bmp", "PICT/1985.bmp" : "ApplicationResourcePatches/PICT/1985.bmp", "PICT/1986.bmp" : "ApplicationResourcePatches/PICT/1986.bmp", - "PICT/1987.bmp" : "ApplicationResourcePatches/PICT/1987.bmp" + "PICT/1987.bmp" : "ApplicationResourcePatches/PICT/1987.bmp", + "LICS/1000.txt" : "ApplicationResourcePatches/LICS/1000.txt", + "LICS/1001.txt" : "ApplicationResourcePatches/LICS/1001.txt", + "LICS/1002.txt" : "ApplicationResourcePatches/LICS/1002.txt", + "LICS/1003.txt" : "ApplicationResourcePatches/LICS/1003.txt", + "LICS/1004.txt" : "ApplicationResourcePatches/LICS/1004.txt", + "LICS/1005.txt" : "ApplicationResourcePatches/LICS/1005.txt", + "LICS/1006.txt" : "ApplicationResourcePatches/LICS/1006.txt" }, "delete" : [ diff --git a/Documentation/license_ofl.txt b/Documentation/license_ofl.txt new file mode 100644 index 0000000..ffb8605 --- /dev/null +++ b/Documentation/license_ofl.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011, Juan Pablo del Peral (juan@huertatipografica.com.ar), +with Reserved Font Names "Gochi" and "Gochi Hand" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Documentation/readme.txt b/Documentation/readme.txt index a42da84..090a922 100644 --- a/Documentation/readme.txt +++ b/Documentation/readme.txt @@ -16,10 +16,11 @@ IN-GAME SHORTCUT COMMANDS - Alt-Enter toggles full screen. -GAMEPAD SUPPORT +GAMEPAD SUPPORT (WINDOWS) ------------------------------------------------------------------------------- XInput gamepads are supported. Other gamepads may be supported via third-party -software that maps them to XInput (i.e. PS4 gamepads are supported via DS4Windows) +software that maps them to XInput (i.e. PS4 gamepads are supported via +DS4Windows) LEGAL NOTICES @@ -62,8 +63,8 @@ ADDITIONAL CREDITS * PICT resource 3975 (Ozma) is derived from an illustration by John R. Neill from [Ozma of Oz](https://www.gutenberg.org/files/33361/33361-h/33361-h.htm). * PICT resource 153 (About box) features a portion of - [this Little Nemo comic](http://www.comicstriplibrary.org/display/116) by Winsor - McCay. + [this Little Nemo comic](http://www.comicstriplibrary.org/display/116) + byWinsor McCay. Aerofoil uses the following third-party software: @@ -73,6 +74,16 @@ Open Sans font: Distributed under the Apache License (see license_apache.txt) +Roboto Mono font: +(c)2015 Google +Distributed under the Apache License (see license_apache.txt) + + +Gochi Hand font: +(c) 2011 Juan Pablo del Peral +Distributed under the Open Font License (see license_ofl.txt) + + stb_image_write: Created by Sean Barrett @@ -84,7 +95,8 @@ Distributed under the LGPLv2 license (See license_lgplv2.txt) RapidJSON: -Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All +rights reserved. Distributed under the MIT license (See license_rapidjson.txt) @@ -115,7 +127,8 @@ zlib: FreeType: -Portions of this software are copyright (c)2020 The FreeType Project (www.freetype.org). +Portions of this software are copyright (c)2020 The FreeType Project +(www.freetype.org). All rights reserved. Distributed under the GPLv2 license (see license_gplv2.txt) diff --git a/GpApp/About.cpp b/GpApp/About.cpp index bb968ab..41c7fa9 100644 --- a/GpApp/About.cpp +++ b/GpApp/About.cpp @@ -14,6 +14,7 @@ #include "PLResources.h" #include "PLSound.h" #include "PLPasStr.h" +#include "PLScrollBarWidget.h" #include "PLStandardColors.h" #include "PLSysCalls.h" #include "PLTimeTaggedVOSEvent.h" @@ -40,6 +41,9 @@ static void UnHiLiteOkayButton (DrawSurface *surface); static void UpdateMainPict (Dialog *); static int16_t AboutFilter(void *context, Dialog *, const TimeTaggedVOSEvent *evt); static int16_t AboutFrameworkFilter(void *context, Dialog *, const TimeTaggedVOSEvent *evt); +static int16_t LicenseReaderFilter(void *context, Dialog *, const TimeTaggedVOSEvent *evt); +static void DrawLicenseReader(Window *window); +void DoLicenseReader(int licenseResID); static Point okayButtLowerV, okayButtUpperV; @@ -47,6 +51,45 @@ static Rect okayButtonBounds, mainPICTBounds; static Boolean okayButtIsHiLit, clickedDownInOkay; +struct LicenseReaderLine +{ + PortabilityLayer::PascalStr<80> m_text; +}; + +static const unsigned int kLicenseReaderPointHistoryLength = 3; +static Boolean licenseReaderIsScrolling; +static Point licenseReaderPointHistory[kLicenseReaderPointHistoryLength]; + +static int32_t licenseReaderVelocity; +static unsigned int licenseReaderTextScroll; +static unsigned int licenseReaderTextScrollMax; +static unsigned int licenseReaderNumLines; +static THandle licenseReaderLines; +static const unsigned int kLicenseReaderTextSpacing = 10; +static const Rect licenseReaderTextRect = Rect::Create(16, 16, 344, 496); +static PortabilityLayer::ScrollBarWidget *licenseReaderScrollBarWidget; + +static void InitLicenseReader(unsigned int numLines) +{ + for (unsigned int i = 0; i < kLicenseReaderPointHistoryLength; i++) + licenseReaderPointHistory[i] = Point::Create(0, 0); + + licenseReaderIsScrolling = false; + + licenseReaderTextScroll = 0; + licenseReaderVelocity = 0; + licenseReaderTextScrollMax = numLines * kLicenseReaderTextSpacing; + if (licenseReaderTextScrollMax < licenseReaderTextRect.Height()) + licenseReaderTextScrollMax = 0; + else + licenseReaderTextScrollMax -= licenseReaderTextRect.Height(); + + licenseReaderNumLines = numLines; + licenseReaderScrollBarWidget = nullptr; +} + + + //============================================================== Functions //-------------------------------------------------------------- DoAbout // Brings up the About dialog box. @@ -98,9 +141,168 @@ void DoAbout (void) aboutDialog->Destroy(); } +void DoLicenseReader(int resID) +{ + static const int kLicenseReaderDialogTemplateID = 2006; + + THandle licenseTextHandle = PortabilityLayer::ResourceManager::GetInstance()->GetAppResource('LICS', resID).StaticCast(); + + if (!licenseTextHandle) + return; + + // Count lines + unsigned int numLines = 1; + const uint8_t *licenseText = *licenseTextHandle; + const size_t licenseTextLength = licenseTextHandle.MMBlock()->m_size; + + for (size_t i = 0; i < licenseTextLength; i++) + { + if (licenseText[i] == '\n') + numLines++; + } + + licenseReaderLines = NewHandle(sizeof(LicenseReaderLine) * numLines).StaticCast(); + if (!licenseReaderLines) + { + licenseTextHandle.Dispose(); + return; + } + + LicenseReaderLine *lines = *licenseReaderLines; + unsigned int lineIndex = 0; + size_t lineStart = 0; + for (size_t i = 0; i < licenseTextLength; i++) + { + if (licenseText[i] == '\n') + { + assert(i - lineStart <= 80); + lines[lineIndex++].m_text.Set(i - lineStart, reinterpret_cast(licenseText + lineStart)); + lineStart = i + 1; + } + } + assert(licenseTextLength - lineStart <= 80); + lines[lineIndex++].m_text.Set(licenseTextLength - lineStart, reinterpret_cast(licenseText + lineStart)); + + assert(lineIndex == numLines); + + licenseTextHandle.Dispose(); + + const Rect windowRect = Rect::Create(0, 0, 396, 528); + + PortabilityLayer::WindowDef wdef = PortabilityLayer::WindowDef::Create(windowRect, PortabilityLayer::WindowStyleFlags::kAlert, true, 0, 0, PSTR("")); + + PortabilityLayer::DialogManager *dialogManager = PortabilityLayer::DialogManager::GetInstance(); + Dialog *dialog = dialogManager->LoadDialogFromTemplate(kLicenseReaderDialogTemplateID, windowRect, true, false, 0, 0, PL_GetPutInFrontWindowPtr(), PSTR(""), nullptr); + + DrawDefaultButton(dialog); + + int16_t hit = 0; + + InitLicenseReader(numLines); + DrawLicenseReader(dialog->GetWindow()); + + if (licenseReaderTextScrollMax != 0) + { + PortabilityLayer::WidgetBasicState state; + state.m_rect = Rect::Create(licenseReaderTextRect.top, licenseReaderTextRect.right, licenseReaderTextRect.bottom, licenseReaderTextRect.right + 16); + state.m_refConstant = 2; + state.m_window = dialog->GetWindow(); + state.m_max = licenseReaderTextScrollMax; + state.m_state = 0; + licenseReaderScrollBarWidget = PortabilityLayer::ScrollBarWidget::Create(state, nullptr); + } + + dialog->GetWindow()->DrawControls(); + + do + { + hit = dialog->ExecuteModal(nullptr, LicenseReaderFilter); + } while (hit != kOkayButton); + + dialog->Destroy(); + licenseReaderLines.Dispose(); +} + +void DoAboutOpenSource(void) +{ + static const int kExportSourceItem = 2; + static const int kAerofoilLicenseButton = 4; + static const int kGliderPROLicenseButton = 6; + static const int kOpenSansLicenseButton = 8; + static const int kRobotoMonoLicenseButton = 10; + static const int kGochiHandLicenseButton = 12; + static const int kLibIConvLicenseButton = 14; + static const int kRapidJSONLicenseButton = 16; + static const int kZLibLicenseButton = 18; + static const int kFreeTypeLicenseButton = 20; + static const int kSDLLicenseButton = 22; + + static const int kLicenseResourceApache = 1000; + static const int kLicenseResourceGPLv2 = 1001; + static const int kLicenseResourceLGPLv3 = 1002; + static const int kLicenseResourceOFL = 1003; + static const int kLicenseResourceRapidJSON = 1004; + static const int kLicenseResourceZLib = 1005; + static const int kLicenseResourceSDL = 1006; + + static const int kAboutOpenSourceDialogTemplateID = 2005; + + const Rect windowRect = Rect::Create(0, 0, 324, 512); + + PortabilityLayer::WindowDef wdef = PortabilityLayer::WindowDef::Create(windowRect, PortabilityLayer::WindowStyleFlags::kAlert, true, 0, 0, PSTR("")); + + PortabilityLayer::DialogManager *dialogManager = PortabilityLayer::DialogManager::GetInstance(); + Dialog *dialog = dialogManager->LoadDialogFromTemplate(kAboutOpenSourceDialogTemplateID, windowRect, true, false, 0, 0, PL_GetPutInFrontWindowPtr(), PSTR(""), nullptr); + + DrawDefaultButton(dialog); + + if (thisMac.isTouchscreen) + dialog->GetItems()[kExportSourceItem - 1].GetWidget()->SetEnabled(true); + + int16_t hit = 0; + + do + { + hit = dialog->ExecuteModal(nullptr, AboutFrameworkFilter); + + switch (hit) + { + case kExportSourceItem: + DoExportSourceCode(); + break; + case kAerofoilLicenseButton: + case kGliderPROLicenseButton: + DoLicenseReader(kLicenseResourceGPLv2); + break; + case kOpenSansLicenseButton: + case kRobotoMonoLicenseButton: + DoLicenseReader(kLicenseResourceApache); + break; + case kGochiHandLicenseButton: + DoLicenseReader(kLicenseResourceOFL); + break; + case kLibIConvLicenseButton: + case kFreeTypeLicenseButton: + DoLicenseReader(kLicenseResourceLGPLv3); + break; + case kZLibLicenseButton: + DoLicenseReader(kLicenseResourceZLib); + break; + case kSDLLicenseButton: + DoLicenseReader(kLicenseResourceSDL); + break; + default: + break; + } + } while (hit != kOkayButton); + + dialog->Destroy(); +} + void DoAboutFramework (void) { -#define kAboutFrameworkDialogTemplateID 2000 + static const int kAboutFrameworkDialogTemplateID = 2000; + static const int kAboutOpenSourceButton = 2; const Rect windowRect = Rect::Create(0, 0, 272, 450); @@ -153,6 +355,9 @@ void DoAboutFramework (void) do { hit = dialog->ExecuteModal(nullptr, AboutFrameworkFilter); + + if (hit == kAboutOpenSourceButton) + DoAboutOpenSource(); } while (hit != kOkayButton); dialog->Destroy(); @@ -366,3 +571,193 @@ static int16_t AboutFrameworkFilter(void *context, Dialog *dialog, const TimeTag return hit; } +void DrawLicenseReader(Window *window) +{ + PortabilityLayer::RenderedFont *rfont = GetMonospaceFont(10, PortabilityLayer::FontFamilyFlag_None, true); + if (!rfont) + return; + + PortabilityLayer::ResolveCachingColor whiteColor(StdColors::White()); + PortabilityLayer::ResolveCachingColor blackColor(StdColors::Black()); + + DrawSurface *surface = window->GetDrawSurface(); + surface->FillRect(licenseReaderTextRect, whiteColor); + + int32_t ascent = rfont->GetMetrics().m_ascent; + + const LicenseReaderLine *lines = *licenseReaderLines; + + for (unsigned int i = 0; i < licenseReaderNumLines; i++) + { + int32_t lineY = licenseReaderTextRect.top + ascent + static_cast(kLicenseReaderTextSpacing * i); + lineY -= static_cast(licenseReaderTextScroll); + + surface->DrawStringConstrained(Point::Create(licenseReaderTextRect.left, lineY), lines[i].m_text.ToShortStr(), licenseReaderTextRect, blackColor, rfont); + } +} + +static void CycleLicenseReaderMouseHistory() +{ + for (unsigned int ri = 1; ri < kLicenseReaderPointHistoryLength; ri++) + { + unsigned int i = kLicenseReaderPointHistoryLength - ri; + licenseReaderPointHistory[i] = licenseReaderPointHistory[i - 1]; + } +} + +static void HandleLicenseReaderScroll(Window *window, int32_t offset) +{ + int32_t newScroll = static_cast(licenseReaderTextScroll) + offset; + if (newScroll < 0) + newScroll = 0; + else if (newScroll > static_cast(licenseReaderTextScrollMax)) + newScroll = licenseReaderTextScrollMax; + + if (newScroll != licenseReaderTextScroll) + { + licenseReaderTextScroll = newScroll; + licenseReaderScrollBarWidget->SetState(newScroll); + DrawLicenseReader(window); + } +} + +static void AutoScrollLicenseReader(Window *window) +{ + if (licenseReaderIsScrolling) + return; + + int32_t decayRate = 2; + if (licenseReaderVelocity < 0) + { + HandleLicenseReaderScroll(window, licenseReaderVelocity); + licenseReaderVelocity += decayRate; + if (licenseReaderVelocity > 0) + licenseReaderVelocity = 0; + } + else if (licenseReaderVelocity > 0) + { + HandleLicenseReaderScroll(window, licenseReaderVelocity); + licenseReaderVelocity -= decayRate; + if (licenseReaderVelocity < 0) + licenseReaderVelocity = 0; + } +} + +static void ComputeLicenseReaderVelocity() +{ + int32_t velocity = licenseReaderPointHistory[kLicenseReaderPointHistoryLength - 1].v - licenseReaderPointHistory[0].v; + licenseReaderVelocity = velocity; +} + +static void LicenseReaderScrollBarUpdate(void *captureContext, PortabilityLayer::Widget *widget, int part) +{ + Window *window = static_cast(captureContext); // This is stupid and very lazy... + + + const int incrementalStepping = kLicenseReaderTextSpacing; + const int pageStepping = 20; + + switch (part) + { + case kControlUpButtonPart: + widget->SetState(widget->GetState() - incrementalStepping); + break; + case kControlDownButtonPart: + widget->SetState(widget->GetState() + incrementalStepping); + break; + case kControlPageUpPart: + widget->SetState(widget->GetState() - pageStepping * incrementalStepping); + break; + case kControlPageDownPart: + widget->SetState(widget->GetState() + pageStepping * incrementalStepping); + break; + default: + break; + }; + + licenseReaderTextScroll = widget->GetState(); + DrawLicenseReader(window); +} + +static int16_t LicenseReaderFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) +{ + bool handledIt = false; + int16_t hit = -1; + + if (!evt) + { + if (licenseReaderIsScrolling) + CycleLicenseReaderMouseHistory(); + else + AutoScrollLicenseReader(dialog->GetWindow()); + return -1; + } + + Window *window = dialog->GetWindow(); + DrawSurface *surface = window->GetDrawSurface(); + + if (evt->IsKeyDownEvent()) + { + switch (PackVOSKeyCode(evt->m_vosEvent.m_event.m_keyboardInputEvent)) + { + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): + dialog->GetItems()[kOkayButton - 1].GetWidget()->SetHighlightStyle(kControlButtonPart, true); + PLSysCalls::Sleep(8); + dialog->GetItems()[kOkayButton - 1].GetWidget()->SetHighlightStyle(kControlButtonPart, false); + hit = kOkayButton; + handledIt = true; + break; + + default: + handledIt = false; + break; + } + } + + if (evt->m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput) + { + const GpMouseInputEvent &mouseEvt = evt->m_vosEvent.m_event.m_mouseInputEvent; + + Point mouseLocalPt = window->MouseToLocal(mouseEvt); + + switch (mouseEvt.m_eventType) + { + case GpMouseEventTypes::kDown: + if (licenseReaderTextRect.Contains(mouseLocalPt)) + { + for (unsigned int i = 0; i < kLicenseReaderPointHistoryLength; i++) + licenseReaderPointHistory[i] = mouseLocalPt; + licenseReaderIsScrolling = true; + } + else if (licenseReaderScrollBarWidget->GetRect().Contains(mouseLocalPt)) + { + licenseReaderScrollBarWidget->Capture(dialog->GetWindow(), mouseLocalPt, LicenseReaderScrollBarUpdate); + licenseReaderTextScroll = licenseReaderScrollBarWidget->GetState(); + DrawLicenseReader(dialog->GetWindow()); + } + break; + case GpMouseEventTypes::kLeave: + case GpMouseEventTypes::kUp: + licenseReaderIsScrolling = false; + ComputeLicenseReaderVelocity(); + break; + case GpMouseEventTypes::kMove: + if (licenseReaderIsScrolling) + { + Point prevPoint = licenseReaderPointHistory[0]; + licenseReaderPointHistory[0] = mouseLocalPt; + HandleLicenseReaderScroll(window, prevPoint.v - mouseLocalPt.v); + } + break; + default: + break; + } + } + + if (!handledIt) + return -1; + + return hit; +} + diff --git a/GpApp/Android.mk b/GpApp/Android.mk index 56a5a7c..6225bb7 100644 --- a/GpApp/Android.mk +++ b/GpApp/Android.mk @@ -42,6 +42,7 @@ LOCAL_SRC_FILES := \ InterfaceInit.cpp \ Link.cpp \ Main.cpp \ + MainMenuUI.cpp \ MainWindow.cpp \ Map.cpp \ Marquee.cpp \ diff --git a/GpApp/Events.cpp b/GpApp/Events.cpp index d51300c..62e56c3 100644 --- a/GpApp/Events.cpp +++ b/GpApp/Events.cpp @@ -14,6 +14,7 @@ #include "Environ.h" #include "House.h" #include "InputManager.h" +#include "MainMenuUI.h" #include "ObjectEdit.h" #include "Rect2i.h" #include "WindowManager.h" @@ -125,7 +126,7 @@ void HandleMouseEvent (const GpMouseInputEvent &theEvent, uint32_t tick) if (vDelta < 0) vDelta = -vDelta; if (((tick - lastUp) < doubleTime) && (hDelta < 5) && - (vDelta < 5)) + (vDelta < 5)) isDoubleClick = true; else { @@ -141,6 +142,9 @@ void HandleMouseEvent (const GpMouseInputEvent &theEvent, uint32_t tick) HandleToolsClick(evtPoint); else if (whichWindow == linkWindow) HandleLinkClick(evtPoint); + else if (HandleMainMenuUIClick(whichWindow, evtPoint)) + { + } break; default: @@ -328,6 +332,8 @@ void HandleSplashResolutionChange(void) InitScoreboardMap(); //RefreshScoreboard(wasScoreboardTitleMode); //DumpScreenOn(&justRoomsRect); + + HandleMainMenuUIResolutionChange(); } void KeepWindowInBounds(Window *window) @@ -401,6 +407,8 @@ void HandleIdleTask (void) HandleSplashResolutionChange(); } } + + TickMainMenuUI(); } //-------------------------------------------------------------- HandleEvent @@ -410,7 +418,7 @@ void HandleIdleTask (void) void HandleEvent (void) { TimeTaggedVOSEvent theEvent; - uint32_t sleep = 2; + uint32_t sleep = 1; bool itHappened = true; const KeyDownStates *eventKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys(); @@ -456,12 +464,13 @@ void HandleEvent (void) } else HandleIdleTask(); - + if ((theMode == kSplashMode) && doAutoDemo && !switchedOut) { if (TickCount() >= incrementModeTime) DoDemoGame(); } + } //-------------------------------------------------------------- IgnoreThisClick diff --git a/GpApp/Externs.h b/GpApp/Externs.h index a664330..6b64211 100644 --- a/GpApp/Externs.h +++ b/GpApp/Externs.h @@ -166,6 +166,7 @@ void FillScreenRed (void); void DumpToResEditFile (Ptr, long); void HandleEvent (void); // --- Event.c +void HandleIdleTask (void); void IgnoreThisClick (void); void SwitchToDepth (short, Boolean); // --- Environs.c diff --git a/GpApp/GliderDefines.h b/GpApp/GliderDefines.h index ce15852..6925196 100644 --- a/GpApp/GliderDefines.h +++ b/GpApp/GliderDefines.h @@ -4,7 +4,7 @@ // GliderDefines.h //---------------------------------------------------------------------------- //============================================================================ - +#pragma once //============================================================== Defines diff --git a/GpApp/GliderProtos.h b/GpApp/GliderProtos.h index 21c4dfd..e82ff01 100644 --- a/GpApp/GliderProtos.h +++ b/GpApp/GliderProtos.h @@ -1,9 +1,12 @@ - //============================================================================ //---------------------------------------------------------------------------- // GliderProtos.h //---------------------------------------------------------------------------- //============================================================================ +#pragma once + +#include "PLCore.h" +#include "GliderStructs.h" struct GpMouseInputEvent; diff --git a/GpApp/GliderStructs.h b/GpApp/GliderStructs.h index 918e553..3e7ea46 100644 --- a/GpApp/GliderStructs.h +++ b/GpApp/GliderStructs.h @@ -3,8 +3,9 @@ // GliderStructs.h //---------------------------------------------------------------------------- //============================================================================ +#pragma once - +#include "GliderDefines.h" #include "PLQDOffscreen.h" #include "GpVOSEvent.h" #include "ByteSwap.h" diff --git a/GpApp/GpApp.vcxproj b/GpApp/GpApp.vcxproj index 5f8e374..c80f962 100644 --- a/GpApp/GpApp.vcxproj +++ b/GpApp/GpApp.vcxproj @@ -103,6 +103,7 @@ + @@ -162,6 +163,7 @@ + diff --git a/GpApp/GpApp.vcxproj.filters b/GpApp/GpApp.vcxproj.filters index fdbb488..78d36d6 100644 --- a/GpApp/GpApp.vcxproj.filters +++ b/GpApp/GpApp.vcxproj.filters @@ -219,6 +219,9 @@ Source Files + + Source Files + @@ -302,5 +305,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/GpApp/InterfaceInit.cpp b/GpApp/InterfaceInit.cpp index 4aa2ccf..b4a49f8 100644 --- a/GpApp/InterfaceInit.cpp +++ b/GpApp/InterfaceInit.cpp @@ -67,9 +67,12 @@ void InitializeMenus (void) if (optionsMenu == nil) RedAlert(kErrFailedResourceLoad); InsertMenu(optionsMenu, 0); - - menusUp = true; - PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); + + if (!thisMac.isTouchscreen) + { + menusUp = true; + PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); + } houseMenu = GetMenu(kHouseMenuID); if (houseMenu == nil) diff --git a/GpApp/Main.cpp b/GpApp/Main.cpp index 7f26b7d..74c88b1 100644 --- a/GpApp/Main.cpp +++ b/GpApp/Main.cpp @@ -19,6 +19,7 @@ #include "IGpDisplayDriver.h" #include "GpIOStream.h" #include "House.h" +#include "MainMenuUI.h" #include "MenuManager.h" #include "RenderedFont.h" #include "ResolveCachingColor.h" @@ -523,8 +524,12 @@ int gpAppMain() UpdateMainWindow(); + if (thisMac.isTouchscreen) + StartMainMenuUI(); + while (!quitting) // this is the main loop HandleEvent(); + /* #if BUILD_ARCADE_VERSION ShowMenuBarOld(); diff --git a/GpApp/MainMenuUI.cpp b/GpApp/MainMenuUI.cpp new file mode 100644 index 0000000..8efb299 --- /dev/null +++ b/GpApp/MainMenuUI.cpp @@ -0,0 +1,489 @@ +#include "MainMenuUI.h" + +#include "FontFamily.h" +#include "GpApplicationName.h" +#include "HostDisplayDriver.h" +#include "GliderProtos.h" +#include "Externs.h" +#include "IGpDisplayDriver.h" +#include "PLCore.h" +#include "PLQDraw.h" +#include "PLStandardColors.h" +#include "PLSysCalls.h" +#include "RenderedFont.h" +#include "GpRenderedFontMetrics.h" +#include "ResolveCachingColor.h" +#include "PLTimeTaggedVOSEvent.h" +#include "WindowDef.h" +#include "WindowManager.h" +#include "Vec2i.h" + +struct MainMenuControlState +{ + Window *m_window; + + int m_targetHorizontalCoordinate; + Point m_dimensions; + int m_page; +}; + +struct MainMenuUIState +{ + enum ControlID + { + Control_NewGame, + Control_LoadSavedGame, + Control_HighScores, + Control_Page0To1, + + Control_LoadHouse, + Control_Demo, + Control_Page1To2, + + Control_AboutApplication, + Control_AboutFramework, + Control_Page2To0, + + Control_Count, + }; + + enum ControlStyle + { + ControlStyle_Icon, + ControlStyle_Text, + }; + + MainMenuControlState m_controls[Control_Count]; + int m_scrollInOffset; + int m_scrollInStep; + int m_scrollOutDistance; + int m_currentPage; + + ControlID m_activeControl; + + static const unsigned int kControlHeight = 40; + static const unsigned int kControlFontSize = 24; + static const unsigned int kControlLeftSpacing = 20; + static const unsigned int kControlBottomSpacing = 20; + static const unsigned int kControlIntermediateSpacing = 16; + static const unsigned int kControlInteriorSpacing = 6; + static const unsigned int kControlScrollInDecay = 2; + static const unsigned int kControlScrollInDecayFalloffBits = 0; +}; + +static MainMenuUIState mainMenu; + +static MainMenuUIState::ControlStyle GetControlStyleForControl(MainMenuUIState::ControlID controlID) +{ + switch (controlID) + { + case MainMenuUIState::Control_Page0To1: + case MainMenuUIState::Control_Page1To2: + case MainMenuUIState::Control_Page2To0: + return MainMenuUIState::ControlStyle_Icon; + + default: + return MainMenuUIState::ControlStyle_Text; + }; +} + +static PLPasStr GetTextForControl(MainMenuUIState::ControlID controlID) +{ + switch (controlID) + { + case MainMenuUIState::Control_NewGame: + return PSTR("New Game"); + case MainMenuUIState::Control_LoadSavedGame: + return PSTR("Resume Game"); + case MainMenuUIState::Control_LoadHouse: + return PSTR("Load House"); + case MainMenuUIState::Control_Demo: + return PSTR("Demo"); + case MainMenuUIState::Control_HighScores: + return PSTR("High Scores"); + case MainMenuUIState::Control_AboutApplication: + return PSTR("About Glider PRO"); + case MainMenuUIState::Control_AboutFramework: + return PSTR("About " GP_APPLICATION_NAME); + + default: + return PSTR(""); + }; +} + +static void DrawMainMenuControl(DrawSurface *surface, MainMenuUIState::ControlID controlID, bool clicked) +{ + Rect surfaceRect = surface->m_port.GetRect(); + + PortabilityLayer::ResolveCachingColor blackColor(StdColors::Black()); + PortabilityLayer::ResolveCachingColor whiteColor(StdColors::White()); + PortabilityLayer::ResolveCachingColor borderColor1(PortabilityLayer::RGBAColor::Create(255, 51, 51, 255)); + PortabilityLayer::ResolveCachingColor borderColor2(PortabilityLayer::RGBAColor::Create(255, 153, 51, 255)); + + surface->FrameRect(surfaceRect, blackColor); + surface->FrameRect(surfaceRect.Inset(1, 1), borderColor1); + surface->FrameRect(surfaceRect.Inset(2, 2), borderColor2); + + if (clicked) + surface->FillRect(surfaceRect.Inset(3, 3), borderColor2); + else + surface->FillRect(surfaceRect.Inset(3, 3), whiteColor); + + switch (GetControlStyleForControl(controlID)) + { + case MainMenuUIState::ControlStyle_Text: + { + PortabilityLayer::RenderedFont *rfont = GetHandwritingFont(MainMenuUIState::kControlFontSize, PortabilityLayer::FontFamilyFlag_None, true); + if (!rfont) + return; + + int32_t verticalOffset = (static_cast(surface->m_port.GetRect().Height()) + rfont->GetMetrics().m_ascent) / 2; + + surface->DrawString(Point::Create(MainMenuUIState::kControlInteriorSpacing, verticalOffset), GetTextForControl(controlID), blackColor, rfont); + } + break; + case MainMenuUIState::ControlStyle_Icon: + { + const int dotSize = 4; + const int dotSpacing = 2; + + const int dotCount = 3; + const int dotTotalSize = dotSpacing * (dotCount - 1) + dotSize * dotCount; + + int32_t dotHorizontalOffset = (static_cast(surface->m_port.GetRect().Width()) - dotTotalSize) / 2; + int32_t dotVerticalOffset = (static_cast(surface->m_port.GetRect().Height()) - dotSize) / 2; + + for (int i = 0; i < dotCount; i++) + { + int32_t hCoord = dotHorizontalOffset + i * (dotSize + dotSpacing); + surface->FillEllipse(Rect::Create(dotVerticalOffset, hCoord, dotVerticalOffset + dotSize, hCoord + dotSize), blackColor); + } + } + break; + default: + break; + } +} + +void StartScrollForPage() +{ + unsigned int displayHeight = 0; + PortabilityLayer::HostDisplayDriver::GetInstance()->GetDisplayResolution(nullptr, &displayHeight); + + DismissMainMenuUI(); + + int page = mainMenu.m_currentPage; + + PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); + + int totalWidth = 0; + + for (int controlID = 0; controlID < MainMenuUIState::Control_Count; controlID++) + { + if (mainMenu.m_controls[controlID].m_page == page) + totalWidth = mainMenu.m_controls[controlID].m_targetHorizontalCoordinate + mainMenu.m_controls[controlID].m_dimensions.h; + } + + mainMenu.m_scrollInStep = 1; + mainMenu.m_scrollInOffset = 0; + while (mainMenu.m_scrollInOffset < totalWidth) + { + mainMenu.m_scrollInOffset += (mainMenu.m_scrollInStep >> MainMenuUIState::kControlScrollInDecayFalloffBits); + mainMenu.m_scrollInStep += MainMenuUIState::kControlScrollInDecay; + } + + mainMenu.m_scrollOutDistance = totalWidth; + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + MainMenuControlState &control = mainMenu.m_controls[i]; + + if (control.m_page == page) + { + + const uint16_t styleFlags = PortabilityLayer::WindowStyleFlags::kBorderless; + + PortabilityLayer::WindowDef wdef = PortabilityLayer::WindowDef::Create(Rect::Create(0, 0, control.m_dimensions.v, control.m_dimensions.h), styleFlags, true, 0, 0, PSTR("")); + + control.m_window = wm->CreateWindow(wdef); + control.m_window->SetPosition(PortabilityLayer::Vec2i(control.m_targetHorizontalCoordinate - mainMenu.m_scrollInOffset, displayHeight - MainMenuUIState::kControlBottomSpacing - control.m_dimensions.v)); + wm->PutWindowBehind(control.m_window, wm->GetPutInFrontSentinel()); + + DrawMainMenuControl(control.m_window->GetDrawSurface(), static_cast(i), false); + } + } +} + +void StartMainMenuUI() +{ + DismissMainMenuUI(); + + PortabilityLayer::RenderedFont *rfont = GetHandwritingFont(MainMenuUIState::kControlFontSize, PortabilityLayer::FontFamilyFlag_None, true); + if (!rfont) + return; + + for (int controlID = 0; controlID < MainMenuUIState::Control_Count; controlID++) + { + MainMenuControlState &control = mainMenu.m_controls[controlID]; + + MainMenuUIState::ControlStyle controlStyle = GetControlStyleForControl(static_cast(controlID)); + + if (controlStyle == MainMenuUIState::ControlStyle_Text) + { + size_t textLength = rfont->MeasurePStr(GetTextForControl(static_cast(controlID))); + + control.m_dimensions.h = textLength + MainMenuUIState::kControlInteriorSpacing * 2; + control.m_dimensions.v = MainMenuUIState::kControlHeight; + } + else + control.m_dimensions.h = control.m_dimensions.v = MainMenuUIState::kControlHeight; + } + + mainMenu.m_controls[MainMenuUIState::Control_LoadHouse].m_page = 1; + mainMenu.m_controls[MainMenuUIState::Control_Demo].m_page = 1; + mainMenu.m_controls[MainMenuUIState::Control_Page1To2].m_page = 1; + + mainMenu.m_controls[MainMenuUIState::Control_AboutApplication].m_page = 2; + mainMenu.m_controls[MainMenuUIState::Control_AboutFramework].m_page = 2; + mainMenu.m_controls[MainMenuUIState::Control_Page2To0].m_page = 2; + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + if (i == 0 || mainMenu.m_controls[i].m_page != mainMenu.m_controls[i - 1].m_page) + mainMenu.m_controls[i].m_targetHorizontalCoordinate = MainMenuUIState::kControlLeftSpacing; + else + mainMenu.m_controls[i].m_targetHorizontalCoordinate = mainMenu.m_controls[i - 1].m_targetHorizontalCoordinate + mainMenu.m_controls[i - 1].m_dimensions.h + MainMenuUIState::kControlIntermediateSpacing; + } + + mainMenu.m_currentPage = 0; + StartScrollForPage(); +} + +static void DismissMainMenuUIPage() +{ + unsigned int displayHeight = 0; + PortabilityLayer::HostDisplayDriver::GetInstance()->GetDisplayResolution(nullptr, &displayHeight); + + PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); + + while (mainMenu.m_scrollInOffset < mainMenu.m_scrollOutDistance) + { + mainMenu.m_scrollInOffset += (mainMenu.m_scrollInStep >> MainMenuUIState::kControlScrollInDecayFalloffBits); + mainMenu.m_scrollInStep += MainMenuUIState::kControlScrollInDecay; + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + MainMenuControlState &control = mainMenu.m_controls[i]; + if (control.m_page == mainMenu.m_currentPage) + control.m_window->SetPosition(PortabilityLayer::Vec2i(control.m_targetHorizontalCoordinate - mainMenu.m_scrollInOffset, displayHeight - MainMenuUIState::kControlBottomSpacing - control.m_dimensions.v)); + } + + Delay(1, nullptr); + } +} + + +void TickMainMenuUI() +{ + if (mainMenu.m_scrollInOffset > 0) + { + PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); + + unsigned int displayHeight = 0; + PortabilityLayer::HostDisplayDriver::GetInstance()->GetDisplayResolution(nullptr, &displayHeight); + + mainMenu.m_scrollInStep -= MainMenuUIState::kControlScrollInDecay; + mainMenu.m_scrollInOffset -= (mainMenu.m_scrollInStep >> MainMenuUIState::kControlScrollInDecayFalloffBits); + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + MainMenuControlState &control = mainMenu.m_controls[i]; + if (control.m_page == mainMenu.m_currentPage) + control.m_window->SetPosition(PortabilityLayer::Vec2i(control.m_targetHorizontalCoordinate - mainMenu.m_scrollInOffset, displayHeight - MainMenuUIState::kControlBottomSpacing - control.m_dimensions.v)); + } + } +} + +void DismissMainMenuUI() +{ + PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + MainMenuControlState &control = mainMenu.m_controls[i]; + + if (control.m_window) + { + wm->DestroyWindow(control.m_window); + control.m_window = nullptr; + } + } +} + +void HandleMainMenuUIResolutionChange() +{ + PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance(); + + unsigned int displayHeight = 0; + PortabilityLayer::HostDisplayDriver::GetInstance()->GetDisplayResolution(nullptr, &displayHeight); + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + MainMenuControlState &control = mainMenu.m_controls[i]; + + if (control.m_window) + { + PortabilityLayer::Vec2i pos = control.m_window->GetPosition(); + pos.m_y = displayHeight - MainMenuUIState::kControlBottomSpacing - MainMenuUIState::kControlHeight; + control.m_window->SetPosition(pos); + + wm->PutWindowBehind(control.m_window, wm->GetPutInFrontSentinel()); + } + } +} + +static void MainMenuUIMouseMove(Window *window, MainMenuUIState::ControlID controlID, const Point &localPoint) +{ + if (window->GetSurfaceRect().Contains(localPoint)) + { + if (mainMenu.m_activeControl != controlID) + { + DrawMainMenuControl(window->GetDrawSurface(), controlID, true); + mainMenu.m_activeControl = controlID; + } + } + else + { + if (mainMenu.m_activeControl == controlID) + { + DrawMainMenuControl(window->GetDrawSurface(), controlID, false); + mainMenu.m_activeControl = MainMenuUIState::Control_Count; + } + } +} + +static void HandleMainMenuUISelection(MainMenuUIState::ControlID controlID) +{ + switch (controlID) + { + case MainMenuUIState::Control_NewGame: + DismissMainMenuUIPage(); + DoGameMenu(iNewGame); + break; + + case MainMenuUIState::Control_LoadSavedGame: + DismissMainMenuUIPage(); + DoGameMenu(iOpenSavedGame); + StartMainMenuUI(); + break; + + case MainMenuUIState::Control_HighScores: + DismissMainMenuUIPage(); + DoOptionsMenu(iHighScores); + StartMainMenuUI(); + break; + + case MainMenuUIState::Control_LoadHouse: + DismissMainMenuUIPage(); + DoGameMenu(iLoadHouse); + StartMainMenuUI(); + break; + + case MainMenuUIState::Control_Demo: + DismissMainMenuUIPage(); + DoOptionsMenu(iHelp); + StartMainMenuUI(); + break; + + case MainMenuUIState::Control_AboutApplication: + DismissMainMenuUIPage(); + DoAppleMenu(iAbout); + StartScrollForPage(); + break; + + case MainMenuUIState::Control_AboutFramework: + DismissMainMenuUIPage(); + DoAppleMenu(iAboutAerofoil); + StartScrollForPage(); + break; + + case MainMenuUIState::Control_Page0To1: + DismissMainMenuUIPage(); + mainMenu.m_currentPage = 1; + StartScrollForPage(); + break; + + case MainMenuUIState::Control_Page1To2: + DismissMainMenuUIPage(); + mainMenu.m_currentPage = 2; + StartScrollForPage(); + break; + + case MainMenuUIState::Control_Page2To0: + DismissMainMenuUIPage(); + mainMenu.m_currentPage = 0; + StartScrollForPage(); + break; + + default: + break; + } +} + +bool HandleMainMenuUIClick(Window *window, const Point &pt) +{ + MainMenuUIState::ControlID controlID = MainMenuUIState::Control_Count; + + if (mainMenu.m_scrollInOffset != 0) + return true; + + for (int i = 0; i < MainMenuUIState::Control_Count; i++) + { + const MainMenuControlState &control = mainMenu.m_controls[i]; + + if (control.m_window == window) + { + controlID = static_cast(i); + break; + } + } + + if (controlID == MainMenuUIState::Control_Count) + return false; + + DrawMainMenuControl(mainMenu.m_controls[controlID].m_window->GetDrawSurface(), controlID, true); + + mainMenu.m_activeControl = controlID; + + for (;;) + { + TimeTaggedVOSEvent evt; + if (WaitForEvent(&evt, 1)) + { + if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput) + { + const GpMouseInputEvent &mouseEvt = evt.m_vosEvent.m_event.m_mouseInputEvent; + + if (mouseEvt.m_eventType == GpMouseEventTypes::kLeave) + return true; + + if (mouseEvt.m_eventType == GpMouseEventTypes::kMove || mouseEvt.m_eventType == GpMouseEventTypes::kDown || mouseEvt.m_eventType == GpMouseEventTypes::kUp) + { + MainMenuUIMouseMove(window, controlID, window->MouseToLocal(mouseEvt)); + } + + if (mouseEvt.m_eventType == GpMouseEventTypes::kUp) + { + if (mainMenu.m_activeControl != MainMenuUIState::Control_Count) + { + DrawMainMenuControl(mainMenu.m_controls[controlID].m_window->GetDrawSurface(), controlID, false); + HandleMainMenuUISelection(controlID); + } + return true; + } + } + } + } + + return true; +} diff --git a/GpApp/MainMenuUI.h b/GpApp/MainMenuUI.h new file mode 100644 index 0000000..795d745 --- /dev/null +++ b/GpApp/MainMenuUI.h @@ -0,0 +1,10 @@ +#pragma once + +struct Point; +struct Window; + +void StartMainMenuUI(); +void TickMainMenuUI(); +void DismissMainMenuUI(); +void HandleMainMenuUIResolutionChange(); +bool HandleMainMenuUIClick(Window *window, const Point &pt); diff --git a/GpApp/MainWindow.cpp b/GpApp/MainWindow.cpp index 6be3e07..0a278f1 100644 --- a/GpApp/MainWindow.cpp +++ b/GpApp/MainWindow.cpp @@ -30,8 +30,6 @@ void DrawOnSplash (DrawSurface *surface); -void SetPaletteToGrays (void); -void HardDrawMainWindow (void); void KeepWindowInBounds(Window *window); CTabHandle theCTab; @@ -53,6 +51,7 @@ Boolean fadeGraysOut, isDoColorFade, splashDrawn; extern short toolSelected; extern Boolean noRoomAtAll, isUseSecondScreen; extern Boolean quickerTransitions, houseIsReadOnly; +extern Boolean menusUp; //============================================================== Functions //-------------------------------------------------------------- DrawOnSplash @@ -111,7 +110,12 @@ void RedrawSplashScreen (void) CopyRectMainToWork(&workSrcRect); mainWindow->GetDrawSurface()->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); - PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); + + if (!thisMac.isTouchscreen) + { + menusUp = true; + PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); + } } //-------------------------------------------------------------- UpdateMainWindow diff --git a/GpApp/Menu.cpp b/GpApp/Menu.cpp index b5a8ed1..2a4e748 100644 --- a/GpApp/Menu.cpp +++ b/GpApp/Menu.cpp @@ -15,6 +15,7 @@ #include "DialogManager.h" #include "DialogUtils.h" #include "Externs.h" +#include "Environ.h" #include "House.h" #include "MenuManager.h" #include "ObjectEdit.h" @@ -417,6 +418,13 @@ void DoOptionsMenu (short theItem) } } CloseMainWindow(); + + if (thisMac.isTouchscreen) + { + menusUp = false; + PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(false); + } + OpenMainWindow(); incrementModeTime = TickCount() + kIdleSplashTicks; } @@ -425,6 +433,10 @@ void DoOptionsMenu (short theItem) theMode = kEditMode; StopTheMusic(); CloseMainWindow(); + + menusUp = true; + PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true); + OpenMainWindow(); OpenCloseEditWindows(); } diff --git a/GpApp/SourceExport.cpp b/GpApp/SourceExport.cpp index c8a01ba..aaed992 100644 --- a/GpApp/SourceExport.cpp +++ b/GpApp/SourceExport.cpp @@ -9,6 +9,7 @@ #include "PLStandardColors.h" #include "PLSysCalls.h" #include "RenderedFont.h" +#include "GpApplicationName.h" #include "GpRenderedFontMetrics.h" #include "ResolveCachingColor.h" #include "ZipFile.h" @@ -711,7 +712,7 @@ bool ExportSourceToStream (GpIOStream *stream) void DoExportSourceCode (void) { - GpIOStream *stream = PortabilityLayer::HostFileSystem::GetInstance()->OpenFile(PortabilityLayer::VirtualDirectories::kSourceExport, "SourceExport.zip", true, GpFileCreationDispositions::kCreateOrOverwrite); + GpIOStream *stream = PortabilityLayer::HostFileSystem::GetInstance()->OpenFile(PortabilityLayer::VirtualDirectories::kSourceExport, GP_APPLICATION_NAME "SourceCode.zip", true, GpFileCreationDispositions::kCreateOrOverwrite); if (!stream) return; diff --git a/PortabilityLayer/FontManager.cpp b/PortabilityLayer/FontManager.cpp index 939ca8f..5b88b38 100644 --- a/PortabilityLayer/FontManager.cpp +++ b/PortabilityLayer/FontManager.cpp @@ -25,6 +25,8 @@ namespace PortabilityLayer FontFamily *GetSystemFont(int textSize, int variationFlags) const override; FontFamily *GetApplicationFont(int textSize, int variationFlags) const override; + FontFamily *GetHandwritingFont(int textSize, int variationFlags) const override; + FontFamily *GetMonospaceFont(int textSize, int variationFlags) const override; RenderedFont *GetRenderedFont(IGpFont *font, int size, bool aa, FontHacks fontHacks) override; RenderedFont *GetRenderedFontFromFamily(FontFamily *font, int size, bool aa, int flags) override; @@ -38,6 +40,8 @@ namespace PortabilityLayer static const unsigned int kNumCachedRenderedFonts = 32; static const int kSystemFontCacheID = 1; static const int kApplicationFontCacheID = 2; + static const int kHandwritingFontCacheID = 3; + static const int kMonospaceFontCacheID = 3; static const int kFontCacheVersion = 1; static const int kFontCacheNameSize = 64; @@ -59,6 +63,8 @@ namespace PortabilityLayer FontFamily *m_systemFont; FontFamily *m_applicationFont; + FontFamily *m_handwritingFont; + FontFamily *m_monospaceFont; uint32_t m_usageCounter; CachedRenderedFont m_cachedRenderedFonts[kNumCachedRenderedFonts]; @@ -70,6 +76,8 @@ namespace PortabilityLayer { m_systemFont = FontFamily::Create(kSystemFontCacheID); m_applicationFont = FontFamily::Create(kApplicationFontCacheID); + m_handwritingFont = FontFamily::Create(kHandwritingFontCacheID); + m_monospaceFont = FontFamily::Create(kMonospaceFontCacheID); if (m_systemFont) m_systemFont->AddFont(FontFamilyFlag_None, "Fonts/OpenSans/OpenSans-ExtraBold.ttf", FontHacks_None); @@ -80,6 +88,12 @@ namespace PortabilityLayer m_applicationFont->AddFont(FontFamilyFlag_Bold, "Fonts/OpenSans/OpenSans-Bold.ttf", FontHacks_None); } + if (m_handwritingFont) + m_handwritingFont->AddFont(FontFamilyFlag_None, "Fonts/GochiHand/GochiHand-Regular.ttf", FontHacks_None); + + if (m_monospaceFont) + m_monospaceFont->AddFont(FontFamilyFlag_None, "Fonts/Roboto/RobotoMono-Regular.ttf", FontHacks_None); + memset(m_cachedRenderedFonts, 0, sizeof(m_cachedRenderedFonts)); } @@ -91,13 +105,13 @@ namespace PortabilityLayer if (m_applicationFont) m_applicationFont->Destroy(); - IGpFontHandler *hfh = HostFontHandler::GetInstance(); + if (m_handwritingFont) + m_handwritingFont->Destroy(); - if (m_systemFont) - { - m_systemFont->Destroy(); - m_systemFont = nullptr; - } + if (m_monospaceFont) + m_monospaceFont->Destroy(); + + IGpFontHandler *hfh = HostFontHandler::GetInstance(); for (int i = 0; i < sizeof(m_cachedRenderedFonts) / sizeof(m_cachedRenderedFonts[0]); i++) { @@ -109,7 +123,6 @@ namespace PortabilityLayer FontFamily *FontManagerImpl::GetSystemFont(int textSize, int variationFlags) const { - (void)textSize; return m_systemFont; } @@ -121,6 +134,16 @@ namespace PortabilityLayer return m_applicationFont; } + FontFamily *FontManagerImpl::GetHandwritingFont(int textSize, int variationFlags) const + { + return m_handwritingFont; + } + + FontFamily *FontManagerImpl::GetMonospaceFont(int textSize, int variationFlags) const + { + return m_monospaceFont; + } + RenderedFont *FontManagerImpl::GetRenderedFont(IGpFont *font, int size, bool aa, FontHacks fontHacks) { CachedRenderedFont *newCacheSlot = &m_cachedRenderedFonts[0]; diff --git a/PortabilityLayer/FontManager.h b/PortabilityLayer/FontManager.h index 0692679..c91d3e7 100644 --- a/PortabilityLayer/FontManager.h +++ b/PortabilityLayer/FontManager.h @@ -17,6 +17,8 @@ namespace PortabilityLayer virtual FontFamily *GetSystemFont(int fontSize, int variationFlags) const = 0; virtual FontFamily *GetApplicationFont(int fontSize, int variationFlags) const = 0; + virtual FontFamily *GetHandwritingFont(int fontSize, int variationFlags) const = 0; + virtual FontFamily *GetMonospaceFont(int fontSize, int variationFlags) const = 0; virtual RenderedFont *GetRenderedFont(IGpFont *font, int size, bool aa, FontHacks fontHacks) = 0; virtual RenderedFont *GetRenderedFontFromFamily(FontFamily *fontFamily, int fontSize, bool aa, int flags) = 0; diff --git a/PortabilityLayer/MenuManager.cpp b/PortabilityLayer/MenuManager.cpp index 61183ba..807451c 100644 --- a/PortabilityLayer/MenuManager.cpp +++ b/PortabilityLayer/MenuManager.cpp @@ -208,12 +208,12 @@ namespace PortabilityLayer static const unsigned int kIconResID = 128; static const unsigned int kMenuFontSize = 12; - static const unsigned int kTouchScreenMenuFontSize = 24; + static const unsigned int kTouchScreenMenuFontSize = 40; static const unsigned int kMenuBarIconYOffset = 2; static const unsigned int kMenuBarTextYOffset = 14; - static const unsigned int kTouchScreenMenuBarTextYOffset = 26; + static const unsigned int kTouchScreenMenuBarTextYOffset = 40; static const unsigned int kMenuBarHeight = 20; - static const unsigned int kTouchscreenMenuBarHeight = 38; + static const unsigned int kTouchscreenMenuBarHeight = 54; static const unsigned int kMenuBarItemPadding = 6; static const unsigned int kMenuBarInitialPadding = 16; @@ -645,6 +645,9 @@ namespace PortabilityLayer bool MenuManagerImpl::IsPointInMenuBar(const Vec2i &point) const { + if (!m_menuBarVisible) + return false; + return IsYInMenuBarRange(point.m_y); } diff --git a/PortabilityLayer/PLCore.cpp b/PortabilityLayer/PLCore.cpp index 9d92fcc..f3ad712 100644 --- a/PortabilityLayer/PLCore.cpp +++ b/PortabilityLayer/PLCore.cpp @@ -647,6 +647,9 @@ bool WaitForEvent(TimeTaggedVOSEvent *eventOut, uint32_t ticks) Delay(1, nullptr); ticks--; + + if (ticks == 0) + break; } return false; diff --git a/PortabilityLayer/PLQDraw.cpp b/PortabilityLayer/PLQDraw.cpp index a52fbe4..2e0bb0a 100644 --- a/PortabilityLayer/PLQDraw.cpp +++ b/PortabilityLayer/PLQDraw.cpp @@ -2026,6 +2026,24 @@ PortabilityLayer::RenderedFont *GetSystemFont(int size, int variationFlags, bool return PortabilityLayer::FontManager::GetInstance()->GetRenderedFontFromFamily(fontFamily, size, aa, variationFlags); } +PortabilityLayer::RenderedFont *GetHandwritingFont(int size, int variationFlags, bool aa) +{ + PortabilityLayer::FontFamily *fontFamily = PortabilityLayer::FontManager::GetInstance()->GetHandwritingFont(size, variationFlags); + if (!fontFamily) + return nullptr; + + return PortabilityLayer::FontManager::GetInstance()->GetRenderedFontFromFamily(fontFamily, size, aa, variationFlags); +} + +PortabilityLayer::RenderedFont *GetMonospaceFont(int size, int variationFlags, bool aa) +{ + PortabilityLayer::FontFamily *fontFamily = PortabilityLayer::FontManager::GetInstance()->GetMonospaceFont(size, variationFlags); + if (!fontFamily) + return nullptr; + + return PortabilityLayer::FontManager::GetInstance()->GetRenderedFontFromFamily(fontFamily, size, aa, variationFlags); +} + #include "stb_image_write.h" void DebugPixMap(PixMap **pixMapH, const char *outName) diff --git a/PortabilityLayer/PLQDraw.h b/PortabilityLayer/PLQDraw.h index 3f20d1e..dd25652 100644 --- a/PortabilityLayer/PLQDraw.h +++ b/PortabilityLayer/PLQDraw.h @@ -93,6 +93,8 @@ Boolean SectRect(const Rect *rectA, const Rect *rectB, Rect *outIntersection); PortabilityLayer::RenderedFont *GetApplicationFont(int size, int variationFlags, bool aa); PortabilityLayer::RenderedFont *GetSystemFont(int size, int variationFlags, bool aa); +PortabilityLayer::RenderedFont *GetHandwritingFont(int size, int variationFlags, bool aa); +PortabilityLayer::RenderedFont *GetMonospaceFont(int size, int variationFlags, bool aa); inline RGBColor::RGBColor(uint8_t r, uint8_t g, uint8_t b) diff --git a/PortabilityLayer/PLResourceManager.cpp b/PortabilityLayer/PLResourceManager.cpp index 66aaffb..de1f4c8 100644 --- a/PortabilityLayer/PLResourceManager.cpp +++ b/PortabilityLayer/PLResourceManager.cpp @@ -276,7 +276,7 @@ namespace PortabilityLayer extension = kPICTExtension; outValidationRule = ResourceValidationRules::kBMP; } - else if (resTypeID == ResTypeID('STR#')) + else if (resTypeID == ResTypeID('STR#') || resTypeID == ResTypeID('LICS')) extension = ".txt"; else if (resTypeID == ResTypeID('DITL') || resTypeID == ResTypeID('muvi')) extension = ".json"; diff --git a/PortabilityLayer/WindowManager.cpp b/PortabilityLayer/WindowManager.cpp index e2e23af..d63668d 100644 --- a/PortabilityLayer/WindowManager.cpp +++ b/PortabilityLayer/WindowManager.cpp @@ -1108,7 +1108,8 @@ namespace PortabilityLayer void WindowManagerImpl::FindWindow(const Point &point, Window **outWindow, short *outRegion) const { - if (PortabilityLayer::MenuManager::GetInstance()->IsPointInMenuBar(PortabilityLayer::Vec2i(point.h, point.v))) + PortabilityLayer::MenuManager *menuManager = PortabilityLayer::MenuManager::GetInstance(); + if (menuManager->IsPointInMenuBar(PortabilityLayer::Vec2i(point.h, point.v))) { if (outWindow) *outWindow = nullptr; diff --git a/Resources/Fonts/GochiHand/GochiHand-Regular.ttf b/Resources/Fonts/GochiHand/GochiHand-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..13afabdf741ab4abbcd445783b87d72d6d86cd0d GIT binary patch literal 35908 zcmbTe2b>&Nl`q^CJ5^V8S9Mo)RabS+IZSs??8!NgW|TEbW94XNOG36RS;%t2#>O~d zdvRD}jPVk@EUVcr<;xx~uNF zC;ZRPOwy>@a{uK3H(9%a6WG^VC44WNBxHX$M98y;lkta zKE316&i(gxfAvv5{??saj~s$=JAB{E@ULm-zEe9MPQLIWyr&urH=W;g!`6jA zo*($V!Ep9jc)zj>2AF5aN8oQ0N-+J;8Va7JX>&M}G|ADRhZ`if#&J;Wkd>^^((7_`|J6HcLJj-R6BmVrM8*ezY zi@xI`y#F9vZ#3YBwx#E>OXM#NZbRH)5Tem?Q>9dtyoAfi;-OeH8jIpWFpKNMUfkuR z`$#GjdYI$Al8t0s{H)@_OTGi;t{AXYJ>TYL5;~7GhK8fA) z$EyxsQcgAr{*;s|7?zd{4`E-$KSQSMF~d)n{+XDu8x23jBE$?l)xgrvh&xHfaMEx) z%(GIh7F{l*%UObdjkFQ{xSS%q646UK7(!!o2!4Vvfu?G;Qf><62#AlE_JE z$wNhqisXp6oD%NG)pm^tnX`^4dTF+sSgs(san_t|)d)drtN&eN9k@d0#zaX`XH?>| zgf!xzWL%u`62u#6g3MUHW|ECf}nrsS2W4D%L=0 zvUrSedU2`B64*B|i=6Z;epB}tZDV~(J5xEbsl9#E;fk5Jm@tbw6;OOkb=z=~cBqoc zX5y`Gr!AjkI}XeiJGLBexrtR-KH_uAiHi0+UJcr5A)@l+eVpQA0{(kUUdb%0iu|L{ zsx5n4ySMiQ@fXosLI3xqzBN0V#Y|Wva2mJqZnnHGi1}j!{R4^ocuUy$_Iq*M$SH!e zR4xkG{We*0n(xJpHUUYdZSh5lCeImm87>$eK-vff0y9RE0l^rNiWIA85Sa%UP2F0m z)fkN%kwV5|pp(@K57&Sa1(7iIOKP}2f-G+3L#jT_8ma{x22bOR{hi z7RNtt4vJ=%HKNFLbRtQ!tWZ8x>)+WItZcfew{6!%h9XRK=eyeYyxC<77mY0^YXoJn ziox-C)9Q|Z$!aBNlC(RLn=++MgDIQfq@6J=;mdhBDb}R10iR5gB#z^bVDW0FiTArz zpG}E-tgMkBhg1(q3rtvY@Q45T5NCC8p?G=qf!48iZ75||9qx4|okjeG#pga!h0EMI z-tm{%$TMb+vM^3ptZ!3A$;DJ7>!2x;qFs#U4fQQ_Z$9w$F%7IF)DjnIo6}|@ zY2IcQY+9}4$LIM}RH=r=bWn7vUbH%=mtG?tBQ?XEVUOXA!4RphN?q*N2pfqQ%pV+D zU1jTQg%(d=%DT3$EQP+f`qE06QvzMC)5 zWvr%-YxzLrY4ee_O44A#Spnjf|=7aLd4r zQ|VyO_MWb7LR%=#yyTxhk?x}lb>?n9<@W{wB8!*EM7Z>pe`MevG z%8on${}a-#rTvivX|f2M*&-+W7Dcqnel5T_GD@m5?hKRLc#mN5sYWeYICb0IgM;t6 z=Sr6=?DujGpXB5cp^j%h`?W3iVsW^)Z*dWO9PSMfimJOFFd4KWcnsaHZa$*^7&tah z+SLr)o6_%{?X<`e2Y2?{8h4JoeEp5@#)9Xszwh7v{g!(d{|W9Jz+7#AO}QtvwV3OFN+>Oln4c4shox4{Z=*{_QQ21i%AK`Y%*(P zEpCr$6GU3Jdo{_)5IBZooM;S&6tHKb)#O#QkX^8fHg`A~c02tp#UXpljNhl3%@&I0 zoDSLS7tL0)l{KdeSu5wX(dCe@qy{`j((1M_VNLRwC<>gR!D*N$zCnE2(2ZoI8&DNo zA^L$Sp|z=^7sy@eqbOceGzbI92u1CnE>*Y~M6}u;BybDY*}qPWXjV1YNtvlu!h*Y{ zp*x2LaH4{%MwZ&IhKE+G8#d3mBZ(ti z+sO1t2R5I}#N#HyYBi;sTN&JFv6yJ|Jzp~L*q01HGH~!z*I_PfN-ITOy;Y?E_=@L! zNjHK~Nhw``Peqnyus6s%4HAk?)hfg#94EjSb=^XNhp%9EOMYH+mTw%Uz4Cfd!ZZEV zG`TiQkhr2Pe)a18i(gY57F==yes~RAg$1qx25VV*jhrFwG`I{gm{&vbVc~RXMH=1^ z!7vC{Et8jD-gEfx?wd=F?>&G2N&Sa9}rD}^ivG>T~t%KYEW5UDX+c5L3n%AE#p%vM+^eN)gWRGDGUex^? zJP^2^wy7Ng)xN@~IpoY{E8?!D!3OTyI*GF@DHh4==!+OTdGXg_S}sE3W;ERsM)Q#JSuInW&U) z7Z8^Dw z%Vs>qK^$jV)*q_uJ~aE-kMG%w8_oTlSAMpA4M`KBu-n9$WG_xow24p!MrrODpTDtx z{9PN0$+`1uqHU^Q!HF!z&{2P7ydd_rw{Bd!u`RP;^d>q7tr8FGJ+ky|k|DlkC>aLO zykL!CsX{@0(UxQLpTX>UDkJEQ4Q7w@Ute+jx2j)ey`0DAZ}H@&+k<8kWjEWHwO`uP zx_`FVws7mvrSCnuru(KB_I2+%;mtIO#l01VlWPm*p;6+jtops8jS+Z0Kee+eH!BQ7 zXPdokYg>Ew496yK|LZ-QKXKQZ#MP?X#~US)vYU9uCjiXCmR?)>GC51U4H;QIw(6=` zDk2pG{Fw#4g;|w#!9$EimWh7QW5bW`kI>5LYY7uFvN#0W807fKZ@v_a8hM|4`swKs zj#HZETeow6NlZE?a6B1RtDeMow0Q8qLQD`X1XgN3RP}{SHmQ|uYAG^`3?CtgVL`Id zM2%o@w_M({u^+oL6mrFUPMoGoj*#6Kw_16I#s{@%5|Ri461)&!?wiTwXo@jWez(P= zwa_Mjv!m}D9kN5F(T}Z_HIf3lgD@;Cy-M<+nF+&$VK)dv&#snNrIBZmy5{L<9N8^~ zKsijVo?^w|FJr^X8}J^3dF#lmRIF!g2-+hbjk7~{-#F+XC|678?4{>cmk;dP*cVU7 z9afjEbJs;|i1n~m!3sv?>(E99+>8-7ae|dBO)nJM7Y1Yg#gB{mn8G>)g)$r66{Vv& zVWEp7t4Jm~e&bjoX119`NAn${8!xR(3$eE8ot@pcR0N(ClFjn?-X8DOCt1;K0_08# zG)~*X@uX0hY*NHTThup*y++yqJ_j5kNS3kE>GrVQfG>S}sfG9s@e@N6NT}}Bkk;xV z5+z;d(Q@lv?E1VDu&M}IEb?&;c_Ck@$8q8l4!d2FBm(dxJ&>ZUR2R(fFsi#J95un61`YP+j_!KBeDAg zr_0_f^1h*gn#&xkO-_w?Lasp60c%{@+Z3LkX$e#Z$H$4w0+$e+JntWyU7fVqg+wwD z*334=lFfxNLdbiBLg#2YG`oJ|`Wf_)Wy6<jv)=b8Mo*w{1HI6)D`7Z#uXasd~Z-0TM)`@kxTDBvVfT=UWApTzMLa6VHR zc#lZV773ek@$>Z&j51kiTy)Kr2-<4aQLX``vH()a0-gj zrK0l1+GwVH;r0t4lcnz%c;b8HPXO1p{U>C*@?3nNL7*6yhw3?=?!a(T2f%fLaq*Bd zkEj~U-(wH2yMJFt<%at<@j@cNcvN+If3FtloXg+*>FZ!J{yM-UcZ!#=7pvReJw1H! z#*IEYz{rZ=xB9wzh7zffst+hs+;DjDYsM?&D~6qhQ=m(_-aw2C>EI7x(G}!Z4}m(# z1&EI&k)}aN)V=WvI|Tk0oK%en!^cPpY)*H+a4lSEywZE-uMTE5Ow~Ag`lY!wTMIM$ zPn>Sf%yq}?N>GTj_W3*3G#>sRhy(|7aBKgIZmc6{-}@7dk<_M3KDFuR@Vz)*iBkf_~*-@WCt3>*iAJ^$K@bL}c<T*uk#Ff2OKZsv;&nsCFm2dpFi4G52g&9g1+4pd5ao(% z)5QYU2p~^ULjPR{)CmM=5S9f$e~n?iW-o;avx(+R(PVY~(bFdj>uy;UOO5UuxCvY5fv54 z=FNiLVpCJTOfBkgV_zqLsB9S;_X#XT*#gC4I=N)I&Q0rMg7| z^^DNmGUI~a>-Dd(-#2d_jQ5^+VsroLjTK(vouP~yiWsid4}SBeOFw>U2j89)#Xc<2L(w?LL@X&f!wB!XM z+v(PTTELg?UV5Es10^up4Dexo!BRJK$kuUR_uaL6MAQi}x9>ghnP0a~JA&ol4++wGhQYg&D#^dA&dIr%5ZBy0*b?EyP)5@7Az|wy zU)+B5a}OQ}F~0+;`DH)rV3aKpEX2KEn z3QjGgITJoaJrx+zAt|zC1ehd7{Xm{T&~-3YH|vb~1Syi2d$x4?e0}>TB*5{%T6&s1 zOnm1Z9E*YF6TMg*zb=R2y35*JVi7gCmYoMSzx==xp9uK?rT5`b}Yi86y{W>1VB zf90dk&8vQnFuOwXRDR!{t)ppP@t93cM`HDwH7S&9G;cXK=(e%A+3jNcJEat5kBer- zJ30ZmDz64OKAErj?N(m0nH>0=HiwOKtF~x9AhDv`inF51+MyVO!Nlzh)7;(Zaxg$b zIAqn5$%rN+cv>qU$H4T|kd)24)R{*oJR~Fd(_R5;g1pE(>`g6IfnibHm|A*`>LCM$ zBIM}x3JWq_U7H%%^jcvB!*v=TTh7($u@^Fc-?-9(99KC_X&NYmd8kK9cFrzzT)O@C z?w!w{>0AB4*N;EC_{YE5S>F8!{_E8E{+_eH-Yth~v-1o2@r&D=Ni+i`U>D=8HyQNu z?pjAP&+*n^B`Rd54)>1UzN^-K^ocE-Kl#+%SJwuc<6?ieU9tzfs*{mZtza`_OFttY zBu^M_hIxQV*NtSwqF2lW)^!=2uAtKftx$LEb)zA4r(Y){^e=-iTy|#l!UZ@J{PPx; zXDv!R>rx74D+eh8EqHvqGb^$l(dJac4o%FNY<7-;teOuM{UIN1lU#y{Qk;F4dn8Dx z30%-3LavF%9d57N!AXk5fsue2*xPeBiHq`&Gzb1WYr3Vo2JTX`(^@1pIXd8Vs~l-E zOL3nPf`pyGsW6croSW#diEfwO=jKvs(}8_EbD|4koZ`xD%vX4^gu9+-+0SOA05?>*GBb;A*icz=bUfo8@GCWAx;z+wC!qg{JL_F7li+uYn15SpA(jrXR@ zX>Xu)GFL8DXJ2^Xxe15HK`q)64BE@>9R(lD?)$5A0}gLOU)Se|67g9>2C6zb@&i$q z(V`&t2l$1D$bn+ua+H7xVXL)lFcN2hC$TqHU6m=>8K0S%j>IZLf3f1jbW{V4Dq{=5R zJcBu2*?Zz*WxhY=XgRPk-xYK89Ju%Kr$$5v;|M5ro5MV@_v8%#GcaH|1LPaPoq(33 znsFm^)X7bx@H#RCT}I^Hav%l`LJ=ONg#bgaDy(#0i&`Ln&!9=%q-3Jn(5m@`-4%C7 zceht{K{3pB+PhtZap=x)04*ohnWW(7OTVZTkTU%w$;=mP>CPE?NT!%u~OJ=8$5jHUALsBPtT@O!}B|Kqy@y8Udk5-m2=_F5f94^kI+{mBsH)PUVUJ4`@TlCe@I-~fK78=gmnSwp@!hi_qtVz@%2)6$t=n!H4CPcSZL!jXl?krhv~DnUB(Ue^d+xee z86OH3+ls-?_Swr@D}^;D1}5)0xlX1d^61QzuQ?wedV{sRN-+Xw8Q!ux>2pf4QVW1& z+)!FPLD@+s*xVk_4TME?ZvZY(N1&hp%gnu3Ct6R1YyiR+%G zPQD?+5r3Qp*d{=sI_Pmp9>J9ex+cy%IBey>C z{F;IH-ubTiYPfr2a{$9Ahl3e#Md=Q+*~8H;R=fDmA6ScB7VJ6MVlzVdYO+5QYaj6M zc;Zl7dezCX)`RmykVkN!tytLVci8Uj&fmrGe zWyPV3n5S*anQmt?D8j!tpV`uu=v%*SdnPd1pM~y~h?dxpl}kyby5Z=lqZ_I{yWZ8_ zarWp9BPk>AmrYJt%U}<+?;MAhnwXrKo}QYXUX_gZH>bTE!Fg4)$ERrmWs?OV-`YR9 zZu^0@p#viktvtGEUz=Qt$%M%q12q2l(qqJWa;>2U<^jA7Fz66*07ju7WDUAohpE(m zP&$U{KR`DiK4Q7_SZ=~_Q>MMAHD&BILNDC0pC4C}irUlLsrUo5T@_o-=bcVSV~m73 zBI30S?@;`dngn)%=+ujK146_nl6+jG%qA1Zm=X~or1H24P>jbZ#Q5ZF@}9+?-a}ca zDhvhu&tr2RR(nFI;@h_L0J)JwT%$qIBNI3rS3SR9He|i$2xVouh3X3dDQ0D!Ztf1n za4Q>_yYI%XZQTJ+rY*oG5*~L%jt-Q4qql$l_|0E__kfG2hC*RKq&nSq3~hSq^k8=S zKv&n9Q^(sqV$9>=GrgDZdH?j`PhA{d_vm-twf3VR%B44!en@J7ttt&{g}kEVHNq1$ z3b^12!Evw@iZZX{=ei=kWQGeX)=c~G`1oLlsO1xWnWqV_+f__!Ho?u9Jn_oFno4YT zc4njtJJ)w=_u4R@ipUw)^v+{P_s$fi&Oi0s2ipAs-j{Gk77iXMh4-E~vAHcZux{fT zcqXvuXX%T?tI)dz*b#Ur@MuM7PyUA{@ zof%5b1bM}7bU35iij~97tOHu*a$6^gV@EI7dTy?O%CxvRx~F!gcH!qAUf6p~QEI!# zk{cfU(zpLnud@Ge>HFk4a>y`wEibGaK%=t>2?b3WR3H85wK81@4c~`sW5pNhW)Z6s za|Cu#%f%u|XL55#oMns6of3uNM`wUtb_<>7YDy4lFoB@eT-n=9o77F8SetNIJYnc} zng85&Al+ns{m0jO{9cdGBVlFQf9r3 zfsm$C(lUm*034lZ=%)wvhlU!g_Q;mG{H3UTvMif|?g?2!}DK{0ePMow@;TbK2Plkpk#@L3NfP|FOlLgjobNL7>d<~s( z%A7Z?iph{n@h+={;=IKKpb+2a*s#~hF`Qm4`QYNW@n2Cg>OG-~*N8>uU-cM)I+?)L z8jV5tje3KT>>;}2&-JmQ$2RxCP-Y0as0e~$QmaP>@0;suN_=w&!*D3b2-VWg*(!9! z2?Q&|a!+7G&+hr=zB5lPq;RTI9l^<=*v#%Ln{)R*|MG0riG0@x^z|$@`g%l>ug4&C z^Jol$2q=IgV!Sg`?a#ndte3sUp(9OBZ9Y$~J#%&O`->lb4Omv_JqA7lE8}~yss?f- zz$RXSc{25RqWY8``x*&X-NzYMGz^NPm1X>g0B@6i;8+>P) zWKR`3@EY@6{N%H{zq$YP(+g>gEH@9Md9Kpu`JtER>hnw(enZ?xtVUI;My-B1Zv`X) zpbJ4tcuX2)F2pT7o8Vo%;2&GHCIM9ts654?9>;i4J&yOMORa5fp3v;NP3vc{w|SS- zQI!O}#@8rjd4eu~)WNiju3J0P8P!XCD0aPebqBd?(P!Xcs{qJEcliNWYdz)%a=6oy zB^CI`oc-fZuI@+xdYZ}9f1{Q9JaHI*l4>(3D9Y%`KqH%iB0cqaDHP|UbJN4sfWs4T z2%0G}KGI##$nP-$&6yrtw{F_QxS>t!?Pe1XV!kzNNRw4-$JIz9X!)!eT>%dr0@j z=oTxp~&{53JO65i6jp=a;KHCUTJEi#ReWk{oVx1vJGbg;E1+GZV*U+QOK( z|6qS>+<^^iSk}m1kr|~^IJC!r6c~CFA#fz?Xx9UOmkq^)ZG^#JB+Jpb4I=8 ztdlu=)?1w{^gsCC+jg`sJ`Gh8!fG-rvGnk!ZCj$j=nF6-+K?kn2^Hmg0XOyWd*a-hu#ohIS&u@V2!sG9Hn*}q}`@KY$hNI{8d(e~Z-m+NHib3Hdc zvVQiSU2VfP6U$q1A=0mCz?5o73*{Ry@aoA3Q8B$BH;=dtU^a}IJie%w&5!i(p z=*zAnoQA&Q*vFc-jb?do)FnkzO5wd0|VrZTCGyi?`Gr z6caunlnMnqRu%5J&l`pwY?TcRw1hkMKe%z>+0*?X#m=Qys4DpoM6+plB)DnWft)8;ct;9v0UqHg4m!o4Q1qn>h$=^1JRjx2MNdp zJZp|z9-F$jr80H-6FZahzie68pZBs1<7sU!x!Sk&N43%r{wA(r)wW_&r+d@!OFcW@ zyESJ^Xi7FH+_1}TA3nA!UEX}l=$7Zsjo7ZT;xrt@9XcO4wFn>j}$jv8KkT+-p&a`N)v$Sqr{{`R@b;!{pJ);*U=ZCE$^DNYol zMK!T{AgwyaHqO5(+Z~d|dOh*Zw3Haz+p9Xl;G3Lbf2{w;=}c;D2c$A3KNWI1&=wen zKZE%Q$$@qsxMMj0E_!b9cP_K& z5d)=mMUD{`)=c7o7w{O~97H57H1l}h^R4%+cbgn?tl&0VDQ#%iy*q(0wlOImAN9I$ zl~CpHEq>vRv#KlTwmF;w&wTAa?uiV9ygGl+Uwx2lA!I{U=bT_Bb%PLHb_l=A27w%S zsVG3FFBo-W5ZW3*0y@ReFeQ8;zj~l(HQU|sKr~%E^wPQ3v%7lz*&;6}k~`cK`)<_1 zn&$ub{=t)L@|o#F7w&uf@{gyXYpHKddho)I+8To49GoBuF>UeQMQrhN_cTp!%W(0i z;>%XEKKvmsd+uCnd~a9h>HQmfBUhjM@Kdyrw1{?VeriXxZ2)Y&y7U|=lQ})VYC^gQ z^*FR9*C?K@kI4K{jiR0v;?e3IZYZX*Hk-*zo6W)5Eqj}R&C6QB7;*_Y-4+~w|0%g$T z0xOwc`ZBb)e*^j`q6i-%kH4%ofCo@&0}ZkuSum9>{)=n2Wc_VNaXn3%5tWA+avNtO z-oAD-*5a$7Of9wV)GcR^<`G?f`+t1;tN~yA-qoLA-ylyLQmDcz=oAs~?I=08Car9g zIK1Qvp$=YQEWE4NyMdIl-wkNQ&s)7SI_>dy52P`@j^Of-k`6$v&}<^yqJs0@bI~kOq*gnq_h7Fk*N+y`N~;*};oJzmyfy19@fe^i%U2 zpE@(#b@<^2gWdCO?YqX)M^1DfoX!HP{hO=Xh}Vf*pid3;CNwk;l;K)07Yn+eB^mH| z6vwkTRc|bTYu;gt*@14(4a9`WWVG;YBWvctP4Pl<2 zKfmwy-RDL!G;NIzZfhStH(yB%1EGT(s#l+;zC^^Jv;7FKopVjW08Ec_nyC7p1`mPK{ zSX#0Rn_fRNa&~PjoT(7V^bD!}%E=?5BM8JvKh_!EVI3-H5{<~USvZC!0vRTeOF zur!!8Sv`q@6m69ut+ozc!Tv8k>&=l0q8U@V3IGS%Hsvm>SRV?zX|%f=FHt^W-=4I ziG@(L&u@=~qDv%V0ZJzo^WpF#=f;veu83{m#JvLc(4*Lw)e{+ znWGpexF@Wof$8aCRa7|2DyaOLkFL$&D05`}<#;rV(+cp7go&sf$a|6wNhGZ#`a>k}!QRqbYD z!e`Yq+2n}WDM^CXxQ*}ISA&(QE?p)b0lPyPdmXDbyqF$oaWoU%;E?ew=XF?QW}>jF zJzz4MDs7{y`fqvp#_7w@Z~^;#i9$5ko{}K~W7}@Kw{_Ruv!&6ttjn+Ub$@j6r(fFB zd+M2m=<4l9`?L`2_VfJsb})Cu?Y>Qn5hwJgxQ4ga1&MT^aciV4dWj$3Lzo4xG~91w zI3q8ytEM~7-?V=wSL#f+hB(p{&R41mFAxN&MkGrrXYN?Hw|esj=4Wbq?)<>hlk3)5 zJ?Vg$7E1^BY#vIwHS`RTr3dK%@iNLCOfU)0s;kb@Tv>#>&xf$sperebMdVQ^1&=G`A zlP)JND+D8A&p{TAFpFx3*Ldc4^c$vm&}Q6LOkGVsf=E# zS)jivGSc6zNlh+IawnR7`GtjTIbLu&a%-kX!%9rCIin?iXtqGnzS>4&%%zzfVNGy^ zT5hUIuF;$0vfUkua#Gr#J=1UD%_iQQ8Y*eFkQQhP3BmU1yx?lxF_w0DVI!sNO9w(b z+n^azP0ihp)|bAzk@y;9{lLRO1-h4wyNzZ0xt~ zClAaI#G5-O&3xCIz3r(n)nddc8;wJP=ndw*Hk*UP0X-2o7>GMw@hU!?AW0}PS!t&& zG~{X9apj2@*Y>q_-~KO;%%)$x*w30ixV}cWc3K!C% z`%jZ=s<{`%h2B2Z3Fe`Y><(Dhb5K%9{@uLFo@_ThKgNe03XljqdXx^Q`J_a`q+v~0gP9v*HDTcKVAeZML|vG!1Ea(_={V{Z(t;jzUxfr^$5 zQ2L;dTGsh~Fu=Nxss{|Tm~|(%JjuF8&VrQc(}nP;3#1Mo>jJ3YCwwY+N>%B+XR3Qs zn@4a9?npA?j{2Gl&_`9BXwZIM(dmloZ*0JNQQN<{RRJ5?L! z^=e9cH8r@gn4FxLNCZ==Q`Fp%l9g|Y1}0a{goh4KBp7#8W`nBN1?_lFFSIC5%uQ>R z)j@%UlJ|I1VqzRN(PcbV1?K(GB8%;yW(~GRL=s(&dUE*CShvrQ{wLp#=M$m-J&%5a zq?W$3_$I!mE-3*yalMH6jthr5LlTAL@{XSC0T^V5oWMIS52UGAl8}ExQUxp6#i@2p z)jXYd*99dB?r4Ne|+3N*GmSA&<=2Jb_OUi{LRjf;Db|yTiODcjS z<#U3hT)L!YXBv{?{1XjHr9D;|Bvr;v6A$3`q5b9h=?=?ATwnZUMX67*0`15FE9X`0 zg^{(f+@785eePr!9@_79rn)D?#T}dH0`VSv-psgzQ7AM-oW7_JC~I#VRxjyu_@jQr z@jiIm}+F8~OyPy3pNE!`0)}ou6Rl*XlbOn_xFBX$3mme+%%~rcGylN6s z9kf4x@pmG0XXLRFXyrpcV_V-6XZmotk4E zz^bJ+KH_&_8sU+9j#Y}TP^w(OA*WgT{nD?9jl@CdK{<`=RyU+ropeD7EbNp(FaiD$ zp_Z)^qV?TQuu^s4vFxXGH)qt9DvBa7*e$YX_^Z*!&}b1rjBqsiC;PcOQdVJth5Uw9 zJppaTDOtImkwO6~%ZfAw8@{|AMz*o4$?WJ4`W%jgJHxxBsFzVW$q5^R2L`*UP>gel z;~vf7XDp6D1Ug<=4&R>~+ER&hWj!}+D6Q*_VRx?^6<8NP1=Ur~3wYvYSx7elW-MO{EtJ;N>M+qwyHUj%G(Y{vLjNzJ6Tq3VZL2tz605qu$L}Ps= zO-fXKa~s4+3H%zW0)Gsuz&lYNJ4z0b0AVjq7>Qt|(*2)n!n6@0d}EImpc~`z-ymsS zm>@U(^Y9WucfD#0S)tVQ+a|Cv2;w}-kiNVg=%S`=GwzR#p zQhvTfkeK8o(T*~VAcDO?6UwXKi5#9kjUA1G!=FZy>m$n5H&8^m`fdI9i}mP&8)gOySg1JrvWyV?yGN zfPOvVG$<@AQr&R8OMpPryy4jCV;h=>4go+m)08*7eyTch@@K!9Fkkr=p z&H!}4+6$96pj^?DtA)LM+eG({Gi|jqM;7XxNLGi{DQ7a#j^X}RHqsQ}C{}jaN&{;O z&P2fFY}q}Tqd1S4UbANP+}!M{MC+Osl_CJ!$?Cw=+FW&}Ng<4^=og{+QIryKVP@*4#)-+{QQQ75VS(&cXMb{QLJz0~twzt1QeNd-was z?)vc)s|)Mj_3+2B&-9&r>A;Q8-PqD~X8+GtQ&$2tA zIhwbeA6a$h&eqbpo@hBYO*o3)#;KsUwd;d=p4TEg_G-_ zy8Gx%24B1I*n!sCp+`6G{LoFkeW#zp6eZgoi+1J|s~|B}j&pLH3i}`;Ik~vHD-6w1 zoxP_ww;-fy2fzxD16IR_eV=#$`sI>_4p@x_gQ15bh*GdFjr=GYLrMLJdlH4 zDcnZV)147GWQ5N}9MDrNnB`EYWiVXZ?3(z{^xWp$n{0tN6RI0 zwUX_MLd%>3-?|!F@~NaMWh2tYwX0XJ8_nJ240_f8X5%I#vR;mB$UH$X~{4n@tn^(3M+6!8$l+t8Zz+qEtk-6b~ zx@%78p{Zb?6g6LzFV4j;=`ZW=hsRh&ja6j`<7s@ zs3b^8>i*zgwf)8pMYG|Q!>dH6XI90XGHzmFqgp0g%-coL$i|}%kL-rC2d}lA(*{T` z{~OkWC`xGEuftM32|>Y~1-}T%wLXtf5b;X-P!yt)9++ylR4LJXO-*M36)}>989Wjz+pMLxu>R{2847*yywZKL!2^ zfkI?}_xXaO8>FGRjjKoGY^c_%Ow8}tww4TKli4VoSVobl7Jq<3kpyg~1^WiEh1?H& zz9T4JE@zPS1^N?Y)zY#1?p15vcc^>t)L(3vzHPn*mKe(5anExWML)pvlGHY=$brFIw5g`rwNbFs-)kI;j5aY66>k}~qo>v% zTW_rczhBjlop?*e*08acgdZ%qd@vDlsD+%#1~bZ@A!7BlB!Jk#se4W^x10A&2>t7mlaV86KLGGMnW<%vJS>fVoUIIGjzD z#U#VIS>LL7c%nNA8L!9#Q!7Y9j8(0itZ2Lsn#14>FxYPBBX5D|t)Br_SCYn(p@T*n zHEI;)P-1Y*>t_8PN3c3D*yDDnOf0W)G-YNP3*FJIMF|u1g*t7CT!vT;h|OzvB+}`) z-$EI^`4*2ev1{eZn!jxihyC706?h6btqL}8zhMZYZlNl@OhSSA17E941GS}~kRL$~rY@!H z-_@H4e&Y#T2gXE%wip0og>?5Y<_4^Wz?eG%waV+@SiW3NA~?1UAg|jdRsoE;k~$cZ z)fF)2pPU)B02mWwmJ3B=@tEL>$0N}{1ILz@mfpKGL)*za?NP%`A2Gn0zdZK5eum4h ziO$98#`^(yfBBu5;Rq30oVL^GdU*f+@cAp`Tk!d#59^=Df!>8PV17+}YH=DQw&Uv4 zaWM8BvI-)Y;wC0%g*Bn{$ zRW&2R*_-}gb?%1j)Tx<7v~NpmC?Q5GJ|k%d|Y2j;o*rdM+&N8ZqK5GyX@fWZSFEK!W)22-1;l=-PKO78_pglbEG&cMc z-;;_wu=r08#NgZn+U+1{>YLd6UuU~WqbU{n+~QrI$ynO5yuHM!ok1o5UpD#Jq%Um4 z@;1@MY@{KXx4^!DAe^NO9RTgnYzvL)&R=8S{-w`PoALIkAf9Tc@PJ|x+)+PH6hme| zWi{?`I{ZbR7%Al_M?!^4y@lQhN5UmLS)vt=&kYB0Yc*zenPRpkfuq|OzOXff3kkO+ zq~QU-_f^KmLZhA8VKNGw4UU`wt%xid(AgNUYQQgpm7GGSl*71wrUUf?j04*ZWa^-fNPl!xrDufE@PZoZ95aieXm%9h|A#|2C@N5fzAgAPV@!^S zaIhznR2E>n@wC1Jjj^Y6M z>3e#qOCS%(W?|iaVECZnaTwQk$x`>hc(Jjbw;I;|nek(WUtKeP>&o?SUN_#kGX4WN zgKOn`$hTL<_ZVI^tOcxa#c-C`Ph2rTqK(d$x;Fmk`44#2m5_;A@8EwuA3|p(;aI^f znY>=n6VJyzzFalubNXU}Es<|3ByF}-soIogZ9$(aP-ra#0X2^y=KpH< zG1&)&4psiclTZ-}`KXyccK%;)M~0QvcmGjegcX5ZO~`_mer>q?XU31gI=wUgv6buJ zyly9^2r*A!fjB6Ls;g^2jV=mEBnBLv8@#2OuLj~m>`Em^Z2EjlGntV3U(gzo3$w#RAZfBI-Lf%_HI<_A7>)DnbJmBdYDjJ0dqo>d?BNV>s zgtG2obU^X{)^;uMQB`ODoO|!gWRl6uWHOmaW|GWICX?5^GI>oV50aP%AqgRbM-#+I zNCG4TA|VkGu~-!p7A?{TWi6#tyKQ}qFJvuJDchn&+ET3+gax!pZLN#Ax>ikQ|L4r) z1yR`kej9$5d+#^rp4a!CbH4Mv&ZMm+6V#amx<}p=4wV;|7$wTI>1B&t-5X|ST4PfY z!dq>(CHd^7jalyYTBk~>Rq0Ks$(E!*d4<(d;j?5_w#;oXtsDJ#^qtW+K{4FVM79i= z2ICDrtNQECE1(K8Ox}Yn)>!I=k<<$E<`lSY9Da@*o=7kKZXDi6j!nR2d&l8t$>X3Y z5%l${yh2GJpZ4};@-Kw zM2B0faU??8 zG-kNL$6|M9u5YWJov2U-3LGR@X;A{4;yr1)ingT8JQL!^!rq$24yNCcTeRl* zm;{8gib3>%ShnUnv9E*g3VOVb<9YpS49a~jWEw#0!`N?r?FuNv{(;aqTna@}Gwe@> z-!cyGBfD98@Bw?k2Z(_G2cJc%M_&)Ug#0PsZ%u-O4`6Wc0eb|G#Q27Adhh`p{xINF z>K})L4+y=4*~l3>ERKrDNhetcTA2{-PN9tOPzH#T2BVGeB*pkeP9Ru~_{xP1EjJEF z3bwHYnaCqP?tJ26R3jXT$10;zB_*iUwxX=qCdSQL0yjkAWHAN!Mh)5oH4YhsCHmmU3y)4zD{peYc(?TfGlP--(bzqCIrgLJSp0Y z86I7IgI_3@Y1GQtq;#XkWHhM2f6C)^v509CV^G=j#>CvhMfFjVF52iYIaA<8YRWEl zG~PRWV@-Nm_0p>9B^9ZNDg&GBbSHesW5v;Rx+JwcT9=rds!?d7(eNyWdu}5wOGdB4 zlL#aK+=@a#xoxtH@r;lwviYF!&sRVhMeGetz#09p)Qln~!KGv4xtv=!o?5zRJar$r zBlKsCdL3CM{s9(rOlQU9^i%g=Q{Lzmf=YUJ(jKd5((~vXCXduKPLW3n7bcrRjBMun zt8g6kT$=84>FY&9G(?Z_5IrJ#n@FNZJH$_=Qg8@vcqWb8N<=t>NMwwu!bnC>mk9^x zClL;ztOy*!Xy3Kja*LOy@(3e~uGzL5IO7(YvIO*YTNso7b!r;uaN7h_HlFs)38-}Y zIJ7Uo(sFw^nF7$o9OuKp;wu=9^3fICzpskhzefD~!mK!x*kI&A!W`ib#&+cxgG>|+ z#vQA2Mq%L$NRu)qT>iM|nsE(%D!&Dro07c1bS{6b->;93Ll7kqVTiqDI0+yv4K-o$ ztg`0JEJctN)$H$8aqmC6>mVI^0b*NNF{EW&;r~}!j8JazGjFf>Wk!wy^3Ujn-}=Uy z0{?Pal~HqpAMR>#%9*nx{(xgWA>9<|2|4Lo`U+;T(_zmcK*1MdOlU(-P(R>(*v;g~ zegJrQmvb(Z$ag<|nB8)uCjbx6dVphgqhv8=$yVXgM9eETJHefmEq7o}gvEw*Z=y0W zF%IFnm|Jaaa)-f^u2yHbbG#Vq+9# zfqXAQSpOf~he~!m^zinTiP_oCQY-Ac4cF{Egx0`!NO(wk6_|y)4=@-<&e9<0?cETM zt%X)XmWx(u|J@DfACQ_#uL2rQtqna)P9T@?-jdNlcyBpOj`O``c$Hu@&Q=LF^Y4IH zjR0Nd7R7dHF&QBDU{(az#aCD^&?!m}4|6uML8_c-gP*P;pYIgL1UhW9&U$w&4tIDa zU=+i?f`Wssz!Umf3HoRVb=WpP%)K$DTr_7bboIyRqueS%mYQ@YRcuZ!$Vy}p3ufka z`W|^CIZh9FVDlXV>Gmup>#_HpSe{@|#F=yu+pPQO)<%IvH>lcj-_9m0EC_WAN=jIMZi&0rP zo4jO?U#EdHY5jxk%pGac%C`K;88Ee0C)7W(aDp?=o3$YQ`iH+L_suW2$H=q}cvdM( z)k?jis=bi;Siprz?2OkjMmfE;)*WV)-%P?m63Ob6WX33$*BDjG+IsjiExv3yY+Hm_ zsEu{$;E(-tifu~p$H`t>e8uc^UtVmCGM&l&5*o#5ZAo!XN=aKObAo~;qh75w>%-i# zD#9)EC{TR=i}*U6>UWW+FiLDA0Tvw!qah4GPgUVr^otjmCk@~W_*gq{zl)`2v7}^= zj;B6NR`Fc8-;K;ap8E82_s!?5iewOrCnRijz8u4-AJ?S%E8so>u*>5n|;{qc=Xw{^}Yg3Kmt3mVZG6$Fa zOsodduMoon#@@PuV!z8g%`A`7)?p~VFRLRkYmUcy$qEP$gd#pwvBD$M%SO4umaQ}5 zV5;)M+*x|HH5o2R2?|~9q7?=1g^i`s%Nkf8B*a*f?fEW`H9acMtc#A%pHrM-^wbkd zeXzOmaht2lcvpJxOU>Kg3H{@iSh$L_9g zcUl@|RT&%=+#Dh|CRT~#rL?imKw?%ZG|ozRgkwb=3DAq7JJ<}!7FnTC@s;s8F0l9<-p`Zh78aRft~(26jjiZhME9UuN6d_MJ@CPpUyc?7-GSp89r*}1Zd6ChWU}jg*5ds!rJj49T9FN3FtugdlDx*^ zER8)8M~w=s#^M04G22mHS!c(UAbMunc8u@hJkM7V_6^0T^Q1E82?+ZftPb$`(?+ zH83|fYi40;dU>lSr`Bg?d>&4akUk}EBj-5eoQV@)ck>eB#C%@DGO~((!0p|}B~6^S zz~slc6Re35bvzAB)u6_zrl?SbL*~n^)exX)Ttmvt)zBVjbD?X0hH37;QkVOc+S;qC zVp-4qf1L)VrQ3uP(pj_wGNiD-0_!GzDrmUF!19N+rx@j!Wy6L@;fda05e)gv%movQ zLLqF2lvfs=YKX#Vb2QZiGc{8R+}U)x?Y6}WN;3l$i2?W%dy5lbKte@ly=Xk|g)&c6 zC^~RrnLSmZ)!9?z={d$IA;qqYQdpruutvwE7UrZiH_bHHC=m!YL2b%pL78HVu^Zlu zlHU!N?x^*we-JbN7}r{2)(hKgW8$0Q^o+@u)f2izC@uM+9cZ8)zEB(j0BbK!MjaCk zPu31_?v+u`q^ub$2E&bfL8q`7OogV@B^$muhsBm>G3OCm-eRg7v|s=1_0dLzvl0t> zj`mRTh67#ES!issarW+}qWw2}=T)R5Y(u;y3&&Vk;;Yx~yK&`n5A-HqSB}GYSiW&K z9I2I&_N0j<-=(MBA^IVl?bygKYj1YO)rm#Dz;XmC+CNJ`j#)h8I>cP7=$Vcse* z;tz+lw-hzF0{sgMJo9g^7xf4uE>;`jX$%U1M<9!1BA!4Tlf~?O0+C6}+3>{DI@$Mv z2k+*xRi!uf5#rq_yv_aY@{aQLN ziO&aMH&}jP)mrbjeqvi= z`+J%^?Hg$a@$Vn@1@@QH2OZIlLdUx>j(aRq%3PiKOxA5#`?5}Dw`4z(Q;>5*&ht4V zPPucI^IqpGh^1ZYTHxw&{n2&a^>^1l+%k8ZJH`FJ`%{nP(Rz|SS)Kw|Dpd;{{jCI|L^>#{O|fN`A3QiidPozEk0O0 z5^x3P1qK5<0tW(z1Ai^aE2$`HEa@+~t>o#Fzm)1rZz(gCJz8GHF%4`#w&|$%Mornr zBqfTY{Wp*ND8L?$xvoDodghB46c5T_8HV`hoIpT6@9<>&&Yp!RQVPCmx44hgiMz;p zStj0tWCP&4g&Oh@E{kx4*u=MqUbvHV;Bw>o6@8yLq-`W1mWJMezw-(yGc+o`Oj4vm z(g0iA1}PioVJ;=z5>DP?>G`*NkbWO26!ze>b$RFw#RalPI)HDCq4!|qC2` zJ)~4x8#*aJj;P+{q4VPY&{AkL%fTHzBrGBgLJ;RW?nD`8oP^v>4oho@MG6qPaDX_a zAgMr%c(brJbPSqqozz79ko|QC^GDA>+SNplkQCYDqzQVIZYh&Qix)$e;9=(%{)oQ0 zM4VzxXa}OB`^7E9CeKIzK>8zIByzmVg|lQBDA+BW4ZVRAP6{J^zl)WNQ$y9_?$D>K zt}Kl>N?K93J7tT3lcmIhYnilur{GH)p(#6^)8OeN{nZAqnIqUb!E>P-xjtAg?;bH8e2T}e(lz$NA9}GPV z`f`rpfZ<{Ch4NE4ZWtaWU%&&yGsB0}6grJ|^dT=?WU-_r9gN1t@C;mcfJRe<4?^$K zBcVUAwzBdR&yzZN5aog1*v0TZc4zbl8ZeE~8^by9FpO&ru61HJ_P*WN#{z$BEJzn{ zhR3DQ2|VxQW8+S82xaWVg%g6wA>jhX;(m-9Cs~H8oQ*f(Jkd%=fFCdDvoLgw%>i=f z7cUT^xG;JqBq<)8GXJxI{t*$y-_vgr8TOUCW#HwhC43i8U`&Lkg2?}y2w7gq){w~G zP3s5Ol1gIzTnLvTcZ$_kLgSEz2qTCROo)}wDl8lJl|Him=!rxw;=LHZOV|hAP97y8 znoWJQkQUP#I-j=FPI?QyT{tS75>AU5Rz1$SPqn7O*SEx4V;!++K zt##HFo!vpn!SDE?XKTCH8YJ`Ddh!4KHe0Z=-8}x-)81a<4oWN=e1X(k+mS(EBm>+z z$UEW=%3O`spqSCpHn%Ofsm2_vtZ6sfY}VS~i!E)z7i-M6_I7trK3+%Ebz^U0xV8#c zP@dxsMul^j*A}ca2TA+Ztt`KJZFXC5)7Gu#t!Tm6`-@ZG4^VPBpmH(*Jy3gqZfZeR zxY=!H2C&=gHq@}a#vN3;8t1juqKdY5NF@mGR!qw94|^H%cJ`-+B?LGgNr~r6xWdou zjO|O2XMw1xJn}4J{^k^l^wOj>GGd}jB5C9#jouo0R*-J`VB|T9WP!-T`70+qt4Ohs z6@kZ6t1y<2niPneB5)lqs~Xb(n_yKq2v6nZWCa-lZD+yXAshER#J2L`p9|0R&>Hk0 z)etoGR`_oB;;R9CF^KnNcH44HAR08xD2CN+YPn;z=_EI!e!ciL+=Hy16V%E2 zzm8NvqsDMC#OZ>Ko*~q#1ll?;a_&OC**F=(vj-Q;%Y(Kvn)0Ilb!f*w^9`0cHqAh5 zu?+n<-QPz5vY0<2W)vBs_A0<V!@%dwpoG7|V*XaloEykSavN-#e~9z- zZYP__9pru3;yzCWDpHBOL1k1<6*P(}X*79@yiH@EZwitpX)IM!4b{>(@@Mi6`8gz~ z7s#K;dD!2aCTGY=s)M!W)3DHg4mJhPkY^zY-9jEAhsZC;K^l)0<3;QdRxIrtl+POK z?eFf9_wt+2+ZWT&)jQZVylPp0&n+>16VFjAyL!5N`};dpE0+)U^sMghT;1K_Z zd{fV0@4%o`J3Kf5It1qfild-OXxjLn0NSMJa|)bY;?GQ0paNxv|5(~+(4mXa{?4J* wpk9gnfPC05w7++GCt!@m*@dIe`JMTvv4}ZrPbo)kEay2WK>*dE7G&1{0-11yUjP6A literal 0 HcmV?d00001 diff --git a/Resources/Fonts/GochiHand/OFL.txt b/Resources/Fonts/GochiHand/OFL.txt new file mode 100644 index 0000000..ffb8605 --- /dev/null +++ b/Resources/Fonts/GochiHand/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011, Juan Pablo del Peral (juan@huertatipografica.com.ar), +with Reserved Font Names "Gochi" and "Gochi Hand" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/Roboto/LICENSE.txt b/Resources/Fonts/Roboto/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/Resources/Fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Resources/Fonts/Roboto/RobotoMono-Regular.ttf b/Resources/Fonts/Roboto/RobotoMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7c4ce36a442d14eeb12444ad707c2afa19422fd8 GIT binary patch literal 86908 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