From a9a1b47a14ae9d57b16df11f944f7a19874c5bb6 Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 14 Jan 2015 18:47:31 +0000 Subject: [PATCH] dgl changes from Carla --- dgl/ImageKnob.hpp | 15 +++---- dgl/ImageSlider.hpp | 8 +--- dgl/ImageSwitch.hpp | 8 +--- dgl/NanoVG.hpp | 7 ++-- dgl/Widget.hpp | 61 +++++++++++++++++++++++++-- dgl/Window.hpp | 2 +- dgl/src/Color.cpp | 12 +++--- dgl/src/Geometry.cpp | 4 +- dgl/src/Image.cpp | 6 ++- dgl/src/ImageKnob.cpp | 60 ++++++++++++--------------- dgl/src/ImageSlider.cpp | 36 +++++----------- dgl/src/ImageSwitch.cpp | 18 +------- dgl/src/NanoVG.cpp | 84 ++++++++++++++++++++++++++++++++------ dgl/src/Widget.cpp | 11 +++++ dgl/src/Window.cpp | 78 +++++++++++++++++++++-------------- dgl/src/nanovg/fontstash.h | 8 ++-- 16 files changed, 256 insertions(+), 162 deletions(-) diff --git a/dgl/ImageKnob.hpp b/dgl/ImageKnob.hpp index 35638246..2dd26694 100644 --- a/dgl/ImageKnob.hpp +++ b/dgl/ImageKnob.hpp @@ -41,15 +41,12 @@ public: virtual void imageKnobValueChanged(ImageKnob* imageKnob, float value) = 0; }; - explicit ImageKnob(Window& parent, const Image& image, Orientation orientation = Vertical, int id = 0) noexcept; - explicit ImageKnob(Widget* widget, const Image& image, Orientation orientation = Vertical, int id = 0) noexcept; + explicit ImageKnob(Window& parent, const Image& image, Orientation orientation = Vertical) noexcept; + explicit ImageKnob(Widget* widget, const Image& image, Orientation orientation = Vertical) noexcept; explicit ImageKnob(const ImageKnob& imageKnob); ImageKnob& operator=(const ImageKnob& imageKnob); ~ImageKnob() override; - int getId() const noexcept; - void setId(int id) noexcept; - float getValue() const noexcept; void setDefault(float def) noexcept; @@ -70,7 +67,6 @@ protected: private: Image fImage; - int fId; float fMinimum; float fMaximum; float fStep; @@ -89,11 +85,10 @@ private: Callback* fCallback; bool fIsImgVertical; - int fImgLayerSize; - int fImgLayerCount; - Rectangle fKnobArea; - GLuint fTextureId; + uint fImgLayerSize; + uint fImgLayerCount; bool fIsReady; + GLuint fTextureId; float _logscale(float value) const; float _invlogscale(float value) const; diff --git a/dgl/ImageSlider.hpp b/dgl/ImageSlider.hpp index 613b25c6..e6f27163 100644 --- a/dgl/ImageSlider.hpp +++ b/dgl/ImageSlider.hpp @@ -36,14 +36,11 @@ public: virtual void imageSliderValueChanged(ImageSlider* imageSlider, float value) = 0; }; - explicit ImageSlider(Window& parent, const Image& image, int id = 0) noexcept; - explicit ImageSlider(Widget* widget, const Image& image, int id = 0) noexcept; + explicit ImageSlider(Window& parent, const Image& image) noexcept; + explicit ImageSlider(Widget* widget, const Image& image) noexcept; explicit ImageSlider(const ImageSlider& imageSlider) noexcept; ImageSlider& operator=(const ImageSlider& imageSlider) noexcept; - int getId() const noexcept; - void setId(int id) noexcept; - float getValue() const noexcept; void setStartPos(const Point& startPos) noexcept; @@ -65,7 +62,6 @@ protected: private: Image fImage; - int fId; float fMinimum; float fMaximum; float fStep; diff --git a/dgl/ImageSwitch.hpp b/dgl/ImageSwitch.hpp index bb963ac3..172d61cf 100644 --- a/dgl/ImageSwitch.hpp +++ b/dgl/ImageSwitch.hpp @@ -34,14 +34,11 @@ public: virtual void imageSwitchClicked(ImageSwitch* imageButton, bool down) = 0; }; - explicit ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown, int id = 0) noexcept; - explicit ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown, int id = 0) noexcept; + explicit ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept; + explicit ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept; explicit ImageSwitch(const ImageSwitch& imageSwitch) noexcept; ImageSwitch& operator=(const ImageSwitch& imageSwitch) noexcept; - int getId() const noexcept; - void setId(int id) noexcept; - bool isDown() const noexcept; void setDown(bool down) noexcept; @@ -55,7 +52,6 @@ private: Image fImageNormal; Image fImageDown; bool fIsDown; - int fId; Callback* fCallback; diff --git a/dgl/NanoVG.hpp b/dgl/NanoVG.hpp index 32d467d0..1135f55f 100644 --- a/dgl/NanoVG.hpp +++ b/dgl/NanoVG.hpp @@ -258,7 +258,7 @@ public: /** Destructor. */ - ~NanoVG(); + virtual ~NanoVG(); /** Get the NanoVG context. @@ -641,7 +641,7 @@ public: Creates font by loading it from the specified memory chunk. Returns handle to the font. */ - FontId createFontMem(const char* name, uchar* data, int ndata, bool freeData); + FontId createFontMem(const char* name, const uchar* data, int ndata, bool freeData); /** Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. @@ -761,7 +761,8 @@ public: */ NanoWidget(Window& parent) : Widget(parent), - NanoVG() + NanoVG(), + leakDetector_NanoWidget() { setNeedsScaling(true); } diff --git a/dgl/Widget.hpp b/dgl/Widget.hpp index 57ac7aca..faed6b57 100644 --- a/dgl/Widget.hpp +++ b/dgl/Widget.hpp @@ -53,12 +53,17 @@ class Widget public: /** Base event data. - @a mod The currently active keyboard modifiers. + @a mod The currently active keyboard modifiers, @see Modifier. @a time The timestamp (if any). */ struct BaseEvent { - Modifier mod; + uint mod; uint32_t time; + + /** Constuctor */ + BaseEvent() noexcept : mod(0x0), time(0) {} + /** Destuctor */ + virtual ~BaseEvent() noexcept {} }; /** @@ -70,6 +75,12 @@ public: struct KeyboardEvent : BaseEvent { bool press; uint key; + + /** Constuctor */ + KeyboardEvent() noexcept + : BaseEvent(), + press(false), + key(0) {} }; /** @@ -80,7 +91,13 @@ public: */ struct SpecialEvent : BaseEvent { bool press; - Key key; + Key key; + + /** Constuctor */ + SpecialEvent() noexcept + : BaseEvent(), + press(false), + key(Key(0)) {} }; /** @@ -91,9 +108,16 @@ public: @see onMouse */ struct MouseEvent : BaseEvent { - int button; + int button; bool press; Point pos; + + /** Constuctor */ + MouseEvent() noexcept + : BaseEvent(), + button(0), + press(false), + pos(0, 0) {} }; /** @@ -103,6 +127,11 @@ public: */ struct MotionEvent : BaseEvent { Point pos; + + /** Constuctor */ + MotionEvent() noexcept + : BaseEvent(), + pos(0, 0) {} }; /** @@ -114,6 +143,12 @@ public: struct ScrollEvent : BaseEvent { Point pos; Point delta; + + /** Constuctor */ + ScrollEvent() noexcept + : BaseEvent(), + pos(0, 0), + delta(0.0f, 0.0f) {} }; /** @@ -125,6 +160,11 @@ public: struct ResizeEvent { Size size; Size oldSize; + + /** Constuctor */ + ResizeEvent() noexcept + : size(0, 0), + oldSize(0, 0) {} }; /** @@ -256,6 +296,18 @@ public: */ void repaint() noexcept; + /** + Get the Id associated with this widget. + @see setId + */ + uint getId() const noexcept; + + /** + Set an Id to be associated with this widget. + @see getId + */ + void setId(uint id) noexcept; + protected: /** A function called to draw the view contents with OpenGL. @@ -318,6 +370,7 @@ private: bool fNeedsFullViewport; bool fNeedsScaling; bool fVisible; + uint fId; Point fAbsolutePos; Size fSize; diff --git a/dgl/Window.hpp b/dgl/Window.hpp index 89e91dee..f93e29f1 100644 --- a/dgl/Window.hpp +++ b/dgl/Window.hpp @@ -56,7 +56,7 @@ public: void setTitle(const char* title); - void setTransientWinId(intptr_t winId); + void setTransientWinId(uintptr_t winId); App& getApp() const noexcept; intptr_t getWindowId() const noexcept; diff --git a/dgl/src/Color.cpp b/dgl/src/Color.cpp index 91c03ec0..57b8c075 100644 --- a/dgl/src/Color.cpp +++ b/dgl/src/Color.cpp @@ -125,27 +125,27 @@ Color Color::fromHTML(const char* rgb, float alpha) if (rgblen == 3) { rgbtmp[0] = rgb[0]; - r = std::strtol(rgbtmp, nullptr, 16); + r = static_cast(std::strtol(rgbtmp, nullptr, 16)); rgbtmp[0] = rgb[1]; - g = std::strtol(rgbtmp, nullptr, 16); + g = static_cast(std::strtol(rgbtmp, nullptr, 16)); rgbtmp[0] = rgb[2]; - b = std::strtol(rgbtmp, nullptr, 16); + b = static_cast(std::strtol(rgbtmp, nullptr, 16)); } else { rgbtmp[0] = rgb[0]; rgbtmp[1] = rgb[1]; - r = std::strtol(rgbtmp, nullptr, 16); + r = static_cast(std::strtol(rgbtmp, nullptr, 16)); rgbtmp[0] = rgb[2]; rgbtmp[1] = rgb[3]; - g = std::strtol(rgbtmp, nullptr, 16); + g = static_cast(std::strtol(rgbtmp, nullptr, 16)); rgbtmp[0] = rgb[4]; rgbtmp[1] = rgb[5]; - b = std::strtol(rgbtmp, nullptr, 16); + b = static_cast(std::strtol(rgbtmp, nullptr, 16)); } return Color(r, g, b, static_cast(getFixedRange(alpha)*255.0f)); diff --git a/dgl/src/Geometry.cpp b/dgl/src/Geometry.cpp index 2b351c5d..6964816a 100644 --- a/dgl/src/Geometry.cpp +++ b/dgl/src/Geometry.cpp @@ -641,13 +641,13 @@ Circle& Circle::operator=(const Circle& cir) noexcept template bool Circle::operator==(const Circle& cir) const noexcept { - return (fPos == cir.fPos && fSize == cir.fSize && fNumSegments == cir.fNumSegments); + return (fPos == cir.fPos && d_isEqual(fSize, cir.fSize) && fNumSegments == cir.fNumSegments); } template bool Circle::operator!=(const Circle& cir) const noexcept { - return (fPos != cir.fPos || fSize != cir.fSize || fNumSegments != cir.fNumSegments); + return (fPos != cir.fPos || d_isNotEqual(fSize, cir.fSize) || fNumSegments != cir.fNumSegments); } template diff --git a/dgl/src/Image.cpp b/dgl/src/Image.cpp index 55ee0af5..74dceede 100644 --- a/dgl/src/Image.cpp +++ b/dgl/src/Image.cpp @@ -152,12 +152,14 @@ void Image::drawAt(const Point& pos) glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fSize.getWidth(), fSize.getHeight(), 0, fFormat, fType, fRawData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + static_cast(fSize.getWidth()), static_cast(fSize.getHeight()), 0, + fFormat, fType, fRawData); fIsReady = true; } - Rectangle(pos, fSize.getWidth(), fSize.getHeight()).draw(); + Rectangle(pos, static_cast(fSize.getWidth()), static_cast(fSize.getHeight())).draw(); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); diff --git a/dgl/src/ImageKnob.cpp b/dgl/src/ImageKnob.cpp index 0fc8c69b..57dae6ad 100644 --- a/dgl/src/ImageKnob.cpp +++ b/dgl/src/ImageKnob.cpp @@ -22,10 +22,9 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation, int id) noexcept +ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation) noexcept : Widget(parent), fImage(image), - fId(id), fMinimum(0.0f), fMaximum(1.0f), fStep(0.0f), @@ -43,19 +42,17 @@ ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation fIsImgVertical(image.getHeight() > image.getWidth()), fImgLayerSize(fIsImgVertical ? image.getWidth() : image.getHeight()), fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerSize : image.getWidth()/fImgLayerSize), - fKnobArea(0, 0, fImgLayerSize, fImgLayerSize), - fTextureId(0), fIsReady(false), + fTextureId(0), leakDetector_ImageKnob() { glGenTextures(1, &fTextureId); setSize(fImgLayerSize, fImgLayerSize); } -ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation, int id) noexcept +ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation) noexcept : Widget(widget->getParentWindow()), fImage(image), - fId(id), fMinimum(0.0f), fMaximum(1.0f), fStep(0.0f), @@ -73,9 +70,8 @@ ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation fIsImgVertical(image.getHeight() > image.getWidth()), fImgLayerSize(fIsImgVertical ? image.getWidth() : image.getHeight()), fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerSize : image.getWidth()/fImgLayerSize), - fKnobArea(0, 0, fImgLayerSize, fImgLayerSize), - fTextureId(0), fIsReady(false), + fTextureId(0), leakDetector_ImageKnob() { glGenTextures(1, &fTextureId); @@ -85,7 +81,6 @@ ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation ImageKnob::ImageKnob(const ImageKnob& imageKnob) : Widget(imageKnob.getParentWindow()), fImage(imageKnob.fImage), - fId(imageKnob.fId), fMinimum(imageKnob.fMinimum), fMaximum(imageKnob.fMaximum), fStep(imageKnob.fStep), @@ -103,9 +98,8 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob) fIsImgVertical(imageKnob.fIsImgVertical), fImgLayerSize(imageKnob.fImgLayerSize), fImgLayerCount(imageKnob.fImgLayerCount), - fKnobArea(imageKnob.fKnobArea), - fTextureId(0), fIsReady(false), + fTextureId(0), leakDetector_ImageKnob() { glGenTextures(1, &fTextureId); @@ -115,7 +109,6 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob) ImageKnob& ImageKnob::operator=(const ImageKnob& imageKnob) { fImage = imageKnob.fImage; - fId = imageKnob.fId; fMinimum = imageKnob.fMinimum; fMaximum = imageKnob.fMaximum; fStep = imageKnob.fStep; @@ -133,7 +126,6 @@ ImageKnob& ImageKnob::operator=(const ImageKnob& imageKnob) fIsImgVertical = imageKnob.fIsImgVertical; fImgLayerSize = imageKnob.fImgLayerSize; fImgLayerCount = imageKnob.fImgLayerCount; - fKnobArea = imageKnob.fKnobArea; fIsReady = false; if (fTextureId != 0) @@ -157,16 +149,6 @@ ImageKnob::~ImageKnob() } } -int ImageKnob::getId() const noexcept -{ - return fId; -} - -void ImageKnob::setId(int id) noexcept -{ - fId = id; -} - float ImageKnob::getValue() const noexcept { return fValue; @@ -220,12 +202,12 @@ void ImageKnob::setStep(float step) noexcept // NOTE: value is assumed to be scaled if using log void ImageKnob::setValue(float value, bool sendCallback) noexcept { - if (fValue == value) + if (d_isEqual(fValue, value)) return; fValue = value; - if (fStep == 0.0f) + if (d_isZero(fStep)) fValueTmp = value; if (fRotationAngle == 0) @@ -288,36 +270,44 @@ void ImageKnob::onDisplay() glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - int imageDataOffset = 0; + uint imageDataOffset = 0; if (fRotationAngle == 0) { - int layerDataSize = fImgLayerSize * fImgLayerSize * ((fImage.getFormat() == GL_BGRA || fImage.getFormat() == GL_RGBA) ? 4 : 3); - imageDataOffset = layerDataSize * int(normValue * float(fImgLayerCount-1)); + DISTRHO_SAFE_ASSERT_RETURN(fImgLayerCount > 0,); + DISTRHO_SAFE_ASSERT_RETURN(normValue >= 0.0f,); + + const uint layerDataSize = fImgLayerSize * fImgLayerSize * ((fImage.getFormat() == GL_BGRA || fImage.getFormat() == GL_RGBA) ? 4 : 3); + /* */ imageDataOffset = layerDataSize * uint(normValue * float(fImgLayerCount-1)); } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, fImage.getFormat(), fImage.getType(), fImage.getRawData() + imageDataOffset); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + static_cast(getWidth()), static_cast(getHeight()), 0, + fImage.getFormat(), fImage.getType(), fImage.getRawData() + imageDataOffset); fIsReady = true; } + const int w = static_cast(getWidth()); + const int h = static_cast(getHeight()); + if (fRotationAngle != 0) { glPushMatrix(); - const GLint w2 = getWidth()/2; - const GLint h2 = getHeight()/2; + const int w2 = w/2; + const int h2 = h/2; glTranslatef(static_cast(w2), static_cast(h2), 0.0f); glRotatef(normValue*static_cast(fRotationAngle), 0.0f, 0.0f, 1.0f); - Rectangle(-w2, -h2, getWidth(), getHeight()).draw(); + Rectangle(-w2, -h2, w, h).draw(); glPopMatrix(); } else { - Rectangle(0, 0, getWidth(), getHeight()).draw(); + Rectangle(0, 0, w, h).draw(); } glBindTexture(GL_TEXTURE_2D, 0); @@ -403,7 +393,7 @@ bool ImageKnob::onMotion(const MotionEvent& ev) { fValueTmp = value = fMaximum; } - else if (fStep != 0.0f) + else if (d_isNotZero(fStep)) { fValueTmp = value; const float rest = std::fmod(value, fStep); @@ -437,7 +427,7 @@ bool ImageKnob::onScroll(const ScrollEvent& ev) { fValueTmp = value = fMaximum; } - else if (fStep != 0.0f) + else if (d_isNotZero(fStep)) { fValueTmp = value; const float rest = std::fmod(value, fStep); diff --git a/dgl/src/ImageSlider.cpp b/dgl/src/ImageSlider.cpp index b9ae84e5..12f7b371 100644 --- a/dgl/src/ImageSlider.cpp +++ b/dgl/src/ImageSlider.cpp @@ -22,10 +22,9 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -ImageSlider::ImageSlider(Window& parent, const Image& image, int id) noexcept +ImageSlider::ImageSlider(Window& parent, const Image& image) noexcept : Widget(parent), fImage(image), - fId(id), fMinimum(0.0f), fMaximum(1.0f), fStep(0.0f), @@ -44,10 +43,9 @@ ImageSlider::ImageSlider(Window& parent, const Image& image, int id) noexcept Widget::setNeedsFullViewport(true); } -ImageSlider::ImageSlider(Widget* widget, const Image& image, int id) noexcept +ImageSlider::ImageSlider(Widget* widget, const Image& image) noexcept : Widget(widget->getParentWindow()), fImage(image), - fId(id), fMinimum(0.0f), fMaximum(1.0f), fStep(0.0f), @@ -69,7 +67,6 @@ ImageSlider::ImageSlider(Widget* widget, const Image& image, int id) noexcept ImageSlider::ImageSlider(const ImageSlider& imageSlider) noexcept : Widget(imageSlider.getParentWindow()), fImage(imageSlider.fImage), - fId(imageSlider.fId), fMinimum(imageSlider.fMinimum), fMaximum(imageSlider.fMaximum), fStep(imageSlider.fStep), @@ -91,7 +88,6 @@ ImageSlider::ImageSlider(const ImageSlider& imageSlider) noexcept ImageSlider& ImageSlider::operator=(const ImageSlider& imageSlider) noexcept { fImage = imageSlider.fImage; - fId = imageSlider.fId; fMinimum = imageSlider.fMinimum; fMaximum = imageSlider.fMaximum; fStep = imageSlider.fStep; @@ -109,16 +105,6 @@ ImageSlider& ImageSlider::operator=(const ImageSlider& imageSlider) noexcept return *this; } -int ImageSlider::getId() const noexcept -{ - return fId; -} - -void ImageSlider::setId(int id) noexcept -{ - fId = id; -} - float ImageSlider::getValue() const noexcept { return fValue; @@ -193,12 +179,12 @@ void ImageSlider::setStep(float step) noexcept void ImageSlider::setValue(float value, bool sendCallback) noexcept { - if (fValue == value) + if (d_isEqual(fValue, value)) return; fValue = value; - if (fStep == 0.0f) + if (d_isZero(fStep)) fValueTmp = value; repaint(); @@ -224,7 +210,7 @@ void ImageSlider::onDisplay() glColor4f(1.0f, 1.0f, 1.0f, 1.0f); #endif - float normValue = (fValue - fMinimum) / (fMaximum - fMinimum); + const float normValue = (fValue - fMinimum) / (fMaximum - fMinimum); int x, y; @@ -292,7 +278,7 @@ bool ImageSlider::onMouse(const MouseEvent& ev) { fValueTmp = value = fMaximum; } - else if (fStep != 0.0f) + else if (d_isNotZero(fStep)) { fValueTmp = value; const float rest = std::fmod(value, fStep); @@ -361,7 +347,7 @@ bool ImageSlider::onMotion(const MotionEvent& ev) { fValueTmp = value = fMaximum; } - else if (fStep != 0.0f) + else if (d_isNotZero(fStep)) { fValueTmp = value; const float rest = std::fmod(value, fStep); @@ -395,16 +381,16 @@ void ImageSlider::_recheckArea() noexcept // horizontal fSliderArea = Rectangle(fStartPos.getX(), fStartPos.getY(), - fEndPos.getX() + fImage.getWidth() - fStartPos.getX(), - fImage.getHeight()); + fEndPos.getX() + static_cast(fImage.getWidth()) - fStartPos.getX(), + static_cast(fImage.getHeight())); } else { // vertical fSliderArea = Rectangle(fStartPos.getX(), fStartPos.getY(), - fImage.getWidth(), - fEndPos.getY() + fImage.getHeight() - fStartPos.getY()); + static_cast(fImage.getWidth()), + fEndPos.getY() + static_cast(fImage.getHeight()) - fStartPos.getY()); } } diff --git a/dgl/src/ImageSwitch.cpp b/dgl/src/ImageSwitch.cpp index bd99786f..37b3e56f 100644 --- a/dgl/src/ImageSwitch.cpp +++ b/dgl/src/ImageSwitch.cpp @@ -20,12 +20,11 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -ImageSwitch::ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown, int id) noexcept +ImageSwitch::ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept : Widget(parent), fImageNormal(imageNormal), fImageDown(imageDown), fIsDown(false), - fId(id), fCallback(nullptr), leakDetector_ImageSwitch() { @@ -34,12 +33,11 @@ ImageSwitch::ImageSwitch(Window& parent, const Image& imageNormal, const Image& setSize(fImageNormal.getSize()); } -ImageSwitch::ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown, int id) noexcept +ImageSwitch::ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept : Widget(widget->getParentWindow()), fImageNormal(imageNormal), fImageDown(imageDown), fIsDown(false), - fId(id), fCallback(nullptr), leakDetector_ImageSwitch() { @@ -53,7 +51,6 @@ ImageSwitch::ImageSwitch(const ImageSwitch& imageSwitch) noexcept fImageNormal(imageSwitch.fImageNormal), fImageDown(imageSwitch.fImageDown), fIsDown(imageSwitch.fIsDown), - fId(imageSwitch.fId), fCallback(imageSwitch.fCallback), leakDetector_ImageSwitch() { @@ -67,7 +64,6 @@ ImageSwitch& ImageSwitch::operator=(const ImageSwitch& imageSwitch) noexcept fImageNormal = imageSwitch.fImageNormal; fImageDown = imageSwitch.fImageDown; fIsDown = imageSwitch.fIsDown; - fId = imageSwitch.fId; fCallback = imageSwitch.fCallback; DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); @@ -77,16 +73,6 @@ ImageSwitch& ImageSwitch::operator=(const ImageSwitch& imageSwitch) noexcept return *this; } -int ImageSwitch::getId() const noexcept -{ - return fId; -} - -void ImageSwitch::setId(int id) noexcept -{ - fId = id;; -} - bool ImageSwitch::isDown() const noexcept { return fIsDown; diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp index bb7b9f1d..0b780804 100644 --- a/dgl/src/NanoVG.cpp +++ b/dgl/src/NanoVG.cpp @@ -18,8 +18,32 @@ #include "../Window.hpp" // ----------------------------------------------------------------------- +// Ignore some warnings if debugging + +#ifdef DEBUG +# define NANOVG_GL3 0 +# define NANOVG_GLES2 0 +# define NANOVG_GLES3 0 +# define NANOVG_GL_USE_UNIFORMBUFFER 0 +# if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Weverything" +# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wall" +# pragma GCC diagnostic ignored "-Wextra" +# pragma GCC diagnostic ignored "-Wconversion" +# pragma GCC diagnostic ignored "-Weffc++" +# pragma GCC diagnostic ignored "-Wsign-conversion" +# pragma GCC diagnostic ignored "-Wundef" +# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +// ----------------------------------------------------------------------- +// Include NanoVG OpenGL implementation -#define NANOVG_GL2_IMPLEMENTATION +#define NANOVG_GL2_IMPLEMENTATION 1 #include "nanovg/nanovg_gl.h" #if defined(NANOVG_GL2) @@ -36,6 +60,19 @@ # define nvgDeleteGL nvgDeleteGLES3 #endif +// ----------------------------------------------------------------------- +// Restore normal state if debugging + +#ifdef DEBUG +# if defined(__clang__) +# pragma clang diagnostic pop +# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +# endif +#endif + +// ----------------------------------------------------------------------- + START_NAMESPACE_DGL // ----------------------------------------------------------------------- @@ -75,7 +112,8 @@ NanoVG::Paint::operator NVGpaint() const noexcept NanoImage::NanoImage(NVGcontext* const context, const int imageId) noexcept : fContext(context), fImageId(imageId), - fSize() + fSize(), + leakDetector_NanoImage() { _updateSize(); } @@ -114,7 +152,7 @@ void NanoImage::_updateSize() if (h < 0) h = 0; } - fSize.setSize(w, h); + fSize.setSize(static_cast(w), static_cast(h)); } // ----------------------------------------------------------------------- @@ -122,14 +160,16 @@ void NanoImage::_updateSize() NanoVG::NanoVG() : fContext(nvgCreateGL(512, 512, NVG_ANTIALIAS)), - fInFrame(false) + fInFrame(false), + leakDetector_NanoVG() { DISTRHO_SAFE_ASSERT_RETURN(fContext != nullptr,); } NanoVG::NanoVG(const int textAtlasWidth, const int textAtlasHeight) : fContext(nvgCreateGL(textAtlasWidth, textAtlasHeight, NVG_ANTIALIAS)), - fInFrame(false) + fInFrame(false), + leakDetector_NanoVG() { DISTRHO_SAFE_ASSERT_RETURN(fContext != nullptr,); } @@ -151,7 +191,7 @@ void NanoVG::beginFrame(const uint width, const uint height, const float scaleFa DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); fInFrame = true; - nvgBeginFrame(fContext, width, height, scaleFactor, static_cast(alpha)); + nvgBeginFrame(fContext, static_cast(width), static_cast(height), scaleFactor, static_cast(alpha)); } void NanoVG::beginFrame(Widget* const widget) @@ -163,7 +203,7 @@ void NanoVG::beginFrame(Widget* const widget) Window& window(widget->getParentWindow()); fInFrame = true; - nvgBeginFrame(fContext, window.getWidth(), window.getHeight(), 1.0f, NVG_PREMULTIPLIED_ALPHA); + nvgBeginFrame(fContext, static_cast(window.getWidth()), static_cast(window.getHeight()), 1.0f, NVG_PREMULTIPLIED_ALPHA); } void NanoVG::endFrame() @@ -209,7 +249,17 @@ void NanoVG::strokeColor(const Color& color) void NanoVG::strokeColor(const int red, const int green, const int blue, const int alpha) { if (fContext != nullptr) - nvgStrokeColor(fContext, nvgRGBA(red, green, blue, alpha)); + { + DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); + + nvgStrokeColor(fContext, nvgRGBA(static_cast(red), + static_cast(green), + static_cast(blue), + static_cast(alpha))); + } } void NanoVG::strokeColor(const float red, const float green, const float blue, const float alpha) @@ -233,7 +283,17 @@ void NanoVG::fillColor(const Color& color) void NanoVG::fillColor(const int red, const int green, const int blue, const int alpha) { if (fContext != nullptr) - nvgFillColor(fContext, nvgRGBA(red, green, blue, alpha)); + { + DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); + + nvgFillColor(fContext, nvgRGBA(static_cast(red), + static_cast(green), + static_cast(blue), + static_cast(alpha))); + } } void NanoVG::fillColor(const float red, const float green, const float blue, const float alpha) @@ -427,7 +487,7 @@ NanoImage* NanoVG::createImageRGBA(uint w, uint h, const uchar* data) if (fContext == nullptr) return nullptr; DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, nullptr); - if (const int imageId = nvgCreateImageRGBA(fContext, w, h, data)) + if (const int imageId = nvgCreateImageRGBA(fContext, static_cast(w), static_cast(h), data)) return new NanoImage(fContext, imageId); return nullptr; @@ -576,13 +636,13 @@ NanoVG::FontId NanoVG::createFont(const char* name, const char* filename) return nvgCreateFont(fContext, name, filename); } -NanoVG::FontId NanoVG::createFontMem(const char* name, uchar* data, int ndata, bool freeData) +NanoVG::FontId NanoVG::createFontMem(const char* name, const uchar* data, int ndata, bool freeData) { if (fContext == nullptr) return -1; DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, -1); - return nvgCreateFontMem(fContext, name, data, ndata, freeData); + return nvgCreateFontMem(fContext, name, const_cast(data), ndata, freeData); } NanoVG::FontId NanoVG::findFont(const char* name) diff --git a/dgl/src/Widget.cpp b/dgl/src/Widget.cpp index 6013ea28..d2898b3f 100644 --- a/dgl/src/Widget.cpp +++ b/dgl/src/Widget.cpp @@ -27,6 +27,7 @@ Widget::Widget(Window& parent) fNeedsFullViewport(false), fNeedsScaling(false), fVisible(true), + fId(0), fAbsolutePos(0, 0), fSize(0, 0), leakDetector_Widget() @@ -200,6 +201,16 @@ void Widget::repaint() noexcept fParent.repaint(); } +uint Widget::getId() const noexcept +{ + return fId; +} + +void Widget::setId(uint id) noexcept +{ + fId = id; +} + bool Widget::onKeyboard(const KeyboardEvent&) { return false; diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp index 7a751e2a..492e8287 100644 --- a/dgl/src/Window.cpp +++ b/dgl/src/Window.cpp @@ -70,6 +70,7 @@ struct Window::PrivateData { fUsingEmbed(false), fWidth(1), fHeight(1), + fWidgets(), fModal(), #if defined(DISTRHO_OS_WINDOWS) hwnd(0), @@ -97,6 +98,7 @@ struct Window::PrivateData { fUsingEmbed(false), fWidth(1), fHeight(1), + fWidgets(), fModal(parent.pData), #if defined(DISTRHO_OS_WINDOWS) hwnd(0), @@ -134,6 +136,7 @@ struct Window::PrivateData { fUsingEmbed(parentId != 0), fWidth(1), fHeight(1), + fWidgets(), fModal(), #if defined(DISTRHO_OS_WINDOWS) hwnd(0), @@ -177,7 +180,7 @@ struct Window::PrivateData { } puglInitResizable(fView, fResizable); - puglInitWindowSize(fView, fWidth, fHeight); + puglInitWindowSize(fView, static_cast(fWidth), static_cast(fHeight)); puglSetHandle(fView, this); puglSetDisplayFunc(fView, onDisplayCallback); @@ -554,7 +557,7 @@ struct Window::PrivateData { #endif } - void setTransientWinId(const intptr_t winId) + void setTransientWinId(const uintptr_t winId) { #if defined(DISTRHO_OS_LINUX) XSetTransientForHint(xDisplay, xWindow, static_cast< ::Window>(winId)); @@ -611,7 +614,7 @@ struct Window::PrivateData { // ------------------------------------------------------------------- - void onDisplay() + void onPuglDisplay() { fSelf->onDisplayBefore(); @@ -629,22 +632,35 @@ struct Window::PrivateData { if (widget->fNeedsFullViewport || (widget->fAbsolutePos.isZero() && widget->fSize == Size(fWidth, fHeight))) { // full viewport size - glViewport(0, 0, fWidth, fHeight); + glViewport(0, + 0, + static_cast(fWidth), + static_cast(fHeight)); } else if (! widget->fNeedsScaling) { // only set viewport pos - glViewport(widget->getAbsoluteX(), /*fView->height - widget->getHeight()*/ - widget->getAbsoluteY(), fWidth, fHeight); + glViewport(widget->getAbsoluteX(), + /*fView->height - static_cast(widget->getHeight())*/ - widget->getAbsoluteY(), + static_cast(fWidth), + static_cast(fHeight)); // then cut the outer bounds - glScissor(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); + glScissor(widget->getAbsoluteX(), + fView->height - static_cast(widget->getHeight()) - widget->getAbsoluteY(), + static_cast(widget->getWidth()), + static_cast(widget->getHeight())); + glEnable(GL_SCISSOR_TEST); needsDisableScissor = true; } else { // limit viewport to widget bounds - glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); + glViewport(widget->getAbsoluteX(), + fView->height - static_cast(widget->getHeight()) - widget->getAbsoluteY(), + static_cast(widget->getWidth()), + static_cast(widget->getHeight())); } // display widget @@ -661,7 +677,7 @@ struct Window::PrivateData { fSelf->onDisplayAfter(); } - void onKeyboard(const bool press, const uint key) + void onPuglKeyboard(const bool press, const uint key) { DBGp("PUGL: onKeyboard : %i %i\n", press, key); @@ -683,7 +699,7 @@ struct Window::PrivateData { } } - void onSpecial(const bool press, const Key key) + void onPuglSpecial(const bool press, const Key key) { DBGp("PUGL: onSpecial : %i %i\n", press, key); @@ -705,7 +721,7 @@ struct Window::PrivateData { } } - void onMouse(const int button, const bool press, const int x, const int y) + void onPuglMouse(const int button, const bool press, const int x, const int y) { DBGp("PUGL: onMouse : %i %i %i %i\n", button, press, x, y); @@ -732,7 +748,7 @@ struct Window::PrivateData { } } - void onMotion(const int x, const int y) + void onPuglMotion(const int x, const int y) { DBGp("PUGL: onMotion : %i %i\n", x, y); @@ -754,7 +770,7 @@ struct Window::PrivateData { } } - void onScroll(const int x, const int y, const float dx, const float dy) + void onPuglScroll(const int x, const int y, const float dx, const float dy) { DBGp("PUGL: onScroll : %i %i %f %f\n", x, y, dx, dy); @@ -777,28 +793,28 @@ struct Window::PrivateData { } } - void onReshape(const int width, const int height) + void onPuglReshape(const int width, const int height) { DBGp("PUGL: onReshape : %i %i\n", width, height); if (width <= 1 && height <= 1) return; - fWidth = width; - fHeight = height; + fWidth = static_cast(width); + fHeight = static_cast(height); - fSelf->onReshape(width, height); + fSelf->onReshape(fWidth, fHeight); FOR_EACH_WIDGET(it) { Widget* const widget(*it); if (widget->fNeedsFullViewport) - widget->setSize(width, height); + widget->setSize(fWidth, fHeight); } } - void onClose() + void onPuglClose() { DBG("PUGL: onClose\n"); @@ -808,7 +824,7 @@ struct Window::PrivateData { fSelf->onClose(); if (fModal.childFocus != nullptr) - fModal.childFocus->onClose(); + fModal.childFocus->fSelf->onClose(); close(); } @@ -847,6 +863,8 @@ struct Window::PrivateData { DISTRHO_SAFE_ASSERT(! enabled); DISTRHO_SAFE_ASSERT(childFocus == nullptr); } + + DISTRHO_DECLARE_NON_COPY_STRUCT(Modal) } fModal; #if defined(DISTRHO_OS_WINDOWS) @@ -867,42 +885,42 @@ struct Window::PrivateData { static void onDisplayCallback(PuglView* view) { - handlePtr->onDisplay(); + handlePtr->onPuglDisplay(); } static void onKeyboardCallback(PuglView* view, bool press, uint32_t key) { - handlePtr->onKeyboard(press, key); + handlePtr->onPuglKeyboard(press, key); } static void onSpecialCallback(PuglView* view, bool press, PuglKey key) { - handlePtr->onSpecial(press, static_cast(key)); + handlePtr->onPuglSpecial(press, static_cast(key)); } static void onMouseCallback(PuglView* view, int button, bool press, int x, int y) { - handlePtr->onMouse(button, press, x, y); + handlePtr->onPuglMouse(button, press, x, y); } static void onMotionCallback(PuglView* view, int x, int y) { - handlePtr->onMotion(x, y); + handlePtr->onPuglMotion(x, y); } static void onScrollCallback(PuglView* view, int x, int y, float dx, float dy) { - handlePtr->onScroll(x, y, dx, dy); + handlePtr->onPuglScroll(x, y, dx, dy); } static void onReshapeCallback(PuglView* view, int width, int height) { - handlePtr->onReshape(width, height); + handlePtr->onPuglReshape(width, height); } static void onCloseCallback(PuglView* view) { - handlePtr->onClose(); + handlePtr->onPuglClose(); } #undef handlePtr @@ -1010,7 +1028,7 @@ void Window::setTitle(const char* title) pData->setTitle(title); } -void Window::setTransientWinId(intptr_t winId) +void Window::setTransientWinId(uintptr_t winId) { pData->setTransientWinId(winId); } @@ -1074,8 +1092,8 @@ void Window::onReshape(uint width, uint height) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(0, width, height, 0, 0.0f, 1.0f); - glViewport(0, 0, width, height); + glOrtho(0.0, static_cast(width), static_cast(height), 0.0, 0.0, 1.0); + glViewport(0, 0, static_cast(width), static_cast(height)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } diff --git a/dgl/src/nanovg/fontstash.h b/dgl/src/nanovg/fontstash.h index 7fb89555..a97ce537 100644 --- a/dgl/src/nanovg/fontstash.h +++ b/dgl/src/nanovg/fontstash.h @@ -41,7 +41,7 @@ enum FONSalign { enum FONSerrorCode { // Font atlas is full. FONS_ATLAS_FULL = 1, - // Scratch memory used to render glyphs is full, requested size reported in 'val', you may need to bump up FONS_SCRATCH_BUF_SIZE. + // Scratch memory used to render glyphs is full, requested size reported in 'val', you may need to bump up FONS_SCRATCH_BUF_SIZE. FONS_SCRATCH_FULL = 2, // Calls to fonsPushState has craeted too large stack, if you need deep state stack bump up FONS_MAX_STATES. FONS_STATES_OVERFLOW = 3, @@ -85,7 +85,7 @@ void fonsDeleteInternal(struct FONScontext* s); void fonsSetErrorCallback(struct FONScontext* s, void (*callback)(void* uptr, int error, int val), void* uptr); // Returns current atlas size. void fonsGetAtlasSize(struct FONScontext* s, int* width, int* height); -// Expands the atlas size. +// Expands the atlas size. int fonsExpandAtlas(struct FONScontext* s, int width, int height); // Reseta the whole stash. int fonsResetAtlas(struct FONScontext* stash, int width, int height); @@ -1388,7 +1388,7 @@ void fonsDrawDebug(struct FONScontext* stash, float x, float y) } float fonsTextBounds(struct FONScontext* stash, - float x, float y, + float x, float y, const char* str, const char* end, float* bounds) { @@ -1576,7 +1576,7 @@ int fonsExpandAtlas(struct FONScontext* stash, int width, int height) height = fons__maxi(height, stash->params.height); if (width == stash->params.width && height == stash->params.height) - return 1; + return 1; // Flush pending glyphs. fons__flush(stash);