diff options
author | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2016-01-08 15:41:22 +0100 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2016-01-12 12:37:37 +0000 |
commit | a3aa68222d586f38e261f8dae5b2d50230f3ebb3 (patch) | |
tree | ecab898a95e40091cbb4cfee7dbf4260ee53799a /examples/wayland/minimal-cpp/window.cpp | |
parent | 6aa799c6fe24c29f9d92634b605dd91b2ca12bc1 (diff) |
A minimal c++-based compositor
No input handling.
Change-Id: Ie35f8ad5ff7317c83b9b76bc5c45adaca8bdb6fb
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'examples/wayland/minimal-cpp/window.cpp')
-rw-r--r-- | examples/wayland/minimal-cpp/window.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/examples/wayland/minimal-cpp/window.cpp b/examples/wayland/minimal-cpp/window.cpp new file mode 100644 index 000000000..25ea6b64f --- /dev/null +++ b/examples/wayland/minimal-cpp/window.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Wayland module +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "window.h" +#include "compositor.h" + +#include <QPainter> +#include <QMatrix4x4> +#include <QOpenGLFunctions> + +Window::Window() + : m_compositor(0) +{ +} + +void Window::setCompositor(Compositor *comp) { + m_compositor = comp; +} + +void Window::initializeGL() +{ + m_textureBlitter.create(); +} + +static int sillyrandom(int range) +{ + if (range <= 0) + range = 200; + return qrand() % range; +} + +void Window::paintGL() +{ + m_compositor->startRender(); + + QOpenGLFunctions *functions = context()->functions(); + functions->glClearColor(.4f, .7f, .1f, 0.5f); + functions->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + m_textureBlitter.bind(); + functions->glEnable(GL_BLEND); + functions->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + qsrand(31337); + + Q_FOREACH (View *view, m_compositor->views()) { + if (view->isCursor()) + continue; + GLuint textureId = view->getTexture(); + QWaylandSurface *surface = view->surface(); + if (surface && surface->isMapped()) { + QSize s = surface->size(); + QPointF pos(sillyrandom(width() - s.width()), sillyrandom(height() - s.height())); + QRectF surfaceGeometry(pos, s); + QOpenGLTextureBlitter::Origin surfaceOrigin = + view->currentBuffer().origin() == QWaylandSurface::OriginTopLeft + ? QOpenGLTextureBlitter::OriginTopLeft + : QOpenGLTextureBlitter::OriginBottomLeft; + QMatrix4x4 targetTransform = QOpenGLTextureBlitter::targetTransform(surfaceGeometry, QRect(QPoint(), size())); + m_textureBlitter.blit(textureId, targetTransform, surfaceOrigin); + } + } + m_textureBlitter.release(); + m_compositor->endRender(); +} |