From 3cac8c20be41ff5d9a4d096876ee7cfee85177b0 Mon Sep 17 00:00:00 2001 From: William Turner Date: Tue, 4 May 2021 00:46:44 -0400 Subject: [PATCH] Add license and readme --- LICENSE | 19 +++++++++++++++++++ README.md | 36 ++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 25211 bytes 3 files changed, 55 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 screenshot.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ddfb926 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2021 William Turner + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69efdc --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +AfinityEx +========= + +Primitive plugin injection system for Serif Affinity products. + +Greatly inspired by [BepInEx](https://github.com/BepInEx/BepInEx) and from +which the name is derived. [Harmony](https://github.com/pardeike/Harmony) is +used to hook into the original application code to wire plugins in relevant +places. + +This repository includes 2 proof of concept plugins demonstrating the +capabilities. One is bundled directly in the `Launcher` project to provide UI +feedback of which plugins are active. The other is in the `Plugins` project and +adds extra keyboard shorcuts to Affinity Designer that made the author's life +better and prompted this whole endeavour. + +No precompiled release will be provided at the moment since, while the author +has had good success so far, nothing is fully tested or vetted for daily usage. +You are encouraged to inspect, improve and compile the code yourself. + +![](/screenshot.png) + +Legal Disclaimer +---------------- + +This project is licensed under the [MIT license](/LICENSE). + +Use at your own risk, the author, contributors and Serif Europe Ltd. cannot be +held liable for corrupted files, loss of work or any other issue that could +arise by using the project and any derived plugin. You recognise that you are +"on your own" and that Serif will be unable to assist you in any way, support +will only be provided by the author and contributors on best effort basis. + +This project is not associated in any way with Serif Europe Ltd. + +"Serif" and "Affinity" are both registered trademarks of Serif Europe Ltd. \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ab363fc1c8086b16d13044f575af707684b1922f GIT binary patch literal 25211 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