summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfalkTX <falktx@gmail.com>2019-01-07 01:12:43 +0100
committerfalkTX <falktx@gmail.com>2019-01-07 01:12:43 +0100
commit7bf7a04f47be9bc3e7d832414d11f4c6af0080b6 (patch)
tree40a39afe186151abd55de159458fca7338d458d0
parent204fbeb807d604042c4cd3fcb076df7906521739 (diff)
Add CairoUI plugin example, WIP
Signed-off-by: falkTX <falktx@gmail.com>
-rw-r--r--examples/CairoUI/DemoWidgetBanner.cc82
-rw-r--r--examples/CairoUI/DemoWidgetBanner.h12
-rw-r--r--examples/CairoUI/DemoWidgetClickable.cc74
-rw-r--r--examples/CairoUI/DemoWidgetClickable.h16
-rw-r--r--examples/CairoUI/DistrhoPluginInfo.h118
-rw-r--r--examples/CairoUI/LICENSE23
-rw-r--r--examples/CairoUI/Makefile56
-rw-r--r--examples/CairoUI/PluginMain.cc60
-rw-r--r--examples/CairoUI/PluginMain.h20
-rw-r--r--examples/CairoUI/PluginUI.cc45
-rw-r--r--examples/CairoUI/PluginUI.h21
11 files changed, 527 insertions, 0 deletions
diff --git a/examples/CairoUI/DemoWidgetBanner.cc b/examples/CairoUI/DemoWidgetBanner.cc
new file mode 100644
index 00000000..f6a76876
--- /dev/null
+++ b/examples/CairoUI/DemoWidgetBanner.cc
@@ -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);
+ }
+ }
+}
diff --git a/examples/CairoUI/DemoWidgetBanner.h b/examples/CairoUI/DemoWidgetBanner.h
new file mode 100644
index 00000000..e02383df
--- /dev/null
+++ b/examples/CairoUI/DemoWidgetBanner.h
@@ -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;
+};
diff --git a/examples/CairoUI/DemoWidgetClickable.cc b/examples/CairoUI/DemoWidgetClickable.cc
new file mode 100644
index 00000000..7f2ecb75
--- /dev/null
+++ b/examples/CairoUI/DemoWidgetClickable.cc
@@ -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);
+}
diff --git a/examples/CairoUI/DemoWidgetClickable.h b/examples/CairoUI/DemoWidgetClickable.h
new file mode 100644
index 00000000..e73522ff
--- /dev/null
+++ b/examples/CairoUI/DemoWidgetClickable.h
@@ -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;
+};
diff --git a/examples/CairoUI/DistrhoPluginInfo.h b/examples/CairoUI/DistrhoPluginInfo.h
new file mode 100644
index 00000000..72b05cb7
--- /dev/null
+++ b/examples/CairoUI/DistrhoPluginInfo.h
@@ -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"
diff --git a/examples/CairoUI/LICENSE b/examples/CairoUI/LICENSE
new file mode 100644
index 00000000..36b7cd93
--- /dev/null
+++ b/examples/CairoUI/LICENSE
@@ -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.
diff --git a/examples/CairoUI/Makefile b/examples/CairoUI/Makefile
new file mode 100644
index 00000000..fc339040
--- /dev/null
+++ b/examples/CairoUI/Makefile
@@ -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)
+
+# --------------------------------------------------------------
diff --git a/examples/CairoUI/PluginMain.cc b/examples/CairoUI/PluginMain.cc
new file mode 100644
index 00000000..63180ba1
--- /dev/null
+++ b/examples/CairoUI/PluginMain.cc
@@ -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 &parameter)
+{
+}
+
+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;
+}
diff --git a/examples/CairoUI/PluginMain.h b/examples/CairoUI/PluginMain.h
new file mode 100644
index 00000000..cd4ca4b8
--- /dev/null
+++ b/examples/CairoUI/PluginMain.h
@@ -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 &parameter) 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;
+};
diff --git a/examples/CairoUI/PluginUI.cc b/examples/CairoUI/PluginUI.cc
new file mode 100644
index 00000000..ef86185c
--- /dev/null
+++ b/examples/CairoUI/PluginUI.cc
@@ -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;
+}
diff --git a/examples/CairoUI/PluginUI.h b/examples/CairoUI/PluginUI.h
new file mode 100644
index 00000000..2415d816
--- /dev/null
+++ b/examples/CairoUI/PluginUI.h
@@ -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_;
+ };