commit b9dcf5ca9f18801d1411525d3672628c08b84871
parent e06cb84757bc45c6e682d4e228c46e3d3d0f432e
Author: falkTX <falktx@gmail.com>
Date: Mon, 18 Aug 2014 20:04:32 +0100
Use uint for sizes; Some DPF UI class changes and docs
Diffstat:
18 files changed, 373 insertions(+), 259 deletions(-)
diff --git a/dgl/Geometry.hpp b/dgl/Geometry.hpp
@@ -91,6 +91,11 @@ public:
*/
void moveBy(const Point<T>& pos) noexcept;
+ /**
+ Return true if point is (0, 0).
+ */
+ bool isZero() const noexcept;
+
Point<T> operator+(const Point<T>& pos) noexcept;
Point<T> operator-(const Point<T>& pos) noexcept;
Point<T>& operator=(const Point<T>& pos) noexcept;
@@ -169,6 +174,16 @@ public:
*/
void shrinkBy(const T& divider) noexcept;
+ /**
+ Return true if size is null (0x0).
+ */
+ bool isNull() const noexcept;
+
+ /**
+ Return true if size is not null (0x0).
+ */
+ bool isNotNull() const noexcept;
+
Size<T> operator+(const Size<T>& size) noexcept;
Size<T> operator-(const Size<T>& size) noexcept;
Size<T>& operator=(const Size<T>& size) noexcept;
diff --git a/dgl/Image.hpp b/dgl/Image.hpp
@@ -47,13 +47,13 @@ public:
Constructor using raw image data.
@note: @a rawData must remain valid for the lifetime of this Image.
*/
- Image(const char* const rawData, const int width, const int height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE);
+ Image(const char* const rawData, const uint width, const uint height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE);
/**
Constructor using raw image data.
@note: @a rawData must remain valid for the lifetime of this Image.
*/
- Image(const char* const rawData, const Size<int>& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE);
+ Image(const char* const rawData, const Size<uint>& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE);
/**
Constructor using another image data.
@@ -69,13 +69,13 @@ public:
Load image data from memory.
@note: @a rawData must remain valid for the lifetime of this Image.
*/
- void loadFromMemory(const char* const rawData, const int width, const int height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept;
+ void loadFromMemory(const char* const rawData, const uint width, const uint height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept;
/**
Load image data from memory.
@note: @a rawData must remain valid for the lifetime of this Image.
*/
- void loadFromMemory(const char* const rawData, const Size<int>& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept;
+ void loadFromMemory(const char* const rawData, const Size<uint>& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept;
/**
Check if this image is valid.
@@ -85,17 +85,17 @@ public:
/**
Get width.
*/
- int getWidth() const noexcept;
+ uint getWidth() const noexcept;
/**
Get height.
*/
- int getHeight() const noexcept;
+ uint getHeight() const noexcept;
/**
Get size.
*/
- const Size<int>& getSize() const noexcept;
+ const Size<uint>& getSize() const noexcept;
/**
Get the raw image data.
@@ -133,7 +133,7 @@ public:
private:
const char* fRawData;
- Size<int> fSize;
+ Size<uint> fSize;
GLenum fFormat;
GLenum fType;
GLuint fTextureId;
diff --git a/dgl/ImageAboutWindow.hpp b/dgl/ImageAboutWindow.hpp
@@ -38,7 +38,7 @@ protected:
void onDisplay() override;
bool onKeyboard(const KeyboardEvent&) override;
bool onMouse(const MouseEvent&) override;
- void onReshape(int width, int height) override;
+ void onReshape(uint width, uint height) override;
private:
Image fImgBackground;
diff --git a/dgl/NanoVG.hpp b/dgl/NanoVG.hpp
@@ -45,7 +45,7 @@ public:
/**
Get size.
*/
- Size<int> getSize() const noexcept;
+ Size<uint> getSize() const noexcept;
/**
Update image data.
@@ -62,7 +62,7 @@ protected:
private:
NVGcontext* fContext;
int fImageId;
- Size<int> fSize;
+ Size<uint> fSize;
friend class NanoVG;
void _updateSize();
@@ -273,7 +273,7 @@ public:
Begin drawing a new frame.
@param withAlha Controls if drawing the shapes to the render target should be done using straight or pre-multiplied alpha.
*/
- void beginFrame(const int width, const int height, const float scaleFactor = 1.0f, const Alpha alpha = PREMULTIPLIED_ALPHA);
+ void beginFrame(const uint width, const uint height, const float scaleFactor = 1.0f, const Alpha alpha = PREMULTIPLIED_ALPHA);
/**
Begin drawing a new frame inside a widget.
@@ -505,7 +505,7 @@ public:
/**
Creates image from specified image data.
*/
- NanoImage* createImageRGBA(int w, int h, const uchar* data);
+ NanoImage* createImageRGBA(uint w, uint h, const uchar* data);
/* --------------------------------------------------------------------
* Paints */
diff --git a/dgl/Widget.hpp b/dgl/Widget.hpp
@@ -122,8 +122,8 @@ public:
@see onResize
*/
struct ResizeEvent {
- Size<int> size;
- Size<int> oldSize;
+ Size<uint> size;
+ Size<uint> oldSize;
};
/**
@@ -162,37 +162,37 @@ public:
/**
Get width.
*/
- int getWidth() const noexcept;
+ uint getWidth() const noexcept;
/**
Get height.
*/
- int getHeight() const noexcept;
+ uint getHeight() const noexcept;
/**
Get size.
*/
- const Size<int>& getSize() const noexcept;
+ const Size<uint>& getSize() const noexcept;
/**
Set width.
*/
- virtual void setWidth(int width) noexcept;
+ virtual void setWidth(uint width) noexcept;
/**
Set height.
*/
- virtual void setHeight(int height) noexcept;
+ virtual void setHeight(uint height) noexcept;
/**
Set size using @a width and @a height values.
*/
- virtual void setSize(int width, int height) noexcept;
+ virtual void setSize(uint width, uint height) noexcept;
/**
Set size.
*/
- virtual void setSize(const Size<int>& size) noexcept;
+ virtual void setSize(const Size<uint>& size) noexcept;
/**
Get absolute X.
@@ -317,7 +317,8 @@ private:
bool fNeedsFullViewport;
bool fNeedsScaling;
bool fVisible;
- Rectangle<int> fArea;
+ Point<int> fAbsolutePos;
+ Size<uint> fSize;
friend class CairoWidget;
friend class Window;
diff --git a/dgl/Window.hpp b/dgl/Window.hpp
@@ -48,8 +48,8 @@ public:
bool isResizable() const noexcept;
void setResizable(bool yesNo);
- int getWidth() const noexcept;
- int getHeight() const noexcept;
+ uint getWidth() const noexcept;
+ uint getHeight() const noexcept;
Size<uint> getSize() const noexcept;
void setSize(uint width, uint height);
void setSize(Size<uint> size);
@@ -67,7 +67,7 @@ public:
protected:
virtual void onDisplayBefore();
virtual void onDisplayAfter();
- virtual void onReshape(int width, int height);
+ virtual void onReshape(uint width, uint height);
virtual void onClose();
private:
diff --git a/dgl/src/Geometry.cpp b/dgl/src/Geometry.cpp
@@ -90,6 +90,11 @@ void Point<T>::moveBy(const Point<T>& pos) noexcept
fY = static_cast<T>(fY+pos.fY);
}
+template<typename T>
+bool Point<T>::isZero() const noexcept
+{
+ return fX == 0 && fY == 0;
+}
template<typename T>
Point<T> Point<T>::operator+(const Point<T>& pos) noexcept
@@ -210,6 +215,19 @@ void Size<T>::shrinkBy(const T& divider) noexcept
}
template<typename T>
+bool Size<T>::isNull() const noexcept
+{
+ return fWidth == 0 && fHeight == 0;
+}
+
+template<typename T>
+bool Size<T>::isNotNull() const noexcept
+{
+ return fWidth != 0 || fHeight != 0;
+}
+
+
+template<typename T>
Size<T> Size<T>::operator+(const Size<T>& size) noexcept
{
return Size<T>(fWidth+size.fWidth, fHeight+size.fHeight);
diff --git a/dgl/src/Image.cpp b/dgl/src/Image.cpp
@@ -31,7 +31,7 @@ Image::Image()
glGenTextures(1, &fTextureId);
}
-Image::Image(const char* const rawData, const int width, const int height, const GLenum format, const GLenum type)
+Image::Image(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type)
: fRawData(rawData),
fSize(width, height),
fFormat(format),
@@ -42,7 +42,7 @@ Image::Image(const char* const rawData, const int width, const int height, const
glGenTextures(1, &fTextureId);
}
-Image::Image(const char* const rawData, const Size<int>& size, const GLenum format, const GLenum type)
+Image::Image(const char* const rawData, const Size<uint>& size, const GLenum format, const GLenum type)
: fRawData(rawData),
fSize(size),
fFormat(format),
@@ -73,12 +73,12 @@ Image::~Image()
}
}
-void Image::loadFromMemory(const char* const rawData, const int width, const int height, const GLenum format, const GLenum type) noexcept
+void Image::loadFromMemory(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) noexcept
{
- loadFromMemory(rawData, Size<int>(width, height), format, type);
+ loadFromMemory(rawData, Size<uint>(width, height), format, type);
}
-void Image::loadFromMemory(const char* const rawData, const Size<int>& size, const GLenum format, const GLenum type) noexcept
+void Image::loadFromMemory(const char* const rawData, const Size<uint>& size, const GLenum format, const GLenum type) noexcept
{
fRawData = rawData;
fSize = size;
@@ -92,17 +92,17 @@ bool Image::isValid() const noexcept
return (fRawData != nullptr && fSize.getWidth() > 0 && fSize.getHeight() > 0);
}
-int Image::getWidth() const noexcept
+uint Image::getWidth() const noexcept
{
return fSize.getWidth();
}
-int Image::getHeight() const noexcept
+uint Image::getHeight() const noexcept
{
return fSize.getHeight();
}
-const Size<int>& Image::getSize() const noexcept
+const Size<uint>& Image::getSize() const noexcept
{
return fSize;
}
@@ -157,7 +157,7 @@ void Image::drawAt(const Point<int>& pos)
fIsReady = true;
}
- Rectangle<int>(pos, fSize).draw();
+ Rectangle<int>(pos, fSize.getWidth(), fSize.getHeight()).draw();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
diff --git a/dgl/src/ImageAboutWindow.cpp b/dgl/src/ImageAboutWindow.cpp
@@ -78,7 +78,7 @@ bool ImageAboutWindow::onMouse(const MouseEvent& ev)
return false;
}
-void ImageAboutWindow::onReshape(int width, int height)
+void ImageAboutWindow::onReshape(uint width, uint height)
{
Widget::setSize(width, height);
Window::onReshape(width, height);
diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp
@@ -86,7 +86,7 @@ NanoImage::~NanoImage()
nvgDeleteImage(fContext, fImageId);
}
-Size<int> NanoImage::getSize() const noexcept
+Size<uint> NanoImage::getSize() const noexcept
{
return fSize;
}
@@ -107,8 +107,13 @@ void NanoImage::_updateSize()
int w=0, h=0;
if (fContext != nullptr && fImageId != 0)
+ {
nvgImageSize(fContext, fImageId, &w, &h);
+ if (w < 0) w = 0;
+ if (h < 0) h = 0;
+ }
+
fSize.setSize(w, h);
}
@@ -139,11 +144,9 @@ NanoVG::~NanoVG()
// -----------------------------------------------------------------------
-void NanoVG::beginFrame(const int width, const int height, const float scaleFactor, const Alpha alpha)
+void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor, const Alpha alpha)
{
if (fContext == nullptr) return;
- DISTRHO_SAFE_ASSERT_RETURN(width > 0,);
- DISTRHO_SAFE_ASSERT_RETURN(height > 0,);
DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,);
DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,);
@@ -419,11 +422,9 @@ NanoImage* NanoVG::createImageMem(uchar* data, int ndata)
return nullptr;
}
-NanoImage* NanoVG::createImageRGBA(int w, int h, const uchar* data)
+NanoImage* NanoVG::createImageRGBA(uint w, uint h, const uchar* data)
{
if (fContext == nullptr) return nullptr;
- DISTRHO_SAFE_ASSERT_RETURN(w > 0, nullptr);
- DISTRHO_SAFE_ASSERT_RETURN(h > 0, nullptr);
DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, nullptr);
if (const int imageId = nvgCreateImageRGBA(fContext, w, h, data))
diff --git a/dgl/src/Widget.cpp b/dgl/src/Widget.cpp
@@ -27,7 +27,8 @@ Widget::Widget(Window& parent)
fNeedsFullViewport(false),
fNeedsScaling(false),
fVisible(true),
- fArea(),
+ fAbsolutePos(0, 0),
+ fSize(0, 0),
leakDetector_Widget()
{
fParent._addWidget(this);
@@ -62,66 +63,66 @@ void Widget::hide()
setVisible(false);
}
-int Widget::getWidth() const noexcept
+uint Widget::getWidth() const noexcept
{
- return fArea.getWidth();
+ return fSize.getWidth();
}
-int Widget::getHeight() const noexcept
+uint Widget::getHeight() const noexcept
{
- return fArea.getHeight();
+ return fSize.getHeight();
}
-const Size<int>& Widget::getSize() const noexcept
+const Size<uint>& Widget::getSize() const noexcept
{
- return fArea.getSize();
+ return fSize;
}
-void Widget::setWidth(int width) noexcept
+void Widget::setWidth(uint width) noexcept
{
- if (fArea.getWidth() == width)
+ if (fSize.getWidth() == width)
return;
ResizeEvent ev;
- ev.oldSize = fArea.getSize();
- ev.size = Size<int>(width, fArea.getHeight());
+ ev.oldSize = fSize;
+ ev.size = Size<uint>(width, fSize.getHeight());
- fArea.setWidth(width);
+ fSize.setWidth(width);
onResize(ev);
fParent.repaint();
}
-void Widget::setHeight(int height) noexcept
+void Widget::setHeight(uint height) noexcept
{
- if (fArea.getHeight() == height)
+ if (fSize.getHeight() == height)
return;
ResizeEvent ev;
- ev.oldSize = fArea.getSize();
- ev.size = Size<int>(fArea.getWidth(), height);
+ ev.oldSize = fSize;
+ ev.size = Size<uint>(fSize.getWidth(), height);
- fArea.setHeight(height);
+ fSize.setHeight(height);
onResize(ev);
fParent.repaint();
}
-void Widget::setSize(int width, int height) noexcept
+void Widget::setSize(uint width, uint height) noexcept
{
- setSize(Size<int>(width, height));
+ setSize(Size<uint>(width, height));
}
-void Widget::setSize(const Size<int>& size) noexcept
+void Widget::setSize(const Size<uint>& size) noexcept
{
- if (fArea.getSize() == size)
+ if (fSize == size)
return;
ResizeEvent ev;
- ev.oldSize = fArea.getSize();
- ev.size = size;
+ ev.oldSize = fSize;
+ ev.size = size;
- fArea.setSize(size);
+ fSize = size;
onResize(ev);
fParent.repaint();
@@ -129,34 +130,34 @@ void Widget::setSize(const Size<int>& size) noexcept
int Widget::getAbsoluteX() const noexcept
{
- return fArea.getX();
+ return fAbsolutePos.getX();
}
int Widget::getAbsoluteY() const noexcept
{
- return fArea.getY();
+ return fAbsolutePos.getY();
}
const Point<int>& Widget::getAbsolutePos() const noexcept
{
- return fArea.getPos();
+ return fAbsolutePos;
}
void Widget::setAbsoluteX(int x) noexcept
{
- if (fArea.getX() == x)
+ if (fAbsolutePos.getX() == x)
return;
- fArea.setX(x);
+ fAbsolutePos.setX(x);
fParent.repaint();
}
void Widget::setAbsoluteY(int y) noexcept
{
- if (fArea.getY() == y)
+ if (fAbsolutePos.getY() == y)
return;
- fArea.setY(y);
+ fAbsolutePos.setY(y);
fParent.repaint();
}
@@ -167,10 +168,10 @@ void Widget::setAbsolutePos(int x, int y) noexcept
void Widget::setAbsolutePos(const Point<int>& pos) noexcept
{
- if (fArea.getPos() == pos)
+ if (fAbsolutePos == pos)
return;
- fArea.setPos(pos);
+ fAbsolutePos = pos;
fParent.repaint();
}
@@ -186,7 +187,7 @@ Window& Widget::getParentWindow() const noexcept
bool Widget::contains(int x, int y) const noexcept
{
- return (x >= 0 && y >= 0 && x < fArea.getWidth() && y < fArea.getHeight());
+ return (x >= 0 && y >= 0 && static_cast<uint>(x) < fSize.getWidth() && static_cast<uint>(y) < fSize.getHeight());
}
bool Widget::contains(const Point<int>& pos) const noexcept
diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp
@@ -580,7 +580,7 @@ struct Window::PrivateData {
// reset color
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- if (widget->fNeedsFullViewport || widget->fArea == Rectangle<int>(0, 0, fView->width, fView->height))
+ if (widget->fNeedsFullViewport || (widget->fAbsolutePos.isZero() && widget->fSize == Size<uint>(fView->width, fView->height)))
{
// full viewport size
glViewport(0, 0, fView->width, fView->height);
@@ -919,13 +919,17 @@ void Window::setResizable(bool yesNo)
pData->setResizable(yesNo);
}
-int Window::getWidth() const noexcept
+uint Window::getWidth() const noexcept
{
+ DISTRHO_SAFE_ASSERT_RETURN(pData->fView->width >= 0, 0);
+
return pData->fView->width;
}
-int Window::getHeight() const noexcept
+uint Window::getHeight() const noexcept
{
+ DISTRHO_SAFE_ASSERT_RETURN(pData->fView->height >= 0, 0);
+
return pData->fView->height;
}
@@ -1009,7 +1013,7 @@ void Window::onDisplayAfter()
{
}
-void Window::onReshape(int width, int height)
+void Window::onReshape(uint width, uint height)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/distrho/DistrhoPlugin.hpp b/distrho/DistrhoPlugin.hpp
@@ -407,207 +407,209 @@ struct TimePosition {
class Plugin
{
public:
- /**
- Plugin class constructor.
- */
+ /**
+ Plugin class constructor.
+ */
Plugin(const uint32_t parameterCount, const uint32_t programCount, const uint32_t stateCount);
- /**
- Destructor.
- */
+ /**
+ Destructor.
+ */
virtual ~Plugin();
- /* --------------------------------------------------------------------------------------------------------
- * Host state */
+ /* --------------------------------------------------------------------------------------------------------
+ * Host state */
- /**
- Get the current buffer size that will probably be used during processing, in frames.
- This value will remain constant between activate and deactivate.
- @note: This value is only a hint!
- Hosts might call d_run() with a higher or lower number of frames.
- @see d_bufferSizeChanged()
- */
+ /**
+ Get the current buffer size that will probably be used during processing, in frames.
+ This value will remain constant between activate and deactivate.
+ @note: This value is only a hint!
+ Hosts might call d_run() with a higher or lower number of frames.
+ @see d_bufferSizeChanged(uint32_t)
+ */
uint32_t d_getBufferSize() const noexcept;
- /**
- Get the current sample rate that will be used during processing.
- This value will remain constant between activate and deactivate.
- @see d_sampleRateChanged()
- */
+ /**
+ Get the current sample rate that will be used during processing.
+ This value will remain constant between activate and deactivate.
+ @see d_sampleRateChanged(double)
+ */
double d_getSampleRate() const noexcept;
#if DISTRHO_PLUGIN_WANT_TIMEPOS
- /**
- Get the current host transport time position.
- This function should only be called during d_run().
- You can call this during other times, but the returned position is not guaranteed to be in sync.
- */
+ /**
+ Get the current host transport time position.
+ This function should only be called during d_run().
+ You can call this during other times, but the returned position is not guaranteed to be in sync.
+ @note: TimePos is not supported in LADSPA and DSSI plugin formats.
+ */
const TimePos& d_getTimePos() const noexcept;
#endif
#if DISTRHO_PLUGIN_WANT_LATENCY
- /**
- Change the plugin audio output latency to @a frames.
- This function should only be called in the constructor, d_activate() and d_run().
- */
+ /**
+ Change the plugin audio output latency to @a frames.
+ This function should only be called in the constructor, d_activate() and d_run().
+ */
void d_setLatency(const uint32_t frames) noexcept;
#endif
#if DISTRHO_PLUGIN_HAS_MIDI_OUTPUT
- /**
- Write a MIDI output event.
- This function must only be called during d_run().
- Returns false when the host buffer is full, in which case do not call this again until the next d_run().
- */
+ /**
+ Write a MIDI output event.
+ This function must only be called during d_run().
+ Returns false when the host buffer is full, in which case do not call this again until the next d_run().
+ */
bool d_writeMidiEvent(const MidiEvent& midiEvent) noexcept;
#endif
protected:
- /* --------------------------------------------------------------------------------------------------------
- * Information */
+ /* --------------------------------------------------------------------------------------------------------
+ * Information */
- /**
- Get the plugin name.
- Returns DISTRHO_PLUGIN_NAME by default.
- */
+ /**
+ Get the plugin name.
+ Returns DISTRHO_PLUGIN_NAME by default.
+ */
virtual const char* d_getName() const { return DISTRHO_PLUGIN_NAME; }
- /**
- Get the plugin label.
- A plugin label follows the same rules as Parameter::symbol, with the exception that it can start with numbers.
- */
+ /**
+ Get the plugin label.
+ A plugin label follows the same rules as Parameter::symbol, with the exception that it can start with numbers.
+ */
virtual const char* d_getLabel() const = 0;
- /**
- Get the plugin author/maker.
- */
+ /**
+ Get the plugin author/maker.
+ */
virtual const char* d_getMaker() const = 0;
- /**
- Get the plugin license name (a single line of text).
- */
+ /**
+ Get the plugin license name (a single line of text).
+ */
virtual const char* d_getLicense() const = 0;
- /**
- Get the plugin version, in hexadecimal.
- TODO format to be defined
- */
+ /**
+ Get the plugin version, in hexadecimal.
+ TODO format to be defined
+ */
virtual uint32_t d_getVersion() const = 0;
- /**
- Get the plugin unique Id.
- This value is used by LADSPA, DSSI and VST plugin formats.
- */
+ /**
+ Get the plugin unique Id.
+ This value is used by LADSPA, DSSI and VST plugin formats.
+ */
virtual int64_t d_getUniqueId() const = 0;
- /* --------------------------------------------------------------------------------------------------------
- * Init */
+ /* --------------------------------------------------------------------------------------------------------
+ * Init */
- /**
- Initialize the parameter @a index.
- This function will be called once, shortly after the plugin is created.
- */
+ /**
+ Initialize the parameter @a index.
+ This function will be called once, shortly after the plugin is created.
+ */
virtual void d_initParameter(uint32_t index, Parameter& parameter) = 0;
#if DISTRHO_PLUGIN_WANT_PROGRAMS
- /**
- Set the name of the program @a index.
- This function will be called once, shortly after the plugin is created.
- Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled.
- */
+ /**
+ Set the name of the program @a index.
+ This function will be called once, shortly after the plugin is created.
+ Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled.
+ */
virtual void d_initProgramName(uint32_t index, d_string& programName) = 0;
#endif
#if DISTRHO_PLUGIN_WANT_STATE
- /**
- Set the key name of the state @a index.
- This function will be called once, shortly after the plugin is created.
- Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled.
- */
+ /**
+ Set the key name of the state @a index.
+ This function will be called once, shortly after the plugin is created.
+ Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled.
+ */
virtual void d_initStateKey(uint32_t index, d_string& stateKey) = 0;
#endif
- /* --------------------------------------------------------------------------------------------------------
- * Internal data */
+ /* --------------------------------------------------------------------------------------------------------
+ * Internal data */
- /**
- Get a parameter value.
- The host may call this function from any context, including realtime processing.
- */
+ /**
+ Get the current value of a parameter.
+ The host may call this function from any context, including realtime processing.
+ */
virtual float d_getParameterValue(uint32_t index) const = 0;
- /**
- Set a parameter value.
- The host may call this function from any context, including realtime processing.
- When a parameter is marked as automable, you must ensure no non-realtime operations are called.
- @note This function will only be called for parameter inputs.
- */
+ /**
+ Change a parameter value.
+ The host may call this function from any context, including realtime processing.
+ When a parameter is marked as automable, you must ensure no non-realtime operations are called.
+ @note This function will only be called for parameter inputs.
+ */
virtual void d_setParameterValue(uint32_t index, float value) = 0;
#if DISTRHO_PLUGIN_WANT_PROGRAMS
- /**
- Change the currently used program to @a index.
- The host may call this function from any context, including realtime processing.
- Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled.
- */
+ /**
+ Change the currently used program to @a index.
+ The host may call this function from any context, including realtime processing.
+ Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled.
+ */
virtual void d_setProgram(uint32_t index) = 0;
#endif
#if DISTRHO_PLUGIN_WANT_STATE
- /**
- Change an internal state @a key to @a value.
- Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled.
- */
+ /**
+ Change an internal state @a key to @a value.
+ Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled.
+ */
virtual void d_setState(const char* key, const char* value) = 0;
#endif
- /* --------------------------------------------------------------------------------------------------------
- * Process */
+ /* --------------------------------------------------------------------------------------------------------
+ * Process */
- /**
- Activate this plugin.
- */
+ /**
+ Activate this plugin.
+ */
virtual void d_activate() {}
- /**
- Deactivate this plugin.
- */
+ /**
+ Deactivate this plugin.
+ */
virtual void d_deactivate() {}
#if DISTRHO_PLUGIN_HAS_MIDI_INPUT
- /**
- Run/process function for plugins with MIDI input.
- @note: Some parameters might be null if there are no audio inputs/outputs or MIDI events.
- */
- virtual void d_run(const float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) = 0;
+ /**
+ Run/process function for plugins with MIDI input.
+ @note: Some parameters might be null if there are no audio inputs/outputs or MIDI events.
+ */
+ virtual void d_run(const float** inputs, float** outputs, uint32_t frames,
+ const MidiEvent* midiEvents, uint32_t midiEventCount) = 0;
#else
- /**
- Run/process function for plugins without MIDI input.
- @note: Some parameters might be null if there are no audio inputs or outputs.
- */
+ /**
+ Run/process function for plugins without MIDI input.
+ @note: Some parameters might be null if there are no audio inputs or outputs.
+ */
virtual void d_run(const float** inputs, float** outputs, uint32_t frames) = 0;
#endif
- /* --------------------------------------------------------------------------------------------------------
- * Callbacks (optional) */
+ /* --------------------------------------------------------------------------------------------------------
+ * Callbacks (optional) */
- /**
- Optional callback to inform the plugin about a buffer size change.
- This function will only be called when the plugin is deactivated.
- @note: This value is only a hint!
- Hosts might call d_run() with a higher or lower number of frames.
- @see d_getBufferSize()
- */
+ /**
+ Optional callback to inform the plugin about a buffer size change.
+ This function will only be called when the plugin is deactivated.
+ @note: This value is only a hint!
+ Hosts might call d_run() with a higher or lower number of frames.
+ @see d_getBufferSize()
+ */
virtual void d_bufferSizeChanged(uint32_t newBufferSize);
- /**
- Optional callback to inform the plugin about a sample rate change.
- This function will only be called when the plugin is deactivated.
- @see d_getSampleRate()
- */
+ /**
+ Optional callback to inform the plugin about a sample rate change.
+ This function will only be called when the plugin is deactivated.
+ @see d_getSampleRate()
+ */
virtual void d_sampleRateChanged(double newSampleRate);
- // -------------------------------------------------------------------
+ // -------------------------------------------------------------------------------------------------------
private:
struct PrivateData;
diff --git a/distrho/DistrhoUI.hpp b/distrho/DistrhoUI.hpp
@@ -33,75 +33,146 @@ typedef DGL::Widget UIWidget;
START_NAMESPACE_DISTRHO
-// -----------------------------------------------------------------------
-// UI
+/* ------------------------------------------------------------------------------------------------------------
+ * DPF UI */
+/**
+ DPF UI class from where UI instances are created.
+
+ TODO.
+
+ you should not have to call setSize during construction,
+ that is handled by d_initSize
+ if you want to change size later on you should use setSize and then d_setSize to report to host
+ */
class UI : public UIWidget
{
public:
+ /**
+ UI class constructor.
+ */
UI();
+
+ /**
+ Destructor.
+ */
virtual ~UI();
- // -------------------------------------------------------------------
- // Host DSP State
+ /* --------------------------------------------------------------------------------------------------------
+ * Host DSP state */
+ /**
+ Get the current sample rate used in plugin processing.
+ @see d_sampleRateChanged(double)
+ */
double d_getSampleRate() const noexcept;
- void d_editParameter(const uint32_t index, const bool started);
- void d_setParameterValue(const uint32_t index, const float value);
+
+ /**
+ TODO: Document this.
+ */
+ void d_editParameter(const uint32_t index, const bool started);
+
+ /**
+ TODO: Document this.
+ */
+ void d_setParameterValue(const uint32_t index, const float value);
+
#if DISTRHO_PLUGIN_WANT_STATE
- void d_setState(const char* const key, const char* const value);
+ /**
+ TODO: Document this.
+ */
+ void d_setState(const char* const key, const char* const value);
#endif
+
#if DISTRHO_PLUGIN_IS_SYNTH
- void d_sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity);
+ /**
+ TODO: Document this.
+ */
+ void d_sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity);
#endif
- // -------------------------------------------------------------------
- // Host UI State
+ /* --------------------------------------------------------------------------------------------------------
+ * Host UI state */
+ /**
+ TODO: Document this.
+ never call this from the constructor
+ */
void d_setSize(const uint width, const uint height);
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
- // -------------------------------------------------------------------
- // Direct DSP access - DO NOT USE THIS UNLESS STRICTLY NECESSARY!!
+ /* --------------------------------------------------------------------------------------------------------
+ * Direct DSP access - DO NOT USE THIS UNLESS STRICTLY NECESSARY!! */
+ /**
+ TODO: Document this.
+ */
void* d_getPluginInstancePointer() const noexcept;
#endif
protected:
- // -------------------------------------------------------------------
- // Basic Information
-
- virtual const char* d_getName() const noexcept { return DISTRHO_PLUGIN_NAME; }
- virtual uint d_getWidth() const noexcept = 0;
- virtual uint d_getHeight() const noexcept = 0;
-
- // -------------------------------------------------------------------
- // DSP Callbacks
-
+ /* --------------------------------------------------------------------------------------------------------
+ * Init */
+
+ /**
+ Set the initial UI size.
+ This function will be called once, shortly after the UI is created.
+ @see d_setSize(uint,uint)
+ */
+ virtual void d_initSize(uint& width, uint& height) = 0;
+
+ /* --------------------------------------------------------------------------------------------------------
+ * DSP/Plugin Callbacks */
+
+ /**
+ A parameter has changed on the plugin side.
+ This is called by the host to inform the UI about parameter changes.
+ */
virtual void d_parameterChanged(uint32_t index, float value) = 0;
+
#if DISTRHO_PLUGIN_WANT_PROGRAMS
+ /**
+ The current program has changed on the plugin side.
+ This is called by the host to inform the UI about program changes.
+ */
virtual void d_programChanged(uint32_t index) = 0;
#endif
+
#if DISTRHO_PLUGIN_WANT_STATE
+ /**
+ A state has changed on the plugin side.
+ This is called by the host to inform the UI about state changes.
+ */
virtual void d_stateChanged(const char* key, const char* value) = 0;
#endif
- // -------------------------------------------------------------------
- // DSP Callbacks (optional)
+ /* --------------------------------------------------------------------------------------------------------
+ * DSP/Plugin Callbacks (optional) */
+ /**
+ Optional callback to inform the UI about a sample rate change on the plugin side.
+ @see d_getSampleRate()
+ */
virtual void d_sampleRateChanged(double newSampleRate);
- // -------------------------------------------------------------------
- // UI Callbacks (optional)
+ /* --------------------------------------------------------------------------------------------------------
+ * UI Callbacks (optional) */
+ /**
+ TODO: Document this.
+ */
virtual void d_uiIdle() {}
#if ! DISTRHO_UI_USE_NTK
- // updates window openGL state
- virtual void d_uiReshape(int width, int height);
+ /**
+ OpenGL reshape function, called when the host window is resized.
+ You can reimplement this function for a custom OpenGL state.
+ @see Window::onReshape(uint,uint)
+ */
+ virtual void d_uiReshape(uint width, uint height);
#endif
- // -------------------------------------------------------------------
+ // -------------------------------------------------------------------------------------------------------
private:
struct PrivateData;
@@ -120,12 +191,15 @@ private:
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI)
};
-// -----------------------------------------------------------------------
-// Create UI, entry point
+/* ------------------------------------------------------------------------------------------------------------
+ * Create UI, entry point */
+/**
+ TODO.
+ */
extern UI* createUI();
-// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------------------------------------------
END_NAMESPACE_DISTRHO
diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp
@@ -107,7 +107,7 @@ public:
if (const char* const name = jack_get_client_name(fClient))
fUI.setTitle(name);
else
- fUI.setTitle(DISTRHO_PLUGIN_NAME);
+ fUI.setTitle(fPlugin.getName());
fUI.exec(this);
}
diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp
@@ -99,7 +99,7 @@ void UI::d_sampleRateChanged(double) {}
// UI Callbacks (optional)
#if ! DISTRHO_UI_USE_NTK
-void UI::d_uiReshape(int width, int height)
+void UI::d_uiReshape(uint width, uint height)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp
@@ -62,6 +62,10 @@ struct UI::PrivateData {
void* dspPtr;
#endif
+ // UI
+ uint initialWidth;
+ uint initialHeight;
+
// Callbacks
editParamFunc editParamCallbackFunc;
setParamFunc setParamCallbackFunc;
@@ -76,6 +80,8 @@ struct UI::PrivateData {
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
dspPtr(d_lastUiDspPtr),
#endif
+ initialWidth(0),
+ initialHeight(0),
editParamCallbackFunc(nullptr),
setParamCallbackFunc(nullptr),
setStateCallbackFunc(nullptr),
@@ -128,6 +134,9 @@ struct UI::PrivateData {
void setSizeCallback(const uint width, const uint height)
{
+ DISTRHO_SAFE_ASSERT_RETURN(initialWidth != 0,);
+ DISTRHO_SAFE_ASSERT_RETURN(initialHeight != 0,);
+
if (setSizeCallbackFunc != nullptr)
setSizeCallbackFunc(ptr, width, height);
}
@@ -157,8 +166,8 @@ public:
{
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,);
- const int width = fUI->d_getWidth();
- const int height = fUI->d_getHeight();
+ uint width = 0, height = 0;
+ fUI->d_initSize(width, height);
// set widget size
fUI->setSize(width, height);
@@ -191,7 +200,7 @@ protected:
fIsReady = true;
}
#else
- void onReshape(int width, int height) override
+ void onReshape(uint width, uint height) override
{
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,);
@@ -237,25 +246,14 @@ public:
// -------------------------------------------------------------------
- const char* getName() const noexcept
- {
- DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, "");
-
- return fUI->d_getName();
- }
-
uint getWidth() const noexcept
{
- DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, 0);
-
- return fUI->d_getWidth();
+ return glWindow.getWidth();
}
uint getHeight() const noexcept
{
- DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, 0);
-
- return fUI->d_getHeight();
+ return glWindow.getHeight();
}
// -------------------------------------------------------------------
diff --git a/distrho/src/DistrhoUILV2.cpp b/distrho/src/DistrhoUILV2.cpp
@@ -91,7 +91,7 @@ public:
}
if (! hasTitle)
- fUI.setTitle(fUI.getName());
+ fUI.setTitle(DISTRHO_PLUGIN_NAME);
}
// -------------------------------------------------------------------