Signed-off-by: falkTX <falktx@falktx.com>pull/272/head
@@ -10,7 +10,7 @@ include ../Makefile.base.mk | |||
BUILD_C_FLAGS += $(DGL_FLAGS) -I. -Isrc | |||
BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc -DDONT_SET_USING_DGL_NAMESPACE -Wno-unused-parameter | |||
# -Isrc/pugl-upstream/include | |||
BUILD_CXX_FLAGS += -Isrc/pugl-upstream/include | |||
LINK_FLAGS += $(DGL_LIBS) | |||
# TODO fix these after pugl-upstream is done | |||
@@ -27,22 +27,24 @@ OBJS_common = \ | |||
../build/dgl/Application.cpp.o \ | |||
../build/dgl/ApplicationPrivateData.cpp.o \ | |||
../build/dgl/Color.cpp.o \ | |||
../build/dgl/Geometry.cpp.o | |||
../build/dgl/Geometry.cpp.o \ | |||
../build/dgl/TopLevelWidget.cpp.o \ | |||
../build/dgl/Window.cpp.o \ | |||
../build/dgl/WindowPrivateData.cpp.o | |||
# ../build/dgl/ImageBase.cpp.o \ | |||
# ../build/dgl/Resources.cpp.o\ | |||
# ../build/dgl/StandaloneWindow.cpp.o \ | |||
# ../build/dgl/Widget.cpp.o \ | |||
# ../build/dgl/Window.cpp.o\ | |||
# ../build/dgl/WindowFileBrowser.cpp.o | |||
# TODO: ImageWidgets.cpp | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
OBJS_cairo = $(OBJS_common) | |||
OBJS_cairo = $(OBJS_common) \ | |||
../build/dgl/pugl.cpp.cairo.o | |||
# ../build/dgl/Cairo.cpp.cairo.o \ | |||
# ../build/dgl/WidgetPrivateData.cpp.cairo.o \ | |||
# ../build/dgl/WindowPrivateData.cpp.cairo.o | |||
# ../build/dgl/WidgetPrivateData.cpp.cairo.o | |||
# ifeq ($(MACOS),true) | |||
# OBJS_cairo += ../build/dgl/Window.mm.cairo.o | |||
@@ -52,7 +54,8 @@ OBJS_cairo = $(OBJS_common) | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
OBJS_opengl = $(OBJS_common) | |||
OBJS_opengl = $(OBJS_common) \ | |||
../build/dgl/pugl.cpp.opengl.o | |||
# ../build/dgl/OpenGL.cpp.opengl.o \ | |||
# ../build/dgl/Image.cpp.opengl.o \ | |||
# ../build/dgl/ImageWidgets.cpp.opengl.o \ | |||
@@ -115,10 +118,10 @@ all: $(TARGETS) | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# ../build/dgl/%.cpp.cairo.o: src/%.cpp | |||
# -@mkdir -p ../build/dgl | |||
# @echo "Compiling $< (Cairo variant)" | |||
# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
../build/dgl/%.cpp.cairo.o: src/%.cpp | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (Cairo variant)" | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
# ../build/dgl/Window.cpp.cairo.o: src/Window.cpp src/sofd/* src/pugl-upstream/* | |||
# -@mkdir -p ../build/dgl | |||
@@ -132,10 +135,10 @@ all: $(TARGETS) | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# ../build/dgl/%.cpp.opengl.o: src/%.cpp | |||
# -@mkdir -p ../build/dgl | |||
# @echo "Compiling $< (OpenGL variant)" | |||
# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
../build/dgl/%.cpp.opengl.o: src/%.cpp | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (OpenGL variant)" | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
# ../build/dgl/Window.cpp.opengl.o: src/Window.cpp src/sofd/* src/pugl-upstream/* | |||
# -@mkdir -p ../build/dgl | |||
@@ -21,6 +21,8 @@ | |||
START_NAMESPACE_DGL | |||
class Window; | |||
// ----------------------------------------------------------------------- | |||
/** | |||
@@ -31,6 +33,9 @@ START_NAMESPACE_DGL | |||
This widget takes the full size of the Window it is mapped to. | |||
Sub-widgets can be added on top of this top-level widget, by creating them with this class as parent. | |||
Doing so allows for custom position and sizes. | |||
This class is used as the type for DPF Plugin UIs. | |||
So anything that a plugin UI might need that does not belong in a simple Widget will go here. | |||
*/ | |||
class TopLevelWidget : public Widget | |||
{ | |||
@@ -45,9 +50,32 @@ public: | |||
*/ | |||
virtual ~TopLevelWidget(); | |||
protected: | |||
/** | |||
A function called before any draw operations begin (in the current event-loop cycle). | |||
Can be used to setup any resources for needed drawing. | |||
The default implementation simply paints the full Widget contents black. | |||
*/ | |||
virtual void onDisplayBefore(); | |||
/** | |||
A function called after all draw operations have ended (in the current event-loop cycle). | |||
Can be used to clear any resources setup during onDisplayBefore(). | |||
The default implementation does nothing. | |||
*/ | |||
virtual void onDisplayAfter(); | |||
/** | |||
A function called when the widget is resized. | |||
Reimplemented from Widget::onResize. | |||
*/ | |||
void onResize(const ResizeEvent&) override; | |||
private: | |||
struct PrivateData; | |||
PrivateData* const pData; | |||
friend class Window; | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(TopLevelWidget) | |||
}; | |||
@@ -22,19 +22,19 @@ | |||
// ----------------------------------------------------------------------- | |||
// Forward class names | |||
#ifdef DISTRHO_DEFINES_H_INCLUDED | |||
START_NAMESPACE_DISTRHO | |||
class UI; | |||
END_NAMESPACE_DISTRHO | |||
#endif | |||
// #ifdef DISTRHO_DEFINES_H_INCLUDED | |||
// START_NAMESPACE_DISTRHO | |||
// class UI; | |||
// END_NAMESPACE_DISTRHO | |||
// #endif | |||
START_NAMESPACE_DGL | |||
// class Application; | |||
// class NanoWidget; | |||
class Window; | |||
// class Window; | |||
// class StandaloneWindow; | |||
class SubWidget; | |||
// class SubWidget; | |||
class TopLevelWidget; | |||
using namespace Events; | |||
@@ -208,10 +208,10 @@ private: | |||
// friend class NanoWidget; | |||
// friend class Window; | |||
// friend class StandaloneWindow; | |||
friend class SubWidget; | |||
#ifdef DISTRHO_DEFINES_H_INCLUDED | |||
friend class DISTRHO_NAMESPACE::UI; | |||
#endif | |||
friend class TopLevelWidget; | |||
// #ifdef DISTRHO_DEFINES_H_INCLUDED | |||
// friend class DISTRHO_NAMESPACE::UI; | |||
// #endif | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Widget) | |||
}; | |||
@@ -37,12 +37,13 @@ class Application; | |||
Typically the event handling functions as following: | |||
Application -> Window -> Top-Level-Widget -> SubWidgets | |||
... | |||
Please note that, unlike many other graphical toolkits out there, | |||
DGL makes a clear distinction between a Window and a Widget. | |||
You cannot directly draw in a Window, you need to create a Widget for that. | |||
Also, a Window MUST have a single top-level Widget. | |||
The Window will take care of global screen positioning and resizing, everything else is sent for widgets to handle. | |||
... | |||
*/ | |||
class Window | |||
@@ -160,11 +161,6 @@ public: | |||
*/ | |||
uintptr_t getNativeWindowHandle() const noexcept; | |||
protected: | |||
virtual void onDisplayBefore(); | |||
virtual void onDisplayAfter(); | |||
virtual void onReshape(uint width, uint height); | |||
private: | |||
struct PrivateData; | |||
PrivateData* const pData; | |||
@@ -15,11 +15,34 @@ | |||
*/ | |||
#include "TopLevelWidgetPrivateData.hpp" | |||
#include "pugl.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
TopLevelWidget::TopLevelWidget(Window& windowToMapTo) | |||
: pData(new PrivateData(this, windowToMapTo)) {} | |||
: Widget(*this), | |||
pData(new PrivateData(this, windowToMapTo)) {} | |||
TopLevelWidget::~TopLevelWidget() | |||
{ | |||
delete pData; | |||
} | |||
void TopLevelWidget::onDisplayBefore() | |||
{ | |||
} | |||
void TopLevelWidget::onDisplayAfter() | |||
{ | |||
} | |||
void TopLevelWidget::onResize(const ResizeEvent& ev) | |||
{ | |||
Widget::onResize(ev); | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -0,0 +1,68 @@ | |||
/* | |||
* 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 "TopLevelWidgetPrivateData.hpp" | |||
#include "../Window.hpp" | |||
// #include "pugl.hpp" | |||
START_NAMESPACE_DGL | |||
#define FOR_EACH_WIDGET(it) \ | |||
for (std::list<Widget*>::iterator it = fWidgets.begin(); it != fWidgets.end(); ++it) | |||
#define FOR_EACH_WIDGET_INV(rit) \ | |||
for (std::list<Widget*>::reverse_iterator rit = fWidgets.rbegin(); rit != fWidgets.rend(); ++rit) | |||
// ----------------------------------------------------------------------- | |||
TopLevelWidget::PrivateData::PrivateData(TopLevelWidget* const s, Window& w) | |||
: self(s), | |||
window(w), | |||
widgets() {} | |||
void TopLevelWidget::PrivateData::display() | |||
{ | |||
if (widgets.size() == 0) | |||
return; | |||
const Size<uint> size(window.getSize()); | |||
// const int width = rect.width; | |||
// const int height = rect.height; | |||
FOR_EACH_WIDGET(it) | |||
{ | |||
Widget* const widget(*it); | |||
widget->pData->display(width, height, fAutoScaling, false); | |||
} | |||
} | |||
void TopLevelWidget::PrivateData::resize(const uint width, const uint height) | |||
{ | |||
if (widgets.size() == 0) | |||
return; | |||
FOR_EACH_WIDGET(it) | |||
{ | |||
Widget* const widget(*it); | |||
if (widget->pData->needsFullViewport) | |||
widget->setSize(width, height); | |||
} | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -18,7 +18,8 @@ | |||
#define DGL_TOP_LEVEL_WIDGET_PRIVATE_DATA_HPP_INCLUDED | |||
#include "../TopLevelWidget.hpp" | |||
// #include "../WidgetPrivateData.hpp" | |||
#include <list> | |||
START_NAMESPACE_DGL | |||
@@ -27,12 +28,13 @@ START_NAMESPACE_DGL | |||
struct TopLevelWidget::PrivateData { | |||
TopLevelWidget* const self; | |||
Window& window; | |||
std::list<Widget*> widgets; | |||
PrivateData(TopLevelWidget* const s, Window& w) | |||
: self(s), | |||
window(w) {} | |||
PrivateData(TopLevelWidget* const s, Window& w); | |||
void display(); | |||
void resize(uint width, uint height); | |||
DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) | |||
}; | |||
// ----------------------------------------------------------------------- | |||
@@ -128,24 +128,6 @@ uintptr_t Window::getNativeWindowHandle() const noexcept | |||
return puglGetNativeWindow(pData->view); | |||
} | |||
void Window::onDisplayBefore() | |||
{ | |||
const GraphicsContext& context(pData->getGraphicsContext()); | |||
PrivateData::Fallback::onDisplayBefore(context); | |||
} | |||
void Window::onDisplayAfter() | |||
{ | |||
const GraphicsContext& context(pData->getGraphicsContext()); | |||
PrivateData::Fallback::onDisplayAfter(context); | |||
} | |||
void Window::onReshape(const uint width, const uint height) | |||
{ | |||
const GraphicsContext& context(pData->getGraphicsContext()); | |||
PrivateData::Fallback::onReshape(context, width, height); | |||
} | |||
#if 0 | |||
#if 0 | |||
void Window::exec(bool lockWait) | |||
@@ -15,10 +15,12 @@ | |||
*/ | |||
#include "WindowPrivateData.hpp" | |||
#include "../Widget.hpp" | |||
#include "../TopLevelWidget.hpp" | |||
#include "pugl.hpp" | |||
#include <cinttypes> | |||
START_NAMESPACE_DGL | |||
#define DGL_DEBUG_EVENTS | |||
@@ -42,6 +44,7 @@ Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* cons | |||
: appData(a), | |||
self(s), | |||
view(puglNewView(appData->world)), | |||
topLevelWidget(nullptr), | |||
isClosed(true), | |||
isVisible(false), | |||
isEmbed(false) | |||
@@ -53,6 +56,7 @@ Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* cons | |||
: appData(a), | |||
self(s), | |||
view(puglNewView(appData->world)), | |||
topLevelWidget(nullptr), | |||
isClosed(true), | |||
isVisible(false), | |||
isEmbed(false) | |||
@@ -69,6 +73,7 @@ Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* cons | |||
: appData(a), | |||
self(s), | |||
view(puglNewView(appData->world)), | |||
topLevelWidget(nullptr), | |||
isClosed(parentWindowHandle == 0), | |||
isVisible(parentWindowHandle != 0), | |||
isEmbed(parentWindowHandle != 0) | |||
@@ -115,15 +120,7 @@ void Window::PrivateData::init(const uint width, const uint height, const bool r | |||
return; | |||
} | |||
#ifdef DGL_CAIRO | |||
puglSetBackend(view, puglCairoBackend()); | |||
#endif | |||
#ifdef DGL_OPENGL | |||
puglSetBackend(view, puglGlBackend()); | |||
#endif | |||
#ifdef DGL_Vulkan | |||
puglSetBackend(view, puglVulkanBackend()); | |||
#endif | |||
puglSetMatchingBackendForCurrentBuild(view); | |||
puglSetHandle(view, this); | |||
puglSetViewHint(view, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); | |||
@@ -238,17 +235,6 @@ void Window::PrivateData::close() | |||
// ----------------------------------------------------------------------- | |||
const GraphicsContext& Window::PrivateData::getGraphicsContext() const noexcept | |||
{ | |||
GraphicsContext& context((GraphicsContext&)graphicsContext); | |||
#ifdef DGL_CAIRO | |||
((CairoGraphicsContext&)context).handle = (cairo_t*)puglGetContext(view); | |||
#endif | |||
return context; | |||
} | |||
// ----------------------------------------------------------------------- | |||
void Window::PrivateData::idleCallback() | |||
{ | |||
// #if defined(DISTRHO_OS_WINDOWS) && !defined(DGL_FILE_BROWSER_DISABLED) | |||
@@ -268,24 +254,18 @@ void Window::PrivateData::idleCallback() | |||
void Window::PrivateData::onPuglDisplay() | |||
{ | |||
self->onDisplayBefore(); | |||
/* | |||
if (fWidgets.size() != 0) | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
{ | |||
const PuglRect rect = puglGetFrame(fView); | |||
const int width = rect.width; | |||
const int height = rect.height; | |||
FOR_EACH_WIDGET(it) | |||
{ | |||
Widget* const widget(*it); | |||
widget->pData->display(width, height, fAutoScaling, false); | |||
} | |||
topLevelWidget->onDisplayBefore(); | |||
topLevelWidget->onDisplay(); | |||
topLevelWidget->onDisplayAfter(); | |||
} | |||
else | |||
#endif | |||
{ | |||
puglFallbackOnDisplay(view); | |||
} | |||
*/ | |||
self->onDisplayAfter(); | |||
} | |||
void Window::PrivateData::onPuglReshape(const int width, const int height) | |||
@@ -294,17 +274,12 @@ void Window::PrivateData::onPuglReshape(const int width, const int height) | |||
DGL_DBGp("PUGL: onReshape : %i %i\n", width, height); | |||
self->onReshape(width, height); | |||
/* | |||
FOR_EACH_WIDGET(it) | |||
{ | |||
Widget* const widget(*it); | |||
if (widget->pData->needsFullViewport) | |||
widget->setSize(width, height); | |||
} | |||
*/ | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->setSize(width, height); | |||
else | |||
#endif | |||
puglFallbackOnResize(view); | |||
} | |||
static int printEvent(const PuglEvent* event, const char* prefix, const bool verbose); | |||
@@ -467,38 +442,6 @@ static int printEvent(const PuglEvent* event, const char* prefix, const bool ver | |||
// ----------------------------------------------------------------------- | |||
void Window::PrivateData::Fallback::onDisplayBefore(const GraphicsContext&) | |||
{ | |||
#ifdef DGL_OPENGL | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |||
glLoadIdentity(); | |||
#endif | |||
} | |||
void Window::PrivateData::Fallback::onDisplayAfter(const GraphicsContext&) | |||
{ | |||
} | |||
void Window::PrivateData::Fallback::onReshape(const GraphicsContext&, const uint width, const uint height) | |||
{ | |||
#ifdef DGL_OPENGL | |||
glEnable(GL_BLEND); | |||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
glMatrixMode(GL_PROJECTION); | |||
glLoadIdentity(); | |||
glOrtho(0.0, static_cast<GLdouble>(width), static_cast<GLdouble>(height), 0.0, 0.0, 1.0); | |||
glViewport(0, 0, static_cast<GLsizei>(width), static_cast<GLsizei>(height)); | |||
glMatrixMode(GL_MODELVIEW); | |||
glLoadIdentity(); | |||
#else | |||
// unused | |||
(void)width; | |||
(void)height; | |||
#endif | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
#if 0 | |||
@@ -555,12 +498,6 @@ extern "C" { | |||
START_NAMESPACE_DGL | |||
#define FOR_EACH_WIDGET(it) \ | |||
for (std::list<Widget*>::iterator it = fWidgets.begin(); it != fWidgets.end(); ++it) | |||
#define FOR_EACH_WIDGET_INV(rit) \ | |||
for (std::list<Widget*>::reverse_iterator rit = fWidgets.rbegin(); rit != fWidgets.rend(); ++rit) | |||
// ----------------------------------------------------------------------- | |||
void Window::PrivateData::addWidget(Widget* const widget) | |||
@@ -18,12 +18,13 @@ | |||
#define DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED | |||
#include "../Window.hpp" | |||
#include "ApplicationPrivateData.hpp" | |||
#include "pugl.hpp" | |||
START_NAMESPACE_DGL | |||
class Widget; | |||
class TopLevelWidget; | |||
// ----------------------------------------------------------------------- | |||
@@ -43,6 +44,9 @@ struct Window::PrivateData : IdleCallback { | |||
/** Reserved space for graphics context. */ | |||
mutable uint8_t graphicsContext[sizeof(void*)]; | |||
/** The top-level widget associated with this Window. */ | |||
TopLevelWidget* topLevelWidget; | |||
/** Whether this Window is closed (not visible or counted in the Application it is tied to). | |||
Defaults to true unless embed (embed windows are never closed). */ | |||
bool isClosed; | |||
@@ -92,12 +96,14 @@ struct Window::PrivateData : IdleCallback { | |||
// Pugl event handling entry point | |||
static PuglStatus puglEventCallback(PuglView* view, const PuglEvent* event); | |||
#if 0 | |||
// Fallback build-specific Window functions | |||
struct Fallback { | |||
static void onDisplayBefore(const GraphicsContext& context); | |||
static void onDisplayAfter(const GraphicsContext& context); | |||
static void onReshape(const GraphicsContext& context, uint width, uint height); | |||
}; | |||
#endif | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) | |||
}; | |||
@@ -115,7 +121,6 @@ END_NAMESPACE_DGL | |||
bool fUsingEmbed; | |||
double fScaling; | |||
double fAutoScaling; | |||
std::list<Widget*> fWidgets; | |||
struct Modal { | |||
bool enabled; | |||
@@ -154,5 +154,70 @@ PuglStatus puglSetWindowSize(PuglView* view, unsigned int width, unsigned int he | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// set backend that matches current build | |||
void puglSetMatchingBackendForCurrentBuild(PuglView* view) | |||
{ | |||
#ifdef DGL_CAIRO | |||
puglSetBackend(view, puglCairoBackend()); | |||
#endif | |||
#ifdef DGL_OPENGL | |||
puglSetBackend(view, puglGlBackend()); | |||
#endif | |||
#ifdef DGL_Vulkan | |||
puglSetBackend(view, puglVulkanBackend()); | |||
#endif | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// DGL specific, build-specific fallback drawing | |||
void puglFallbackOnDisplay(PuglView*) | |||
{ | |||
#ifdef DGL_OPENGL | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |||
glLoadIdentity(); | |||
#endif | |||
} | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// DGL specific, build-specific fallback resize | |||
void puglFallbackOnResize(PuglView* view) | |||
{ | |||
#ifdef DGL_OPENGL | |||
glEnable(GL_BLEND); | |||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
glMatrixMode(GL_PROJECTION); | |||
glLoadIdentity(); | |||
glOrtho(0.0, static_cast<GLdouble>(view->frame.width), static_cast<GLdouble>(view->frame.height), 0.0, 0.0, 1.0); | |||
glViewport(0, 0, static_cast<GLsizei>(view->frame.width), static_cast<GLsizei>(view->frame.height)); | |||
glMatrixMode(GL_MODELVIEW); | |||
glLoadIdentity(); | |||
#endif | |||
} | |||
END_NAMESPACE_DGL | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// extra, build-specific stuff | |||
#include "WindowPrivateData.hpp" | |||
#ifdef DGL_CAIRO | |||
# include "../Cairo.hpp" | |||
#endif | |||
START_NAMESPACE_DGL | |||
const GraphicsContext& Window::PrivateData::getGraphicsContext() const noexcept | |||
{ | |||
GraphicsContext& context((GraphicsContext&)graphicsContext); | |||
#ifdef DGL_CAIRO | |||
((CairoGraphicsContext&)context).handle = (cairo_t*)puglGetContext(view); | |||
#endif | |||
return context; | |||
} | |||
END_NAMESPACE_DGL | |||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -41,6 +41,18 @@ puglGetWindowTitle(const PuglView* view); | |||
PUGL_API PuglStatus | |||
puglSetWindowSize(PuglView* view, unsigned int width, unsigned int height); | |||
// DGL specific, assigns backend that matches current DGL build | |||
PUGL_API void | |||
puglSetMatchingBackendForCurrentBuild(PuglView* view); | |||
// DGL specific, build-specific fallback drawing | |||
PUGL_API void | |||
puglFallbackOnDisplay(PuglView* view); | |||
// DGL specific, build-specific fallback resize | |||
PUGL_API void | |||
puglFallbackOnResize(PuglView* view); | |||
PUGL_END_DECLS | |||
// -------------------------------------------------------------------------------------------------------------------- | |||