@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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 */ | |||
@@ -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; | |||
@@ -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: | |||
@@ -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 | |||
@@ -209,6 +214,19 @@ void Size<T>::shrinkBy(const T& divider) noexcept | |||
fHeight = static_cast<T>(fHeight/divider); | |||
} | |||
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 | |||
{ | |||
@@ -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); | |||
@@ -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); | |||
@@ -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)) | |||
@@ -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 | |||
@@ -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); | |||
@@ -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; | |||
@@ -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 | |||
@@ -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); | |||
} | |||
@@ -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); | |||
@@ -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(); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -91,7 +91,7 @@ public: | |||
} | |||
if (! hasTitle) | |||
fUI.setTitle(fUI.getName()); | |||
fUI.setTitle(DISTRHO_PLUGIN_NAME); | |||
} | |||
// ------------------------------------------------------------------- | |||