| @@ -37,21 +37,11 @@ START_NAMESPACE_DGL | |||||
| class NanoImage | class NanoImage | ||||
| { | { | ||||
| public: | public: | ||||
| /** | |||||
| Constructor for null image. | |||||
| */ | |||||
| NanoImage() noexcept; | |||||
| /** | /** | ||||
| Destructor. | Destructor. | ||||
| */ | */ | ||||
| ~NanoImage(); | ~NanoImage(); | ||||
| /** | |||||
| Check if this is a valid image. | |||||
| */ | |||||
| bool isValid() const noexcept; | |||||
| /** | /** | ||||
| Get size. | Get size. | ||||
| */ | */ | ||||
| @@ -62,25 +52,19 @@ public: | |||||
| */ | */ | ||||
| void updateImage(const uchar* data); | void updateImage(const uchar* data); | ||||
| /** | |||||
| Operator =. | |||||
| Takes the image data from @a img, invalidating it. | |||||
| */ | |||||
| NanoImage operator=(NanoImage img) noexcept; | |||||
| protected: | protected: | ||||
| /** | /** | ||||
| Constructors are protected. | Constructors are protected. | ||||
| NanoImages must be created within a NanoVG or NanoWidget class. | NanoImages must be created within a NanoVG or NanoWidget class. | ||||
| */ | */ | ||||
| NanoImage(const char* filename); | |||||
| NanoImage(uchar* data, int ndata); | |||||
| NanoImage(int w, int h, const uchar* data); | |||||
| NanoImage(NVGcontext* context, int imageId) noexcept; | |||||
| private: | private: | ||||
| NVGcontext* fContext; | NVGcontext* fContext; | ||||
| int fImageId; | int fImageId; | ||||
| friend class NanoVG; | friend class NanoVG; | ||||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoImage) | |||||
| }; | }; | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -534,17 +518,17 @@ public: | |||||
| /** | /** | ||||
| Creates image by loading it from the disk from specified file name. | Creates image by loading it from the disk from specified file name. | ||||
| */ | */ | ||||
| NanoImage createImage(const char* filename); | |||||
| NanoImage* createImage(const char* filename); | |||||
| /** | /** | ||||
| Creates image by loading it from the specified chunk of memory. | Creates image by loading it from the specified chunk of memory. | ||||
| */ | */ | ||||
| NanoImage createImageMem(uchar* data, int ndata); | |||||
| NanoImage* createImageMem(uchar* data, int ndata); | |||||
| /** | /** | ||||
| Creates image from specified image data. | Creates image from specified image data. | ||||
| */ | */ | ||||
| NanoImage createImageRGBA(int w, int h, const uchar* data); | |||||
| NanoImage* createImageRGBA(int w, int h, const uchar* data); | |||||
| /* -------------------------------------------------------------------- | /* -------------------------------------------------------------------- | ||||
| * Paints */ | * Paints */ | ||||
| @@ -573,12 +557,12 @@ public: | |||||
| Paint radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol); | Paint radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol); | ||||
| /** | /** | ||||
| Creates and returns an image patter. Parameters (ox,oy) specify the left-top location of the image pattern, | |||||
| Creates and returns an image pattern. Parameters (ox,oy) specify the left-top location of the image pattern, | |||||
| (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render, | (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render, | ||||
| and repeat tells if the image should be repeated across x or y. | and repeat tells if the image should be repeated across x or y. | ||||
| The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). | ||||
| */ | */ | ||||
| Paint imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage& image, PatternRepeat repeat); | |||||
| Paint imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage* image, PatternRepeat repeat); | |||||
| /* -------------------------------------------------------------------- | /* -------------------------------------------------------------------- | ||||
| * Scissoring */ | * Scissoring */ | ||||
| @@ -49,7 +49,7 @@ NanoVG::Color::Color(const NVGcolor& c) noexcept | |||||
| NanoVG::Color::operator NVGcolor() const noexcept | NanoVG::Color::operator NVGcolor() const noexcept | ||||
| { | { | ||||
| NVGcolor nc = { r, g, b, a }; | |||||
| NVGcolor nc = {{{ r, g, b, a }}}; | |||||
| return nc; | return nc; | ||||
| } | } | ||||
| @@ -84,33 +84,9 @@ NanoVG::Paint::operator NVGpaint() const noexcept | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // NanoImage | // NanoImage | ||||
| static NVGcontext* sLastContext = nullptr; | |||||
| NanoImage::NanoImage() noexcept | |||||
| : fContext(nullptr), | |||||
| fImageId(0) {} | |||||
| #if 0 | |||||
| NanoImage::NanoImage(NanoImage& img) noexcept | |||||
| : fContext(img.fContext), | |||||
| fImageId(img.fImageId) | |||||
| { | |||||
| img.fContext = nullptr; | |||||
| img.fImageId = 0; | |||||
| } | |||||
| #endif | |||||
| NanoImage::NanoImage(const char* filename) | |||||
| : fContext(sLastContext), | |||||
| fImageId((fContext != nullptr) ? nvgCreateImage(fContext, filename) : 0) {} | |||||
| NanoImage::NanoImage(uchar* data, int ndata) | |||||
| : fContext(sLastContext), | |||||
| fImageId((fContext != nullptr) ? nvgCreateImageMem(fContext, data, ndata) : 0) {} | |||||
| NanoImage::NanoImage(int w, int h, const uchar* data) | |||||
| : fContext(sLastContext), | |||||
| fImageId((fContext != nullptr) ? nvgCreateImageRGBA(fContext, w, h, data) : 0) {} | |||||
| NanoImage::NanoImage(NVGcontext* context, int imageId) noexcept | |||||
| : fContext(context), | |||||
| fImageId(imageId) {} | |||||
| NanoImage::~NanoImage() | NanoImage::~NanoImage() | ||||
| { | { | ||||
| @@ -118,11 +94,6 @@ NanoImage::~NanoImage() | |||||
| nvgDeleteImage(fContext, fImageId); | nvgDeleteImage(fContext, fImageId); | ||||
| } | } | ||||
| bool NanoImage::isValid() const noexcept | |||||
| { | |||||
| return (fContext != nullptr && fImageId != 0); | |||||
| } | |||||
| Size<int> NanoImage::getSize() const | Size<int> NanoImage::getSize() const | ||||
| { | { | ||||
| int w=0, h=0; | int w=0, h=0; | ||||
| @@ -139,20 +110,6 @@ void NanoImage::updateImage(const uchar* data) | |||||
| nvgUpdateImage(fContext, fImageId, data); | nvgUpdateImage(fContext, fImageId, data); | ||||
| } | } | ||||
| NanoImage NanoImage::operator=(NanoImage img) noexcept | |||||
| { | |||||
| if (fContext != nullptr && fImageId != 0) | |||||
| nvgDeleteImage(fContext, fImageId); | |||||
| fContext = img.fContext; | |||||
| fImageId = img.fImageId; | |||||
| img.fContext = nullptr; | |||||
| img.fImageId = 0; | |||||
| return *this; | |||||
| } | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // NanoVG | // NanoVG | ||||
| @@ -401,22 +358,25 @@ float NanoVG::radToDeg(float rad) | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Images | // Images | ||||
| NanoImage NanoVG::createImage(const char* filename) | |||||
| NanoImage* NanoVG::createImage(const char* filename) | |||||
| { | { | ||||
| sLastContext = fContext; | |||||
| return NanoImage(filename); | |||||
| if (const int imageId = nvgCreateImage(fContext, filename)) | |||||
| return new NanoImage(fContext, imageId); | |||||
| return nullptr; | |||||
| } | } | ||||
| NanoImage NanoVG::createImageMem(uchar* data, int ndata) | |||||
| NanoImage* NanoVG::createImageMem(uchar* data, int ndata) | |||||
| { | { | ||||
| sLastContext = fContext; | |||||
| return NanoImage(data, ndata); | |||||
| if (const int imageId = nvgCreateImageMem(fContext, data, ndata)) | |||||
| return new NanoImage(fContext, imageId); | |||||
| return nullptr; | |||||
| } | } | ||||
| NanoImage NanoVG::createImageRGBA(int w, int h, const uchar* data) | |||||
| NanoImage* NanoVG::createImageRGBA(int w, int h, const uchar* data) | |||||
| { | { | ||||
| sLastContext = fContext; | |||||
| return NanoImage(w, h, data); | |||||
| if (const int imageId = nvgCreateImageRGBA(fContext, w, h, data)) | |||||
| return new NanoImage(fContext, imageId); | |||||
| return nullptr; | |||||
| } | } | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -437,9 +397,10 @@ NanoVG::Paint NanoVG::radialGradient(float cx, float cy, float inr, float outr, | |||||
| return nvgRadialGradient(fContext, cx, cy, inr, outr, icol, ocol); | return nvgRadialGradient(fContext, cx, cy, inr, outr, icol, ocol); | ||||
| } | } | ||||
| NanoVG::Paint NanoVG::imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage& image, NanoVG::PatternRepeat repeat) | |||||
| NanoVG::Paint NanoVG::imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage* image, NanoVG::PatternRepeat repeat) | |||||
| { | { | ||||
| return nvgImagePattern(fContext, ox, oy, ex, ey, angle, image.fImageId, repeat); | |||||
| DISTRHO_SAFE_ASSERT_RETURN(image != nullptr, Paint()); | |||||
| return nvgImagePattern(fContext, ox, oy, ex, ey, angle, image->fImageId, repeat); | |||||
| } | } | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -14,9 +14,6 @@ | |||||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| */ | */ | ||||
| // we need this for now | |||||
| #define PUGL_GRAB_FOCUS 1 | |||||
| #include "AppPrivateData.hpp" | #include "AppPrivateData.hpp" | ||||
| #include "../Widget.hpp" | #include "../Widget.hpp" | ||||
| #include "../Window.hpp" | #include "../Window.hpp" | ||||
| @@ -562,6 +559,8 @@ struct Window::PrivateData { | |||||
| { | { | ||||
| fSelf->onDisplayBefore(); | fSelf->onDisplayBefore(); | ||||
| bool needsDisableScissor = false; | |||||
| FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
| { | { | ||||
| Widget* const widget(*it); | Widget* const widget(*it); | ||||
| @@ -575,32 +574,30 @@ struct Window::PrivateData { | |||||
| { | { | ||||
| // full viewport size | // full viewport size | ||||
| glViewport(0, 0, fView->width, fView->height); | glViewport(0, 0, fView->width, fView->height); | ||||
| // display widget | |||||
| widget->onDisplay(); | |||||
| } | } | ||||
| else if (! widget->fNeedsScaling) | else if (! widget->fNeedsScaling) | ||||
| { | { | ||||
| // only set viewport pos | // only set viewport pos | ||||
| glViewport(widget->getAbsoluteX(), /*fView->height - widget->getHeight()*/ - widget->getAbsoluteY(), fView->width, fView->height); | glViewport(widget->getAbsoluteX(), /*fView->height - widget->getHeight()*/ - widget->getAbsoluteY(), fView->width, fView->height); | ||||
| // display widget | |||||
| widget->onDisplay(); | |||||
| // then cut the outer bounds | |||||
| glScissor(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); | |||||
| glEnable(GL_SCISSOR_TEST); | |||||
| needsDisableScissor = true; | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| // limit viewport to widget bounds | // limit viewport to widget bounds | ||||
| glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); | glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); | ||||
| } | |||||
| // scale contents to match viewport size | |||||
| glPushMatrix(); | |||||
| glScalef(float(fView->width)/float(widget->getWidth()), float(fView->height)/float(widget->getHeight()), 1.0f); | |||||
| // display widget | |||||
| widget->onDisplay(); | |||||
| // display widget | |||||
| widget->onDisplay(); | |||||
| // done | |||||
| glPopMatrix(); | |||||
| if (needsDisableScissor) | |||||
| { | |||||
| glDisable(GL_SCISSOR_TEST); | |||||
| needsDisableScissor = false; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||