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 pt = getAbsolutePos(); + Size 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 pt = getAbsolutePos(); + Size 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 pos = getAbsolutePos(); + Size 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 + * + * 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 + +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; +} 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 ¶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; +}; 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 +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 widget_clickable_; + std::unique_ptr widget_banner_; + };