diff options
Diffstat (limited to 'src/declarative/scenegraph/util')
25 files changed, 0 insertions, 4809 deletions
diff --git a/src/declarative/scenegraph/util/qsgareaallocator.cpp b/src/declarative/scenegraph/util/qsgareaallocator.cpp deleted file mode 100644 index c5171f1c93..0000000000 --- a/src/declarative/scenegraph/util/qsgareaallocator.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgareaallocator_p.h" - -#include <QtCore/qglobal.h> -#include <QtCore/qrect.h> -#include <QtCore/qpoint.h> - -QT_BEGIN_NAMESPACE - -namespace -{ - enum SplitType - { - VerticalSplit, - HorizontalSplit - }; - - static const int maxMargin = 2; -} - -struct QSGAreaAllocatorNode -{ - QSGAreaAllocatorNode(QSGAreaAllocatorNode *parent); - ~QSGAreaAllocatorNode(); - inline bool isLeaf(); - - QSGAreaAllocatorNode *parent; - QSGAreaAllocatorNode *left; - QSGAreaAllocatorNode *right; - int split; // only valid for inner nodes. - SplitType splitType; - bool isOccupied; // only valid for leaf nodes. -}; - -QSGAreaAllocatorNode::QSGAreaAllocatorNode(QSGAreaAllocatorNode *parent) - : parent(parent) - , left(0) - , right(0) - , isOccupied(false) -{ -} - -QSGAreaAllocatorNode::~QSGAreaAllocatorNode() -{ - delete left; - delete right; -} - -bool QSGAreaAllocatorNode::isLeaf() -{ - Q_ASSERT((left != 0) == (right != 0)); - return !left; -} - - -QSGAreaAllocator::QSGAreaAllocator(const QSize &size) : m_size(size) -{ - m_root = new QSGAreaAllocatorNode(0); -} - -QSGAreaAllocator::~QSGAreaAllocator() -{ - delete m_root; -} - -QRect QSGAreaAllocator::allocate(const QSize &size) -{ - QPoint point; - bool result = allocateInNode(size, point, QRect(QPoint(0, 0), m_size), m_root); - return result ? QRect(point, size) : QRect(); -} - -bool QSGAreaAllocator::deallocate(const QRect &rect) -{ - return deallocateInNode(rect.topLeft(), m_root); -} - -bool QSGAreaAllocator::allocateInNode(const QSize &size, QPoint &result, const QRect ¤tRect, QSGAreaAllocatorNode *node) -{ - if (size.width() > currentRect.width() || size.height() > currentRect.height()) - return false; - - if (node->isLeaf()) { - if (node->isOccupied) - return false; - if (size.width() + maxMargin >= currentRect.width() && size.height() + maxMargin >= currentRect.height()) { - //Snug fit, occupy entire rectangle. - node->isOccupied = true; - result = currentRect.topLeft(); - return true; - } - // TODO: Reuse nodes. - // Split node. - node->left = new QSGAreaAllocatorNode(node); - node->right = new QSGAreaAllocatorNode(node); - QRect splitRect = currentRect; - if ((currentRect.width() - size.width()) * currentRect.height() < (currentRect.height() - size.height()) * currentRect.width()) { - node->splitType = HorizontalSplit; - node->split = currentRect.top() + size.height(); - splitRect.setHeight(size.height()); - } else { - node->splitType = VerticalSplit; - node->split = currentRect.left() + size.width(); - splitRect.setWidth(size.width()); - } - return allocateInNode(size, result, splitRect, node->left); - } else { - // TODO: avoid unnecessary recursion. - // has been split. - QRect leftRect = currentRect; - QRect rightRect = currentRect; - if (node->splitType == HorizontalSplit) { - leftRect.setHeight(node->split - leftRect.top()); - rightRect.setTop(node->split); - } else { - leftRect.setWidth(node->split - leftRect.left()); - rightRect.setLeft(node->split); - } - if (allocateInNode(size, result, leftRect, node->left)) - return true; - if (allocateInNode(size, result, rightRect, node->right)) - return true; - return false; - } -} - -bool QSGAreaAllocator::deallocateInNode(const QPoint &pos, QSGAreaAllocatorNode *node) -{ - while (!node->isLeaf()) { - // has been split. - int cmp = node->splitType == HorizontalSplit ? pos.y() : pos.x(); - node = cmp < node->split ? node->left : node->right; - } - if (!node->isOccupied) - return false; - node->isOccupied = false; - mergeNodeWithNeighbors(node); - return true; -} - -void QSGAreaAllocator::mergeNodeWithNeighbors(QSGAreaAllocatorNode *node) -{ - bool done = false; - QSGAreaAllocatorNode *parent = 0; - QSGAreaAllocatorNode *current = 0; - QSGAreaAllocatorNode *sibling; - while (!done) { - Q_ASSERT(node->isLeaf()); - Q_ASSERT(!node->isOccupied); - if (node->parent == 0) - return; // No neighbours. - - SplitType splitType = SplitType(node->parent->splitType); - done = true; - - /* Special case. Might be faster than going through the general code path. - // Merge with sibling. - parent = node->parent; - sibling = (node == parent->left ? parent->right : parent->left); - if (sibling->isLeaf() && !sibling->isOccupied) { - Q_ASSERT(!sibling->right); - node = parent; - parent->isOccupied = false; - delete parent->left; - delete parent->right; - parent->left = parent->right = 0; - done = false; - continue; - } - */ - - // Merge with left neighbour. - current = node; - parent = current->parent; - while (parent && current == parent->left && parent->splitType == splitType) { - current = parent; - parent = parent->parent; - } - - if (parent && parent->splitType == splitType) { - Q_ASSERT(current == parent->right); - Q_ASSERT(parent->left); - - QSGAreaAllocatorNode *neighbor = parent->left; - while (neighbor->right && neighbor->splitType == splitType) - neighbor = neighbor->right; - - if (neighbor->isLeaf() && neighbor->parent->splitType == splitType && !neighbor->isOccupied) { - // Left neighbour can be merged. - parent->split = neighbor->parent->split; - - parent = neighbor->parent; - sibling = neighbor == parent->left ? parent->right : parent->left; - QSGAreaAllocatorNode **nodeRef = &m_root; - if (parent->parent) { - if (parent == parent->parent->left) - nodeRef = &parent->parent->left; - else - nodeRef = &parent->parent->right; - } - sibling->parent = parent->parent; - *nodeRef = sibling; - parent->left = parent->right = 0; - delete parent; - delete neighbor; - done = false; - } - } - - // Merge with right neighbour. - current = node; - parent = current->parent; - while (parent && current == parent->right && parent->splitType == splitType) { - current = parent; - parent = parent->parent; - } - - if (parent && parent->splitType == splitType) { - Q_ASSERT(current == parent->left); - Q_ASSERT(parent->right); - - QSGAreaAllocatorNode *neighbor = parent->right; - while (neighbor->left && neighbor->splitType == splitType) - neighbor = neighbor->left; - - if (neighbor->isLeaf() && neighbor->parent->splitType == splitType && !neighbor->isOccupied) { - // Right neighbour can be merged. - parent->split = neighbor->parent->split; - - parent = neighbor->parent; - sibling = neighbor == parent->left ? parent->right : parent->left; - QSGAreaAllocatorNode **nodeRef = &m_root; - if (parent->parent) { - if (parent == parent->parent->left) - nodeRef = &parent->parent->left; - else - nodeRef = &parent->parent->right; - } - sibling->parent = parent->parent; - *nodeRef = sibling; - parent->left = parent->right = 0; - delete parent; - delete neighbor; - done = false; - } - } - } // end while(!done) -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgareaallocator_p.h b/src/declarative/scenegraph/util/qsgareaallocator_p.h deleted file mode 100644 index fd79d4c67a..0000000000 --- a/src/declarative/scenegraph/util/qsgareaallocator_p.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef AREAALLOCATOR_H -#define AREAALLOCATOR_H - -#include <QtCore/qsize.h> - -QT_BEGIN_NAMESPACE - -class QRect; -class QPoint; -struct QSGAreaAllocatorNode; -class Q_DECLARATIVE_EXPORT QSGAreaAllocator -{ -public: - QSGAreaAllocator(const QSize &size); - ~QSGAreaAllocator(); - - QRect allocate(const QSize &size); - bool deallocate(const QRect &rect); - bool isEmpty() const { return m_root == 0; } - QSize size() const { return m_size; } -private: - bool allocateInNode(const QSize &size, QPoint &result, const QRect ¤tRect, QSGAreaAllocatorNode *node); - bool deallocateInNode(const QPoint &pos, QSGAreaAllocatorNode *node); - void mergeNodeWithNeighbors(QSGAreaAllocatorNode *node); - - QSGAreaAllocatorNode *m_root; - QSize m_size; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/declarative/scenegraph/util/qsgdistancefieldutil.cpp b/src/declarative/scenegraph/util/qsgdistancefieldutil.cpp deleted file mode 100644 index 3429162d6b..0000000000 --- a/src/declarative/scenegraph/util/qsgdistancefieldutil.cpp +++ /dev/null @@ -1,805 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgdistancefieldutil_p.h" - -#include <qmath.h> -#include <private/qsgpathsimplifier_p.h> -#include <private/qsgadaptationlayer_p.h> -#include <QtGui/private/qopenglengineshadersource_p.h> -#include <private/qsgcontext_p.h> - -QT_BEGIN_NAMESPACE - -static float defaultThresholdFunc(float glyphScale) -{ - static float base = qgetenv("QT_DF_BASE").isEmpty() ? 0.5f : qgetenv("QT_DF_BASE").toFloat(); - static float baseDev = qgetenv("QT_DF_BASEDEVIATION").isEmpty() ? 0.065f : qgetenv("QT_DF_BASEDEVIATION").toFloat(); - static float devScaleMin = qgetenv("QT_DF_SCALEFORMAXDEV").isEmpty() ? 0.15f : qgetenv("QT_DF_SCALEFORMAXDEV").toFloat(); - static float devScaleMax = qgetenv("QT_DF_SCALEFORNODEV").isEmpty() ? 0.3f : qgetenv("QT_DF_SCALEFORNODEV").toFloat(); - return base - ((qBound(devScaleMin, glyphScale, devScaleMax) - devScaleMin) / (devScaleMax - devScaleMin) * -baseDev + baseDev); -} - -static float defaultAntialiasingSpreadFunc(float glyphScale) -{ - static float range = qgetenv("QT_DF_RANGE").isEmpty() ? 0.06f : qgetenv("QT_DF_RANGE").toFloat(); - return range / glyphScale; -} - -namespace -{ - enum FillHDir - { - LeftToRight, - RightToLeft - }; - - enum FillVDir - { - TopDown, - BottomUp - }; - - enum FillClip - { - NoClip, - Clip - }; -} - -template <FillClip clip, FillHDir dir> -inline void fillLine(qint32 *, int, int, int, qint32, qint32) -{ -} - -template <> -inline void fillLine<Clip, LeftToRight>(qint32 *line, int width, int lx, int rx, qint32 d, qint32 dd) -{ - int fromX = qMax(0, lx >> 8); - int toX = qMin(width, rx >> 8); - int x = toX - fromX; - if (x <= 0) - return; - qint32 val = d + (((fromX << 8) + 0xff - lx) * dd >> 8); - line += fromX; - do { - *line = abs(val) < abs(*line) ? val : *line; - val += dd; - ++line; - } while (--x); -} - -template <> -inline void fillLine<Clip, RightToLeft>(qint32 *line, int width, int lx, int rx, qint32 d, qint32 dd) -{ - int fromX = qMax(0, lx >> 8); - int toX = qMin(width, rx >> 8); - int x = toX - fromX; - if (x <= 0) - return; - qint32 val = d + (((toX << 8) + 0xff - rx) * dd >> 8); - line += toX; - do { - val -= dd; - --line; - *line = abs(val) < abs(*line) ? val : *line; - } while (--x); -} - -template <> -inline void fillLine<NoClip, LeftToRight>(qint32 *line, int, int lx, int rx, qint32 d, qint32 dd) -{ - int fromX = lx >> 8; - int toX = rx >> 8; - int x = toX - fromX; - if (x <= 0) - return; - qint32 val = d + ((~lx & 0xff) * dd >> 8); - line += fromX; - do { - *line = abs(val) < abs(*line) ? val : *line; - val += dd; - ++line; - } while (--x); -} - -template <> -inline void fillLine<NoClip, RightToLeft>(qint32 *line, int, int lx, int rx, qint32 d, qint32 dd) -{ - int fromX = lx >> 8; - int toX = rx >> 8; - int x = toX - fromX; - if (x <= 0) - return; - qint32 val = d + ((~rx & 0xff) * dd >> 8); - line += toX; - do { - val -= dd; - --line; - *line = abs(val) < abs(*line) ? val : *line; - } while (--x); -} - -template <FillClip clip, FillVDir vDir, FillHDir hDir> -inline void fillLines(qint32 *bits, int width, int height, int upperY, int lowerY, - int &lx, int ldx, int &rx, int rdx, qint32 &d, qint32 ddy, qint32 ddx) -{ - Q_UNUSED(height); - Q_ASSERT(upperY < lowerY); - int y = lowerY - upperY; - if (vDir == TopDown) { - qint32 *line = bits + upperY * width; - do { - fillLine<clip, hDir>(line, width, lx, rx, d, ddx); - lx += ldx; - d += ddy; - rx += rdx; - line += width; - } while (--y); - } else { - qint32 *line = bits + lowerY * width; - do { - lx -= ldx; - d -= ddy; - rx -= rdx; - line -= width; - fillLine<clip, hDir>(line, width, lx, rx, d, ddx); - } while (--y); - } -} - -template <FillClip clip> -void drawTriangle(qint32 *bits, int width, int height, const QPoint *center, - const QPoint *v1, const QPoint *v2, qint32 value) -{ - const int y1 = clip == Clip ? qBound(0, v1->y() >> 8, height) : v1->y() >> 8; - const int y2 = clip == Clip ? qBound(0, v2->y() >> 8, height) : v2->y() >> 8; - const int yC = clip == Clip ? qBound(0, center->y() >> 8, height) : center->y() >> 8; - - const int v1Frac = clip == Clip ? (y1 << 8) + 0xff - v1->y() : ~v2->y() & 0xff; - const int v2Frac = clip == Clip ? (y2 << 8) + 0xff - v2->y() : ~v1->y() & 0xff; - const int centerFrac = clip == Clip ? (yC << 8) + 0xff - center->y() : ~center->y() & 0xff; - - int dx1 = 0, x1 = 0, dx2 = 0, x2 = 0; - qint32 dd1, d1, dd2, d2; - if (v1->y() != center->y()) { - dx1 = ((v1->x() - center->x()) << 8) / (v1->y() - center->y()); - x1 = center->x() + centerFrac * (v1->x() - center->x()) / (v1->y() - center->y()); - } - if (v2->y() != center->y()) { - dx2 = ((v2->x() - center->x()) << 8) / (v2->y() - center->y()); - x2 = center->x() + centerFrac * (v2->x() - center->x()) / (v2->y() - center->y()); - } - - const qint32 div = (v2->x() - center->x()) * (v1->y() - center->y()) - - (v2->y() - center->y()) * (v1->x() - center->x()); - const qint32 dd = div ? qint32((qint64(value * (v1->y() - v2->y())) << 8) / div) : 0; - - if (y2 < yC) { - if (y1 < yC) { - // Center at the bottom. - if (y2 < y1) { - // y2 < y1 < yC - // Long right edge. - d1 = centerFrac * value / (v1->y() - center->y()); - dd1 = ((value << 8) / (v1->y() - center->y())); - fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y1, yC, x1, dx1, - x2, dx2, d1, dd1, dd); - dx1 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - x1 = v1->x() + v1Frac * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y2, y1, x1, dx1, - x2, dx2, value, 0, dd); - } else { - // y1 <= y2 < yC - // Long left edge. - d2 = centerFrac * value / (v2->y() - center->y()); - dd2 = ((value << 8) / (v2->y() - center->y())); - fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y2, yC, x1, dx1, - x2, dx2, d2, dd2, dd); - if (y1 != y2) { - dx2 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - x2 = v2->x() + v2Frac * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y1, y2, x1, dx1, - x2, dx2, value, 0, dd); - } - } - } else { - // y2 < yC <= y1 - // Center to the right. - int dx = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - int xUp, xDn; - xUp = xDn = v2->x() + (clip == Clip ? (yC << 8) + 0xff - v2->y() - : (center->y() | 0xff) - v2->y()) - * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, BottomUp, LeftToRight>(bits, width, height, y2, yC, xUp, dx, - x2, dx2, value, 0, dd); - if (yC != y1) - fillLines<clip, TopDown, LeftToRight>(bits, width, height, yC, y1, xDn, dx, - x1, dx1, value, 0, dd); - } - } else { - if (y1 < yC) { - // y1 < yC <= y2 - // Center to the left. - int dx = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - int xUp, xDn; - xUp = xDn = v1->x() + (clip == Clip ? (yC << 8) + 0xff - v1->y() - : (center->y() | 0xff) - v1->y()) - * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, BottomUp, RightToLeft>(bits, width, height, y1, yC, x1, dx1, - xUp, dx, value, 0, dd); - if (yC != y2) - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yC, y2, x2, dx2, - xDn, dx, value, 0, dd); - } else { - // Center at the top. - if (y2 < y1) { - // yC <= y2 < y1 - // Long right edge. - if (yC != y2) { - d2 = centerFrac * value / (v2->y() - center->y()); - dd2 = ((value << 8) / (v2->y() - center->y())); - fillLines<clip, TopDown, LeftToRight>(bits, width, height, yC, y2, x2, dx2, - x1, dx1, d2, dd2, dd); - } - dx2 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - x2 = v2->x() + v2Frac * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, TopDown, LeftToRight>(bits, width, height, y2, y1, x2, dx2, - x1, dx1, value, 0, dd); - } else { - // Long left edge. - // yC <= y1 <= y2 - if (yC != y1) { - d1 = centerFrac * value / (v1->y() - center->y()); - dd1 = ((value << 8) / (v1->y() - center->y())); - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yC, y1, x2, dx2, - x1, dx1, d1, dd1, dd); - } - if (y1 != y2) { - dx1 = ((v1->x() - v2->x()) << 8) / (v1->y() - v2->y()); - x1 = v1->x() + v1Frac * (v1->x() - v2->x()) / (v1->y() - v2->y()); - fillLines<clip, TopDown, RightToLeft>(bits, width, height, y1, y2, x2, dx2, - x1, dx1, value, 0, dd); - } - } - } - } -} - -template <FillClip clip> -void drawRectangle(qint32 *bits, int width, int height, - const QPoint *int1, const QPoint *center1, const QPoint *ext1, - const QPoint *int2, const QPoint *center2, const QPoint *ext2, - qint32 extValue) -{ - if (center1->y() > center2->y()) { - qSwap(center1, center2); - qSwap(int1, ext2); - qSwap(ext1, int2); - extValue = -extValue; - } - - Q_ASSERT(ext1->x() - center1->x() == center1->x() - int1->x()); - Q_ASSERT(ext1->y() - center1->y() == center1->y() - int1->y()); - Q_ASSERT(ext2->x() - center2->x() == center2->x() - int2->x()); - Q_ASSERT(ext2->y() - center2->y() == center2->y() - int2->y()); - - const int yc1 = clip == Clip ? qBound(0, center1->y() >> 8, height) : center1->y() >> 8; - const int yc2 = clip == Clip ? qBound(0, center2->y() >> 8, height) : center2->y() >> 8; - const int yi1 = clip == Clip ? qBound(0, int1->y() >> 8, height) : int1->y() >> 8; - const int yi2 = clip == Clip ? qBound(0, int2->y() >> 8, height) : int2->y() >> 8; - const int ye1 = clip == Clip ? qBound(0, ext1->y() >> 8, height) : ext1->y() >> 8; - const int ye2 = clip == Clip ? qBound(0, ext2->y() >> 8, height) : ext2->y() >> 8; - - const int center1Frac = clip == Clip ? (yc1 << 8) + 0xff - center1->y() : ~center1->y() & 0xff; - const int center2Frac = clip == Clip ? (yc2 << 8) + 0xff - center2->y() : ~center2->y() & 0xff; - const int int1Frac = clip == Clip ? (yi1 << 8) + 0xff - int1->y() : ~int1->y() & 0xff; - const int ext1Frac = clip == Clip ? (ye1 << 8) + 0xff - ext1->y() : ~ext1->y() & 0xff; - - int dxC = 0, dxE = 0; // cap slope, edge slope - qint32 ddC = 0; - if (ext1->y() != int1->y()) { - dxC = ((ext1->x() - int1->x()) << 8) / (ext1->y() - int1->y()); - ddC = (extValue << 9) / (ext1->y() - int1->y()); - } - if (ext1->y() != ext2->y()) - dxE = ((ext1->x() - ext2->x()) << 8) / (ext1->y() - ext2->y()); - - const qint32 div = (ext1->x() - int1->x()) * (ext2->y() - int1->y()) - - (ext1->y() - int1->y()) * (ext2->x() - int1->x()); - const qint32 dd = div ? qint32((qint64(extValue * (ext2->y() - ext1->y())) << 9) / div) : 0; - - int xe1, xe2, xc1, xc2; - qint32 d; - - qint32 intValue = -extValue; - - if (center2->x() < center1->x()) { - // Leaning to the right. '/' - if (int1->y() < ext2->y()) { - // Mostly vertical. - Q_ASSERT(ext1->y() != ext2->y()); - xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - if (ye1 != yi1) { - xc2 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc2 += (ye1 - yc1) * dxC; - fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, yi1, xe1, dxE, - xc2, dxC, extValue, 0, dd); - } - if (yi1 != ye2) - fillLines<clip, TopDown, LeftToRight>(bits, width, height, yi1, ye2, xe1, dxE, - xe2, dxE, extValue, 0, dd); - if (ye2 != yi2) { - xc1 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc1 += (ye2 - yc2) * dxC; - fillLines<clip, TopDown, RightToLeft>(bits, width, height, ye2, yi2, xc1, dxC, - xe2, dxE, intValue, 0, dd); - } - } else { - // Mostly horizontal. - Q_ASSERT(ext1->y() != int1->y()); - xc1 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc2 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc1 += (ye2 - yc2) * dxC; - xc2 += (ye1 - yc1) * dxC; - if (ye1 != ye2) { - xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, ye2, xe1, dxE, - xc2, dxC, extValue, 0, dd); - } - if (ye2 != yi1) { - d = (clip == Clip ? (ye2 << 8) + 0xff - center2->y() - : (ext2->y() | 0xff) - center2->y()) - * 2 * extValue / (ext1->y() - int1->y()); - fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye2, yi1, xc1, dxC, - xc2, dxC, d, ddC, dd); - } - if (yi1 != yi2) { - xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, yi2, xc1, dxC, - xe2, dxE, intValue, 0, dd); - } - } - } else { - // Leaning to the left. '\' - if (ext1->y() < int2->y()) { - // Mostly vertical. - Q_ASSERT(ext1->y() != ext2->y()); - xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - if (yi1 != ye1) { - xc1 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc1 += (yi1 - yc1) * dxC; - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, ye1, xc1, dxC, - xe2, dxE, intValue, 0, dd); - } - if (ye1 != yi2) - fillLines<clip, TopDown, RightToLeft>(bits, width, height, ye1, yi2, xe1, dxE, - xe2, dxE, intValue, 0, dd); - if (yi2 != ye2) { - xc2 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc2 += (yi2 - yc2) * dxC; - fillLines<clip, TopDown, LeftToRight>(bits, width, height, yi2, ye2, xe1, dxE, - xc2, dxC, extValue, 0, dd); - } - } else { - // Mostly horizontal. - Q_ASSERT(ext1->y() != int1->y()); - xc1 = center1->x() + center1Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc2 = center2->x() + center2Frac * (ext1->x() - int1->x()) / (ext1->y() - int1->y()); - xc1 += (yi1 - yc1) * dxC; - xc2 += (yi2 - yc2) * dxC; - if (yi1 != yi2) { - xe2 = int1->x() + int1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi1, yi2, xc1, dxC, - xe2, dxE, intValue, 0, dd); - } - if (yi2 != ye1) { - d = (clip == Clip ? (yi2 << 8) + 0xff - center2->y() - : (int2->y() | 0xff) - center2->y()) - * 2 * extValue / (ext1->y() - int1->y()); - fillLines<clip, TopDown, RightToLeft>(bits, width, height, yi2, ye1, xc1, dxC, - xc2, dxC, d, ddC, dd); - } - if (ye1 != ye2) { - xe1 = ext1->x() + ext1Frac * (ext1->x() - ext2->x()) / (ext1->y() - ext2->y()); - fillLines<clip, TopDown, LeftToRight>(bits, width, height, ye1, ye2, xe1, dxE, - xc2, dxC, extValue, 0, dd); - } - } - } -} - -static void drawPolygons(qint32 *bits, int width, int height, const QPoint *vertices, - const quint32 *indices, int indexCount, qint32 value) -{ - Q_ASSERT(indexCount != 0); - Q_ASSERT(height <= 128); - QVarLengthArray<quint8, 16> scans[128]; - int first = 0; - for (int i = 1; i < indexCount; ++i) { - quint32 idx1 = indices[i - 1]; - quint32 idx2 = indices[i]; - Q_ASSERT(idx1 != quint32(-1)); - if (idx2 == quint32(-1)) { - idx2 = indices[first]; - Q_ASSERT(idx2 != quint32(-1)); - first = ++i; - } - const QPoint *v1 = &vertices[idx1]; - const QPoint *v2 = &vertices[idx2]; - if (v2->y() < v1->y()) - qSwap(v1, v2); - int fromY = qMax(0, v1->y() >> 8); - int toY = qMin(height, v2->y() >> 8); - if (fromY >= toY) - continue; - int dx = ((v2->x() - v1->x()) << 8) / (v2->y() - v1->y()); - int x = v1->x() + ((fromY << 8) + 0xff - v1->y()) * (v2->x() - v1->x()) / (v2->y() - v1->y()); - for (int y = fromY; y < toY; ++y) { - quint32 c = quint32(x >> 8); - if (c < quint32(width)) - scans[y].append(quint8(c)); - x += dx; - } - } - for (int i = 0; i < height; ++i) { - quint8 *scanline = scans[i].data(); - int size = scans[i].size(); - for (int j = 1; j < size; ++j) { - int k = j; - quint8 value = scanline[k]; - for (; k != 0 && value < scanline[k - 1]; --k) - scanline[k] = scanline[k - 1]; - scanline[k] = value; - } - qint32 *line = bits + i * width; - int j = 0; - for (; j + 1 < size; j += 2) { - for (quint8 x = scanline[j]; x < scanline[j + 1]; ++x) - line[x] = value; - } - if (j < size) { - for (int x = scanline[j]; x < width; ++x) - line[x] = value; - } - } -} - -static QImage makeDistanceField(int imgSize, const QPainterPath &path, int dfScale, int offs) -{ - QImage image(imgSize, imgSize, QImage::Format_Indexed8); - - if (path.isEmpty()) { - image.fill(0); - return image; - } - - QTransform transform; - transform.translate(offs, offs); - transform.scale(qreal(1) / dfScale, qreal(1) / dfScale); - - QDataBuffer<quint32> pathIndices(0); - QDataBuffer<QPoint> pathVertices(0); - qSimplifyPath(path, pathVertices, pathIndices, transform); - - const qint32 interiorColor = -0x7f80; // 8:8 signed format, -127.5 - const qint32 exteriorColor = 0x7f80; // 8:8 signed format, 127.5 - - QScopedArrayPointer<qint32> bits(new qint32[imgSize * imgSize]); - for (int i = 0; i < imgSize * imgSize; ++i) - bits[i] = exteriorColor; - - const qreal angleStep = qreal(15 * 3.141592653589793238 / 180); - const QPoint rotation(qRound(cos(angleStep) * 0x4000), - qRound(sin(angleStep) * 0x4000)); // 2:14 signed - - const quint32 *indices = pathIndices.data(); - QVarLengthArray<QPoint> normals; - QVarLengthArray<QPoint> vertices; - QVarLengthArray<bool> isConvex; - QVarLengthArray<bool> needsClipping; - - drawPolygons(bits.data(), imgSize, imgSize, pathVertices.data(), indices, pathIndices.size(), - interiorColor); - - int index = 0; - - while (index < pathIndices.size()) { - normals.clear(); - vertices.clear(); - needsClipping.clear(); - - // Find end of polygon. - int end = index; - while (indices[end] != quint32(-1)) - ++end; - - // Calculate vertex normals. - for (int next = index, prev = end - 1; next < end; prev = next++) { - quint32 fromVertexIndex = indices[prev]; - quint32 toVertexIndex = indices[next]; - - const QPoint &from = pathVertices.at(fromVertexIndex); - const QPoint &to = pathVertices.at(toVertexIndex); - - QPoint n(to.y() - from.y(), from.x() - to.x()); - if (n.x() == 0 && n.y() == 0) - continue; - int scale = qRound((offs << 16) / sqrt(qreal(n.x() * n.x() + n.y() * n.y()))); // 8:16 - n.rx() = n.x() * scale >> 8; - n.ry() = n.y() * scale >> 8; - normals.append(n); - QPoint v(to.x() + 0x7f, to.y() + 0x7f); - vertices.append(v); - needsClipping.append((to.x() < offs << 8) || (to.x() >= (imgSize - offs) << 8) - || (to.y() < offs << 8) || (to.y() >= (imgSize - offs) << 8)); - } - - isConvex.resize(normals.count()); - for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++) { - isConvex[prev] = normals.at(prev).x() * normals.at(next).y() - - normals.at(prev).y() * normals.at(next).x() < 0; - } - - // Draw quads. - for (int next = 0, prev = normals.count() - 1; next < normals.count(); prev = next++) { - QPoint n = normals.at(next); - QPoint intPrev = vertices.at(prev); - QPoint extPrev = vertices.at(prev); - QPoint intNext = vertices.at(next); - QPoint extNext = vertices.at(next); - - extPrev.rx() -= n.x(); - extPrev.ry() -= n.y(); - intPrev.rx() += n.x(); - intPrev.ry() += n.y(); - extNext.rx() -= n.x(); - extNext.ry() -= n.y(); - intNext.rx() += n.x(); - intNext.ry() += n.y(); - - if (needsClipping[prev] || needsClipping[next]) { - drawRectangle<Clip>(bits.data(), imgSize, imgSize, - &intPrev, &vertices.at(prev), &extPrev, - &intNext, &vertices.at(next), &extNext, - exteriorColor); - } else { - drawRectangle<NoClip>(bits.data(), imgSize, imgSize, - &intPrev, &vertices.at(prev), &extPrev, - &intNext, &vertices.at(next), &extNext, - exteriorColor); - } - - if (isConvex.at(prev)) { - QPoint p = extPrev; - if (needsClipping[prev]) { - for (;;) { - QPoint rn((n.x() * rotation.x() - n.y() * rotation.y()) >> 14, - (n.y() * rotation.x() + n.x() * rotation.y()) >> 14); - n = rn; - if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) { - p.rx() = vertices.at(prev).x() - normals.at(prev).x(); - p.ry() = vertices.at(prev).y() - normals.at(prev).y(); - drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &extPrev, &p, exteriorColor); - break; - } - - p.rx() = vertices.at(prev).x() - n.x(); - p.ry() = vertices.at(prev).y() - n.y(); - drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &extPrev, &p, exteriorColor); - extPrev = p; - } - } else { - for (;;) { - QPoint rn((n.x() * rotation.x() - n.y() * rotation.y()) >> 14, - (n.y() * rotation.x() + n.x() * rotation.y()) >> 14); - n = rn; - if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() <= 0) { - p.rx() = vertices.at(prev).x() - normals.at(prev).x(); - p.ry() = vertices.at(prev).y() - normals.at(prev).y(); - drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &extPrev, &p, exteriorColor); - break; - } - - p.rx() = vertices.at(prev).x() - n.x(); - p.ry() = vertices.at(prev).y() - n.y(); - drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &extPrev, &p, exteriorColor); - extPrev = p; - } - } - } else { - QPoint p = intPrev; - if (needsClipping[prev]) { - for (;;) { - QPoint rn((n.x() * rotation.x() + n.y() * rotation.y()) >> 14, - (n.y() * rotation.x() - n.x() * rotation.y()) >> 14); - n = rn; - if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) { - p.rx() = vertices.at(prev).x() + normals.at(prev).x(); - p.ry() = vertices.at(prev).y() + normals.at(prev).y(); - drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &p, &intPrev, interiorColor); - break; - } - - p.rx() = vertices.at(prev).x() + n.x(); - p.ry() = vertices.at(prev).y() + n.y(); - drawTriangle<Clip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &p, &intPrev, interiorColor); - intPrev = p; - } - } else { - for (;;) { - QPoint rn((n.x() * rotation.x() + n.y() * rotation.y()) >> 14, - (n.y() * rotation.x() - n.x() * rotation.y()) >> 14); - n = rn; - if (n.x() * normals.at(prev).y() - n.y() * normals.at(prev).x() >= 0) { - p.rx() = vertices.at(prev).x() + normals.at(prev).x(); - p.ry() = vertices.at(prev).y() + normals.at(prev).y(); - drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &p, &intPrev, interiorColor); - break; - } - - p.rx() = vertices.at(prev).x() + n.x(); - p.ry() = vertices.at(prev).y() + n.y(); - drawTriangle<NoClip>(bits.data(), imgSize, imgSize, &vertices.at(prev), - &p, &intPrev, interiorColor); - intPrev = p; - } - } - } - } - - index = end + 1; - } - - const qint32 *inLine = bits.data(); - uchar *outLine = image.bits(); - int padding = image.bytesPerLine() - image.width(); - for (int y = 0; y < imgSize; ++y) { - for (int x = 0; x < imgSize; ++x, ++inLine, ++outLine) - *outLine = uchar((0x7f80 - *inLine) >> 8); - outLine += padding; - } - - return image; -} - -bool qt_fontHasNarrowOutlines(const QRawFont &f) -{ - QRawFont font = f; - font.setPixelSize(QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE); - Q_ASSERT(font.isValid()); - - QVector<quint32> glyphIndices = font.glyphIndexesForString(QLatin1String("O")); - if (glyphIndices.size() < 1) - return false; - - QImage im = font.alphaMapForGlyph(glyphIndices.at(0), QRawFont::PixelAntialiasing); - if (im.isNull()) - return false; - - int minHThick = 999; - int minVThick = 999; - - int thick = 0; - bool in = false; - int y = (im.height() + 1) / 2; - for (int x = 0; x < im.width(); ++x) { - int a = qAlpha(im.pixel(x, y)); - if (a > 127) { - in = true; - ++thick; - } else if (in) { - in = false; - minHThick = qMin(minHThick, thick); - thick = 0; - } - } - - thick = 0; - in = false; - int x = (im.width() + 1) / 2; - for (int y = 0; y < im.height(); ++y) { - int a = qAlpha(im.pixel(x, y)); - if (a > 127) { - in = true; - ++thick; - } else if (in) { - in = false; - minVThick = qMin(minVThick, thick); - thick = 0; - } - } - - return minHThick == 1 || minVThick == 1; -} - -QImage qt_renderDistanceFieldGlyph(const QRawFont &font, glyph_t glyph, bool doubleResolution) -{ - QRawFont renderFont = font; - renderFont.setPixelSize(QT_DISTANCEFIELD_BASEFONTSIZE(doubleResolution) * QT_DISTANCEFIELD_SCALE(doubleResolution)); - - QPainterPath path = renderFont.pathForGlyph(glyph); - path.translate(-path.boundingRect().topLeft()); - path.setFillRule(Qt::WindingFill); - - QImage im = makeDistanceField(QT_DISTANCEFIELD_TILESIZE(doubleResolution), - path, - QT_DISTANCEFIELD_SCALE(doubleResolution), - QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution)); - return im; -} - -QSGDistanceFieldGlyphCacheManager::QSGDistanceFieldGlyphCacheManager(QSGContext *c) - : sgCtx(c) - , m_threshold_func(defaultThresholdFunc) - , m_antialiasingSpread_func(defaultAntialiasingSpreadFunc) -{ -#ifndef QT_OPENGL_ES - m_defaultAntialiasingMode = QSGGlyphNode::HighQualitySubPixelAntialiasing; -#else - m_defaultAntialiasingMode = QSGGlyphNode::GrayAntialiasing; -#endif -} - -QSGDistanceFieldGlyphCacheManager::~QSGDistanceFieldGlyphCacheManager() -{ - qDeleteAll(m_caches.values()); -} - -QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCacheManager::cache(const QRawFont &font) -{ - QRawFontPrivate *fontD = QRawFontPrivate::get(font); - QHash<QFontEngine *, QSGDistanceFieldGlyphCache *>::iterator cache = m_caches.find(fontD->fontEngine); - if (cache == m_caches.end()) - cache = m_caches.insert(fontD->fontEngine, sgCtx->createDistanceFieldGlyphCache(font)); - return cache.value(); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgdistancefieldutil_p.h b/src/declarative/scenegraph/util/qsgdistancefieldutil_p.h deleted file mode 100644 index 93dffab76e..0000000000 --- a/src/declarative/scenegraph/util/qsgdistancefieldutil_p.h +++ /dev/null @@ -1,111 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGDISTANCEFIELDUTIL_H -#define QSGDISTANCEFIELDUTIL_H - -#include <qrawfont.h> -#include <private/qfontengine_p.h> -#include <private/qsgadaptationlayer_p.h> - -QT_BEGIN_NAMESPACE - -#define QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE 54 -#define QT_DISTANCEFIELD_DEFAULT_TILESIZE 64 -#define QT_DISTANCEFIELD_DEFAULT_SCALE 16 -#define QT_DISTANCEFIELD_DEFAULT_RADIUS 80 -#define QT_DISTANCEFIELD_HIGHGLYPHCOUNT 2000 - -#define QT_DISTANCEFIELD_BASEFONTSIZE(NarrowOutlineFont) \ - (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE * 2 : \ - QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE) -#define QT_DISTANCEFIELD_TILESIZE(NarrowOutlineFont) \ - (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_TILESIZE * 2 : \ - QT_DISTANCEFIELD_DEFAULT_TILESIZE) -#define QT_DISTANCEFIELD_SCALE(NarrowOutlineFont) \ - (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_SCALE / 2 : \ - QT_DISTANCEFIELD_DEFAULT_SCALE) -#define QT_DISTANCEFIELD_RADIUS(NarrowOutlineFont) \ - (NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_RADIUS / 2 : \ - QT_DISTANCEFIELD_DEFAULT_RADIUS) - - -typedef float (*ThresholdFunc)(float glyphScale); -typedef float (*AntialiasingSpreadFunc)(float glyphScale); - -bool qt_fontHasNarrowOutlines(const QRawFont &f); -QImage qt_renderDistanceFieldGlyph(const QRawFont &font, glyph_t glyph, bool doubleResolution); - - -class QOpenGLShaderProgram; -class QSGDistanceFieldGlyphCache; -class QSGContext; - -class Q_DECLARATIVE_EXPORT QSGDistanceFieldGlyphCacheManager -{ -public: - QSGDistanceFieldGlyphCacheManager(QSGContext *c); - ~QSGDistanceFieldGlyphCacheManager(); - - QSGDistanceFieldGlyphCache *cache(const QRawFont &font); - - QSGGlyphNode::AntialiasingMode defaultAntialiasingMode() const { return m_defaultAntialiasingMode; } - void setDefaultAntialiasingMode(QSGGlyphNode::AntialiasingMode mode) { m_defaultAntialiasingMode = mode; } - - ThresholdFunc thresholdFunc() const { return m_threshold_func; } - void setThresholdFunc(ThresholdFunc func) { m_threshold_func = func; } - - AntialiasingSpreadFunc antialiasingSpreadFunc() const { return m_antialiasingSpread_func; } - void setAntialiasingSpreadFunc(AntialiasingSpreadFunc func) { m_antialiasingSpread_func = func; } - -private: - QHash<QFontEngine *, QSGDistanceFieldGlyphCache *> m_caches; - - QSGContext *sgCtx; - - QSGGlyphNode::AntialiasingMode m_defaultAntialiasingMode; - ThresholdFunc m_threshold_func; - AntialiasingSpreadFunc m_antialiasingSpread_func; -}; - -QT_END_NAMESPACE - -#endif // QSGDISTANCEFIELDUTIL_H diff --git a/src/declarative/scenegraph/util/qsgengine.cpp b/src/declarative/scenegraph/util/qsgengine.cpp deleted file mode 100644 index 88eeebc472..0000000000 --- a/src/declarative/scenegraph/util/qsgengine.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgengine.h" - -#include <qquickcanvas.h> - -#include <private/qobject_p.h> -#include <QtGui/QColor> - -QT_BEGIN_NAMESPACE - -class QSGEnginePrivate : public QObjectPrivate -{ -public: - QSGEnginePrivate() - : canvas(0) - { - } - - QQuickCanvas *canvas; -}; - -/*! - \class QSGEngine - \deprecated - */ - -QSGEngine::QSGEngine(QObject *parent) : - QObject(*(new QSGEnginePrivate), parent) -{ -} - - -QSGEngine::~QSGEngine() -{ -} - - -void QSGEngine::setCanvas(QQuickCanvas *canvas) -{ - d_func()->canvas = canvas; - connect(canvas, SIGNAL(afterRendering()), this, SIGNAL(afterRendering())); - connect(canvas, SIGNAL(beforeRendering()), this, SIGNAL(beforeRendering())); -} - -void QSGEngine::setClearBeforeRendering(bool enabled) -{ - d_func()->canvas->setClearBeforeRendering(enabled); -} - -bool QSGEngine::clearBeforeRendering() const -{ - return d_func()->canvas->clearBeforeRendering(); -} - -QSGTexture *QSGEngine::createTextureFromImage(const QImage &image) const -{ - return d_func()->canvas->createTextureFromImage(image); -} - -QSGTexture *QSGEngine::createTextureFromId(uint id, const QSize &size, TextureOptions options) const -{ - return d_func()->canvas->createTextureFromId(id, size, QQuickCanvas::CreateTextureOptions((int) options)); -} - -void QSGEngine::setClearColor(const QColor &color) -{ - d_func()->canvas->setClearColor(color); -} - -QColor QSGEngine::clearColor() const -{ - return d_func()->canvas->clearColor(); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgengine.h b/src/declarative/scenegraph/util/qsgengine.h deleted file mode 100644 index 0cbbcddfec..0000000000 --- a/src/declarative/scenegraph/util/qsgengine.h +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGENGINE_H -#define QSGENGINE_H - -#include <QObject> - -#include <qsgtexture.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QSGEnginePrivate; - -class QQuickCanvas; - -class Q_DECLARATIVE_EXPORT QSGEngine : public QObject -{ - Q_OBJECT - - Q_DECLARE_PRIVATE(QSGEngine) - -public: - - enum TextureOption { - TextureHasAlphaChannel = 0x0001, - TextureHasMipmaps = 0x0002, - TextureOwnsGLTexture = 0x0004 - }; - Q_DECLARE_FLAGS(TextureOptions, TextureOption) - - QSGTexture *createTextureFromImage(const QImage &image) const; - QSGTexture *createTextureFromId(uint id, const QSize &size, TextureOptions options = TextureOption(0)) const; - - void setClearBeforeRendering(bool enabled); - bool clearBeforeRendering() const; - - void setClearColor(const QColor &color); - QColor clearColor() const; - -Q_SIGNALS: - void beforeRendering(); - void afterRendering(); - -private: - QSGEngine(QObject *parent = 0); - ~QSGEngine(); - - friend class QSGContext; - friend class QSGContextPrivate; - friend class QQuickCanvasPrivate; - void setCanvas(QQuickCanvas *canvas); - -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QSGENGINE_H diff --git a/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp b/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp deleted file mode 100644 index ee73616e4f..0000000000 --- a/src/declarative/scenegraph/util/qsgflatcolormaterial.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgflatcolormaterial.h" - -#include <qopenglshaderprogram.h> - -QT_BEGIN_NAMESPACE - -class FlatColorMaterialShader : public QSGMaterialShader -{ -public: - virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect); - virtual char const *const *attributeNames() const; - - static QSGMaterialType type; - -private: - virtual void initialize(); - virtual const char *vertexShader() const; - virtual const char *fragmentShader() const; - - int m_matrix_id; - int m_color_id; -}; - -QSGMaterialType FlatColorMaterialShader::type; - -void FlatColorMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) -{ - Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type()); - - QSGFlatColorMaterial *oldMaterial = static_cast<QSGFlatColorMaterial *>(oldEffect); - QSGFlatColorMaterial *newMaterial = static_cast<QSGFlatColorMaterial *>(newEffect); - - const QColor &c = newMaterial->color(); - - if (oldMaterial == 0 || c != oldMaterial->color() || state.isOpacityDirty()) { - float opacity = state.opacity(); - QVector4D v(c.redF() * c.alphaF() * opacity, - c.greenF() * c.alphaF() * opacity, - c.blueF() * c.alphaF() * opacity, - c.alphaF() * opacity); - program()->setUniformValue(m_color_id, v); - } - - if (state.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, state.combinedMatrix()); -} - -char const *const *FlatColorMaterialShader::attributeNames() const -{ - static char const *const attr[] = { "vCoord", 0 }; - return attr; -} - -void FlatColorMaterialShader::initialize() -{ - m_matrix_id = program()->uniformLocation("matrix"); - m_color_id = program()->uniformLocation("color"); -} - -const char *FlatColorMaterialShader::vertexShader() const { - return - "attribute highp vec4 vCoord; \n" - "uniform highp mat4 matrix; \n" - "void main() { \n" - " gl_Position = matrix * vCoord; \n" - "}"; -} - -const char *FlatColorMaterialShader::fragmentShader() const { - return - "uniform lowp vec4 color; \n" - "void main() { \n" - " gl_FragColor = color; \n" - "}"; -} - - - -/*! - \class QSGFlatColorMaterial - \brief The QSGFlatColorMaterial class provides a convenient way of rendering - solid colored geometry in the scene graph. - - \inmodule QtDeclarative - - The flat color material will fill every pixel in a geometry using - a solid color. The color can contain transparency. - - The geometry to be rendered with a flat color material requires - vertices in attribute location 0 in the QSGGeometry object to render - correctly. The QSGGeometry::defaultAttributes_Point2D() returns an attribute - set compatible with this material. - - The flat color material respects both current opacity and current matrix - when updating it's rendering state. - */ - - -/*! - Constructs a new flat color material. - - The default color is white. - */ - -QSGFlatColorMaterial::QSGFlatColorMaterial() : m_color(QColor(255, 255, 255)) -{ -} - - - -/*! - \fn QColor QSGFlatColorMaterial::color() const - - Returns this flat color material's color. - - The default color is white. - */ - - - -/*! - Sets this flat color material's color to \a color. - */ - -void QSGFlatColorMaterial::setColor(const QColor &color) -{ - m_color = color; - setFlag(Blending, m_color.alpha() != 0xff); -} - - - -/*! - \internal - */ - -QSGMaterialType *QSGFlatColorMaterial::type() const -{ - return &FlatColorMaterialShader::type; -} - - - -/*! - \internal - */ - -QSGMaterialShader *QSGFlatColorMaterial::createShader() const -{ - return new FlatColorMaterialShader; -} - - -int QSGFlatColorMaterial::compare(const QSGMaterial *other) const -{ - const QSGFlatColorMaterial *flat = static_cast<const QSGFlatColorMaterial *>(other); - return m_color.rgba() - flat->color().rgba(); - -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgflatcolormaterial.h b/src/declarative/scenegraph/util/qsgflatcolormaterial.h deleted file mode 100644 index f6345b6483..0000000000 --- a/src/declarative/scenegraph/util/qsgflatcolormaterial.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef FLATCOLORMATERIAL_H -#define FLATCOLORMATERIAL_H - -#include <qsgmaterial.h> -#include <qcolor.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGFlatColorMaterial : public QSGMaterial -{ -public: - QSGFlatColorMaterial(); - virtual QSGMaterialType *type() const; - virtual QSGMaterialShader *createShader() const; - - void setColor(const QColor &color); - const QColor &color() const { return m_color; } - - int compare(const QSGMaterial *other) const; - -private: - QColor m_color; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // FLATCOLORMATERIAL_H diff --git a/src/declarative/scenegraph/util/qsgpainternode.cpp b/src/declarative/scenegraph/util/qsgpainternode.cpp deleted file mode 100644 index f3e5202241..0000000000 --- a/src/declarative/scenegraph/util/qsgpainternode.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgpainternode_p.h" - -#include <private/qquickpainteditem_p.h> - -#include <private/qsgcontext_p.h> -#include <private/qopenglextensions_p.h> -#include <qopenglframebufferobject.h> -#include <qopenglfunctions.h> -#include <qopenglpaintdevice.h> -#include <qmath.h> -#include <qpainter.h> - -QT_BEGIN_NAMESPACE - -#define QT_MINIMUM_DYNAMIC_FBO_SIZE 64 - -static inline int qt_next_power_of_two(int v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - ++v; - return v; -} - -QSGPainterTexture::QSGPainterTexture() - : QSGPlainTexture() -{ - -} - -void QSGPainterTexture::bind() -{ - if (m_dirty_rect.isNull()) { - QSGPlainTexture::bind(); - return; - } - - bool oldMipmapsGenerated = m_mipmaps_generated; - m_mipmaps_generated = true; - QSGPlainTexture::bind(); - m_mipmaps_generated = oldMipmapsGenerated; - - QImage subImage = m_image.copy(m_dirty_rect); - - int w = m_dirty_rect.width(); - int h = m_dirty_rect.height(); - -#ifdef QT_OPENGL_ES - glTexSubImage2D(GL_TEXTURE_2D, 0, m_dirty_rect.x(), m_dirty_rect.y(), w, h, - GL_RGBA, GL_UNSIGNED_BYTE, subImage.constBits()); -#else - glTexSubImage2D(GL_TEXTURE_2D, 0, m_dirty_rect.x(), m_dirty_rect.y(), w, h, - GL_BGRA, GL_UNSIGNED_BYTE, subImage.constBits()); -#endif - - if (m_has_mipmaps && !m_mipmaps_generated) { - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D); - m_mipmaps_generated = true; - } - - m_dirty_texture = false; - m_dirty_bind_options = false; - - m_dirty_rect = QRect(); -} - -QSGPainterNode::QSGPainterNode(QQuickPaintedItem *item) - : QSGGeometryNode() - , m_preferredRenderTarget(QQuickPaintedItem::Image) - , m_actualRenderTarget(QQuickPaintedItem::Image) - , m_item(item) - , m_fbo(0) - , m_multisampledFbo(0) - , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) - , m_texture(0) - , m_gl_device(0) - , m_size(1, 1) - , m_dirtyContents(false) - , m_opaquePainting(false) - , m_linear_filtering(false) - , m_mipmapping(false) - , m_smoothPainting(false) - , m_extensionsChecked(false) - , m_multisamplingSupported(false) - , m_fastFBOResizing(false) - , m_fillColor(Qt::transparent) - , m_contentsScale(1.0) - , m_dirtyGeometry(false) - , m_dirtyRenderTarget(false) - , m_dirtyTexture(false) -{ - m_context = static_cast<QQuickPaintedItemPrivate *>(QObjectPrivate::get(item))->sceneGraphContext(); - - setMaterial(&m_materialO); - setOpaqueMaterial(&m_material); - setGeometry(&m_geometry); -} - -QSGPainterNode::~QSGPainterNode() -{ - delete m_texture; - delete m_fbo; - delete m_multisampledFbo; - delete m_gl_device; -} - -void QSGPainterNode::paint() -{ - QRect dirtyRect = m_dirtyRect.isNull() ? QRect(0, 0, m_size.width(), m_size.height()) : m_dirtyRect; - - QPainter painter; - if (m_actualRenderTarget == QQuickPaintedItem::Image) - painter.begin(&m_image); - else { - if (!m_gl_device) { - m_gl_device = new QOpenGLPaintDevice(m_fboSize); - m_gl_device->setPaintFlipped(true); - } - - if (m_multisampledFbo) - m_multisampledFbo->bind(); - else - m_fbo->bind(); - - painter.begin(m_gl_device); - } - - if (m_smoothPainting) { - painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing - | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); - } - - painter.scale(m_contentsScale, m_contentsScale); - - QRect sclip(qFloor(dirtyRect.x()/m_contentsScale), - qFloor(dirtyRect.y()/m_contentsScale), - qCeil(dirtyRect.width()/m_contentsScale+dirtyRect.x()/m_contentsScale-qFloor(dirtyRect.x()/m_contentsScale)), - qCeil(dirtyRect.height()/m_contentsScale+dirtyRect.y()/m_contentsScale-qFloor(dirtyRect.y()/m_contentsScale))); - - if (!m_dirtyRect.isNull()) - painter.setClipRect(sclip); - - painter.setCompositionMode(QPainter::CompositionMode_Source); - painter.fillRect(sclip, m_fillColor); - painter.setCompositionMode(QPainter::CompositionMode_SourceOver); - - m_item->paint(&painter); - painter.end(); - - if (m_actualRenderTarget == QQuickPaintedItem::Image) { - m_texture->setImage(m_image); - m_texture->setDirtyRect(dirtyRect); - } else if (m_multisampledFbo) { - QOpenGLFramebufferObject::blitFramebuffer(m_fbo, dirtyRect, m_multisampledFbo, dirtyRect); - } - - if (m_multisampledFbo) - m_multisampledFbo->release(); - else if (m_fbo) - m_fbo->release(); - - m_dirtyRect = QRect(); -} - -void QSGPainterNode::update() -{ - if (m_dirtyRenderTarget) - updateRenderTarget(); - if (m_dirtyGeometry) - updateGeometry(); - if (m_dirtyTexture) - updateTexture(); - - if (m_dirtyContents) - paint(); - - m_dirtyGeometry = false; - m_dirtyRenderTarget = false; - m_dirtyTexture = false; - m_dirtyContents = false; -} - -void QSGPainterNode::updateTexture() -{ - m_texture->setHasMipmaps(m_mipmapping); - m_texture->setHasAlphaChannel(!m_opaquePainting); - m_material.setTexture(m_texture); - m_materialO.setTexture(m_texture); - - markDirty(DirtyMaterial); -} - -void QSGPainterNode::updateGeometry() -{ - QRectF source; - if (m_actualRenderTarget == QQuickPaintedItem::Image) - source = QRectF(0, 0, 1, 1); - else - source = QRectF(0, 0, qreal(m_size.width()) / m_fboSize.width(), qreal(m_size.height()) / m_fboSize.height()); - QRectF dest(0, 0, m_size.width(), m_size.height()); - if (m_actualRenderTarget == QQuickPaintedItem::InvertedYFramebufferObject) - dest = QRectF(QPointF(0, m_size.height()), QPointF(m_size.width(), 0)); - QSGGeometry::updateTexturedRectGeometry(&m_geometry, - dest, - source); - markDirty(DirtyGeometry); -} - -void QSGPainterNode::updateRenderTarget() -{ - if (!m_extensionsChecked) { - QList<QByteArray> extensions = QByteArray((const char *)glGetString(GL_EXTENSIONS)).split(' '); - m_multisamplingSupported = extensions.contains("GL_EXT_framebuffer_multisample") - && extensions.contains("GL_EXT_framebuffer_blit"); - m_extensionsChecked = true; - } - - m_dirtyContents = true; - - QQuickPaintedItem::RenderTarget oldTarget = m_actualRenderTarget; - if (m_preferredRenderTarget == QQuickPaintedItem::Image) { - m_actualRenderTarget = QQuickPaintedItem::Image; - } else { - if (!m_multisamplingSupported && m_smoothPainting) - m_actualRenderTarget = QQuickPaintedItem::Image; - else - m_actualRenderTarget = m_preferredRenderTarget; - } - if (oldTarget != m_actualRenderTarget) { - m_image = QImage(); - delete m_fbo; - delete m_multisampledFbo; - m_fbo = m_multisampledFbo = 0; - } - - if (m_actualRenderTarget == QQuickPaintedItem::FramebufferObject || - m_actualRenderTarget == QQuickPaintedItem::InvertedYFramebufferObject) { - const QOpenGLContext *ctx = m_context->glContext(); - if (m_fbo && !m_dirtyGeometry && (!ctx->format().samples() || !m_multisamplingSupported)) - return; - - if (m_fboSize.isEmpty()) - updateFBOSize(); - - delete m_fbo; - delete m_multisampledFbo; - m_fbo = m_multisampledFbo = 0; - - if (m_smoothPainting && ctx->format().samples() && m_multisamplingSupported) { - { - QOpenGLFramebufferObjectFormat format; - format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); - format.setSamples(8); - m_multisampledFbo = new QOpenGLFramebufferObject(m_fboSize, format); - } - { - QOpenGLFramebufferObjectFormat format; - format.setAttachment(QOpenGLFramebufferObject::NoAttachment); - m_fbo = new QOpenGLFramebufferObject(m_fboSize, format); - } - } else { - QOpenGLFramebufferObjectFormat format; - format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); - m_fbo = new QOpenGLFramebufferObject(m_fboSize, format); - } - } else { - if (!m_image.isNull() && !m_dirtyGeometry) - return; - - m_image = QImage(m_size, QImage::Format_ARGB32_Premultiplied); - m_image.fill(Qt::transparent); - } - - QSGPainterTexture *texture = new QSGPainterTexture; - if (m_actualRenderTarget == QQuickPaintedItem::Image) { - texture->setOwnsTexture(true); - texture->setTextureSize(m_size); - } else { - texture->setTextureId(m_fbo->texture()); - texture->setOwnsTexture(false); - texture->setTextureSize(m_fboSize); - } - - if (m_texture) - delete m_texture; - - texture->setTextureSize(m_size); - m_texture = texture; -} - -void QSGPainterNode::updateFBOSize() -{ - int fboWidth; - int fboHeight; - if (m_fastFBOResizing) { - fboWidth = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qt_next_power_of_two(m_size.width())); - fboHeight = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qt_next_power_of_two(m_size.height())); - } else { - QSize minimumFBOSize = m_context->minimumFBOSize(); - fboWidth = qMax(minimumFBOSize.width(), m_size.width()); - fboHeight = qMax(minimumFBOSize.height(), m_size.height()); - } - - m_fboSize = QSize(fboWidth, fboHeight); -} - -void QSGPainterNode::setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target) -{ - if (m_preferredRenderTarget == target) - return; - - m_preferredRenderTarget = target; - - m_dirtyRenderTarget = true; - m_dirtyGeometry = true; - m_dirtyTexture = true; -} - -void QSGPainterNode::setSize(const QSize &size) -{ - if (size == m_size) - return; - - m_size = size; - updateFBOSize(); - - if (m_fbo) - m_dirtyRenderTarget = m_fbo->size() != m_fboSize || m_dirtyRenderTarget; - else - m_dirtyRenderTarget = true; - m_dirtyGeometry = true; - m_dirtyTexture = true; -} - -void QSGPainterNode::setDirty(const QRect &dirtyRect) -{ - m_dirtyContents = true; - m_dirtyRect = dirtyRect; - - if (m_mipmapping) - m_dirtyTexture = true; - - markDirty(DirtyMaterial); -} - -void QSGPainterNode::setOpaquePainting(bool opaque) -{ - if (opaque == m_opaquePainting) - return; - - m_opaquePainting = opaque; - m_dirtyTexture = true; -} - -void QSGPainterNode::setLinearFiltering(bool linearFiltering) -{ - if (linearFiltering == m_linear_filtering) - return; - - m_linear_filtering = linearFiltering; - - m_material.setFiltering(linearFiltering ? QSGTexture::Linear : QSGTexture::Nearest); - m_materialO.setFiltering(linearFiltering ? QSGTexture::Linear : QSGTexture::Nearest); - markDirty(DirtyMaterial); -} - -void QSGPainterNode::setMipmapping(bool mipmapping) -{ - if (mipmapping == m_mipmapping) - return; - - m_mipmapping = mipmapping; - m_material.setMipmapFiltering(mipmapping ? QSGTexture::Linear : QSGTexture::None); - m_materialO.setMipmapFiltering(mipmapping ? QSGTexture::Linear : QSGTexture::None); - m_dirtyTexture = true; -} - -void QSGPainterNode::setSmoothPainting(bool s) -{ - if (s == m_smoothPainting) - return; - - m_smoothPainting = s; - m_dirtyRenderTarget = true; -} - -void QSGPainterNode::setFillColor(const QColor &c) -{ - if (c == m_fillColor) - return; - - m_fillColor = c; - markDirty(DirtyMaterial); -} - -void QSGPainterNode::setContentsScale(qreal s) -{ - if (s == m_contentsScale) - return; - - m_contentsScale = s; - markDirty(DirtyMaterial); -} - -void QSGPainterNode::setFastFBOResizing(bool dynamic) -{ - m_fastFBOResizing = dynamic; -} - -QImage QSGPainterNode::toImage() const -{ - if (m_actualRenderTarget == QQuickPaintedItem::Image) - return m_image; - else - return m_fbo->toImage(); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgpainternode_p.h b/src/declarative/scenegraph/util/qsgpainternode_p.h deleted file mode 100644 index 8e95107efc..0000000000 --- a/src/declarative/scenegraph/util/qsgpainternode_p.h +++ /dev/null @@ -1,160 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGPAINTERNODE_P_H -#define QSGPAINTERNODE_P_H - -#include "qsgnode.h" -#include "qsgtexturematerial.h" -#include "qsgtexture_p.h" - -#include <qquickpainteditem.h> - -#include <QtGui/qcolor.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QOpenGLFramebufferObject; -class QOpenGLPaintDevice; - -class Q_DECLARATIVE_EXPORT QSGPainterTexture : public QSGPlainTexture -{ -public: - QSGPainterTexture(); - - void setDirtyRect(const QRect &rect) { m_dirty_rect = rect; } - - void bind(); - -private: - QRect m_dirty_rect; -}; - -class Q_DECLARATIVE_EXPORT QSGPainterNode : public QSGGeometryNode -{ -public: - QSGPainterNode(QQuickPaintedItem *item); - virtual ~QSGPainterNode(); - - void setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target); - - void setSize(const QSize &size); - QSize size() const { return m_size; } - - void setDirty(const QRect &dirtyRect = QRect()); - - void setOpaquePainting(bool opaque); - bool opaquePainting() const { return m_opaquePainting; } - - void setLinearFiltering(bool linearFiltering); - bool linearFiltering() const { return m_linear_filtering; } - - void setMipmapping(bool mipmapping); - bool mipmapping() const { return m_mipmapping; } - - void setSmoothPainting(bool s); - bool smoothPainting() const { return m_smoothPainting; } - - void setFillColor(const QColor &c); - QColor fillColor() const { return m_fillColor; } - - void setContentsScale(qreal s); - qreal contentsScale() const { return m_contentsScale; } - - void setFastFBOResizing(bool dynamic); - bool fastFBOResizing() const { return m_fastFBOResizing; } - - QImage toImage() const; - void update(); - - void paint(); - -private: - void updateTexture(); - void updateGeometry(); - void updateRenderTarget(); - void updateFBOSize(); - - QSGContext *m_context; - - QQuickPaintedItem::RenderTarget m_preferredRenderTarget; - QQuickPaintedItem::RenderTarget m_actualRenderTarget; - - QQuickPaintedItem *m_item; - - QOpenGLFramebufferObject *m_fbo; - QOpenGLFramebufferObject *m_multisampledFbo; - QImage m_image; - - QSGOpaqueTextureMaterial m_material; - QSGTextureMaterial m_materialO; - QSGGeometry m_geometry; - QSGPainterTexture *m_texture; - QOpenGLPaintDevice *m_gl_device; - - QSize m_size; - QSize m_fboSize; - bool m_dirtyContents; - QRect m_dirtyRect; - bool m_opaquePainting; - bool m_linear_filtering; - bool m_mipmapping; - bool m_smoothPainting; - bool m_extensionsChecked; - bool m_multisamplingSupported; - bool m_fastFBOResizing; - QColor m_fillColor; - qreal m_contentsScale; - - bool m_dirtyGeometry; - bool m_dirtyRenderTarget; - bool m_dirtyTexture; -}; - -QT_END_HEADER - -QT_END_NAMESPACE - -#endif // QSGPAINTERNODE_P_H diff --git a/src/declarative/scenegraph/util/qsgsimplematerial.h b/src/declarative/scenegraph/util/qsgsimplematerial.h deleted file mode 100644 index b9e453abec..0000000000 --- a/src/declarative/scenegraph/util/qsgsimplematerial.h +++ /dev/null @@ -1,222 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGSIMPLEMATERIAL_H -#define QSGSIMPLEMATERIAL_H - -#include <qsgmaterial.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -template <typename State> -class QSGSimpleMaterialShader : public QSGMaterialShader -{ -public: - void initialize() { - QSGMaterialShader::initialize(); - - m_id_matrix = program()->uniformLocation(uniformMatrixName()); - if (m_id_matrix < 0) { - qFatal("QSGSimpleMaterialShader does not implement 'uniform highp mat4 %s;' in its vertex shader", - uniformMatrixName()); - } - - const char *opacity = uniformOpacityName(); - if (opacity) { - m_id_opacity = program()->uniformLocation(uniformOpacityName()); - if (m_id_opacity < 0) { - qFatal("QSGSimpleMaterialShader does not implement 'uniform lowp float %s' in its fragment shader", - uniformOpacityName()); - } - } else { - m_id_opacity = -1; - } - - resolveUniforms(); - } - - const char *uniformMatrixName() const { return "qt_Matrix"; } - const char *uniformOpacityName() const { return "qt_Opacity"; } - - void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); - - virtual void updateState(const State *newState, const State *oldState) = 0; - - virtual void resolveUniforms() {} - - virtual QList<QByteArray> attributes() const = 0; - - char const *const *attributeNames() const - { - if (m_attribute_pointers.size()) - return m_attribute_pointers.constData(); - - QList<QByteArray> names = attributes(); - - // Calculate the total number of bytes needed, so we don't get rellocs and - // bad pointers while copying over the individual names. - // Add an extra byte pr entry for the '\0' char. - int total = 0; - for (int i=0; i<names.size(); ++i) - total += names.at(i).size() + 1; - m_attribute_name_data.reserve(total); - - // Copy over the names - for (int i=0; i<names.size(); ++i) { - m_attribute_pointers << m_attribute_name_data.constData() + m_attribute_name_data.size(); - m_attribute_name_data.append(names.at(i)); - m_attribute_name_data.append('\0'); - } - - // Append the "null" terminator - m_attribute_pointers << 0; - - return m_attribute_pointers.constData(); - } - -private: - int m_id_matrix; - int m_id_opacity; - - mutable QByteArray m_attribute_name_data; - mutable QVector<const char *> m_attribute_pointers; -}; - -#define QSG_DECLARE_SIMPLE_SHADER(Shader, State) \ -static QSGMaterialShader *createShader() \ -{ \ - return new Shader; \ -} \ -public: \ -static QSGSimpleMaterial<State> *createMaterial() \ -{ \ - return new QSGSimpleMaterial<State>(createShader); \ -} - - -typedef QSGMaterialShader *(*PtrShaderCreateFunc)(); - - -template <typename State> -class QSGSimpleMaterial : public QSGMaterial -{ - -public: - QSGSimpleMaterial(const State &state, PtrShaderCreateFunc func) - : m_state(state) - , m_func(func) - { - } - - QSGSimpleMaterial(PtrShaderCreateFunc func) - : m_func(func) - { - } - - QSGMaterialShader *createShader() const { return m_func(); } - QSGMaterialType *type() const { return &m_type; } - - State *state() { return &m_state; } - const State *state() const { return &m_state; } - -private: - static QSGMaterialType m_type; - State m_state; - PtrShaderCreateFunc m_func; -}; - -#define QSG_DECLARE_SIMPLE_COMPARABLE_SHADER(Shader, State) \ -static QSGMaterialShader *createShader() \ -{ \ - return new Shader; \ -} \ -public: \ -static QSGSimpleMaterialComparableMaterial<State> *createMaterial() \ -{ \ - return new QSGSimpleMaterialComparableMaterial<State>(createShader); \ -} - -template <typename State> -class QSGSimpleMaterialComparableMaterial : public QSGSimpleMaterial<State> -{ - -public: - QSGSimpleMaterialComparableMaterial(const State &state, PtrShaderCreateFunc func) - : QSGSimpleMaterial<State>(state, func) {} - - QSGSimpleMaterialComparableMaterial(PtrShaderCreateFunc func) - : QSGSimpleMaterial<State>(func) {} - - int compare(const QSGMaterial *other) const { - return QSGSimpleMaterialComparableMaterial<State>::state()->compare(static_cast<const QSGSimpleMaterialComparableMaterial<State> *>(other)->state()); - } -}; - - -template <typename State> -QSGMaterialType QSGSimpleMaterial<State>::m_type; - - -template <typename State> -Q_INLINE_TEMPLATE void QSGSimpleMaterialShader<State>::updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) -{ - if (state.isMatrixDirty()) - program()->setUniformValue(m_id_matrix, state.combinedMatrix()); - if (state.isOpacityDirty() && m_id_opacity >= 0) - program()->setUniformValue(m_id_opacity, state.opacity()); - - State *ns = static_cast<QSGSimpleMaterial<State> *>(newMaterial)->state(); - State *old = 0; - if (oldMaterial) - old = static_cast<QSGSimpleMaterial<State> *>(oldMaterial)->state(); - updateState(ns, old); -} - -QT_END_NAMESPACE - -QT_END_HEADER - - -#endif diff --git a/src/declarative/scenegraph/util/qsgsimplerectnode.cpp b/src/declarative/scenegraph/util/qsgsimplerectnode.cpp deleted file mode 100644 index c3dc5354ca..0000000000 --- a/src/declarative/scenegraph/util/qsgsimplerectnode.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgsimplerectnode.h" -#include "qsgflatcolormaterial.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QSGSimpleRectNode - - \brief The QSGSimpleRectNode class is a convenience class for drawing - solid filled rectangles using scenegraph. - - */ - - - -/*! - Constructs a QSGSimpleRectNode instance which is spanning \a rect with - the color \a color. - */ -QSGSimpleRectNode::QSGSimpleRectNode(const QRectF &rect, const QColor &color) - : m_geometry(QSGGeometry::defaultAttributes_Point2D(), 4) -{ - QSGGeometry::updateRectGeometry(&m_geometry, rect); - m_material.setColor(color); - setMaterial(&m_material); - setGeometry(&m_geometry); -} - - - -/*! - Constructs a QSGSimpleRectNode instance with an empty rectangle and - white color. - */ -QSGSimpleRectNode::QSGSimpleRectNode() - : m_geometry(QSGGeometry::defaultAttributes_Point2D(), 4) -{ - QSGGeometry::updateRectGeometry(&m_geometry, QRectF()); - setMaterial(&m_material); - setGeometry(&m_geometry); -} - - - -/*! - Sets the rectangle of this rect node to \a rect. - */ -void QSGSimpleRectNode::setRect(const QRectF &rect) -{ - QSGGeometry::updateRectGeometry(&m_geometry, rect); - markDirty(QSGNode::DirtyGeometry); -} - - - -/*! - Returns the rectangle that this rect node covers. - */ -QRectF QSGSimpleRectNode::rect() const -{ - const QSGGeometry::Point2D *pts = m_geometry.vertexDataAsPoint2D(); - return QRectF(pts[0].x, - pts[0].y, - pts[3].x - pts[0].x, - pts[3].y - pts[0].y); -} - - -/*! - Sets the color of this rectangle to \a color. The default - color will be white. - */ -void QSGSimpleRectNode::setColor(const QColor &color) -{ - if (color != m_material.color()) { - m_material.setColor(color); - markDirty(QSGNode::DirtyMaterial); - } -} - - - -/*! - Returns the color of this rectangle. - */ -QColor QSGSimpleRectNode::color() const -{ - return m_material.color(); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgsimplerectnode.h b/src/declarative/scenegraph/util/qsgsimplerectnode.h deleted file mode 100644 index c06db07f93..0000000000 --- a/src/declarative/scenegraph/util/qsgsimplerectnode.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SOLIDRECTNODE_H -#define SOLIDRECTNODE_H - -#include "qsgnode.h" -#include "qsgflatcolormaterial.h" - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGSimpleRectNode : public QSGGeometryNode -{ -public: - QSGSimpleRectNode(const QRectF &rect, const QColor &color); - QSGSimpleRectNode(); - - void setRect(const QRectF &rect); - inline void setRect(qreal x, qreal y, qreal w, qreal h) { setRect(QRectF(x, y, w, h)); } - QRectF rect() const; - - void setColor(const QColor &color); - QColor color() const; - -private: - QSGFlatColorMaterial m_material; - QSGGeometry m_geometry; - void *reserved; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // SOLIDRECTNODE_H diff --git a/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp b/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp deleted file mode 100644 index a0d6616371..0000000000 --- a/src/declarative/scenegraph/util/qsgsimpletexturenode.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qsgsimpletexturenode.h" - -QT_BEGIN_NAMESPACE - -static void qsgsimpletexturenode_update(QSGGeometry *g, - QSGTexture *texture, - const QRectF &rect) -{ - if (!texture) - return; - - QSize ts = texture->textureSize(); - QRectF sourceRect(0, 0, ts.width(), ts.height()); - QSGGeometry::updateTexturedRectGeometry(g, rect, texture->convertToNormalizedSourceRect(sourceRect)); -} - -/*! - \class QSGSimpleTextureNode - \brief The QSGSimpleTextureNode class is provided for convenience to easily draw - textured content using the QML scene graph. - - \inmodule QtDeclarative - - \warning The simple texture node class must have a texture before being - added to the scene graph to be rendered. -*/ - -/*! - Constructs a new simple texture node - */ -QSGSimpleTextureNode::QSGSimpleTextureNode() - : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) -{ - setGeometry(&m_geometry); - setMaterial(&m_material); - setOpaqueMaterial(&m_opaque_material); -} - -/*! - Sets the filtering to be used for this texture node to \a filtering. - - For smooth scaling, use QSGTexture::Linear; for normal scaling, use - QSGTexture::Nearest. - */ -void QSGSimpleTextureNode::setFiltering(QSGTexture::Filtering filtering) -{ - if (m_material.filtering() == filtering) - return; - - m_material.setFiltering(filtering); - m_opaque_material.setFiltering(filtering); - markDirty(DirtyMaterial); -} - - -/*! - Returns the filtering currently set on this texture node - */ -QSGTexture::Filtering QSGSimpleTextureNode::filtering() const -{ - return m_material.filtering(); -} - - -/*! - Sets the target rect of this texture node to \a r - */ -void QSGSimpleTextureNode::setRect(const QRectF &r) -{ - if (m_rect == r) - return; - m_rect = r; - qsgsimpletexturenode_update(&m_geometry, texture(), m_rect); - markDirty(DirtyGeometry); -} - - -/*! - Returns the target rect of this texture node. - */ -QRectF QSGSimpleTextureNode::rect() const -{ - return m_rect; -} - -/*! - Sets the texture of this texture node to \a texture. - - \warning A texture node must have a texture before being added - to the scenegraph to be rendered. - */ -void QSGSimpleTextureNode::setTexture(QSGTexture *texture) -{ - if (m_material.texture() == texture) - return; - m_material.setTexture(texture); - m_opaque_material.setTexture(texture); - qsgsimpletexturenode_update(&m_geometry, texture, m_rect); - markDirty(DirtyMaterial); -} - - - -/*! - Returns the texture for this texture node - */ -QSGTexture *QSGSimpleTextureNode::texture() const -{ - return m_material.texture(); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgsimpletexturenode.h b/src/declarative/scenegraph/util/qsgsimpletexturenode.h deleted file mode 100644 index db58c30b5f..0000000000 --- a/src/declarative/scenegraph/util/qsgsimpletexturenode.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGSIMPLETEXTURENODE_H -#define QSGSIMPLETEXTURENODE_H - -#include "qsgnode.h" -#include "qsggeometry.h" -#include "qsgtexturematerial.h" - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGSimpleTextureNode : public QSGGeometryNode -{ -public: - QSGSimpleTextureNode(); - - void setRect(const QRectF &rect); - inline void setRect(qreal x, qreal y, qreal w, qreal h) { setRect(QRectF(x, y, w, h)); } - QRectF rect() const; - - void setTexture(QSGTexture *texture); - QSGTexture *texture() const; - - void setFiltering(QSGTexture::Filtering filtering); - QSGTexture::Filtering filtering() const; - -private: - QSGGeometry m_geometry; - QSGOpaqueTextureMaterial m_opaque_material; - QSGTextureMaterial m_material; - - QRectF m_rect; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QSGSIMPLETEXTURENODE_H diff --git a/src/declarative/scenegraph/util/qsgtexture.cpp b/src/declarative/scenegraph/util/qsgtexture.cpp deleted file mode 100644 index e2219e54f5..0000000000 --- a/src/declarative/scenegraph/util/qsgtexture.cpp +++ /dev/null @@ -1,541 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#define GL_GLEXT_PROTOTYPES - -#include <private/qsgtexture_p.h> -#include <qopenglfunctions.h> -#include <private/qsgcontext_p.h> -#include <qthread.h> -#include <private/qdeclarativedebugtrace_p.h> - -#if !defined(QT_NO_DEBUG) && (defined(Q_OS_LINUX) || defined(Q_OS_MAC)) -#include <execinfo.h> -#include <QHash> -#endif - -QT_BEGIN_NAMESPACE - -inline static bool isPowerOfTwo(int x) -{ - // Assumption: x >= 1 - return x == (x & -x); -} - -QSGTexturePrivate::QSGTexturePrivate() - : wrapChanged(false) - , filteringChanged(false) - , horizontalWrap(QSGTexture::ClampToEdge) - , verticalWrap(QSGTexture::ClampToEdge) - , mipmapMode(QSGTexture::None) - , filterMode(QSGTexture::Nearest) -{ -} - -#ifndef QT_NO_DEBUG - -static int qt_debug_texture_count = 0; - -#if defined(Q_OS_LINUX) || defined (Q_OS_MAC) -DEFINE_BOOL_CONFIG_OPTION(qmlDebugLeakBacktrace, QML_DEBUG_LEAK_BACKTRACE) - -#define BACKTRACE_SIZE 20 -class SGTextureTraceItem -{ -public: - void *backTrace[BACKTRACE_SIZE]; - size_t backTraceSize; -}; - -static QHash<QSGTexture*, SGTextureTraceItem*> qt_debug_allocated_textures; -#endif - -inline static void qt_debug_print_texture_count() -{ - qDebug("Number of leaked textures: %i", qt_debug_texture_count); - qt_debug_texture_count = -1; - -#if defined(Q_OS_LINUX) || defined (Q_OS_MAC) - if (qmlDebugLeakBacktrace()) { - while (!qt_debug_allocated_textures.isEmpty()) { - QHash<QSGTexture*, SGTextureTraceItem*>::Iterator it = qt_debug_allocated_textures.begin(); - QSGTexture* texture = it.key(); - SGTextureTraceItem* item = it.value(); - - qt_debug_allocated_textures.erase(it); - - qDebug() << "------"; - qDebug() << "Leaked" << texture << "backtrace:"; - - char** symbols = backtrace_symbols(item->backTrace, item->backTraceSize); - - if (symbols) { - for (int i=0; i<(int) item->backTraceSize; i++) - qDebug("Backtrace <%02d>: %s", i, symbols[i]); - free(symbols); - } - - qDebug() << "------"; - - delete item; - } - } -#endif -} - -inline static void qt_debug_add_texture(QSGTexture* texture) -{ -#if defined(Q_OS_LINUX) || defined (Q_OS_MAC) - if (qmlDebugLeakBacktrace()) { - SGTextureTraceItem* item = new SGTextureTraceItem; - item->backTraceSize = backtrace(item->backTrace, BACKTRACE_SIZE); - qt_debug_allocated_textures.insert(texture, item); - } -#else - Q_UNUSED(texture); -#endif // Q_OS_LINUX - - ++qt_debug_texture_count; - - static bool atexit_registered = false; - if (!atexit_registered) { - atexit(qt_debug_print_texture_count); - atexit_registered = true; - } -} - -static void qt_debug_remove_texture(QSGTexture* texture) -{ -#if defined(Q_OS_LINUX) || defined (Q_OS_MAC) - if (qmlDebugLeakBacktrace()) { - SGTextureTraceItem* item = qt_debug_allocated_textures.value(texture, 0); - if (item) { - qt_debug_allocated_textures.remove(texture); - delete item; - } - } -#else - Q_UNUSED(texture) -#endif - - --qt_debug_texture_count; - - if (qt_debug_texture_count < 0) - qDebug("Material destroyed after qt_debug_print_texture_count() was called."); -} - -#endif // QT_NO_DEBUG - - -QSGTexture::QSGTexture() - : QObject(*(new QSGTexturePrivate)) -{ -#ifndef QT_NO_DEBUG - qt_debug_add_texture(this); -#endif -} - -QSGTexture::~QSGTexture() -{ -#ifndef QT_NO_DEBUG - qt_debug_remove_texture(this); -#endif -} - - -/*! - \fn void QSGTexture::bind() - - Call this function to bind this texture to the current texture - target. - - Binding a texture may also include uploading the texture data from - a previously set QImage. - - \warning This function can only be called from the rendering thread. - */ - -/*! - This function returns a copy of the current texture which is removed - from its atlas. - - The current texture remains unchanged, so texture coordinates do not - need to be updated. - - Removing a texture from an atlas is primarily useful when passing - it to a shader that operates on the texture coordinates 0-1 instead - of the texture subrect inside the atlas. - - If the texture is not part of a texture atlas, this function returns 0. - - Implementations of this function are recommended to return the same instance - for multiple calls to limit memory usage. - - \warning This function can only be called from the rendering thread. - */ - -QSGTexture *QSGTexture::removedFromAtlas() const -{ - Q_ASSERT_X(!isAtlasTexture(), "QSGTexture::removedFromAtlas()", "Called on a non-atlas texture"); - return 0; -} - -/*! - Returns weither this texture is part of an atlas or not. - - The default implementation returns false. - */ -bool QSGTexture::isAtlasTexture() const -{ - return false; -} - -/*! - \fn int QSGTexture::textureId() const - - Returns the OpenGL texture id for this texture. - - The default value is 0, indicating that it is an invalid texture id. - - The function should at all times return the correct texture id. - - \warning This function can only be called from the rendering thread. - */ - - - -/*! - Returns the rectangle inside textureSize() that this texture - represents in normalized coordinates. - - The default implementation returns a rect at position (0, 0) with - width and height of 1. - */ -QRectF QSGTexture::textureSubRect() const -{ - return QRectF(0, 0, 1, 1); -} - -/*! - \fn bool QSGTexture::hasMipmaps() const - - Returns true if the texture data contains mipmap levels. - */ - - -/*! - Sets the mipmap sampling mode to be used for the upcoming bind() call to \a filter. - - Setting the mipmap filtering has no effect it the texture does not have mipmaps. - - \sa hasMipmaps() - */ -void QSGTexture::setMipmapFiltering(Filtering filter) -{ - Q_D(QSGTexture); - if (d->mipmapMode != (uint) filter) { - d->mipmapMode = filter; - d->filteringChanged = true; - } -} - -/*! - Returns whether mipmapping should be used when sampling from this texture. - */ -QSGTexture::Filtering QSGTexture::mipmapFiltering() const -{ - return (QSGTexture::Filtering) d_func()->mipmapMode; -} - - -/*! - Sets the sampling mode to be used for the upcoming bind() call to \a filter. - */ -void QSGTexture::setFiltering(QSGTexture::Filtering filter) -{ - Q_D(QSGTexture); - if (d->filterMode != (uint) filter) { - d->filterMode = filter; - d->filteringChanged = true; - } -} - -QSGTexture::Filtering QSGTexture::filtering() const -{ - return (QSGTexture::Filtering) d_func()->filterMode; -} - - - -/*! - Sets the horizontal wrap mode to be used for the upcoming bind() call to \a hwrap - */ - -void QSGTexture::setHorizontalWrapMode(WrapMode hwrap) -{ - Q_D(QSGTexture); - if ((uint) hwrap != d->horizontalWrap) { - d->horizontalWrap = hwrap; - d->wrapChanged = true; - } -} - -QSGTexture::WrapMode QSGTexture::horizontalWrapMode() const -{ - return (QSGTexture::WrapMode) d_func()->horizontalWrap; -} - - - -void QSGTexture::setVerticalWrapMode(WrapMode vwrap) -{ - Q_D(QSGTexture); - if ((uint) vwrap != d->verticalWrap) { - d->verticalWrap = vwrap; - d->wrapChanged = true; - } -} - -QSGTexture::WrapMode QSGTexture::verticalWrapMode() const -{ - return (QSGTexture::WrapMode) d_func()->verticalWrap; -} - - -/*! - Update the texture state to match the filtering, mipmap and wrap options - currently set. - - If \a force is true, all properties will be updated regardless of weither - they have changed or not. - */ -void QSGTexture::updateBindOptions(bool force) -{ - Q_D(QSGTexture); - if (force || d->filteringChanged) { - bool linear = d->filterMode == Linear; - GLint minFilter = linear ? GL_LINEAR : GL_NEAREST; - GLint magFilter = linear ? GL_LINEAR : GL_NEAREST; - - if (hasMipmaps()) { - if (d->mipmapMode == Nearest) - minFilter = linear ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST; - else if (d->mipmapMode == Linear) - minFilter = linear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_LINEAR; - } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); - d->filteringChanged = false; - } - - if (force || d->wrapChanged) { -#if !defined(QT_NO_DEBUG) && defined(QT_OPENGL_ES_2) - if (d->horizontalWrap == Repeat || d->verticalWrap == Repeat) { - bool npotSupported = QOpenGLFunctions(QOpenGLContext::currentContext()).hasOpenGLFeature(QOpenGLFunctions::NPOTTextures); - QSize size = textureSize(); - bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); - if (!npotSupported && isNpot) - qWarning("Scene Graph: This system does not support the REPEAT wrap mode for non-power-of-two textures."); - } -#endif - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, d->horizontalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, d->verticalWrap == Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE); - d->wrapChanged = false; - } -} - -QSGPlainTexture::QSGPlainTexture() - : QSGTexture() - , m_texture_id(0) - , m_has_alpha(false) - , m_has_mipmaps(false) - , m_dirty_bind_options(false) - , m_owns_texture(true) - , m_mipmaps_generated(false) -{ -} - - -QSGPlainTexture::~QSGPlainTexture() -{ - if (m_texture_id && m_owns_texture) - glDeleteTextures(1, &m_texture_id); -} - -#ifdef QT_OPENGL_ES -static void swizzleBGRAToRGBA(QImage *image) -{ - const int width = image->width(); - const int height = image->height(); - for (int i = 0; i < height; ++i) { - uint *p = (uint *) image->scanLine(i); - for (int x = 0; x < width; ++x) - p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00); - } -} -#endif - -void QSGPlainTexture::setImage(const QImage &image) -{ - m_image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); -#ifdef QT_OPENGL_ES - swizzleBGRAToRGBA(&m_image); -#endif - - m_texture_size = image.size(); - m_has_alpha = image.hasAlphaChannel(); - m_dirty_texture = true; - m_dirty_bind_options = true; - } - -int QSGPlainTexture::textureId() const -{ - if (m_dirty_texture) { - if (m_image.isNull()) { - // The actual texture and id will be updated/deleted in a later bind() - // or ~QSGPlainTexture so just keep it minimal here. - return 0; - } else { - // Generate a texture id for use later and return it. - glGenTextures(1, &const_cast<QSGPlainTexture *>(this)->m_texture_id); - return m_texture_id; - } - } - return m_texture_id; -} - -void QSGPlainTexture::setTextureId(int id) -{ - if (m_texture_id && m_owns_texture) - glDeleteTextures(1, &m_texture_id); - - m_texture_id = id; - m_dirty_texture = false; - m_dirty_bind_options = true; - m_image = QImage(); - m_mipmaps_generated = false; -} - -void QSGPlainTexture::setHasMipmaps(bool mm) -{ - m_has_mipmaps = mm; - m_mipmaps_generated = false; -} - - -void QSGPlainTexture::bind() -{ - if (!m_dirty_texture) { - glBindTexture(GL_TEXTURE_2D, m_texture_id); - if (m_has_mipmaps && !m_mipmaps_generated) { - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D); - m_mipmaps_generated = true; - } - updateBindOptions(m_dirty_bind_options); - m_dirty_bind_options = false; - return; - } - - m_dirty_texture = false; - - - if (m_image.isNull()) { - if (m_texture_id && m_owns_texture) - glDeleteTextures(1, &m_texture_id); - m_texture_id = 0; - m_texture_size = QSize(); - m_has_mipmaps = false; - m_has_alpha = false; - return; - } - - if (m_texture_id == 0) - glGenTextures(1, &m_texture_id); - glBindTexture(GL_TEXTURE_2D, m_texture_id); - - // ### TODO: check for out-of-memory situations... - int w = m_image.width(); - int h = m_image.height(); - -#ifdef QT_OPENGL_ES - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_image.constBits()); -#else - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, m_image.constBits()); -#endif - - if (m_has_mipmaps) { - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D); - m_mipmaps_generated = true; - } - - m_texture_size = QSize(w, h); - m_texture_rect = QRectF(0, 0, 1, 1); - - updateBindOptions(m_dirty_bind_options); - m_dirty_bind_options = false; -} - - -/*! - \class QSGDynamicTexture - \brief The QSGDynamicTexture class serves as a baseclass for dynamically changing textures, - such as content that is rendered to FBO's. - - To update the content of the texture, call updateTexture() explicitly. Simply calling bind() - will not update the texture. - */ - - -/*! - \fn bool QSGDynamicTexture::updateTexture() - - Call this function to explicitely update the dynamic texture. Calling bind() will bind - the content that was previously updated. - - The function returns true if the texture was changed as a resul of the update; otherwise - returns false. - */ - - - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgtexture.h b/src/declarative/scenegraph/util/qsgtexture.h deleted file mode 100644 index 1a49fb941e..0000000000 --- a/src/declarative/scenegraph/util/qsgtexture.h +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGTEXTURE_H -#define QSGTEXTURE_H - -#include <QObject> -#include <QImage> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QSGTexturePrivate; -class Q_DECLARATIVE_EXPORT QSGTexture : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QSGTexture) - -public: - QSGTexture(); - ~QSGTexture(); - - enum WrapMode { - Repeat, - ClampToEdge - }; - - enum Filtering { - None, - Nearest, - Linear - }; - - virtual int textureId() const = 0; - virtual QSize textureSize() const = 0; - virtual bool hasAlphaChannel() const = 0; - virtual bool hasMipmaps() const = 0; - - virtual QRectF textureSubRect() const; - - virtual bool isAtlasTexture() const; - - virtual QSGTexture *removedFromAtlas() const; - - virtual void bind() = 0; - void updateBindOptions(bool force = false); - - void setMipmapFiltering(Filtering filter); - QSGTexture::Filtering mipmapFiltering() const; - - void setFiltering(Filtering filter); - QSGTexture::Filtering filtering() const; - - void setHorizontalWrapMode(WrapMode hwrap); - QSGTexture::WrapMode horizontalWrapMode() const; - - void setVerticalWrapMode(WrapMode vwrap); - QSGTexture::WrapMode verticalWrapMode() const; - - inline QRectF convertToNormalizedSourceRect(const QRectF &rect) const; - -protected: - QSGTexture(QSGTexturePrivate &dd); -}; - -QRectF QSGTexture::convertToNormalizedSourceRect(const QRectF &rect) const -{ - QSize s = textureSize(); - QRectF r = textureSubRect(); - - qreal sx = r.width() / s.width(); - qreal sy = r.height() / s.height(); - - return QRectF(r.x() + rect.x() * sx, - r.y() + rect.y() * sy, - rect.width() * sx, - rect.height() * sy); -} - - -class Q_DECLARATIVE_EXPORT QSGDynamicTexture : public QSGTexture -{ - Q_OBJECT -public: - virtual bool updateTexture() = 0; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif diff --git a/src/declarative/scenegraph/util/qsgtexture_p.h b/src/declarative/scenegraph/util/qsgtexture_p.h deleted file mode 100644 index f14508fd25..0000000000 --- a/src/declarative/scenegraph/util/qsgtexture_p.h +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGTEXTURE_P_H -#define QSGTEXTURE_P_H - -#include <private/qobject_p.h> - -#include <QtGui/qopengl.h> - -#include "qsgtexture.h" -#include <private/qsgcontext_p.h> - -QT_BEGIN_NAMESPACE - -class QSGTexturePrivate : public QObjectPrivate -{ - Q_DECLARE_PUBLIC(QSGTexture); -public: - QSGTexturePrivate(); - - uint wrapChanged : 1; - uint filteringChanged : 1; - - uint horizontalWrap : 1; - uint verticalWrap : 1; - uint mipmapMode : 2; - uint filterMode : 2; -}; - -class Q_DECLARATIVE_EXPORT QSGPlainTexture : public QSGTexture -{ - Q_OBJECT -public: - QSGPlainTexture(); - virtual ~QSGPlainTexture(); - - void setOwnsTexture(bool owns) { m_owns_texture = owns; } - bool ownsTexture() const { return m_owns_texture; } - - void setTextureId(int id); - int textureId() const; - void setTextureSize(const QSize &size) { m_texture_size = size; } - QSize textureSize() const { return m_texture_size; } - - void setHasAlphaChannel(bool alpha) { m_has_alpha = alpha; } - bool hasAlphaChannel() const { return m_has_alpha; } - - void setHasMipmaps(bool mm); - bool hasMipmaps() const { return m_has_mipmaps; } - - void setImage(const QImage &image); - const QImage &image() { return m_image; } - - virtual void bind(); - - static QSGPlainTexture *fromImage(const QImage &image) { - QSGPlainTexture *t = new QSGPlainTexture(); - t->setImage(image); - return t; - } - -protected: - QImage m_image; - - GLuint m_texture_id; - QSize m_texture_size; - QRectF m_texture_rect; - - uint m_has_alpha : 1; - uint m_has_mipmaps : 1; - uint m_dirty_texture : 1; - uint m_dirty_bind_options : 1; - uint m_owns_texture : 1; - uint m_mipmaps_generated : 1; -}; - -QT_END_NAMESPACE - -#endif // QSGTEXTURE_P_H diff --git a/src/declarative/scenegraph/util/qsgtexturematerial.cpp b/src/declarative/scenegraph/util/qsgtexturematerial.cpp deleted file mode 100644 index 0bee81993c..0000000000 --- a/src/declarative/scenegraph/util/qsgtexturematerial.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgtexturematerial_p.h" - -#include <QtGui/qopenglshaderprogram.h> -#include <QtGui/qopenglfunctions.h> - -QT_BEGIN_NAMESPACE - -inline static bool isPowerOfTwo(int x) -{ - // Assumption: x >= 1 - return x == (x & -x); -} - -const char qt_scenegraph_texture_material_vertex_code[] = - "uniform highp mat4 qt_Matrix; \n" - "attribute highp vec4 qt_VertexPosition; \n" - "attribute highp vec2 qt_VertexTexCoord; \n" - "varying highp vec2 qt_TexCoord; \n" - "void main() { \n" - " qt_TexCoord = qt_VertexTexCoord; \n" - " gl_Position = qt_Matrix * qt_VertexPosition; \n" - "}"; - -const char qt_scenegraph_texture_material_fragment[] = - "varying highp vec2 qt_TexCoord; \n" - "uniform sampler2D qt_Texture; \n" - "void main() { \n" - " gl_FragColor = texture2D(qt_Texture, qt_TexCoord);\n" - "}"; - - -const char *QSGOpaqueTextureMaterialShader::vertexShader() const -{ - return qt_scenegraph_texture_material_vertex_code; -} - -const char *QSGOpaqueTextureMaterialShader::fragmentShader() const -{ - return qt_scenegraph_texture_material_fragment; -} - -QSGMaterialType QSGOpaqueTextureMaterialShader::type; - -char const *const *QSGOpaqueTextureMaterialShader::attributeNames() const -{ - static char const *const attr[] = { "qt_VertexPosition", "qt_VertexTexCoord", 0 }; - return attr; -} - -void QSGOpaqueTextureMaterialShader::initialize() -{ - m_matrix_id = program()->uniformLocation("qt_Matrix"); -} - -void QSGOpaqueTextureMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) -{ - Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type()); - QSGOpaqueTextureMaterial *tx = static_cast<QSGOpaqueTextureMaterial *>(newEffect); - QSGOpaqueTextureMaterial *oldTx = static_cast<QSGOpaqueTextureMaterial *>(oldEffect); - - QSGTexture *t = tx->texture(); - - t->setFiltering(tx->filtering()); -#ifdef QT_OPENGL_ES_2 - bool npotSupported = QOpenGLFunctions(const_cast<QOpenGLContext *>(state.context())).hasOpenGLFeature(QOpenGLFunctions::NPOTTextures); - QSize size = t->textureSize(); - bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); - if (!npotSupported && isNpot) { - t->setHorizontalWrapMode(QSGTexture::ClampToEdge); - t->setVerticalWrapMode(QSGTexture::ClampToEdge); - } else -#endif - { - t->setHorizontalWrapMode(tx->horizontalWrapMode()); - t->setVerticalWrapMode(tx->verticalWrapMode()); - } - t->setMipmapFiltering(tx->mipmapFiltering()); - - if (oldTx == 0 || oldTx->texture()->textureId() != t->textureId()) - t->bind(); - else - t->updateBindOptions(); - - if (state.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, state.combinedMatrix()); -} - - -/*! - \class QSGOpaqueTextureMaterial - \brief The QSGOpaqueTextureMaterial class provides a convenient way of - rendering textured geometry in the scene graph. - - The opaque textured material will fill every pixel in a geometry with - the supplied texture. The material does not respect the opacity of the - QSGMaterialShader::RenderState, so opacity nodes in the parent chain - of nodes using this material, have no effect. - - The geometry to be rendered with an opaque texture material requires - vertices in attribute location 0 and texture coordinates in attribute - location 1. The texture coordinate is a 2-dimensional floating-point - tuple. The QSGGeometry::defaultAttributes_TexturedPoint2D returns an - attribute set compatible with this material. - - The texture to be rendered is can be set using setTexture(). How the - texure should be rendered can be specified using setMipmapFiltering(), - setFiltering(), setHorizontalWrapMode() and setVerticalWrapMode(). - The rendering state is set on the texture instance just before it - is bound. - - The opaque textured material respects the current matrix and the alpha - channel of the texture. It will disregard the accumulated opacity in - the scenegraph. - - A texture material must have a texture set before it is used as - a material in the scene graph. - */ - - - -/*! - Creates a new QSGOpaqueTextureMaterial. - - The default mipmap filtering and filtering mode is set to - QSGTexture::Nearest. The default wrap modes is set to - QSGTexture::ClampToEdge. - - */ -QSGOpaqueTextureMaterial::QSGOpaqueTextureMaterial() - : m_texture(0) - , m_filtering(QSGTexture::Nearest) - , m_mipmap_filtering(QSGTexture::Nearest) - , m_horizontal_wrap(QSGTexture::ClampToEdge) - , m_vertical_wrap(QSGTexture::ClampToEdge) -{ -} - - -/*! - \internal - */ -QSGMaterialType *QSGOpaqueTextureMaterial::type() const -{ - return &QSGOpaqueTextureMaterialShader::type; -} - -/*! - \internal - */ -QSGMaterialShader *QSGOpaqueTextureMaterial::createShader() const -{ - return new QSGOpaqueTextureMaterialShader; -} - - - -/*! - \fn QSGTexture *QSGOpaqueTextureMaterial::texture() const - - Returns this texture material's texture. - */ - - - -/*! - Sets the texture of this material to \a texture. - - The material does not take ownership over the texture. - */ - -void QSGOpaqueTextureMaterial::setTexture(QSGTexture *texture) -{ - m_texture = texture; - setFlag(Blending, m_texture ? m_texture->hasAlphaChannel() : false); -} - - - -/*! - \fn void QSGOpaqueTextureMaterial::setMipmapFiltering(QSGTexture::Filtering filtering) - - Sets the mipmap mode to \a filtering. - - The mipmap filtering mode is set on the texture instance just before the - texture is bound for rendering. - - If the texture does not have mipmapping support, enabling mipmapping has no - effect. - */ - - - -/*! - \fn QSGTexture::Filtering QSGOpaqueTextureMaterial::mipmapFiltering() const - - Returns this material's mipmap filtering mode. - - The default mipmap mode is QSGTexture::Nearest. - */ - - - -/*! - \fn void QSGOpaqueTextureMaterial::setFiltering(QSGTexture::Filtering filtering) - - Sets the filtering to \a filtering. - - The filtering mode is set on the texture instance just before the texture - is bound for rendering. - */ - - - -/*! - \fn QSGTexture::Filtering filtering() const - - Returns this material's filtering mode. - - The default filtering is QSGTexture::Nearest. - */ - - - -/*! - \fn void setHorizontalWrapMode(QSGTexture::WrapMode mode) - - Sets the horizontal wrap mode to \a mode. - - The horizontal wrap mode is set on the texture instance just before the texture - is bound for rendering. - */ - - - - /*! - \fn QSGTexture::WrapMode horizontalWrapMode() const - - Returns this material's horizontal wrap mode. - - The default horizontal wrap mode is QSGTexutre::ClampToEdge - */ - - - -/*! - \fn void setVerticalWrapMode(QSGTexture::WrapMode mode) - - Sets the vertical wrap mode to \a mode. - - The vertical wrap mode is set on the texture instance just before the texture - is bound for rendering. - */ - - - - /*! - \fn QSGTexture::WrapMode verticalWrapMode() const - - Returns this material's vertical wrap mode. - - The default vertical wrap mode is QSGTexutre::ClampToEdge - */ - - - -/*! - \internal - */ - -int QSGOpaqueTextureMaterial::compare(const QSGMaterial *o) const -{ - Q_ASSERT(o && type() == o->type()); - const QSGOpaqueTextureMaterial *other = static_cast<const QSGOpaqueTextureMaterial *>(o); - if (int diff = m_texture->textureId() - other->texture()->textureId()) - return diff; - return int(m_filtering) - int(other->m_filtering); -} - - - -/*! - \class QSGTextureMaterial - \brief The QSGTextureMaterial class provides a convenient way of - rendering textured geometry in the scene graph. - - The textured material will fill every pixel in a geometry with - the supplied texture. - - The geometry to be rendered with a texture material requires - vertices in attribute location 0 and texture coordinates in attribute - location 1. The texture coordinate is a 2-dimensional floating-point - tuple. The QSGGeometry::defaultAttributes_TexturedPoint2D returns an - attribute set compatible with this material. - - The texture to be rendered is set using setTexture(). How the - texure should be rendered can be specified using setMipmapFiltering(), - setFiltering(), setHorizontalWrapMode() and setVerticalWrapMode(). - The rendering state is set on the texture instance just before it - is bound. - - The textured material respects the current matrix and the alpha - channel of the texture. It will also respect the accumulated opacity - in the scenegraph. - - A texture material must have a texture set before it is used as - a material in the scene graph. - */ - -static const char qt_scenegraph_texture_material_opacity_fragment[] = - "varying highp vec2 qt_TexCoord; \n" - "uniform sampler2D qt_Texture; \n" - "uniform lowp float opacity; \n" - "void main() { \n" - " gl_FragColor = texture2D(qt_Texture, qt_TexCoord) * opacity; \n" - "}"; - -class QSGTextureMaterialShader : public QSGOpaqueTextureMaterialShader -{ -public: - virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect); - virtual void initialize(); - - static QSGMaterialType type; - -protected: - virtual const char *fragmentShader() const { return qt_scenegraph_texture_material_opacity_fragment; } - - int m_opacity_id; -}; -QSGMaterialType QSGTextureMaterialShader::type; - - - -/*! - \internal - */ - -QSGMaterialType *QSGTextureMaterial::type() const -{ - return &QSGTextureMaterialShader::type; -} - - - -/*! - \internal - */ - -QSGMaterialShader *QSGTextureMaterial::createShader() const -{ - return new QSGTextureMaterialShader; -} - -void QSGTextureMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) -{ - Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type()); - if (state.isOpacityDirty()) - program()->setUniformValue(m_opacity_id, state.opacity()); - - QSGOpaqueTextureMaterialShader::updateState(state, newEffect, oldEffect); -} - -void QSGTextureMaterialShader::initialize() -{ - QSGOpaqueTextureMaterialShader::initialize(); - m_opacity_id = program()->uniformLocation("opacity"); -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgtexturematerial.h b/src/declarative/scenegraph/util/qsgtexturematerial.h deleted file mode 100644 index be6ba7a8ab..0000000000 --- a/src/declarative/scenegraph/util/qsgtexturematerial.h +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TEXTUREMATERIAL_H -#define TEXTUREMATERIAL_H - -#include "qsgmaterial.h" -#include <qsgtexture.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - - -class Q_DECLARATIVE_EXPORT QSGOpaqueTextureMaterial : public QSGMaterial -{ -public: - QSGOpaqueTextureMaterial(); - - virtual QSGMaterialType *type() const; - virtual QSGMaterialShader *createShader() const; - virtual int compare(const QSGMaterial *other) const; - - void setTexture(QSGTexture *texture); - QSGTexture *texture() const { return m_texture; } - - void setMipmapFiltering(QSGTexture::Filtering filtering) { m_mipmap_filtering = filtering; } - QSGTexture::Filtering mipmapFiltering() const { return (QSGTexture::Filtering) m_mipmap_filtering; } - - void setFiltering(QSGTexture::Filtering filtering) { m_filtering = filtering; } - QSGTexture::Filtering filtering() const { return (QSGTexture::Filtering) m_filtering; } - - void setHorizontalWrapMode(QSGTexture::WrapMode mode) { m_horizontal_wrap = mode; } - QSGTexture::WrapMode horizontalWrapMode() const { return (QSGTexture::WrapMode) m_horizontal_wrap; } - - void setVerticalWrapMode(QSGTexture::WrapMode mode) { m_vertical_wrap = mode; } - QSGTexture::WrapMode verticalWrapMode() const { return (QSGTexture::WrapMode) m_vertical_wrap; } - -protected: - QSGTexture *m_texture; - - uint m_filtering: 2; - uint m_mipmap_filtering: 2; - uint m_horizontal_wrap : 1; - uint m_vertical_wrap: 1; - - uint m_reserved : 26; -}; - - -class Q_DECLARATIVE_EXPORT QSGTextureMaterial : public QSGOpaqueTextureMaterial -{ -public: - virtual QSGMaterialType *type() const; - virtual QSGMaterialShader *createShader() const; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // TEXTUREMATERIAL_H diff --git a/src/declarative/scenegraph/util/qsgtexturematerial_p.h b/src/declarative/scenegraph/util/qsgtexturematerial_p.h deleted file mode 100644 index a549f841d8..0000000000 --- a/src/declarative/scenegraph/util/qsgtexturematerial_p.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TEXTUREMATERIAL_P_H -#define TEXTUREMATERIAL_P_H - -#include "qsgtexturematerial.h" - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGOpaqueTextureMaterialShader : public QSGMaterialShader -{ -public: - virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect); - virtual char const *const *attributeNames() const; - - static QSGMaterialType type; - -protected: - virtual void initialize(); - virtual const char *vertexShader() const; - virtual const char *fragmentShader() const; - - int m_matrix_id; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QSGTEXTUREMATERIAL_P_H diff --git a/src/declarative/scenegraph/util/qsgtextureprovider.cpp b/src/declarative/scenegraph/util/qsgtextureprovider.cpp deleted file mode 100644 index 10faf2e5d4..0000000000 --- a/src/declarative/scenegraph/util/qsgtextureprovider.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgtextureprovider_p.h" - -#ifndef GL_CLAMP_TO_EDGE -#define GL_CLAMP_TO_EDGE 0x812F -#endif - -QT_BEGIN_NAMESPACE - -/*! - \class QSGTextureProvider - \brief The QSGTextureProvider class encapsulates texture based entities in QML. - - The QSGTextureProvider lives primarily in the scene graph rendering thread. - */ - - - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgtextureprovider_p.h b/src/declarative/scenegraph/util/qsgtextureprovider_p.h deleted file mode 100644 index ebb6ca8507..0000000000 --- a/src/declarative/scenegraph/util/qsgtextureprovider_p.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSGTEXTUREPROVIDER_H -#define QSGTEXTUREPROVIDER_H - -#include "qsgtexture.h" -#include "qobject.h" - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGTextureProvider : public QObject -{ - Q_OBJECT -public: - virtual QSGTexture *texture() const = 0; - -Q_SIGNALS: - void textureChanged(); -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif diff --git a/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp b/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp deleted file mode 100644 index 78cef55215..0000000000 --- a/src/declarative/scenegraph/util/qsgvertexcolormaterial.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgvertexcolormaterial.h" - -#include <qopenglshaderprogram.h> - -QT_BEGIN_NAMESPACE - -class QSGVertexColorMaterialShader : public QSGMaterialShader -{ -public: - virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect); - virtual char const *const *attributeNames() const; - - static QSGMaterialType type; - -private: - virtual void initialize(); - virtual const char *vertexShader() const; - virtual const char *fragmentShader() const; - - int m_matrix_id; - int m_opacity_id; -}; - -QSGMaterialType QSGVertexColorMaterialShader::type; - -void QSGVertexColorMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *) -{ - if (!(newEffect->flags() & QSGMaterial::Blending) || state.isOpacityDirty()) - program()->setUniformValue(m_opacity_id, state.opacity()); - - if (state.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, state.combinedMatrix()); -} - -char const *const *QSGVertexColorMaterialShader::attributeNames() const -{ - static const char *const attr[] = { "vertexCoord", "vertexColor", 0 }; - return attr; -} - -void QSGVertexColorMaterialShader::initialize() -{ - m_matrix_id = program()->uniformLocation("matrix"); - m_opacity_id = program()->uniformLocation("opacity"); -} - -const char *QSGVertexColorMaterialShader::vertexShader() const { - return - "attribute highp vec4 vertexCoord; \n" - "attribute highp vec4 vertexColor; \n" - "uniform highp mat4 matrix; \n" - "uniform highp float opacity; \n" - "varying lowp vec4 color; \n" - "void main() { \n" - " gl_Position = matrix * vertexCoord; \n" - " color = vertexColor * opacity; \n" - "}"; -} - -const char *QSGVertexColorMaterialShader::fragmentShader() const { - return - "varying lowp vec4 color; \n" - "void main() { \n" - " gl_FragColor = color; \n" - "}"; -} - - - -/*! - \class QSGVertexColorMaterial - \brief The QSGVertexColorMaterial class provides a convenient way of rendering per-vertex - colored geometry in the scene graph. - - \inmodule QtDeclarative - - The vertex color material will give each vertex in a geometry a color. Pixels between - vertices will be linearly interpolated. The colors can contain transparency. - - The geometry to be rendered with vertex color must have the following layout. Attribute - position 0 must contain vertices. Attribute position 1 must contain colors, a tuple of - 4 values with RGBA layout. Both floats in the range of 0 to 1 and unsigned bytes in - the range 0 to 255 are valid for the color values. The - QSGGeometry::defaultAttributes_ColoredPoint2D() constructs an attribute set - compatible with this material. - - The vertex color material respects both current opacity and current matrix when - updating it's rendering state. - */ - - -QSGVertexColorMaterial::QSGVertexColorMaterial() -{ - setFlag(Blending, true); -} - - -/*! - int QSGVertexColorMaterial::compare() const - - As the vertex color material has all its state in the vertex attributes, - all materials will be equal. - - \internal - */ - -int QSGVertexColorMaterial::compare(const QSGMaterial * /* other */) const -{ - return 0; -} - -/*! - \internal - */ - -QSGMaterialType *QSGVertexColorMaterial::type() const -{ - return &QSGVertexColorMaterialShader::type; -} - - - -/*! - \internal - */ - -QSGMaterialShader *QSGVertexColorMaterial::createShader() const -{ - return new QSGVertexColorMaterialShader; -} - -QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/util/qsgvertexcolormaterial.h b/src/declarative/scenegraph/util/qsgvertexcolormaterial.h deleted file mode 100644 index c244f63834..0000000000 --- a/src/declarative/scenegraph/util/qsgvertexcolormaterial.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef VERTEXCOLORMATERIAL_H -#define VERTEXCOLORMATERIAL_H - -#include <qsgmaterial.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class Q_DECLARATIVE_EXPORT QSGVertexColorMaterial : public QSGMaterial -{ -public: - QSGVertexColorMaterial(); - - int compare(const QSGMaterial *other) const; - -protected: - virtual QSGMaterialType *type() const; - virtual QSGMaterialShader *createShader() const; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // VERTEXCOLORMATERIAL_H |