Browse Source

Add CairoUI plugin example, WIP

Signed-off-by: falkTX <falktx@gmail.com>
pull/99/head
falkTX 6 years ago
parent
commit
7bf7a04f47
Signed by: falkTX <falktx@gmail.com> GPG Key ID: 2D3445A829213837
11 changed files with 527 additions and 0 deletions
  1. +82
    -0
      examples/CairoUI/DemoWidgetBanner.cc
  2. +12
    -0
      examples/CairoUI/DemoWidgetBanner.h
  3. +74
    -0
      examples/CairoUI/DemoWidgetClickable.cc
  4. +16
    -0
      examples/CairoUI/DemoWidgetClickable.h
  5. +118
    -0
      examples/CairoUI/DistrhoPluginInfo.h
  6. +23
    -0
      examples/CairoUI/LICENSE
  7. +56
    -0
      examples/CairoUI/Makefile
  8. +60
    -0
      examples/CairoUI/PluginMain.cc
  9. +20
    -0
      examples/CairoUI/PluginMain.h
  10. +45
    -0
      examples/CairoUI/PluginUI.cc
  11. +21
    -0
      examples/CairoUI/PluginUI.h

+ 82
- 0
examples/CairoUI/DemoWidgetBanner.cc View File

@@ -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);
}
}
}

+ 12
- 0
examples/CairoUI/DemoWidgetBanner.h View File

@@ -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;
};

+ 74
- 0
examples/CairoUI/DemoWidgetClickable.cc View File

@@ -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);
}

+ 16
- 0
examples/CairoUI/DemoWidgetClickable.h View File

@@ -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;
};

+ 118
- 0
examples/CairoUI/DistrhoPluginInfo.h View File

@@ -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"

+ 23
- 0
examples/CairoUI/LICENSE View File

@@ -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.

+ 56
- 0
examples/CairoUI/Makefile View File

@@ -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)

# --------------------------------------------------------------

+ 60
- 0
examples/CairoUI/PluginMain.cc View File

@@ -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;
}

+ 20
- 0
examples/CairoUI/PluginMain.h View File

@@ -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;
};

+ 45
- 0
examples/CairoUI/PluginUI.cc View File

@@ -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;
}

+ 21
- 0
examples/CairoUI/PluginUI.h View File

@@ -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_;
};

Loading…
Cancel
Save