Signed-off-by: falkTX <falktx@falktx.com>pull/272/head
@@ -17,6 +17,8 @@ | |||
#ifndef DGL_CAIRO_HPP_INCLUDED | |||
#define DGL_CAIRO_HPP_INCLUDED | |||
#include "ImageBase.hpp" | |||
#include "ImageBaseWidgets.hpp" | |||
#include "SubWidget.hpp" | |||
#include "TopLevelWidget.hpp" | |||
@@ -34,6 +36,54 @@ struct CairoGraphicsContext : GraphicsContext | |||
cairo_t* handle; | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
/** | |||
Cairo Image class. | |||
TODO ... | |||
*/ | |||
class CairoImage : public ImageBase | |||
{ | |||
public: | |||
/** | |||
Constructor for a null Image. | |||
*/ | |||
CairoImage(); | |||
/** | |||
Constructor using raw image data. | |||
@note @a rawData must remain valid for the lifetime of this Image. | |||
*/ | |||
CairoImage(const char* const rawData, | |||
const uint width, | |||
const uint height); | |||
/** | |||
Constructor using raw image data. | |||
@note @a rawData must remain valid for the lifetime of this Image. | |||
*/ | |||
CairoImage(const char* const rawData, | |||
const Size<uint>& size); | |||
/** | |||
Constructor using another image data. | |||
*/ | |||
CairoImage(const CairoImage& image); | |||
/** | |||
Destructor. | |||
*/ | |||
~CairoImage() override; | |||
/** | |||
Draw this image at position @a pos using the graphics context @a context. | |||
*/ | |||
void drawAt(const GraphicsContext& context, const Point<int>& pos) override; | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
/** | |||
Cairo SubWidget, handy class that takes graphics context during onDisplay and passes it in a new function. | |||
*/ | |||
@@ -78,6 +128,10 @@ protected: | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
#endif |
@@ -0,0 +1,53 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
* permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#ifndef DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED | |||
#define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED | |||
#include "StandaloneWindow.hpp" | |||
START_NAMESPACE_DGL | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
template <class ImageType> | |||
class ImageBaseAboutWindow : public StandaloneWindow | |||
{ | |||
public: | |||
explicit ImageBaseAboutWindow(Window& parentWindow, const ImageType& image = ImageType()); | |||
explicit ImageBaseAboutWindow(TopLevelWidget* parentTopLevelWidget, const ImageType& image = ImageType()); | |||
void setImage(const ImageType& image); | |||
protected: | |||
void onDisplay() override; | |||
bool onKeyboard(const KeyboardEvent&) override; | |||
bool onMouse(const MouseEvent&) override; | |||
// FIXME needed? | |||
void onReshape(uint width, uint height) override; | |||
private: | |||
ImageType img; | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseAboutWindow) | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
#endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED |
@@ -1,6 +1,6 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
@@ -18,38 +18,13 @@ | |||
#define DGL_IMAGE_WIDGETS_HPP_INCLUDED | |||
#include "Image.hpp" | |||
#include "StandaloneWindow.hpp" | |||
#include "ImageBaseWidgets.hpp" | |||
#include "SubWidget.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
class ImageAboutWindow : public StandaloneWindow | |||
{ | |||
public: | |||
explicit ImageAboutWindow(Window& parentWindow, const Image& image = Image()); | |||
explicit ImageAboutWindow(TopLevelWidget* parentTopLevelWidget, const Image& image = Image()); | |||
void setImage(const Image& image); | |||
// TODO | |||
void exec() {} | |||
protected: | |||
void onDisplay() override; | |||
bool onKeyboard(const KeyboardEvent&) override; | |||
bool onMouse(const MouseEvent&) override; | |||
void onReshape(uint width, uint height) override; | |||
private: | |||
Image fImgBackground; | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageAboutWindow) | |||
}; | |||
// ----------------------------------------------------------------------- | |||
class ImageButton : public SubWidget | |||
{ | |||
public: | |||
@@ -29,6 +29,7 @@ OBJS_common = \ | |||
../build/dgl/Color.cpp.o \ | |||
../build/dgl/Geometry.cpp.o \ | |||
../build/dgl/ImageBase.cpp.o \ | |||
../build/dgl/ImageBaseWidgets.cpp.o \ | |||
../build/dgl/Resources.cpp.o \ | |||
../build/dgl/SubWidget.cpp.o \ | |||
../build/dgl/SubWidgetPrivateData.cpp.o \ | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
@@ -18,6 +18,7 @@ | |||
#define DGL_OPENGL_HPP_INCLUDED | |||
#include "ImageBase.hpp" | |||
#include "ImageBaseWidgets.hpp" | |||
// ----------------------------------------------------------------------- | |||
// Fix OpenGL includes for Windows, based on glfw code (part 1) | |||
@@ -241,6 +242,13 @@ private: | |||
// ----------------------------------------------------------------------- | |||
typedef ImageBaseAboutWindow<OpenGLImage> OpenGLImageAboutWindow; | |||
// TODO deprecated | |||
typedef OpenGLImageAboutWindow ImageAboutWindow; | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
#endif |
@@ -29,12 +29,19 @@ class StandaloneWindow : public Window, | |||
{ | |||
public: | |||
/** | |||
Constructor. | |||
Constructor without parent. | |||
*/ | |||
StandaloneWindow(Application& app) | |||
: Window(app), | |||
TopLevelWidget((Window&)*this) {} | |||
/** | |||
Constructor with parent window, typically used to run as modal. | |||
*/ | |||
StandaloneWindow(Application& app, Window& parent) | |||
: Window(app, parent), | |||
TopLevelWidget((Window&)*this) {} | |||
/** | |||
Overloaded functions to ensure they apply to the Window class. | |||
*/ | |||
@@ -63,6 +63,37 @@ void Rectangle<T>::_draw(const bool outline) | |||
notImplemented("Rectangle::draw"); | |||
} | |||
// ----------------------------------------------------------------------- | |||
// CairoImage | |||
CairoImage::CairoImage() | |||
: ImageBase() {} | |||
CairoImage::CairoImage(const char* const rawData, const uint width, const uint height) | |||
: ImageBase(rawData, width, height) {} | |||
CairoImage::CairoImage(const char* const rawData, const Size<uint>& size) | |||
: ImageBase(rawData, size) {} | |||
CairoImage::CairoImage(const CairoImage& image) | |||
: ImageBase(image.rawData, image.size) {} | |||
CairoImage::~CairoImage() | |||
{ | |||
} | |||
void CairoImage::drawAt(const GraphicsContext&, const Point<int>&) | |||
{ | |||
} | |||
// ----------------------------------------------------------------------- | |||
template <> | |||
void ImageBaseAboutWindow<CairoImage>::onDisplay() | |||
{ | |||
img.draw(getGraphicsContext()); | |||
} | |||
// ----------------------------------------------------------------------- | |||
void SubWidget::PrivateData::display(const uint width, const uint height, const double autoScaleFactor) | |||
@@ -97,6 +128,39 @@ const GraphicsContext& Window::PrivateData::getGraphicsContext() const noexcept | |||
return context; | |||
} | |||
// ----------------------------------------------------------------------- | |||
// Possible template data types | |||
template class Line<double>; | |||
template class Line<float>; | |||
template class Line<int>; | |||
template class Line<uint>; | |||
template class Line<short>; | |||
template class Line<ushort>; | |||
template class Circle<double>; | |||
template class Circle<float>; | |||
template class Circle<int>; | |||
template class Circle<uint>; | |||
template class Circle<short>; | |||
template class Circle<ushort>; | |||
template class Triangle<double>; | |||
template class Triangle<float>; | |||
template class Triangle<int>; | |||
template class Triangle<uint>; | |||
template class Triangle<short>; | |||
template class Triangle<ushort>; | |||
template class Rectangle<double>; | |||
template class Rectangle<float>; | |||
template class Rectangle<int>; | |||
template class Rectangle<uint>; | |||
template class Rectangle<short>; | |||
template class Rectangle<ushort>; | |||
template class ImageBaseAboutWindow<CairoImage>; | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -0,0 +1,91 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
* permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include "../ImageBaseWidgets.hpp" | |||
START_NAMESPACE_DGL | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
template <class ImageType> | |||
ImageBaseAboutWindow<ImageType>::ImageBaseAboutWindow(Window& parentWindow, const ImageType& image) | |||
: StandaloneWindow(parentWindow.getApp(), parentWindow), | |||
img(image) | |||
{ | |||
setResizable(false); | |||
setTitle("About"); | |||
if (image.isValid()) | |||
setSize(image.getSize()); | |||
} | |||
template <class ImageType> | |||
ImageBaseAboutWindow<ImageType>::ImageBaseAboutWindow(TopLevelWidget* const parentTopLevelWidget, const ImageType& image) | |||
: StandaloneWindow(parentTopLevelWidget->getApp(), parentTopLevelWidget->getWindow()), | |||
img(image) | |||
{ | |||
setResizable(false); | |||
setTitle("About"); | |||
if (image.isValid()) | |||
setSize(image.getSize()); | |||
} | |||
template <class ImageType> | |||
void ImageBaseAboutWindow<ImageType>::setImage(const ImageType& image) | |||
{ | |||
if (img == image) | |||
return; | |||
img = image; | |||
setSize(image.getSize()); | |||
} | |||
template <class ImageType> | |||
bool ImageBaseAboutWindow<ImageType>::onKeyboard(const KeyboardEvent& ev) | |||
{ | |||
if (ev.press && ev.key == kCharEscape) | |||
{ | |||
close(); | |||
return true; | |||
} | |||
return false; | |||
} | |||
template <class ImageType> | |||
bool ImageBaseAboutWindow<ImageType>::onMouse(const MouseEvent& ev) | |||
{ | |||
if (ev.press) | |||
{ | |||
close(); | |||
return true; | |||
} | |||
return false; | |||
} | |||
template <class ImageType> | |||
void ImageBaseAboutWindow<ImageType>::onReshape(uint width, uint height) | |||
{ | |||
// FIXME needed? | |||
TopLevelWidget::setSize(width, height); | |||
StandaloneWindow::onReshape(width, height); | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -15,6 +15,8 @@ | |||
*/ | |||
#include "../Image.hpp" | |||
#include "../ImageBaseWidgets.hpp" | |||
#include "Common.hpp" | |||
#include "WidgetPrivateData.hpp" | |||
@@ -25,74 +27,6 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
ImageAboutWindow::ImageAboutWindow(Window& parentWindow, const Image& image) | |||
: StandaloneWindow(parentWindow.getApp()), | |||
fImgBackground(image) | |||
{ | |||
// TODO set transient | |||
Window::setResizable(false); | |||
Window::setTitle("About"); | |||
if (image.isValid()) | |||
Window::setSize(image.getSize()); | |||
} | |||
ImageAboutWindow::ImageAboutWindow(TopLevelWidget* const parentTopLevelWidget, const Image& image) | |||
: StandaloneWindow(parentTopLevelWidget->getApp()), | |||
fImgBackground(image) | |||
{ | |||
// TODO set transient | |||
Window::setResizable(false); | |||
Window::setTitle("About"); | |||
if (image.isValid()) | |||
Window::setSize(image.getSize()); | |||
} | |||
void ImageAboutWindow::setImage(const Image& image) | |||
{ | |||
if (fImgBackground == image) | |||
return; | |||
fImgBackground = image; | |||
Window::setSize(image.getSize()); | |||
} | |||
void ImageAboutWindow::onDisplay() | |||
{ | |||
fImgBackground.draw(); | |||
} | |||
bool ImageAboutWindow::onKeyboard(const KeyboardEvent& ev) | |||
{ | |||
if (ev.press && ev.key == kCharEscape) | |||
{ | |||
Window::close(); | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool ImageAboutWindow::onMouse(const MouseEvent& ev) | |||
{ | |||
if (ev.press) | |||
{ | |||
Window::close(); | |||
return true; | |||
} | |||
return false; | |||
} | |||
void ImageAboutWindow::onReshape(uint width, uint height) | |||
{ | |||
Widget::setSize(width, height); | |||
Window::onReshape(width, height); | |||
} | |||
// ----------------------------------------------------------------------- | |||
struct ImageButton::PrivateData { | |||
ButtonImpl impl; | |||
Image imageNormal; | |||
@@ -15,6 +15,8 @@ | |||
*/ | |||
#include "../OpenGL.hpp" | |||
#include "../ImageWidgets.hpp" | |||
#include "SubWidgetPrivateData.hpp" | |||
#include "TopLevelWidgetPrivateData.hpp" | |||
#include "WidgetPrivateData.hpp" | |||
@@ -110,39 +112,6 @@ void Rectangle<T>::_draw(const bool outline) | |||
glEnd(); | |||
} | |||
// ----------------------------------------------------------------------- | |||
// Possible template data types | |||
#ifndef DPF_TEST_DEMO | |||
template class Line<double>; | |||
template class Line<float>; | |||
template class Line<int>; | |||
template class Line<uint>; | |||
template class Line<short>; | |||
template class Line<ushort>; | |||
template class Circle<double>; | |||
template class Circle<float>; | |||
template class Circle<int>; | |||
template class Circle<uint>; | |||
template class Circle<short>; | |||
template class Circle<ushort>; | |||
template class Triangle<double>; | |||
template class Triangle<float>; | |||
template class Triangle<int>; | |||
template class Triangle<uint>; | |||
template class Triangle<short>; | |||
template class Triangle<ushort>; | |||
template class Rectangle<double>; | |||
template class Rectangle<float>; | |||
template class Rectangle<int>; | |||
template class Rectangle<uint>; | |||
template class Rectangle<short>; | |||
template class Rectangle<ushort>; | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
OpenGLImage::OpenGLImage() | |||
@@ -152,13 +121,6 @@ OpenGLImage::OpenGLImage() | |||
fTextureId(0), | |||
setupCalled(false) {} | |||
OpenGLImage::OpenGLImage(const OpenGLImage& image) | |||
: ImageBase(image), | |||
fFormat(image.fFormat), | |||
fType(image.fType), | |||
fTextureId(0), | |||
setupCalled(false) {} | |||
OpenGLImage::OpenGLImage(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) | |||
: ImageBase(rawData, width, height), | |||
fFormat(format), | |||
@@ -173,6 +135,13 @@ OpenGLImage::OpenGLImage(const char* const rawData, const Size<uint>& size, cons | |||
fTextureId(0), | |||
setupCalled(false) {} | |||
OpenGLImage::OpenGLImage(const OpenGLImage& image) | |||
: ImageBase(image), | |||
fFormat(image.fFormat), | |||
fType(image.fType), | |||
fTextureId(0), | |||
setupCalled(false) {} | |||
OpenGLImage::~OpenGLImage() | |||
{ | |||
if (setupCalled) { | |||
@@ -324,72 +293,13 @@ void OpenGLImage::drawAt(const Point<int>& pos) | |||
// ----------------------------------------------------------------------- | |||
#if 0 | |||
void Widget::PrivateData::display(const uint width, | |||
const uint height, | |||
const double autoScaleFactor, | |||
const bool renderingSubWidget) | |||
template <> | |||
void ImageBaseAboutWindow<OpenGLImage>::onDisplay() | |||
{ | |||
printf("Widget::PrivateData::display INIT\n"); | |||
if (/*(skipDisplay && ! renderingSubWidget) ||*/ size.isInvalid() || ! visible) | |||
return; | |||
bool needsDisableScissor = false; | |||
// reset color | |||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||
#if 0 | |||
if (/*needsFullViewport ||*/ (absolutePos.isZero() && size == Size<uint>(width, height))) | |||
#endif | |||
{ | |||
// full viewport size | |||
glViewport(0, | |||
-(height * autoScaleFactor - height), | |||
width * autoScaleFactor, | |||
height * autoScaleFactor); | |||
} | |||
#if 0 | |||
else if (needsScaling) | |||
{ | |||
// limit viewport to widget bounds | |||
glViewport(absolutePos.getX(), | |||
height - self->getHeight() - absolutePos.getY(), | |||
self->getWidth(), | |||
self->getHeight()); | |||
} | |||
else | |||
{ | |||
// only set viewport pos | |||
glViewport(absolutePos.getX() * autoScaleFactor, | |||
-std::round((height * autoScaleFactor - height) + (absolutePos.getY() * autoScaleFactor)), | |||
std::round(width * autoScaleFactor), | |||
std::round(height * autoScaleFactor)); | |||
// then cut the outer bounds | |||
glScissor(absolutePos.getX() * autoScaleFactor, | |||
height - std::round((self->getHeight() + absolutePos.getY()) * autoScaleFactor), | |||
std::round(self->getWidth() * autoScaleFactor), | |||
std::round(self->getHeight() * autoScaleFactor)); | |||
glEnable(GL_SCISSOR_TEST); | |||
needsDisableScissor = true; | |||
} | |||
#endif | |||
// display widget | |||
self->onDisplay(); | |||
if (needsDisableScissor) | |||
{ | |||
glDisable(GL_SCISSOR_TEST); | |||
needsDisableScissor = false; | |||
} | |||
displaySubWidgets(width, height, autoScaleFactor); | |||
img.draw(); | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
void SubWidget::PrivateData::display(const uint width, const uint height, const double autoScaleFactor) | |||
{ | |||
@@ -453,9 +363,9 @@ void TopLevelWidget::PrivateData::display() | |||
// full viewport size | |||
if (window.pData->autoScaling) | |||
glViewport(0, -height, width, height); | |||
else | |||
glViewport(0, -(height * autoScaleFactor - height), width * autoScaleFactor, height * autoScaleFactor); | |||
else | |||
glViewport(0, -height, width, height); | |||
// main widget drawing | |||
self->onDisplay(); | |||
@@ -472,5 +382,52 @@ const GraphicsContext& Window::PrivateData::getGraphicsContext() const noexcept | |||
} | |||
// ----------------------------------------------------------------------- | |||
// Possible template data types | |||
#ifndef DPF_TEST_DEMO | |||
// // FIXME | |||
// template class Line<double>; | |||
// template class Line<float>; | |||
// template class Line<int>; | |||
// template class Line<uint>; | |||
// template class Line<short>; | |||
// template class Line<ushort>; | |||
// | |||
// template class Circle<double>; | |||
// template class Circle<float>; | |||
// template class Circle<int>; | |||
// template class Circle<uint>; | |||
// template class Circle<short>; | |||
// template class Circle<ushort>; | |||
// | |||
// template class Triangle<double>; | |||
// template class Triangle<float>; | |||
// template class Triangle<int>; | |||
// template class Triangle<uint>; | |||
// template class Triangle<short>; | |||
// template class Triangle<ushort>; | |||
// | |||
template class Rectangle<double>; | |||
template class Rectangle<float>; | |||
template class Rectangle<int>; | |||
template class Rectangle<uint>; | |||
template class Rectangle<short>; | |||
template class Rectangle<ushort>; | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
// templated classes | |||
#include "ImageBaseWidgets.cpp" | |||
START_NAMESPACE_DGL | |||
template class ImageBaseAboutWindow<OpenGLImage>; | |||
END_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- |