| @@ -0,0 +1,82 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "DemoWidgetBanner.h" | |||||
| #include "Cairo.hpp" | |||||
| #include "Window.hpp" | |||||
| static const char *banner = | |||||
| " " | |||||
| " * * * * * " | |||||
| " ** ** * * * * " | |||||
| " * * * * * * * " | |||||
| " * * * **** *** * **** * * ** **** * *** " | |||||
| " * * * * ** * * * * * * ** * " | |||||
| " * * ***** * * ****** * * * * * * * " | |||||
| " * * * * * * * * * * * * * * " | |||||
| " * * * ** * ** * * * * * * * * * * " | |||||
| " * * *** * *** * **** ** ** ***** ** * * " | |||||
| " " | |||||
| " " | |||||
| " " | |||||
| " ***** **** ***** " | |||||
| " * * * * * " | |||||
| " * * * * * " | |||||
| " * * * * * " | |||||
| " * * **** **** " | |||||
| " * * * * " | |||||
| " * * * * " | |||||
| " * * * * " | |||||
| " ***** * * " | |||||
| " "; | |||||
| enum { | |||||
| rows = 23, | |||||
| columns = 72, | |||||
| }; | |||||
| DemoWidgetBanner::DemoWidgetBanner(Widget *group) | |||||
| : Widget(group) | |||||
| { | |||||
| } | |||||
| void DemoWidgetBanner::onDisplay() | |||||
| { | |||||
| cairo_t *cr = getParentWindow().getGraphicsContext().cairo; | |||||
| Point<int> pt = getAbsolutePos(); | |||||
| Size<uint> sz = getSize(); | |||||
| int x = pt.getX(); | |||||
| int y = pt.getY(); | |||||
| int w = sz.getWidth(); | |||||
| int h = sz.getHeight(); | |||||
| double diameter = (double)w / columns; | |||||
| double radius = 0.5 * diameter; | |||||
| double xoff = 0; | |||||
| double yoff = 0.5 * (h - rows * diameter); | |||||
| for (int r = 0; r < rows; ++r) { | |||||
| for (int c = 0; c < columns; ++c) { | |||||
| double cx = x + xoff + radius + c * diameter; | |||||
| double cy = y + yoff + radius + r * diameter; | |||||
| char ch = banner[c + r * columns]; | |||||
| if (ch != ' ') | |||||
| cairo_set_source_rgb(cr, 0.5, 0.9, 0.2); | |||||
| else | |||||
| cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); | |||||
| cairo_save(cr); | |||||
| cairo_translate(cr, cx, cy); | |||||
| cairo_scale(cr, radius, radius); | |||||
| cairo_arc(cr, 0.0, 0.0, 1.0, 0.0, 2 * M_PI); | |||||
| cairo_restore(cr); | |||||
| cairo_fill(cr); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "Widget.hpp" | |||||
| class DemoWidgetBanner : public Widget { | |||||
| public: | |||||
| explicit DemoWidgetBanner(Widget *group); | |||||
| void onDisplay() override; | |||||
| }; | |||||
| @@ -0,0 +1,74 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "DemoWidgetClickable.h" | |||||
| #include "Cairo.hpp" | |||||
| #include "Window.hpp" | |||||
| DemoWidgetClickable::DemoWidgetClickable(Widget *group) | |||||
| : Widget(group) | |||||
| { | |||||
| } | |||||
| void DemoWidgetClickable::onDisplay() | |||||
| { | |||||
| cairo_t *cr = getParentWindow().getGraphicsContext().cairo; | |||||
| Point<int> pt = getAbsolutePos(); | |||||
| Size<uint> sz = getSize(); | |||||
| int x = pt.getX(); | |||||
| int y = pt.getY(); | |||||
| int w = sz.getWidth(); | |||||
| int h = sz.getHeight(); | |||||
| switch (colorid_) { | |||||
| case 0: | |||||
| cairo_set_source_rgb(cr, 0.75, 0.0, 0.0); | |||||
| break; | |||||
| case 1: | |||||
| cairo_set_source_rgb(cr, 0.0, 0.75, 0.0); | |||||
| break; | |||||
| case 2: | |||||
| cairo_set_source_rgb(cr, 0.0, 0.0, 0.75); | |||||
| break; | |||||
| } | |||||
| cairo_rectangle(cr, x, y, w, h); | |||||
| cairo_fill(cr); | |||||
| cairo_set_source_rgb(cr, 0.9, 0.9, 0.9); | |||||
| cairo_new_path(cr); | |||||
| cairo_move_to(cr, x + 0.25 * w, y + 0.25 * h); | |||||
| cairo_line_to(cr, x + 0.75 * w, y + 0.75 * h); | |||||
| cairo_stroke(cr); | |||||
| cairo_new_path(cr); | |||||
| cairo_move_to(cr, x + 0.75 * w, y + 0.25 * h); | |||||
| cairo_line_to(cr, x + 0.25 * w, y + 0.75 * h); | |||||
| cairo_stroke(cr); | |||||
| } | |||||
| bool DemoWidgetClickable::onMouse(const MouseEvent &event) | |||||
| { | |||||
| if (event.press) { | |||||
| Point<int> pos = getAbsolutePos(); | |||||
| Size<uint> size = getSize(); | |||||
| int mx = event.pos.getX(); | |||||
| int my = event.pos.getY(); | |||||
| int px = pos.getX(); | |||||
| int py = pos.getY(); | |||||
| bool inside = mx >= 0 && my >= 0 && | |||||
| mx < size.getWidth() && my < size.getHeight(); | |||||
| if (inside) { | |||||
| colorid_ = (colorid_ + 1) % 3; | |||||
| repaint(); | |||||
| } | |||||
| } | |||||
| return Widget::onMouse(event); | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "Widget.hpp" | |||||
| class DemoWidgetClickable : public Widget { | |||||
| public: | |||||
| explicit DemoWidgetClickable(Widget *group); | |||||
| void onDisplay() override; | |||||
| bool onMouse(const MouseEvent &event) override; | |||||
| private: | |||||
| unsigned colorid_ = 0; | |||||
| }; | |||||
| @@ -0,0 +1,118 @@ | |||||
| /* | |||||
| * DISTRHO Plugin Framework (DPF) | |||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||||
| * permission notice appear in all copies. | |||||
| * | |||||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||||
| */ | |||||
| /** | |||||
| The plugin name.@n | |||||
| This is used to identify your plugin before a Plugin instance can be created. | |||||
| @note This macro is required. | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_NAME "Cairo DPF example" | |||||
| /** | |||||
| Number of audio inputs the plugin has. | |||||
| @note This macro is required. | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 1 | |||||
| /** | |||||
| Number of audio outputs the plugin has. | |||||
| @note This macro is required. | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||||
| /** | |||||
| The plugin URI when exporting in LV2 format. | |||||
| @note This macro is required. | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_URI "urn:jpcima:cairo-dpf-example" | |||||
| /** | |||||
| Wherever the plugin has a custom %UI. | |||||
| @see DISTRHO_UI_USE_NANOVG | |||||
| @see UI | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||||
| /** | |||||
| Wherever the plugin processing is realtime-safe.@n | |||||
| TODO - list rtsafe requirements | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
| /** | |||||
| Wherever the plugin is a synth.@n | |||||
| @ref DISTRHO_PLUGIN_WANT_MIDI_INPUT is automatically enabled when this is too. | |||||
| @see DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||||
| /** | |||||
| Enable direct access between the %UI and plugin code. | |||||
| @see UI::getPluginInstancePointer() | |||||
| @note DO NOT USE THIS UNLESS STRICTLY NECESSARY!! | |||||
| Try to avoid it at all costs! | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 | |||||
| /** | |||||
| Wherever the plugin introduces latency during audio or midi processing. | |||||
| @see Plugin::setLatency(uint32_t) | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||||
| /** | |||||
| Wherever the plugin wants MIDI input.@n | |||||
| This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true. | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_MIDI_INPUT 0 | |||||
| /** | |||||
| Wherever the plugin wants MIDI output. | |||||
| @see Plugin::writeMidiEvent(const MidiEvent&) | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 | |||||
| /** | |||||
| Wherever the plugin provides its own internal programs. | |||||
| @see Plugin::initProgramName(uint32_t, String&) | |||||
| @see Plugin::loadProgram(uint32_t) | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_PROGRAMS 0 | |||||
| /** | |||||
| Wherever the plugin uses internal non-parameter data. | |||||
| @see Plugin::initState(uint32_t, String&, String&) | |||||
| @see Plugin::setState(const char*, const char*) | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_STATE 0 | |||||
| /** | |||||
| Wherever the plugin wants time position information from the host. | |||||
| @see Plugin::getTimePosition() | |||||
| */ | |||||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||||
| /** | |||||
| Wherever the %UI uses NanoVG for drawing instead of the default raw OpenGL calls.@n | |||||
| When enabled your %UI instance will subclass @ref NanoWidget instead of @ref Widget. | |||||
| */ | |||||
| #define DISTRHO_UI_USE_NANOVG 0 | |||||
| /** | |||||
| The %UI URI when exporting in LV2 format.@n | |||||
| By default this is set to @ref DISTRHO_PLUGIN_URI with "#UI" as suffix. | |||||
| */ | |||||
| #define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" | |||||
| @@ -0,0 +1,23 @@ | |||||
| Boost Software License - Version 1.0 - August 17th, 2003 | |||||
| Permission is hereby granted, free of charge, to any person or organization | |||||
| obtaining a copy of the software and accompanying documentation covered by | |||||
| this license (the "Software") to use, reproduce, display, distribute, | |||||
| execute, and transmit the Software, and to prepare derivative works of the | |||||
| Software, and to permit third-parties to whom the Software is furnished to | |||||
| do so, all subject to the following: | |||||
| The copyright notices in the Software and this entire statement, including | |||||
| the above license grant, this restriction and the following disclaimer, | |||||
| must be included in all copies of the Software, in whole or in part, and | |||||
| all derivative works of the Software, unless such copies or derivative | |||||
| works are solely in the form of machine-executable object code generated by | |||||
| a source language processor. | |||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |||||
| SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |||||
| FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |||||
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
| DEALINGS IN THE SOFTWARE. | |||||
| @@ -0,0 +1,56 @@ | |||||
| #!/usr/bin/make -f | |||||
| # Makefile for DISTRHO Plugins # | |||||
| # ---------------------------- # | |||||
| # Created by falkTX | |||||
| # | |||||
| # -------------------------------------------------------------- | |||||
| # Project name, used for binaries | |||||
| NAME = d_cairoui | |||||
| # -------------------------------------------------------------- | |||||
| # Files to build | |||||
| FILES_DSP = \ | |||||
| PluginMain.cc | |||||
| FILES_UI = \ | |||||
| DemoWidgetBanner.cc \ | |||||
| DemoWidgetClickable.cc \ | |||||
| PluginUI.cc | |||||
| # -------------------------------------------------------------- | |||||
| # Do some magic | |||||
| UI_TYPE = cairo | |||||
| include ../../Makefile.plugins.mk | |||||
| # -------------------------------------------------------------- | |||||
| # Enable all possible plugin types | |||||
| ifeq ($(HAVE_JACK),true) | |||||
| ifeq ($(HAVE_CAIRO),true) | |||||
| TARGETS += jack | |||||
| endif | |||||
| endif | |||||
| ifeq ($(LINUX),true) | |||||
| ifeq ($(HAVE_CAIRO),true) | |||||
| ifeq ($(HAVE_LIBLO),true) | |||||
| TARGETS += dssi | |||||
| endif | |||||
| endif | |||||
| endif | |||||
| ifeq ($(HAVE_CAIRO),true) | |||||
| TARGETS += lv2_sep | |||||
| else | |||||
| TARGETS += lv2_dsp | |||||
| endif | |||||
| TARGETS += vst | |||||
| all: $(TARGETS) | |||||
| # -------------------------------------------------------------- | |||||
| @@ -0,0 +1,60 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "PluginMain.h" | |||||
| #include <string.h> | |||||
| ExamplePlugin::ExamplePlugin() | |||||
| : Plugin(0, 0, 0) | |||||
| { | |||||
| } | |||||
| const char *ExamplePlugin::getLabel() const | |||||
| { | |||||
| return "Cairo DPF Example"; | |||||
| } | |||||
| const char *ExamplePlugin::getMaker() const | |||||
| { | |||||
| return "Jean Pierre Cimalando"; | |||||
| } | |||||
| const char *ExamplePlugin::getLicense() const | |||||
| { | |||||
| return "Boost Software License"; | |||||
| } | |||||
| uint32_t ExamplePlugin::getVersion() const | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| int64_t ExamplePlugin::getUniqueId() const | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| void ExamplePlugin::initParameter(uint32_t index, Parameter ¶meter) | |||||
| { | |||||
| } | |||||
| float ExamplePlugin::getParameterValue(uint32_t index) const | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| void ExamplePlugin::setParameterValue(uint32_t index, float value) | |||||
| { | |||||
| } | |||||
| void ExamplePlugin::run(const float **inputs, float **outputs, uint32_t frames) | |||||
| { | |||||
| memcpy(outputs[0], inputs[0], frames * sizeof(float)); | |||||
| } | |||||
| Plugin *DISTRHO::createPlugin() | |||||
| { | |||||
| return new ExamplePlugin; | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "DistrhoPlugin.hpp" | |||||
| class ExamplePlugin : public Plugin { | |||||
| public: | |||||
| ExamplePlugin(); | |||||
| const char *getLabel() const override; | |||||
| const char *getMaker() const override; | |||||
| const char *getLicense() const override; | |||||
| uint32_t getVersion() const override; | |||||
| int64_t getUniqueId() const override; | |||||
| void initParameter(uint32_t index, Parameter ¶meter) override; | |||||
| float getParameterValue(uint32_t index) const override; | |||||
| void setParameterValue(uint32_t index, float value) override; | |||||
| void run(const float **inputs, float **outputs, uint32_t frames) override; | |||||
| }; | |||||
| @@ -0,0 +1,45 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "PluginUI.h" | |||||
| #include "DemoWidgetClickable.h" | |||||
| #include "DemoWidgetBanner.h" | |||||
| #include "Window.hpp" | |||||
| ExampleUI::ExampleUI() | |||||
| : UI(200, 200) | |||||
| { | |||||
| DemoWidgetClickable *widget_clickable = new DemoWidgetClickable(this); | |||||
| widget_clickable_.reset(widget_clickable); | |||||
| widget_clickable->setSize(50, 50); | |||||
| widget_clickable->setAbsolutePos(100, 100); | |||||
| DemoWidgetBanner *widget_banner = new DemoWidgetBanner(this); | |||||
| widget_banner_.reset(widget_banner); | |||||
| widget_banner->setSize(180, 80); | |||||
| widget_banner->setAbsolutePos(10, 10); | |||||
| } | |||||
| ExampleUI::~ExampleUI() | |||||
| { | |||||
| } | |||||
| void ExampleUI::onDisplay() | |||||
| { | |||||
| cairo_t *cr = getParentWindow().getGraphicsContext().cairo; | |||||
| cairo_set_source_rgb(cr, 1.0, 0.8, 0.5); | |||||
| cairo_paint(cr); | |||||
| } | |||||
| void ExampleUI::parameterChanged(uint32_t index, float value) | |||||
| { | |||||
| } | |||||
| UI *DISTRHO::createUI() | |||||
| { | |||||
| return new ExampleUI; | |||||
| } | |||||
| @@ -0,0 +1,21 @@ | |||||
| // Copyright Jean Pierre Cimalando 2018. | |||||
| // Distributed under the Boost Software License, Version 1.0. | |||||
| // (See accompanying file LICENSE or copy at | |||||
| // http://www.boost.org/LICENSE_1_0.txt) | |||||
| #include "DistrhoUI.hpp" | |||||
| #include <memory> | |||||
| class DemoWidgetClickable; | |||||
| class DemoWidgetBanner; | |||||
| class ExampleUI : public UI { | |||||
| public: | |||||
| ExampleUI(); | |||||
| ~ExampleUI(); | |||||
| void onDisplay() override; | |||||
| void parameterChanged(uint32_t index, float value) override; | |||||
| private: | |||||
| std::unique_ptr<DemoWidgetClickable> widget_clickable_; | |||||
| std::unique_ptr<DemoWidgetBanner> widget_banner_; | |||||
| }; | |||||