diff options
473 files changed, 20727 insertions, 9147 deletions
diff --git a/config.profiles/symbian/qt.iby b/config.profiles/symbian/qt.iby index 18b3940..1f295f0 100644 --- a/config.profiles/symbian/qt.iby +++ b/config.profiles/symbian/qt.iby @@ -52,10 +52,6 @@ file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dl // bearer file=ABI_DIR\BUILD_DIR\qsymbianbearer.dll SHARED_LIB_DIR\qsymbianbearer.dll -// S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM, -// so don't bother including those plugins -file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll - file=ABI_DIR\BUILD_DIR\qtactilefeedback.dll SHARED_LIB_DIR\qtactilefeedback.dll // imageformats stubs diff --git a/config.profiles/symbian/qt.pkg b/config.profiles/symbian/qt.pkg index 6ef51ce..b2db49f 100644 --- a/config.profiles/symbian/qt.pkg +++ b/config.profiles/symbian/qt.pkg @@ -68,9 +68,6 @@ "/epoc32/release/armv5/urel/phonon_mmf.dll" - "!:\sys\bin\phonon_mmf.dll" "/epoc32/data/z/resource/qt/plugins/phonon_backend/phonon_mmf.qtplugin" - "!:\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin" - -"/epoc32/release/armv5/urel/qts60plugin_5_0.dll" - "!:\sys\bin\qts60plugin_5_0.dll" - ; localization "/epoc32/data/z/resource/qt/translations/qt_ur.qm" - "!:\resource\qt\translations\qt_ur.qm" "/epoc32/data/z/resource/qt/translations/qt_fa.qm" - "!:\resource\qt\translations\qt_fa.qm" @@ -4885,7 +4885,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; done fi if [ "$BUILD_ON_MAC" = "yes" ]; then - echo "export MACOSX_DEPLOYMENT_TARGET = 10.4" >> "$mkfile" + echo "export MACOSX_DEPLOYMENT_TARGET = 10.5" >> "$mkfile" echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile" echo "CARBON_CFLAGS =-fconstant-cfstrings" >>"$mkfile" EXTRA_LFLAGS="$EXTRA_LFLAGS \$(CARBON_LFLAGS)" diff --git a/demos/deform/main.cpp b/demos/deform/main.cpp index c49117a..d92ddba 100644 --- a/demos/deform/main.cpp +++ b/demos/deform/main.cpp @@ -50,7 +50,11 @@ int main(int argc, char **argv) QApplication app(argc, argv); +#ifdef Q_OS_SYMBIAN + bool smallScreen = true; +#else bool smallScreen = QApplication::arguments().contains("-small-screen"); +#endif PathDeformWidget deformWidget(0, smallScreen); diff --git a/demos/demos.pro b/demos/demos.pro index f1d5b00..ed18446 100644 --- a/demos/demos.pro +++ b/demos/demos.pro @@ -44,6 +44,9 @@ wince*: SUBDIRS = \ contains(QT_CONFIG, opengl):!contains(QT_CONFIG, opengles1):!contains(QT_CONFIG, opengles2):{ SUBDIRS += demos_boxes } +contains(QT_CONFIG, opengl):contains(QT_CONFIG, svg){ +SUBDIRS += demos_glhypnotizer +} mac* && !qpa: SUBDIRS += demos_macmainwindow wince*|symbian|embedded|x11: SUBDIRS += demos_embedded @@ -103,6 +106,7 @@ demos_browser.subdir = browser demos_boxes.subdir = boxes demos_sub-attaq.subdir = sub-attaq demos_spectrum.subdir = spectrum +demos_glhypnotizer.subdir = glhypnotizer #CONFIG += ordered !ordered { diff --git a/demos/glhypnotizer/glhypnotizer.pro b/demos/glhypnotizer/glhypnotizer.pro new file mode 100644 index 0000000..a7fdf5e --- /dev/null +++ b/demos/glhypnotizer/glhypnotizer.pro @@ -0,0 +1,21 @@ +TEMPLATE = app +CONFIG -= moc +INCLUDEPATH += . + +# Input +SOURCES += main.cpp +QT += opengl svg +RESOURCES = hypnotizer.qrc + +build_all:!build_pass { + CONFIG -= build_all + CONFIG += release +} + +# install +target.path = $$[QT_INSTALL_DEMOS]/glhypnotizer +sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.svg +sources.path = $$[QT_INSTALL_DEMOS]/glhypnotizer +INSTALLS += target sources + +symbian: include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) diff --git a/demos/glhypnotizer/hypnotizer.qrc b/demos/glhypnotizer/hypnotizer.qrc new file mode 100644 index 0000000..97ba159 --- /dev/null +++ b/demos/glhypnotizer/hypnotizer.qrc @@ -0,0 +1,6 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>qt-logo.png</file> + <file>spiral.svg</file> +</qresource> +</RCC>
\ No newline at end of file diff --git a/demos/glhypnotizer/main.cpp b/demos/glhypnotizer/main.cpp new file mode 100644 index 0000000..cc1482d --- /dev/null +++ b/demos/glhypnotizer/main.cpp @@ -0,0 +1,356 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the demonstration applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include <QtOpenGL> +#include <QtSvg> + +#define NUM_SWIRLY_ITEMS 10 + +class GLPainter : public QObject +{ + Q_OBJECT +public: + GLPainter(QGLWidget *widget); + void stop(); + void resizeViewport(const QSize &size); + +public slots: + void start(); + +protected: + void timerEvent(QTimerEvent *event); + void paint(); + void initSwirlyItems(); + void updateSwirlyItems(); + void drawSuggestiveMessages(QPainter *p); + +private: + QMutex mutex; + QGLWidget *glWidget; + int viewportWidth; + int viewportHeight; + bool doRendering; + qreal rotationAngle; + bool swirlClockwise; + QSvgRenderer svgRenderer; + QPixmap logo; + QPainter::PixmapFragment swirlyItems[NUM_SWIRLY_ITEMS]; + int swirlyCounter; + int textCounter; + int messageYPos; + qreal scaleFactor; +}; + + +GLPainter::GLPainter(QGLWidget *widget) + : glWidget(widget) + , doRendering(true) + , rotationAngle(rand() % 360) + , swirlClockwise((rand() % 2) == 1) + , svgRenderer(QLatin1String(":/spiral.svg"), this) + , logo(QLatin1String(":/qt-logo.png")) +{ +} + +void GLPainter::start() +{ + glWidget->makeCurrent(); + startTimer(20); +} + +void GLPainter::stop() +{ + QMutexLocker locker(&mutex); + doRendering = false; +} + +void GLPainter::resizeViewport(const QSize &size) +{ + QMutexLocker locker(&mutex); + viewportWidth = size.width(); + viewportHeight = size.height(); + initSwirlyItems(); + textCounter = 0; + messageYPos = -1; +} + +void GLPainter::timerEvent(QTimerEvent *event) +{ + QMutexLocker locker(&mutex); + if (!doRendering) { + killTimer(event->timerId()); + QThread::currentThread()->quit(); + return; + } + updateSwirlyItems(); + paint(); +} + +void GLPainter::paint() +{ + QPainter p(glWidget); + p.fillRect(QRect(0, 0, viewportWidth, viewportHeight), Qt::white); + p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + p.translate(viewportWidth / 2, viewportHeight / 2); + p.rotate(rotationAngle * (swirlClockwise ? 1 : -1)); + p.scale(svgRenderer.viewBox().width() / 200.0 * 0.65, + svgRenderer.viewBox().height() / 200.0 * 0.65); + p.translate(-viewportWidth / 2, -viewportHeight / 2); + svgRenderer.render(&p); + p.resetTransform(); + p.drawPixmapFragments(swirlyItems, NUM_SWIRLY_ITEMS, logo); + drawSuggestiveMessages(&p); + p.end(); + rotationAngle += 1.2; +} + +void GLPainter::drawSuggestiveMessages(QPainter *p) +{ + const int numSuggestiveMessages = 7; + const char *texts[numSuggestiveMessages] = {" You feel relaxed.. ", + " Let your mind wander.. ", + " Look deep into the swirls.. ", + " Even deeper.. ", + " Qt is good! ", + " Qt is good for you! ", + " You MUST use Qt! "}; + QFont font(p->font()); + font.setPointSizeF(font.pointSizeF() * viewportWidth/200.0); + p->setFont(font); + QFontMetrics fm(font); + int messageNo = textCounter/314; + if (messageNo > 6 || messageNo < 0) { + qFatal("This should not happen: %d - %d", messageNo, textCounter); + } + QLatin1String text(texts[textCounter / 314]); + qreal textWidth = fm.width(text); + int alpha = 255 * qAbs(qSin(textCounter * 0.01)); + if (messageYPos < 0 || (textCounter % 314 == 0)) { + messageYPos = qBound(fm.height(), rand() % viewportHeight, + viewportHeight - fm.height()); + } + p->setPen(QColor(255, 255, 255, alpha)); + p->setBackground(QColor(50, 50, 50, qBound(0, alpha, 50))); + p->setBackgroundMode(Qt::OpaqueMode); + p->drawText((viewportWidth / 2) - (textWidth/ 2), messageYPos, text); + ++textCounter; + if (textCounter >= (314 * numSuggestiveMessages)) + textCounter = 0; +} + +void GLPainter::initSwirlyItems() +{ + swirlyCounter = swirlClockwise ? 0 : 360; + scaleFactor = viewportWidth / 200.0; + QRectF logoRect(0, 0, logo.width(), logo.height()); + + for (int i=0; i<NUM_SWIRLY_ITEMS; ++i) { + if (swirlClockwise) { + swirlyItems[i] = QPainter::PixmapFragment::create(QPointF(0, 0), logoRect, + scaleFactor, + scaleFactor); + } else { + swirlyItems[i] = QPainter::PixmapFragment::create(QPointF(0, 0), logoRect, + scaleFactor * 1 / 360.0, + scaleFactor * 1 / 360.0); + } + } +} + +void GLPainter::updateSwirlyItems() +{ + swirlyCounter += swirlClockwise ? 1 : -1; + + for (int i=0; i<NUM_SWIRLY_ITEMS; ++i) { + int factor; + factor = swirlClockwise ? (swirlyCounter - i * 20) : (swirlyCounter + i * 20); + if (factor > 0 && factor <= 360) { + swirlyItems[i].x = viewportWidth / 2.0 + qSin(factor * 0.05) * (viewportWidth / 2.0) * (100.0 / factor); + swirlyItems[i].y = viewportHeight / 2.0 + qCos(factor * 0.05) * (viewportHeight / 2.0) * (100.0 / factor); + swirlyItems[i].rotation += -swirlyCounter * 0.01; + swirlyItems[i].scaleX += swirlClockwise ? -scaleFactor * 1 / 360.0 : scaleFactor * 1 / 360.0; + if (swirlClockwise) { + if (swirlyItems[i].scaleX < 0) + swirlyItems[i].scaleX = scaleFactor; + } else { + if (swirlyItems[i].scaleX > scaleFactor) + swirlyItems[i].scaleX = scaleFactor * 1 / 360.0; + } + swirlyItems[i].scaleY = swirlyItems[i].scaleX; + } else { + swirlyItems[i].scaleX = swirlyItems[i].scaleY = 0; + } + } + if (swirlClockwise) { + if (swirlyCounter > (360 + NUM_SWIRLY_ITEMS * 20)) + swirlyCounter = 0; + } else { + if (swirlyCounter < -NUM_SWIRLY_ITEMS * 20) + swirlyCounter = 360; + } +} + +class GLWidget : public QGLWidget +{ +public: + GLWidget(QWidget *parent, QGLWidget *shareWidget = 0); + ~GLWidget(); + void startRendering(); + void stopRendering(); + +protected: + void resizeEvent(QResizeEvent *event); + void paintEvent(QPaintEvent *event); + QSize sizeHint() const { return QSize(200, 200); } + +private: + GLPainter glPainter; + QThread glThread; +}; + +GLWidget::GLWidget(QWidget *parent, QGLWidget *share) + : QGLWidget(QGLFormat(QGL::SampleBuffers), parent, share) + , glPainter(this) + , glThread(this) +{ + setAttribute(Qt::WA_PaintOutsidePaintEvent); + setAttribute(Qt::WA_DeleteOnClose); +} + +GLWidget::~GLWidget() +{ + stopRendering(); +} + +void GLWidget::startRendering() +{ + glPainter.moveToThread(&glThread); + connect(&glThread, SIGNAL(started()), &glPainter, SLOT(start())); + glThread.start(); +} + +void GLWidget::stopRendering() +{ + glPainter.stop(); + glThread.wait(); +} + +void GLWidget::resizeEvent(QResizeEvent *event) +{ + glPainter.resizeViewport(event->size()); +} + +void GLWidget::paintEvent(QPaintEvent *) +{ + // Handled by GLPainter. +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(); + +private slots: + void newThread(); + void killThread(); + +private: + QMdiArea mdiArea; + QGLWidget shareWidget; +}; + +MainWindow::MainWindow() + : QMainWindow(0) + , mdiArea(this) + , shareWidget(this) +{ + setWindowTitle("Qt GL Hypnotizer"); + QMenu *menu = menuBar()->addMenu("&Hypnotizers"); + menu->addAction("&New hypnotizer thread", this, SLOT(newThread()), QKeySequence("Ctrl+N")); + menu->addAction("&End current hypnotizer thread", this, SLOT(killThread()), QKeySequence("Ctrl+K")); + menu->addSeparator(); + menu->addAction("E&xit", qApp, SLOT(quit()), QKeySequence("Ctrl+Q")); + + setCentralWidget(&mdiArea); + shareWidget.resize(1, 1); + newThread(); +} + +void MainWindow::newThread() +{ + static int windowCount = 1; + if (mdiArea.subWindowList().count() > 9) + return; + GLWidget *widget = new GLWidget(&mdiArea, &shareWidget); + mdiArea.addSubWindow(widget); + widget->setWindowTitle("Thread #" + QString::number(windowCount++)); + widget->show(); + widget->startRendering(); +} + +void MainWindow::killThread() +{ + delete mdiArea.activeSubWindow(); +} + +int main(int argc, char *argv[]) +{ + // Make Xlib and GLX thread safe under X11 + QApplication::setAttribute(Qt::AA_X11InitThreads); + QApplication application(argc, argv); + + // Using QPainter to draw into QGLWidgets is only supported with GL 2.0 + if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) || + (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0))) { + QMessageBox::information(0, "Qt GL Hypnotizer", + "This system does not support OpenGL 2.0 or OpenGL ES 2.0, " + "which is required for this example to work."); + return 0; + } + + MainWindow mainWindow; + mainWindow.show(); + return application.exec(); +} + +#include "main.moc" diff --git a/demos/glhypnotizer/qt-logo.png b/demos/glhypnotizer/qt-logo.png Binary files differnew file mode 100644 index 0000000..eaea344 --- /dev/null +++ b/demos/glhypnotizer/qt-logo.png diff --git a/demos/glhypnotizer/spiral.svg b/demos/glhypnotizer/spiral.svg new file mode 100644 index 0000000..ff1f047 --- /dev/null +++ b/demos/glhypnotizer/spiral.svg @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="512" + height="512" + id="svg2" + version="1.1" + inkscape:version="0.47pre4 r22446" + sodipodi:docname="spiral.svg"> + <defs + id="defs4"> + <linearGradient + id="linearGradient5046"> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="0" + id="stop5048" /> + <stop + style="stop-color:#6c90da;stop-opacity:1;" + offset="1" + id="stop5050" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5046" + id="radialGradient5052" + cx="359.38702" + cy="438.07581" + fx="359.38702" + fy="438.07581" + r="304.44159" + gradientTransform="matrix(1,0,0,0.91551877,0,37.009184)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.99232897" + inkscape:cx="267.31099" + inkscape:cy="295.6491" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="963" + inkscape:window-height="1024" + inkscape:window-x="286" + inkscape:window-y="74" + inkscape:window-maximized="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-540.36218)"> + <path + sodipodi:type="spiral" + style="fill:url(#radialGradient5052);fill-opacity:1;stroke:#000000;stroke-width:20.29999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path2816" + sodipodi:cx="331.42856" + sodipodi:cy="463.79074" + sodipodi:expansion="1" + sodipodi:revolution="3" + sodipodi:radius="337.44537" + sodipodi:argument="-18.046196" + sodipodi:t0="0" + d="m 331.42856,463.79074 c 11.74672,12.17647 -10.61822,21.84178 -20.23809,19.52382 -26.06925,-6.28154 -29.6746,-39.8823 -18.80954,-59.99999 19.43502,-35.98584 68.28562,-39.36493 99.76189,-18.09528 46.19269,31.21408 49.35062,97.07722 17.381,139.5238 -42.61047,56.57461 -126.00702,59.46265 -179.2857,16.66673 -67.04578,-53.85429 -69.64012,-155.00279 -15.95246,-219.0476 65.02296,-77.56686 184.03573,-79.85552 258.80951,-15.23819 88.11831,76.14929 90.09472,213.09185 14.52392,298.57141 C 400.3696,724.38498 245.45564,726.04525 149.28577,639.50509 40.011453,541.17265 38.669765,368.25918 136.1904,261.40987 245.59381,141.54108 436.52669,140.5196 554.04752,249.02876 684.51792,369.4945 685.21808,578.4614 565.71435,706.64779" + transform="matrix(0.9291373,0,0,0.91940263,-79.040559,394.33975)" /> + </g> +</svg> diff --git a/demos/mobile/quickhit/plugins/LevelOne/levelone.pro b/demos/mobile/quickhit/plugins/LevelOne/levelone.pro index fcbfc56..b936721 100644 --- a/demos/mobile/quickhit/plugins/LevelOne/levelone.pro +++ b/demos/mobile/quickhit/plugins/LevelOne/levelone.pro @@ -57,11 +57,11 @@ BLD_INF_RULES.prj_exports += "gfx/background3.png ../winscw/c/Data/gfx/backgroun myQml.sources = level.qml -myQml.path = c:/System/quickhitdata/levelone +myQml.path = c:/system/quickhitdata/levelone myGraphic.sources = gfx/* -myGraphic.path = c:/System/quickhitdata/levelone/gfx +myGraphic.path = c:/system/quickhitdata/levelone/gfx mySound.sources = sound/* -mySound.path = c:/System/quickhitdata/levelone/sound +mySound.path = c:/system/quickhitdata/levelone/sound # Takes qml, graphics and sounds into Symbian SIS package file (.pkg) DEPLOYMENT += myQml myGraphic mySound diff --git a/demos/mobile/quickhit/plugins/LevelTemplate/leveltemplate.pro b/demos/mobile/quickhit/plugins/LevelTemplate/leveltemplate.pro index a4f5900..1370956 100644 --- a/demos/mobile/quickhit/plugins/LevelTemplate/leveltemplate.pro +++ b/demos/mobile/quickhit/plugins/LevelTemplate/leveltemplate.pro @@ -60,11 +60,11 @@ BLD_INF_RULES.prj_exports += "gfx/enemy1.png ../winscw/c/Data/gfx/enemy1.png" \ myQml.sources = qml/* -myQml.path = c:/System/quickhitdata/leveltemplate +myQml.path = c:/system/quickhitdata/leveltemplate myGraphic.sources = gfx/* -myGraphic.path = c:/System/quickhitdata/leveltemplate/gfx +myGraphic.path = c:/system/quickhitdata/leveltemplate/gfx mySound.sources = sound/* -mySound.path = c:/System/quickhitdata/leveltemplate/sound +mySound.path = c:/system/quickhitdata/leveltemplate/sound # Takes qml, graphics and sounds into Symbian SIS package file (.pkg) DEPLOYMENT += myQml myGraphic mySound diff --git a/demos/mobile/quickhit/plugins/LevelTwo/leveltwo.pro b/demos/mobile/quickhit/plugins/LevelTwo/leveltwo.pro index 171ee6c..e5c144f 100644 --- a/demos/mobile/quickhit/plugins/LevelTwo/leveltwo.pro +++ b/demos/mobile/quickhit/plugins/LevelTwo/leveltwo.pro @@ -64,11 +64,11 @@ BLD_INF_RULES.prj_exports += "gfx/background2.png ../winscw/c/Data/gfx/backgroun myQml.sources = qml/* -myQml.path = c:/System/quickhitdata/leveltwo +myQml.path = c:/system/quickhitdata/leveltwo myGraphic.sources = gfx/* -myGraphic.path = c:/System/quickhitdata/leveltwo/gfx +myGraphic.path = c:/system/quickhitdata/leveltwo/gfx mySound.sources = sound/* -mySound.path = c:/System/quickhitdata/leveltwo/sound +mySound.path = c:/system/quickhitdata/leveltwo/sound # Takes qml, graphics and sounds into Symbian SIS package file (.pkg) DEPLOYMENT += myQml myGraphic mySound diff --git a/demos/pathstroke/main.cpp b/demos/pathstroke/main.cpp index b357f99..ca201d3 100644 --- a/demos/pathstroke/main.cpp +++ b/demos/pathstroke/main.cpp @@ -48,7 +48,11 @@ int main(int argc, char **argv) QApplication app(argc, argv); +#ifdef Q_OS_SYMBIAN + bool smallScreen = true; +#else bool smallScreen = QApplication::arguments().contains("-small-screen"); +#endif PathStrokeWidget pathStrokeWidget(smallScreen); QStyle *arthurStyle = new ArthurStyle(); diff --git a/dist/changes-4.8.0 b/dist/changes-4.8.0 index b8cc626..1703633 100644 --- a/dist/changes-4.8.0 +++ b/dist/changes-4.8.0 @@ -39,12 +39,29 @@ QtCore - Removed support for QT_NO_THREAD define for QHostInfo. - Optimized plugin loading on ELF platforms. Print failure reason at runtime with QT_DEBUG_PLUGINS=1 in environment. + - QMutexLocker: improved performence of the non contended case by inlining some function + - QThreadStorage: Added possibility to store object by value instead of by pointer [QTBUG-15033] + - QThread: fixed few race conditions [QTBUG-17257, QTBUG-15030] + - QtConcurrent: added support for c++0x lambda in few functions + - QObject: Improved performence of the signal activation + - QObject: added ways to connect signals using QMetaMethod + - QObject: deprecated qFindChild and qFindChildren + - QObject: optimize constructions and destruction of objects + - QObject: Qt::BlockingQueuedConnection can handle the return value [QTBUG-10440] + - QList/QVector/QStringList: added C++0x initilizer lists constructors. + - QVarLenghtArray: added method for consistency with QVector + - QStringBuilder: added support for QByteArray + - qSwap now uses std::swap, specialized std::swap for our container to work better with stl algoritms + - QVariant: deprecated global function qVariantSetValue, qVariantValue, qVariantCanConvert, qVariantFromValue QtGui ----- - QTabBar: reduced minimumSizeHint if ElideMode is set. - QComboBox: Fixed a color propagation issue with the lineedit. [QTBUG-5950] + - Deprecate qGenericMatrixFromMatrix4x4 and qGenericMatrixToMatrix4x4 + - QListView diverses optimisations [QTBUG-11438] + - QTreeWidget/QListWidget: use localeAwareCompare for string comparisons [QTBUG-10839] QtOpenGL -------- @@ -54,6 +71,10 @@ QtGui - Including <QtOpenGL> will not work in combination with GLEW, as QGLFunctions will undefine GLEW's defines. +QtScript +-------- + - Deprecated qScriptValueFromQMetaObject, qScriptValueToValue, qScriptValueFromValue + **************************************************************************** * Database Drivers * @@ -136,6 +157,7 @@ Qt for Windows CE - qtconfig + * removed Qt3support dependency - qt3to4 diff --git a/doc/src/declarative/righttoleft.qdoc b/doc/src/declarative/righttoleft.qdoc index 4427798..58c266c 100644 --- a/doc/src/declarative/righttoleft.qdoc +++ b/doc/src/declarative/righttoleft.qdoc @@ -64,8 +64,7 @@ This default locale-based alignment can be overriden by setting the \c horizonta property for the text element, or by enabling layout mirroring using the \l LayoutMirroring attached property, which causes any explicit left and right horizontal alignments to be mirrored. Note that when \l LayoutMirroring is set, the \c horizontalAlignment property value remains unchanged; -the effective alignment of the text element that takes the mirroring into account can be read from the -\c effectiveHorizontalAlignment property. +use the property \c LayoutMirroring.enabled instead to query whether the mirroring is in effect. \snippet doc/src/snippets/declarative/righttoleft.qml 0 @@ -79,9 +78,9 @@ property for controlling the horizontal direction of the layouts. Setting \c lay the left-to-right layout direction. The horizontal layout direction can also be reversed through the \l LayoutMirroring attached property. -This causes the effective \c layoutDirection of positioners and views to be mirrored. Note the actual value -of the \c layoutDirection property will remain unchanged; the effective layout direction of positioners and -views that takes the mirroring into account can be read from the \c effectiveLayoutDirection property. +This causes the effective \c layoutDirection of positioners and views to be mirrored. Note though that the actual +value of the \c layoutDirection property will remain unchanged; use the property \c LayoutMirroring.enabled instead +to query whether the mirroring is in effect. \snippet doc/src/snippets/declarative/righttoleft.qml 1 @@ -101,12 +100,8 @@ Or set all child elements to also inherit the layout direction: \snippet doc/src/snippets/declarative/righttoleft.qml 3 Applying mirroring in this manner does not change the actual value of the relevant anchor, -\c layoutDirection or \c horizontalAlignment properties. The separate read-only property -\c effectiveLayoutDirection can be used to query the effective layout -direction of positioners and model views that takes the mirroring into account. Similarly the \l Text, -\l TextInput and \l TextEdit elements have gained the read-only property \c effectiveHorizontalAlignment -for querying the effective visual alignment of text. For anchors, the read only -\l {Item::anchors}{anchors.mirrored} property reflects whether anchors have been mirrored. +\c layoutDirection or \c horizontalAlignment properties. You can use \c LayoutMirroring.enabled to +query whether the mirroring is in effect. Note that application layouts and animations that are defined using \l {Item::}{x} property values (as opposed to anchors or positioner elements) are not affected by the \l LayoutMirroring attached property. diff --git a/doc/src/declarative/whatsnew.qdoc b/doc/src/declarative/whatsnew.qdoc index 9e13e98..77f8eb0 100644 --- a/doc/src/declarative/whatsnew.qdoc +++ b/doc/src/declarative/whatsnew.qdoc @@ -41,13 +41,6 @@ PinchArea provides support for the common two finger pinch gesture. \l {LayoutMirroring}{Layout mirroring} is useful when you need to support both left-to-right and right-to-left layout versions of your application that target different language areas. -\section2 Anchors - -Added the following property: -\list -\o \l {Item::}{anchors.mirrored} -\endlist - \section2 Text Added the following properties: @@ -57,7 +50,6 @@ Added the following properties: \o \l {Text::}{lineCount} \o \l {Text::}{maximumLineCount} \o \l {Text::}{truncated} -\o \l {Text::}{effectiveHorizontalAlignment} \endlist horizontalAlignment now accepts Text.AlignJustify alignment mode. @@ -70,7 +62,6 @@ Added the following properties, methods and signal handlers: \o \l {TextEdit::}{lineCount} \o \l {TextEdit::}{inputMethodComposing} \o \l {TextEdit::}{mouseSelectionMode} -\o \l {TextEdit::}{effectiveHorizontalAlignment} \o \l {TextEdit::}{deselect()} \o \l {TextEdit::}{isRightToLeft()} \o \l {TextEdit::}{moveCursorSelection()} to enable selection by word @@ -84,7 +75,6 @@ Added the following properties and methods: \o \l {TextInput::}{canPaste} \o \l {TextInput::}{inputMethodComposing} \o \l {TextInput::}{mouseSelectionMode} -\o \l {TextInput::}{effectiveHorizontalAlignment} \o \l {TextInput::}{deselect()} \o \l {TextInput::}{isRightToLeft()} \o \l {TextInput::}{moveCursorSelection()} to enable selection by word @@ -125,17 +115,15 @@ Added the following property: Added the following properties and methods: \list \o \l{ListView::}{layoutDirection} -\o \l{ListView::}{effectiveLayoutDirection} \o \l{ListView::}{positionViewAtBeginning()} \o \l{ListView::}{positionViewAtEnd()} \endlist \section2 Flow, Grid and Row -Added the following properties: +Added the following property: \list \o \l{Flow::}{layoutDirection} -\o \l{Flow::}{effectiveLayoutDirection} \endlist \section2 Repeater diff --git a/doc/src/demos/glhypnotizer.qdoc b/doc/src/demos/glhypnotizer.qdoc new file mode 100644 index 0000000..97b3c3b --- /dev/null +++ b/doc/src/demos/glhypnotizer.qdoc @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of this +** file. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example demos/glhypnotizer + \title GL Hypnotizer + + This demo shows how to use OpenGL from a seperate thread. + + \image glhypnotizer-demo.png + + New MDI windows can be added by pressing Ctrl-N and each new child + window renders in it's own thread. +*/ diff --git a/doc/src/images/glhypnotizer-demo.png b/doc/src/images/glhypnotizer-demo.png Binary files differnew file mode 100644 index 0000000..5b7a1ae --- /dev/null +++ b/doc/src/images/glhypnotizer-demo.png diff --git a/doc/src/windows-and-dialogs/mainwindow.qdoc b/doc/src/windows-and-dialogs/mainwindow.qdoc index f2b29c9..e1a5e82 100644 --- a/doc/src/windows-and-dialogs/mainwindow.qdoc +++ b/doc/src/windows-and-dialogs/mainwindow.qdoc @@ -145,6 +145,17 @@ depends on the result of QWidget::frameGeometry() and the capability of the window manager to do proper window placement, neither of which can be guaranteed. + + \section2 Symbian Peculiarities + + On Symbian, the status pane and softkeys are not created until + after QWidget::show() is called for the main window of the application. + This means that at the time when the application main window gets the + show event, the application main window width() and height() methods + still return full screen width and height instead of the client area + width and height as expected. The correct place to get the main window + size is the resize event handler of the main window, as the resize event + will be sent each time the client area of the window changes. */ /*! diff --git a/examples/declarative/keyinteraction/focus/Core/GridMenu.qml b/examples/declarative/keyinteraction/focus/Core/GridMenu.qml index f3894fb..224d38b 100644 --- a/examples/declarative/keyinteraction/focus/Core/GridMenu.qml +++ b/examples/declarative/keyinteraction/focus/Core/GridMenu.qml @@ -86,7 +86,7 @@ FocusScope { hoverEnabled: true onClicked: { - GridView.view.currentIndex = index + container.GridView.view.currentIndex = index container.forceActiveFocus() } } diff --git a/examples/declarative/keyinteraction/focus/Core/ListViewDelegate.qml b/examples/declarative/keyinteraction/focus/Core/ListViewDelegate.qml index 88c3624..8f9d022 100644 --- a/examples/declarative/keyinteraction/focus/Core/ListViewDelegate.qml +++ b/examples/declarative/keyinteraction/focus/Core/ListViewDelegate.qml @@ -68,7 +68,7 @@ Item { hoverEnabled: true onClicked: { - ListView.view.currentIndex = index + container.ListView.view.currentIndex = index container.forceActiveFocus() } } diff --git a/examples/declarative/righttoleft/layoutdirection/layoutdirection.qml b/examples/declarative/righttoleft/layoutdirection/layoutdirection.qml index 3044430..fa343b9 100644 --- a/examples/declarative/righttoleft/layoutdirection/layoutdirection.qml +++ b/examples/declarative/righttoleft/layoutdirection/layoutdirection.qml @@ -226,7 +226,17 @@ Rectangle { Component { id: viewDelegate Item { - width: (listView.effectiveLayoutDirection == Qt.LeftToRight ? (index == 48 - 1) : (index == 0)) ? 40 : 50 + function effectiveLayoutDirection() { + if (LayoutMirroring.enabled) + if (listView.layoutDirection == Qt.LeftToRight) + return Qt.RightToLeft; + else + return Qt.LeftToRight; + else + return listView.layoutDirection; + } + + width: (effectiveLayoutDirection() == Qt.LeftToRight ? (index == 48 - 1) : (index == 0)) ? 40 : 50 Rectangle { width: 40; height: 40 color: Qt.rgba(0.5+(48 - index)*Math.random()/48, diff --git a/examples/draganddrop/fridgemagnets/main.cpp b/examples/draganddrop/fridgemagnets/main.cpp index 1166abb..e87ef5b 100644 --- a/examples/draganddrop/fridgemagnets/main.cpp +++ b/examples/draganddrop/fridgemagnets/main.cpp @@ -51,7 +51,12 @@ int main(int argc, char *argv[]) #endif DragWidget window; +#ifdef Q_OS_SYMBIAN + bool smallScreen = true; +#else bool smallScreen = QApplication::arguments().contains("-small-screen"); +#endif + if (smallScreen) window.showFullScreen(); else diff --git a/examples/script/context2d/main.cpp b/examples/script/context2d/main.cpp index 3d56910..20df178 100644 --- a/examples/script/context2d/main.cpp +++ b/examples/script/context2d/main.cpp @@ -48,7 +48,12 @@ int main(int argc, char **argv) QApplication app(argc, argv); Window win; +#ifdef Q_OS_SYMBIAN + bool smallScreen = true; +#else bool smallScreen = QApplication::arguments().contains("-small-screen"); +#endif + if (!smallScreen) { win.show(); } else { diff --git a/examples/widgets/wiggly/main.cpp b/examples/widgets/wiggly/main.cpp index 91cd1b8..7ba6d36 100644 --- a/examples/widgets/wiggly/main.cpp +++ b/examples/widgets/wiggly/main.cpp @@ -45,7 +45,11 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); +#ifdef Q_OS_SYMBIAN + bool smallScreen = true; +#else bool smallScreen = QApplication::arguments().contains("-small-screen"); +#endif Dialog dialog(0, smallScreen); diff --git a/mkspecs/features/symbian/application_icon.prf b/mkspecs/features/symbian/application_icon.prf index d9918bf..f058399 100644 --- a/mkspecs/features/symbian/application_icon.prf +++ b/mkspecs/features/symbian/application_icon.prf @@ -66,8 +66,8 @@ contains(CONFIG, no_icon) { mifconv.target = $$replace(mifconv.target, /, \\) } # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library - # svg-t icons should always use /c32 depth - mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed + # svg-t icons should always use -c32 depth + mifconv.commands = mifconv $$mifconv.target -c32 $$ICON_backslashed mifconv.depends = $$ICON PRE_TARGETDEPS += $$mifconv.target diff --git a/mkspecs/features/symbian/qt_config.prf b/mkspecs/features/symbian/qt_config.prf index 82c1862..1afd22c 100644 --- a/mkspecs/features/symbian/qt_config.prf +++ b/mkspecs/features/symbian/qt_config.prf @@ -3,7 +3,7 @@ load(qt_config) !contains(QMAKE_HOST.os, "Windows") { # Test for the existence of lower cased headers, a sign of using Gnupoc. # Note that the qmake "exists" test won't do because it is case insensitive. - system("test -f $${EPOCROOT}epoc32/include/akndoc.h") { + system("test -f $${EPOCROOT}epoc32/include/akndoc.h") | system("test -f $${EPOCROOT}epoc32/include/mw/akndoc.h") { CONFIG += is_using_gnupoc } } diff --git a/src/3rdparty/wayland/qwaylandwindowmanager-client-protocol.h b/src/3rdparty/wayland/qwaylandwindowmanager-client-protocol.h new file mode 100644 index 0000000..73673ae --- /dev/null +++ b/src/3rdparty/wayland/qwaylandwindowmanager-client-protocol.h @@ -0,0 +1,110 @@ +/* + * Copyright © 2010 Kristian Høgsberg + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + + +#ifndef WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H +#define WAYLAND_WINDOWMANAGER_CLIENT_PROTOCOL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> +#include <stddef.h> +#include "wayland-util.h" + +struct wl_client; + +struct wl_windowmanager; + +struct wl_proxy; + +extern void +wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...); +extern struct wl_proxy * +wl_proxy_create(struct wl_proxy *factory, + const struct wl_interface *interface); +extern struct wl_proxy * +wl_proxy_create_for_id(struct wl_display *display, + const struct wl_interface *interface, uint32_t id); +extern void +wl_proxy_destroy(struct wl_proxy *proxy); + +extern int +wl_proxy_add_listener(struct wl_proxy *proxy, + void (**implementation)(void), void *data); + +extern void +wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data); + +extern void * +wl_proxy_get_user_data(struct wl_proxy *proxy); + +extern const struct wl_interface wl_windowmanager_interface; + +#define wl_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0 +#define wl_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN 1 + +static inline struct wl_windowmanager * +wl_windowmanager_create(struct wl_display *display, uint32_t id) +{ + return (struct wl_windowmanager *) + wl_proxy_create_for_id(display, &wl_windowmanager_interface, id); +} + +static inline void +wl_windowmanager_set_user_data(struct wl_windowmanager *wl_windowmanager, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) wl_windowmanager, user_data); +} + +static inline void * +wl_windowmanager_get_user_data(struct wl_windowmanager *wl_windowmanager) +{ + return wl_proxy_get_user_data((struct wl_proxy *) wl_windowmanager); +} + +static inline void +wl_windowmanager_destroy(struct wl_windowmanager *wl_windowmanager) +{ + wl_proxy_destroy((struct wl_proxy *) wl_windowmanager); +} + +static inline void +wl_windowmanager_map_client_to_process(struct wl_windowmanager *wl_windowmanager, uint32_t processid) +{ + wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, + wl_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS, processid); +} + +static inline void +wl_windowmanager_authenticate_with_token(struct wl_windowmanager *wl_windowmanager, const char *wl_authentication_token) +{ + wl_proxy_marshal((struct wl_proxy *) wl_windowmanager, + wl_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, wl_authentication_token); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/wayland/wayland-windowmanager-protocol.c b/src/3rdparty/wayland/wayland-windowmanager-protocol.c new file mode 100644 index 0000000..0250801 --- /dev/null +++ b/src/3rdparty/wayland/wayland-windowmanager-protocol.c @@ -0,0 +1,37 @@ +/* + * Copyright © 2010 Kristian Høgsberg + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + + +#include <stdlib.h> +#include <stdint.h> +#include "wayland-util.h" + +static const struct wl_message wl_windowmanager_requests[] = { + { "map_client_to_process", "u" }, + { "authenticate_with_token", "s" }, +}; + +WL_EXPORT const struct wl_interface wl_windowmanager_interface = { + "wl_windowmanager", 1, + ARRAY_LENGTH(wl_windowmanager_requests), wl_windowmanager_requests, + 0, NULL, +}; diff --git a/src/corelib/concurrent/qtconcurrentcompilertest.h b/src/corelib/concurrent/qtconcurrentcompilertest.h index 884badb..c139c7a 100644 --- a/src/corelib/concurrent/qtconcurrentcompilertest.h +++ b/src/corelib/concurrent/qtconcurrentcompilertest.h @@ -57,6 +57,20 @@ QT_MODULE(Core) # define QT_TYPENAME typename #endif +namespace QtPrivate { + +template<class T> +class HasResultType { + typedef char Yes; + typedef void *No; + template<typename U> static Yes test(int, const typename U::result_type * = 0); + template<typename U> static No test(double); +public: + enum { Value = (sizeof(test<T>(0)) == sizeof(Yes)) }; +}; + +} + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h index a79ad1c..4bf2736 100644 --- a/src/corelib/concurrent/qtconcurrentfunctionwrappers.h +++ b/src/corelib/concurrent/qtconcurrentfunctionwrappers.h @@ -195,17 +195,10 @@ QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func); } - -template<typename T> -void *lazyResultType_helper(int, typename T::result_type * = 0); -template<typename T> -char lazyResultType_helper(double); - -template <typename Functor, bool foo = sizeof(lazyResultType_helper<Functor>(0)) != sizeof(void*)> +template <typename Functor, bool foo = HasResultType<Functor>::Value> struct LazyResultType { typedef typename Functor::result_type Type; }; template <typename Functor> -struct LazyResultType<Functor, true> { typedef void Type; }; - +struct LazyResultType<Functor, false> { typedef void Type; }; template <class T> struct ReduceResultType; diff --git a/src/corelib/concurrent/qtconcurrentrun.h b/src/corelib/concurrent/qtconcurrentrun.h index 8611fba..ef51b2a 100644 --- a/src/corelib/concurrent/qtconcurrentrun.h +++ b/src/corelib/concurrent/qtconcurrentrun.h @@ -71,63 +71,114 @@ namespace QtConcurrent { template <typename T> QFuture<T> run(T (*functionPointer)()) { - return (new QT_TYPENAME SelectStoredFunctorCall0<T, T (*)()>::type(functionPointer))->start(); + return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start(); } template <typename T, typename Param1, typename Arg1> QFuture<T> run(T (*functionPointer)(Param1), const Arg1 &arg1) { - return (new QT_TYPENAME SelectStoredFunctorCall1<T, T (*)(Param1), Arg1>::type(functionPointer, arg1))->start(); + return (new StoredFunctorCall1<T, T (*)(Param1), Arg1>(functionPointer, arg1))->start(); } template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2> QFuture<T> run(T (*functionPointer)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2) { - return (new QT_TYPENAME SelectStoredFunctorCall2<T, T (*)(Param1, Param2), Arg1, Arg2>::type(functionPointer, arg1, arg2))->start(); + return (new StoredFunctorCall2<T, T (*)(Param1, Param2), Arg1, Arg2>(functionPointer, arg1, arg2))->start(); } template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3> QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { - return (new QT_TYPENAME SelectStoredFunctorCall3<T, T (*)(Param1, Param2, Param3), Arg1, Arg2, Arg3>::type(functionPointer, arg1, arg2, arg3))->start(); + return (new StoredFunctorCall3<T, T (*)(Param1, Param2, Param3), Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start(); } template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4> QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) { - return (new QT_TYPENAME SelectStoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4), Arg1, Arg2, Arg3, Arg4>::type(functionPointer, arg1, arg2, arg3, arg4))->start(); + return (new StoredFunctorCall4<T, T (*)(Param1, Param2, Param3, Param4), Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start(); } template <typename T, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5> QFuture<T> run(T (*functionPointer)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) { - return (new QT_TYPENAME SelectStoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5), Arg1, Arg2, Arg3, Arg4, Arg5>::type(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(); + return (new StoredFunctorCall5<T, T (*)(Param1, Param2, Param3, Param4, Param5), Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start(); } +#ifdef Q_COMPILER_DECLTYPE + +template <typename Functor> +auto run(Functor functor) -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor())> >::Type +{ + typedef decltype(functor()) result_type; + return (new StoredFunctorCall0<result_type, Functor>(functor))->start(); +} + +template <typename Functor, typename Arg1> +auto run(Functor functor, const Arg1 &arg1) + -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1))> >::Type +{ + typedef decltype(functor(arg1)) result_type; + return (new StoredFunctorCall1<result_type, Functor, Arg1>(functor, arg1))->start(); +} + +template <typename Functor, typename Arg1, typename Arg2> +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2) + -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2))> >::Type +{ + typedef decltype(functor(arg1, arg2)) result_type; + return (new StoredFunctorCall2<result_type, Functor, Arg1, Arg2>(functor, arg1, arg2))->start(); +} + +template <typename Functor, typename Arg1, typename Arg2, typename Arg3> +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) + -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3))> >::Type +{ + typedef decltype(functor(arg1, arg2, arg3)) result_type; + return (new StoredFunctorCall3<result_type, Functor, Arg1, Arg2, Arg3>(functor, arg1, arg2, arg3))->start(); +} + +template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4> +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) + -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4))> >::Type +{ + typedef decltype(functor(arg1, arg2, arg3, arg4)) result_type; + return (new StoredFunctorCall4<result_type, Functor, Arg1, Arg2, Arg3, Arg4>(functor, arg1, arg2, arg3, arg4))->start(); +} + +template <typename Functor, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> +auto run(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) + -> typename QtPrivate::QEnableIf<!QtPrivate::HasResultType<Functor>::Value, QFuture<decltype(functor(arg1, arg2, arg3, arg4, arg5))> >::Type +{ + typedef decltype(functor(arg1, arg2, arg3, arg4, arg5)) result_type; + return (new StoredFunctorCall5<result_type, Functor, Arg1, Arg2, Arg3, Arg4, Arg5>(functor, arg1, arg2, arg3, arg4, arg5))->start(); +} + +#endif + template <typename FunctionObject> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject) { - return (new QT_TYPENAME SelectStoredFunctorCall0<QT_TYPENAME FunctionObject::result_type, FunctionObject>::type(functionObject))->start(); + return (new StoredFunctorCall0<QT_TYPENAME FunctionObject::result_type, FunctionObject>(functionObject))->start(); } template <typename FunctionObject, typename Arg1> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1) { - return (new QT_TYPENAME SelectStoredFunctorCall1<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1>::type(functionObject, arg1))->start(); + return (new StoredFunctorCall1<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1>(functionObject, arg1))->start(); } template <typename FunctionObject, typename Arg1, typename Arg2> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2) { - return (new QT_TYPENAME SelectStoredFunctorCall2<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2>::type(functionObject, arg1, arg2))->start(); + return (new StoredFunctorCall2<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2>(functionObject, arg1, arg2))->start(); } template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { - return (new QT_TYPENAME SelectStoredFunctorCall3<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>::type(functionObject, arg1, arg2, arg3))->start(); + return (new StoredFunctorCall3<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3>(functionObject, arg1, arg2, arg3))->start(); } template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4) { - return (new QT_TYPENAME SelectStoredFunctorCall4<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>::type(functionObject, arg1, arg2, arg3, arg4))->start(); + return (new StoredFunctorCall4<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4>(functionObject, arg1, arg2, arg3, arg4))->start(); } template <typename FunctionObject, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> QFuture<typename FunctionObject::result_type> run(FunctionObject functionObject, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5) { - return (new QT_TYPENAME SelectStoredFunctorCall5<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>::type(functionObject, arg1, arg2, arg3, arg4, arg5))->start(); + return (new StoredFunctorCall5<QT_TYPENAME FunctionObject::result_type, FunctionObject, Arg1, Arg2, Arg3, Arg4, Arg5>(functionObject, arg1, arg2, arg3, arg4, arg5))->start(); } template <typename FunctionObject> diff --git a/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h b/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h index c61f9b8..9beb0b9 100644 --- a/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h +++ b/src/corelib/concurrent/qtconcurrentstoredfunctioncall.h @@ -66,10 +66,10 @@ struct StoredFunctorCall0: public RunFunctionTask<T> }; -template <typename T, typename FunctionPointer> -struct VoidStoredFunctorCall0: public RunFunctionTask<T> +template <typename FunctionPointer> +struct StoredFunctorCall0<void, FunctionPointer>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall0(FunctionPointer _function) + inline StoredFunctorCall0(FunctionPointer _function) : function(_function) {} void runFunctor() { function(); } FunctionPointer function; @@ -77,13 +77,6 @@ struct VoidStoredFunctorCall0: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer> -struct SelectStoredFunctorCall0 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall0 <T, FunctionPointer>, - VoidStoredFunctorCall0<T, FunctionPointer> >::type type; -}; -template <typename T, typename FunctionPointer> struct StoredFunctorPointerCall0: public RunFunctionTask<T> { inline StoredFunctorPointerCall0(FunctionPointer * _function) @@ -276,10 +269,10 @@ struct StoredFunctorCall1: public RunFunctionTask<T> Arg1 arg1; }; -template <typename T, typename FunctionPointer, typename Arg1> -struct VoidStoredFunctorCall1: public RunFunctionTask<T> +template <typename FunctionPointer, typename Arg1> +struct StoredFunctorCall1<void, FunctionPointer, Arg1>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1) + inline StoredFunctorCall1(FunctionPointer _function, const Arg1 &_arg1) : function(_function), arg1(_arg1) {} void runFunctor() { function(arg1); } FunctionPointer function; @@ -287,13 +280,6 @@ struct VoidStoredFunctorCall1: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer, typename Arg1> -struct SelectStoredFunctorCall1 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall1 <T, FunctionPointer, Arg1>, - VoidStoredFunctorCall1<T, FunctionPointer, Arg1> >::type type; -}; -template <typename T, typename FunctionPointer, typename Arg1> struct StoredFunctorPointerCall1: public RunFunctionTask<T> { inline StoredFunctorPointerCall1(FunctionPointer * _function, const Arg1 &_arg1) @@ -486,10 +472,10 @@ struct StoredFunctorCall2: public RunFunctionTask<T> Arg1 arg1; Arg2 arg2; }; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2> -struct VoidStoredFunctorCall2: public RunFunctionTask<T> +template <typename FunctionPointer, typename Arg1, typename Arg2> +struct StoredFunctorCall2<void, FunctionPointer, Arg1, Arg2>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) + inline StoredFunctorCall2(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2) : function(_function), arg1(_arg1), arg2(_arg2) {} void runFunctor() { function(arg1, arg2); } FunctionPointer function; @@ -497,13 +483,6 @@ struct VoidStoredFunctorCall2: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer, typename Arg1, typename Arg2> -struct SelectStoredFunctorCall2 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall2 <T, FunctionPointer, Arg1, Arg2>, - VoidStoredFunctorCall2<T, FunctionPointer, Arg1, Arg2> >::type type; -}; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2> struct StoredFunctorPointerCall2: public RunFunctionTask<T> { inline StoredFunctorPointerCall2(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2) @@ -696,10 +675,10 @@ struct StoredFunctorCall3: public RunFunctionTask<T> Arg1 arg1; Arg2 arg2; Arg3 arg3; }; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3> -struct VoidStoredFunctorCall3: public RunFunctionTask<T> +template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3> +struct StoredFunctorCall3<void, FunctionPointer, Arg1, Arg2, Arg3>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) + inline StoredFunctorCall3(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3) {} void runFunctor() { function(arg1, arg2, arg3); } FunctionPointer function; @@ -707,13 +686,6 @@ struct VoidStoredFunctorCall3: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3> -struct SelectStoredFunctorCall3 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall3 <T, FunctionPointer, Arg1, Arg2, Arg3>, - VoidStoredFunctorCall3<T, FunctionPointer, Arg1, Arg2, Arg3> >::type type; -}; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3> struct StoredFunctorPointerCall3: public RunFunctionTask<T> { inline StoredFunctorPointerCall3(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3) @@ -906,10 +878,10 @@ struct StoredFunctorCall4: public RunFunctionTask<T> Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; }; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4> -struct VoidStoredFunctorCall4: public RunFunctionTask<T> +template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4> +struct StoredFunctorCall4<void, FunctionPointer, Arg1, Arg2, Arg3, Arg4>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) + inline StoredFunctorCall4(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4) {} void runFunctor() { function(arg1, arg2, arg3, arg4); } FunctionPointer function; @@ -917,13 +889,6 @@ struct VoidStoredFunctorCall4: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4> -struct SelectStoredFunctorCall4 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall4 <T, FunctionPointer, Arg1, Arg2, Arg3, Arg4>, - VoidStoredFunctorCall4<T, FunctionPointer, Arg1, Arg2, Arg3, Arg4> >::type type; -}; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4> struct StoredFunctorPointerCall4: public RunFunctionTask<T> { inline StoredFunctorPointerCall4(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4) @@ -1116,10 +1081,10 @@ struct StoredFunctorCall5: public RunFunctionTask<T> Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5; }; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> -struct VoidStoredFunctorCall5: public RunFunctionTask<T> +template <typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> +struct StoredFunctorCall5<void, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5>: public RunFunctionTask<void> { - inline VoidStoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) + inline StoredFunctorCall5(FunctionPointer _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) : function(_function), arg1(_arg1), arg2(_arg2), arg3(_arg3), arg4(_arg4), arg5(_arg5) {} void runFunctor() { function(arg1, arg2, arg3, arg4, arg5); } FunctionPointer function; @@ -1127,13 +1092,6 @@ struct VoidStoredFunctorCall5: public RunFunctionTask<T> }; template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> -struct SelectStoredFunctorCall5 -{ - typedef typename SelectSpecialization<T>::template - Type<StoredFunctorCall5 <T, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5>, - VoidStoredFunctorCall5<T, FunctionPointer, Arg1, Arg2, Arg3, Arg4, Arg5> >::type type; -}; -template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> struct StoredFunctorPointerCall5: public RunFunctionTask<T> { inline StoredFunctorPointerCall5(FunctionPointer * _function, const Arg1 &_arg1, const Arg2 &_arg2, const Arg3 &_arg3, const Arg4 &_arg4, const Arg5 &_arg5) @@ -1316,6 +1274,33 @@ struct SelectStoredConstMemberFunctionPointerCall5 Type<StoredConstMemberFunctionPointerCall5 <T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5>, VoidStoredConstMemberFunctionPointerCall5<T, Class, Param1, Arg1, Param2, Arg2, Param3, Arg3, Param4, Arg4, Param5, Arg5> >::type type; }; + +template <typename T, typename Functor> +class StoredFunctorCall : public RunFunctionTask<T> +{ +public: + StoredFunctorCall(const Functor &f) : functor(f) { } + void runFunctor() + { + this->result = functor(); + } +private: + Functor functor; +}; +template <typename Functor> +class StoredFunctorCall<void, Functor> : public RunFunctionTask<void> +{ +public: + StoredFunctorCall(const Functor &f) : functor(f) { } + void runFunctor() + { + functor(); + } +private: + Functor functor; +}; + + } //namespace QtConcurrent #endif // qdoc diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 58d2c7b..9673861 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -45,4 +45,5 @@ symbian: { "UNPAGED" \ "$${LITERAL_HASH}endif" MMP_RULES += pagingBlock + LIBS += -ltzclient } diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 4e3f4e3..8a17af5 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -363,6 +363,11 @@ template <typename T> inline void qToLittleEndian(T src, uchar *dest) #endif // Q_BYTE_ORDER == Q_BIG_ENDIAN +template <> inline quint8 qbswap<quint8>(quint8 source) +{ + return source; +} + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 78b8443..32b3e6b 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -425,14 +425,11 @@ namespace QT_NAMESPACE {} #if defined(Q_CC_MSVC) && _MSC_VER >= 1600 # define Q_COMPILER_RVALUE_REFS -# define Q_COMPILER_INITIALIZER_LISTS # define Q_COMPILER_AUTO_TYPE # define Q_COMPILER_LAMBDA -//# define Q_COMPILER_VARIADIC_TEMPLATES -//# define Q_COMPILER_CLASS_ENUM -//# define Q_COMPILER_DEFAULT_DELETE_MEMBERS -//# define Q_COMPILER_UNICODE_STRINGS -//# define Q_COMPILER_EXTERN_TEMPLATES +# define Q_COMPILER_DECLTYPE +// MSCV has std::initilizer_list, but do not support the braces initialization +//# define Q_COMPILER_INITIALIZER_LISTS # endif @@ -524,6 +521,7 @@ namespace QT_NAMESPACE {} # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 /* C++0x features supported in GCC 4.3: */ # define Q_COMPILER_RVALUE_REFS +# define Q_COMPILER_DECLTYPE # endif # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 /* C++0x features supported in GCC 4.4: */ @@ -791,6 +789,7 @@ namespace QT_NAMESPACE {} # if __INTEL_COMPILER >= 1100 # define Q_COMPILER_RVALUE_REFS # define Q_COMPILER_EXTERN_TEMPLATES +# define Q_COMPILER_DECLTYPE # elif __INTEL_COMPILER >= 1200 # define Q_COMPILER_VARIADIC_TEMPLATES # define Q_COMPILER_AUTO_TYPE @@ -1424,6 +1423,7 @@ class QDataStream; # define Q_DECLARATIVE_EXPORT # define Q_OPENGL_EXPORT # define Q_MULTIMEDIA_EXPORT +# define Q_OPENVG_EXPORT # define Q_XML_EXPORT # define Q_XMLPATTERNS_EXPORT # define Q_SCRIPT_EXPORT @@ -2770,6 +2770,12 @@ QT_LICENSED_MODULE(DBus) # define QT_NO_RAWFONT #endif +namespace QtPrivate { +//like std::enable_if +template <bool B, typename T = void> struct QEnableIf; +template <typename T> struct QEnableIf<true, T> { typedef T Type; }; +} + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri index f67600d..e411f8f 100644 --- a/src/corelib/io/io.pri +++ b/src/corelib/io/io.pri @@ -24,6 +24,8 @@ HEADERS += \ io/qresource_p.h \ io/qresource_iterator_p.h \ io/qurl.h \ + io/qurltlds_p.h \ + io/qtldurl_p.h \ io/qsettings.h \ io/qsettings_p.h \ io/qfsfileengine.h \ @@ -41,6 +43,7 @@ SOURCES += \ io/qbuffer.cpp \ io/qdatastream.cpp \ io/qdataurl.cpp \ + io/qtldurl.cpp \ io/qdebug.cpp \ io/qdir.cpp \ io/qdiriterator.cpp \ diff --git a/src/corelib/io/qtldurl.cpp b/src/corelib/io/qtldurl.cpp new file mode 100644 index 0000000..7d06ca4 --- /dev/null +++ b/src/corelib/io/qtldurl.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore 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 "qplatformdefs.h" +#include "qurl.h" +#include "private/qurltlds_p.h" +#include "private/qtldurl_p.h" +#include "QtCore/qstringlist.h" + +QT_BEGIN_NAMESPACE + +static bool containsTLDEntry(const QString &entry) +{ + int index = qHash(entry) % tldCount; + int currentDomainIndex = tldIndices[index]; + while (currentDomainIndex < tldIndices[index+1]) { + QString currentEntry = QString::fromUtf8(tldData + currentDomainIndex); + if (currentEntry == entry) + return true; + currentDomainIndex += qstrlen(tldData + currentDomainIndex) + 1; // +1 for the ending \0 + } + return false; +} + +/*! + \internal + + Return the top-level-domain per Qt's copy of the Mozilla public suffix list of + \a domain. +*/ + +Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain) +{ + QStringList sections = domain.toLower().split(QLatin1Char('.'), QString::SkipEmptyParts); + if (sections.isEmpty()) + return QString(); + + QString level, tld; + for (int j = sections.count() - 1; j >= 0; --j) { + level.prepend(QLatin1Char('.') + sections.at(j)); + if (qIsEffectiveTLD(level.right(level.size() - 1))) + tld = level; + } + return tld; +} + +/*! + \internal + + Return true if \a domain is a top-level-domain per Qt's copy of the Mozilla public suffix list. +*/ + +Q_CORE_EXPORT bool qIsEffectiveTLD(const QString &domain) +{ + // for domain 'foo.bar.com': + // 1. return if TLD table contains 'foo.bar.com' + if (containsTLDEntry(domain)) + return true; + + if (domain.contains(QLatin1Char('.'))) { + int count = domain.size() - domain.indexOf(QLatin1Char('.')); + QString wildCardDomain; + wildCardDomain.reserve(count + 1); + wildCardDomain.append(QLatin1Char('*')); + wildCardDomain.append(domain.right(count)); + // 2. if table contains '*.bar.com', + // test if table contains '!foo.bar.com' + if (containsTLDEntry(wildCardDomain)) { + QString exceptionDomain; + exceptionDomain.reserve(domain.size() + 1); + exceptionDomain.append(QLatin1Char('!')); + exceptionDomain.append(domain); + return (! containsTLDEntry(exceptionDomain)); + } + } + return false; +} + +QT_END_NAMESPACE diff --git a/src/plugins/s60/src/qcoreapplication_3_2.cpp b/src/corelib/io/qtldurl_p.h index 117248c..77c0a15 100644 --- a/src/plugins/s60/src/qcoreapplication_3_2.cpp +++ b/src/corelib/io/qtldurl_p.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the plugins of the Qt Toolkit. +** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage @@ -39,10 +39,28 @@ ** ****************************************************************************/ -#include <qglobal.h> -#include <f32file.h> +#ifndef QTLDURL_P_H +#define QTLDURL_P_H -EXPORT_C TDriveNumber systemDrive(RFs& fs) -{ - return fs.GetSystemDrive(); -} +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of qDecodeDataUrl. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "QtCore/qurl.h" +#include "QtCore/qstring.h" + +QT_BEGIN_NAMESPACE + +Q_CORE_EXPORT QString qTopLevelDomain(const QString &domain); +Q_CORE_EXPORT bool qIsEffectiveTLD(const QString &domain); + +QT_END_NAMESPACE + +#endif // QDATAURL_P_H diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index c00fc68..83b49ce 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -192,7 +192,9 @@ #if defined QT3_SUPPORT #include "qfileinfo.h" #endif - +#ifndef QT_BOOTSTRAPPED +#include "qtldurl_p.h" +#endif #if defined(Q_OS_WINCE_WM) #pragma optimize("g", off) #endif @@ -5593,6 +5595,21 @@ bool QUrl::hasFragment() const } /*! + \since 4.8 + + Returns the TLD (Top-Level Domain) of the URL, (e.g. .co.uk, .net). + Note that the return value is prefixed with a '.' unless the + URL does not contain a valid TLD, in which case the function returns + an empty string. +*/ +#ifndef QT_BOOTSTRAPPED +QString QUrl::topLevelDomain() const +{ + return qTopLevelDomain(host()); +} +#endif + +/*! Returns the result of the merge of this URL with \a relative. This URL is used as a base to convert \a relative to an absolute URL. diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index 96b23d1..d57a0c7 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -181,6 +181,9 @@ public: void setEncodedFragment(const QByteArray &fragment); QByteArray encodedFragment() const; bool hasFragment() const; +#ifndef QT_BOOTSTRAPPED + QString topLevelDomain() const; +#endif QUrl resolved(const QUrl &relative) const; diff --git a/src/network/access/qnetworkcookiejartlds_p.h b/src/corelib/io/qurltlds_p.h index b06d881..f4f525c 100644 --- a/src/network/access/qnetworkcookiejartlds_p.h +++ b/src/corelib/io/qurltlds_p.h @@ -38,15 +38,15 @@ // the terms of any one of the MPL, the GPL or the LGPL. // -#ifndef QNETWORKCOOKIEJARTLD_P_H -#define QNETWORKCOOKIEJARTLD_P_H +#ifndef QURLTLD_P_H +#define QURLTLD_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience -// of the Network Access framework. This header file may change from +// of the Network Access and Core framework. This header file may change from // version to version without notice, or even be removed. // // We mean it. @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE // note to maintainer: // this file should be updated before each release -> // for instructions see the program at -// util/network/cookiejar-generateTLDs +// util/corelib/qurl-generateTLDs static const quint16 tldCount = 3949; static const quint16 tldIndices[] = { @@ -6478,4 +6478,4 @@ static const char tldData[] = { QT_END_NAMESPACE -#endif // QNETWORKCOOKIEJARTLD_P_H +#endif // QURLTLD_P_H diff --git a/src/network/access/qnetworkcookiejartlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO index 57a8d0e..5781c2c 100644 --- a/src/network/access/qnetworkcookiejartlds_p.h.INFO +++ b/src/corelib/io/qurltlds_p.h.INFO @@ -1,15 +1,15 @@ -The file qnetworkcookiejartlds_p.h is generated from the Public Suffix +The file qurltlds_p.h is generated from the Public Suffix List (see [1] and [2]), by the program residing at -util/network/cookiejar-generateTLDs in the Qt source tree. +util/corelib/qurl-generateTLDs in the Qt source tree. That program generates a character array and an index array from the list to provide fast lookups of elements within C++. -Those arrays in qnetworkcookiejartlds_p.h are derived from the Public +Those arrays in qurltlds_p.h are derived from the Public Suffix List ([2]), which was originally provided by Jo Hermans <jo.hermans@gmail.com>. -The file qnetworkcookiejartlds_p.h was last generated Friday, +The file qurltlds_p.h was last generated Friday, November 19th 15:24 2010. ---- diff --git a/src/corelib/kernel/qcore_symbian_p.cpp b/src/corelib/kernel/qcore_symbian_p.cpp index 5b52ec2..04acfb0 100644 --- a/src/corelib/kernel/qcore_symbian_p.cpp +++ b/src/corelib/kernel/qcore_symbian_p.cpp @@ -109,80 +109,6 @@ QHBufC::~QHBufC() delete m_hBufC; } -class QS60PluginResolver -{ -public: - QS60PluginResolver() - : initTried(false) {} - - ~QS60PluginResolver() { - lib.Close(); - } - - TLibraryFunction resolve(int ordinal) { - if (!initTried) { - init(); - initTried = true; - } - - if (lib.Handle()) - return lib.Lookup(ordinal); - else - return reinterpret_cast<TLibraryFunction>(NULL); - } - -private: - void init() - { - _LIT(KLibName_3_1, "qts60plugin_3_1" QT_LIBINFIX_UNICODE L".dll"); - _LIT(KLibName_3_2, "qts60plugin_3_2" QT_LIBINFIX_UNICODE L".dll"); - _LIT(KLibName_5_0, "qts60plugin_5_0" QT_LIBINFIX_UNICODE L".dll"); - - TPtrC libName; - TInt uidValue; - switch (QSysInfo::s60Version()) { - case QSysInfo::SV_S60_3_1: - libName.Set(KLibName_3_1); - uidValue = 0x2001E620; - break; - case QSysInfo::SV_S60_3_2: - libName.Set(KLibName_3_2); - uidValue = 0x2001E621; - break; - case QSysInfo::SV_S60_5_0: // Fall through to default - default: - // Default to 5.0 version, as any unknown platform is likely to be newer than that - libName.Set(KLibName_5_0); - uidValue = 0x2001E622; - break; - } - - TUidType libUid(KDynamicLibraryUid, KSharedLibraryUid, TUid::Uid(uidValue)); - lib.Load(libName, libUid); - - // Duplicate lib handle to enable process wide access to it. Since Duplicate overwrites - // existing handle without closing it, store original for subsequent closing. - RLibrary origHandleCloser = lib; - lib.Duplicate(RThread(), EOwnerProcess); - origHandleCloser.Close(); - } - - RLibrary lib; - bool initTried; -}; - -Q_GLOBAL_STATIC(QS60PluginResolver, qt_s60_plugin_resolver); - -/*! - \internal - Resolves a platform version specific function from S60 plugin. - If plugin is missing or resolving fails for another reason, NULL is returned. -*/ -Q_CORE_EXPORT TLibraryFunction qt_resolveS60PluginFunc(int ordinal) -{ - return qt_s60_plugin_resolver()->resolve(ordinal); -} - class QS60RFsSession { public: diff --git a/src/corelib/kernel/qcore_symbian_p.h b/src/corelib/kernel/qcore_symbian_p.h index 84c6fed..3019e05 100644 --- a/src/corelib/kernel/qcore_symbian_p.h +++ b/src/corelib/kernel/qcore_symbian_p.h @@ -142,19 +142,6 @@ inline uint qHash(TUid uid) return qHash(uid.iUid); } -// S60 version specific function ordinals that can be resolved -enum S60PluginFuncOrdinals -{ - S60Plugin_TimeFormatL = 1, - S60Plugin_GetTimeFormatSpec = 2, - S60Plugin_GetLongDateFormatSpec = 3, - S60Plugin_GetShortDateFormatSpec = 4, - S60Plugin_LocalizedDirectoryName = 5, - S60Plugin_GetSystemDrive = 6 -}; - -Q_CORE_EXPORT TLibraryFunction qt_resolveS60PluginFunc(int ordinal); - Q_CORE_EXPORT RFs& qt_s60GetRFs(); Q_CORE_EXPORT RSocketServ& qt_symbianGetSocketServer(); diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 750204f..7694a0f 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -116,8 +116,6 @@ private: }; #ifdef Q_OS_SYMBIAN -typedef TDriveNumber (*SystemDriveFunc)(RFs&); -static SystemDriveFunc PtrGetSystemDrive = 0; static CApaCommandLine* apaCommandLine = 0; static char *apaTail = 0; static QVector<char *> *apaArgv = 0; @@ -1950,10 +1948,7 @@ QString QCoreApplication::applicationDirPath() } if (err != KErrNone || (driveInfo.iDriveAtt & KDriveAttRom) || (driveInfo.iMediaAtt & KMediaAttWriteProtected)) { - if(!PtrGetSystemDrive) - PtrGetSystemDrive = reinterpret_cast<SystemDriveFunc>(qt_resolveS60PluginFunc(S60Plugin_GetSystemDrive)); - Q_ASSERT(PtrGetSystemDrive); - drive = PtrGetSystemDrive(fs); + drive = fs.GetSystemDrive(); fs.DriveToChar(drive, driveChar); } diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp index 1d7ecce..b216075 100644 --- a/src/corelib/kernel/qeventdispatcher_symbian.cpp +++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp @@ -59,8 +59,6 @@ QT_BEGIN_NAMESPACE #define WAKE_UP_PRIORITY CActive::EPriorityStandard #define TIMER_PRIORITY CActive::EPriorityHigh -#define NULLTIMER_PRIORITY CActive::EPriorityLow -#define COMPLETE_DEFERRED_ACTIVE_OBJECTS_PRIORITY CActive::EPriorityIdle static inline int qt_pipe_write(int socket, const char *data, qint64 len) { @@ -124,57 +122,25 @@ private: }; /* - * This class is designed to aid in implementing event handling in a more round robin fashion. We - * cannot change active objects that we do not own, but the active objects that Qt owns will use - * this as a base class with convenience functions. - * - * Here is how it works: On every RunL, the deriving class should call maybeQueueForLater(). - * This will return whether the active object has been queued, or whether it should run immediately. - * Queued objects will run again after other events have been processed. - * - * The QCompleteDeferredAOs class is a special object that runs after all others, which will - * reactivate the objects that were previously not run. + * This class can be used as a base class for Qt active objects. + * Socket active objects can use it to defer their activity. */ QActiveObject::QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher) : CActive(priority), - m_dispatcher(dispatcher), - m_hasAlreadyRun(false), - m_hasRunAgain(false), - m_iterationCount(1) + m_dispatcher(dispatcher) { } QActiveObject::~QActiveObject() { - if (m_hasRunAgain) - m_dispatcher->removeDeferredActiveObject(this); -} - -bool QActiveObject::maybeQueueForLater() -{ - Q_ASSERT(!m_hasRunAgain); - - if (!m_hasAlreadyRun || m_dispatcher->iterationCount() != m_iterationCount) { - // First occurrence of this event in this iteration. - m_hasAlreadyRun = true; - m_iterationCount = m_dispatcher->iterationCount(); - return false; - } else { - // The event has already occurred. - m_dispatcher->addDeferredActiveObject(this); - m_hasRunAgain = true; - return true; - } } bool QActiveObject::maybeDeferSocketEvent() { - Q_ASSERT(!m_hasRunAgain); Q_ASSERT(m_dispatcher); if (!m_dispatcher->areSocketEventsBlocked()) { return false; } - m_hasRunAgain = true; m_dispatcher->addDeferredSocketActiveObject(this); return true; } @@ -186,13 +152,11 @@ void QActiveObject::reactivateAndComplete() SetActive(); TRequestStatus *status = &iStatus; QEventDispatcherSymbian::RequestComplete(status, error); - - m_hasRunAgain = false; - m_hasAlreadyRun = false; } QWakeUpActiveObject::QWakeUpActiveObject(QEventDispatcherSymbian *dispatcher) - : QActiveObject(WAKE_UP_PRIORITY, dispatcher) + : CActive(WAKE_UP_PRIORITY), + m_dispatcher(dispatcher) { m_hostThreadId = RThread().Id(); CActiveScheduler::Add(this); @@ -224,17 +188,14 @@ void QWakeUpActiveObject::DoCancel() void QWakeUpActiveObject::RunL() { - if (maybeQueueForLater()) - return; - iStatus = KRequestPending; SetActive(); QT_TRYCATCH_LEAVING(m_dispatcher->wakeUpWasCalled()); } QTimerActiveObject::QTimerActiveObject(QEventDispatcherSymbian *dispatcher, SymbianTimerInfo *timerInfo) - : QActiveObject((timerInfo->interval) ? TIMER_PRIORITY : NULLTIMER_PRIORITY , dispatcher), - m_timerInfo(timerInfo), m_expectedTimeSinceLastEvent(0) + : CActive(TIMER_PRIORITY), + m_dispatcher(dispatcher), m_timerInfo(timerInfo), m_expectedTimeSinceLastEvent(0) { // start the timeout timer to ensure initialisation m_timeoutTimer.start(); @@ -311,9 +272,6 @@ void QTimerActiveObject::Run() return; } - if (maybeQueueForLater()) - return; - if (m_timerInfo->interval > 0) { // Start a new timer immediately so that we don't lose time. m_timerInfo->msLeft = m_timerInfo->interval; @@ -365,44 +323,6 @@ SymbianTimerInfo::~SymbianTimerInfo() delete timerAO; } -QCompleteDeferredAOs::QCompleteDeferredAOs(QEventDispatcherSymbian *dispatcher) - : CActive(COMPLETE_DEFERRED_ACTIVE_OBJECTS_PRIORITY), - m_dispatcher(dispatcher) -{ - CActiveScheduler::Add(this); - iStatus = KRequestPending; - SetActive(); -} - -QCompleteDeferredAOs::~QCompleteDeferredAOs() -{ - Cancel(); -} - -void QCompleteDeferredAOs::complete() -{ - if (iStatus.Int() == KRequestPending) { - TRequestStatus *status = &iStatus; - QEventDispatcherSymbian::RequestComplete(status, KErrNone); - } -} - -void QCompleteDeferredAOs::DoCancel() -{ - if (iStatus.Int() == KRequestPending) { - TRequestStatus *status = &iStatus; - QEventDispatcherSymbian::RequestComplete(status, KErrNone); - } -} - -void QCompleteDeferredAOs::RunL() -{ - iStatus = KRequestPending; - SetActive(); - - QT_TRYCATCH_LEAVING(m_dispatcher->reactivateDeferredActiveObjects()); -} - QSelectThread::QSelectThread() : m_quit(false) { @@ -677,8 +597,6 @@ void QSocketActiveObject::RunL() { if (maybeDeferSocketEvent()) return; - if (maybeQueueForLater()) - return; QT_TRYCATCH_LEAVING(run()); } @@ -708,6 +626,138 @@ void QSocketActiveObject::deleteLater() } } +/* Round robin active object scheduling for Qt apps. + * + * Qt and Symbian have different views on how events should be handled. Qt expects + * round-robin event processing, whereas Symbian implements a strict priority based + * system. + * + * This scheduler class, and its use in QEventDispatcherSymbian::processEvents, + * introduces round robin scheduling for high priority active objects, but leaves + * those with low priorities scheduled in priority order. + * The algorithm used is that, during each call to processEvents, any pre-existing + * runnable active object may run, but only once. Active objects with priority + * lower than EPriorityStandard can only run if no higher priority active object + * has run. + * This is done by implementing an alternative scheduling algorithm which requires + * access to the internal members of the active object system. The iSpare member of + * CActive is replaced with a flag indicating that the object is new (CBase zero + * initialization sets this), or not run, or ran. Only active objects with the + * not run flag are allowed to run. + */ +class QtRRActiveScheduler +{ +public: + static void MarkReadyToRun(); + enum RunResult { + NothingFound, + ObjectRun, + ObjectDelayed + }; + static RunResult RunMarkedIfReady(TInt &runPriority, TInt minimumPriority); + static bool UseRRActiveScheduler(); + +private: + // active scheduler access kit, for gaining access to the internals of active objects for + // alternative active scheduler implementations. + class TRequestStatusAccess + { + public: + enum { ERequestActiveFlags = 3 }; // TRequestStatus::EActive | TRequestStatus::ERequestPending + TInt iStatus; + TUint iFlags; + }; + + class CActiveDataAccess : public CBase + { + public: + TRequestStatusAccess iStatus; + TPriQueLink iLink; + enum TMarks + { + ENewObject, // CBase zero initialization sets this, new objects cannot be run in the processEvents in which they are created + ENotRun, // This object has not yet run in the current processEvents call + ERan // This object has run in the current processEvents call + }; + int iMark; //TAny* iSpare; + }; + + class CActiveFuncAccess : public CActive + { + public: + // these functions are needed in RunMarkedIfReady + using CActive::RunL; + using CActive::RunError; + }; + + class CActiveSchedulerAccess : public CBase + { + public: + using CBase::Extension_; + struct TLoop; + TLoop* iStack; + TPriQue<CActiveFuncAccess> iActiveQ; + TAny* iSpare; + }; +}; + +void QtRRActiveScheduler::MarkReadyToRun() +{ + CActiveScheduler *pS=CActiveScheduler::Current(); + if (pS!=NULL) + { + TDblQueIter<CActive> iterator(((CActiveSchedulerAccess*)pS)->iActiveQ); + for (CActive* active=iterator++; active!=NULL; active=iterator++) { + ((CActiveDataAccess*)active)->iMark = CActiveDataAccess::ENotRun; + } + } +} + +QtRRActiveScheduler::RunResult QtRRActiveScheduler::RunMarkedIfReady(TInt &runPriority, TInt minimumPriority) +{ + RunResult result = NothingFound; + TInt error=KErrNone; + CActiveScheduler *pS=CActiveScheduler::Current(); + if (pS!=NULL) { + TDblQueIter<CActiveFuncAccess> iterator(((CActiveSchedulerAccess*)pS)->iActiveQ); + for (CActiveFuncAccess *active=iterator++; active!=NULL; active=iterator++) { + CActiveDataAccess *dataAccess = (CActiveDataAccess*)active; + if (active->IsActive() && (active->iStatus!=KRequestPending)) { + int& mark = dataAccess->iMark; + if (mark == CActiveDataAccess::ENotRun && active->Priority()>=minimumPriority) { + mark = CActiveDataAccess::ERan; + runPriority = active->Priority(); + dataAccess->iStatus.iFlags&=~TRequestStatusAccess::ERequestActiveFlags; + int vptr = *(int*)active; // vptr can be used to identify type when debugging leaves + TRAP(error, active->RunL()); + if (error!=KErrNone) + error=active->RunError(error); + if (error) { + qWarning("Active object (ptr=0x%08x, vptr=0x%08x) leave: %i\n", active, vptr, error); + pS->Error(error); + } + return ObjectRun; + } + result = ObjectDelayed; + } + } + } + return result; +} + +bool QtRRActiveScheduler::UseRRActiveScheduler() +{ + // This code allows euser to declare incompatible active object / scheduler internal data structures + // in the future, disabling Qt's round robin scheduler use. + // By default the Extension_ function will set the second argument to NULL. We therefore use NULL to indicate + // that the data structures are compatible with before when this protocol was recognised. + // The extension id used is QtCore's UID. + CActiveSchedulerAccess *access = (CActiveSchedulerAccess *)CActiveScheduler::Current(); + TAny* schedulerCompatibilityNumber; + access->Extension_(0x2001B2DC, schedulerCompatibilityNumber, NULL); + return schedulerCompatibilityNumber == NULL; +} + #ifdef QT_SYMBIAN_PRIORITY_DROP class QIdleDetectorThread { @@ -811,7 +861,6 @@ QEventDispatcherSymbian::QEventDispatcherSymbian(QObject *parent) m_selectThread(0), m_activeScheduler(0), m_wakeUpAO(0), - m_completeDeferredAOs(0), m_interrupt(false), m_wakeUpDone(0), m_iterationCount(0), @@ -836,7 +885,6 @@ void QEventDispatcherSymbian::startingUp() CActiveScheduler::Install(m_activeScheduler); } m_wakeUpAO = q_check_ptr(new QWakeUpActiveObject(this)); - m_completeDeferredAOs = q_check_ptr(new QCompleteDeferredAOs(this)); // We already might have posted events, wakeup once to process them wakeUp(); } @@ -855,7 +903,6 @@ void QEventDispatcherSymbian::closingDown() delete m_selectThread; m_selectThread = 0; - delete m_completeDeferredAOs; delete m_wakeUpAO; if (m_activeScheduler) { delete m_activeScheduler; @@ -864,6 +911,7 @@ void QEventDispatcherSymbian::closingDown() bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags flags ) { + const bool useRRScheduler = QtRRActiveScheduler::UseRRActiveScheduler(); bool handledAnyEvent = false; bool oldNoSocketEventsValue = m_noSocketEvents; bool oldInsideTimerEventValue = m_insideTimerEvent; @@ -894,8 +942,9 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla handledAnyEvent = sendDeferredSocketEvents(); } - bool handledSymbianEvent = false; + QtRRActiveScheduler::RunResult handledSymbianEvent = QtRRActiveScheduler::NothingFound; m_interrupt = false; + int minPriority = KMinTInt; #ifdef QT_SYMBIAN_PRIORITY_DROP QElapsedTimer eventTimer; @@ -921,6 +970,10 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla CActiveScheduler::Current()->WaitForAnyRequest(); } + if (useRRScheduler && handledSymbianEvent == QtRRActiveScheduler::NothingFound) { + QtRRActiveScheduler::MarkReadyToRun(); + } + #ifdef QT_SYMBIAN_PRIORITY_DROP if (idleDetectorThread()->hasRun()) { if (m_delay > baseDelay) @@ -936,11 +989,31 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla eventTimer.start(); #endif - TInt error; - handledSymbianEvent = CActiveScheduler::RunIfReady(error, KMinTInt); - if (error) { - qWarning("CActiveScheduler::RunIfReady() returned error: %i\n", error); - CActiveScheduler::Current()->Error(error); + if (useRRScheduler) { + // Standard or above priority AOs are scheduled round robin. + // Lower priority AOs can only run if nothing higher priority has run. + int runPriority = minPriority; + handledSymbianEvent = QtRRActiveScheduler::RunMarkedIfReady(runPriority, minPriority); + minPriority = qMin(runPriority, int(CActive::EPriorityStandard)); + } else { + TInt error; + handledSymbianEvent = + CActiveScheduler::RunIfReady(error, minPriority) + ? QtRRActiveScheduler::ObjectRun + : QtRRActiveScheduler::NothingFound; + if (error) { + qWarning("CActiveScheduler::RunIfReady() returned error: %i\n", error); + CActiveScheduler::Current()->Error(error); + } + } + + if (handledSymbianEvent == QtRRActiveScheduler::NothingFound) { + // no runnable or delayed active object was found, the signal that caused us to get here must be bad + qFatal("QEventDispatcherSymbian::processEvents(): Caught Symbian stray signal"); + } else if (handledSymbianEvent == QtRRActiveScheduler::ObjectDelayed) { + // signal the thread to compensate for the un-handled signal absorbed + RThread().RequestSignal(); + break; } #ifdef QT_SYMBIAN_PRIORITY_DROP @@ -949,10 +1022,8 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla m_avgEventTime = (m_avgEventTime * 95 + eventDur * 5) / 100; #endif - if (!handledSymbianEvent) { - qFatal("QEventDispatcherSymbian::processEvents(): Caught Symbian stray signal"); - } handledAnyEvent = true; + if (m_interrupt) { break; } @@ -1051,41 +1122,11 @@ bool QEventDispatcherSymbian::sendPostedEvents() //return false; } -inline void QEventDispatcherSymbian::addDeferredActiveObject(QActiveObject *object) -{ - queueDeferredActiveObjectsCompletion(); - m_deferredActiveObjects.append(object); -} - -inline void QEventDispatcherSymbian::removeDeferredActiveObject(QActiveObject *object) -{ - m_deferredActiveObjects.removeAll(object); - m_deferredSocketEvents.removeAll(object); -} - inline void QEventDispatcherSymbian::addDeferredSocketActiveObject(QActiveObject *object) { m_deferredSocketEvents.append(object); } -void QEventDispatcherSymbian::queueDeferredActiveObjectsCompletion() -{ - m_completeDeferredAOs->complete(); -} - -void QEventDispatcherSymbian::reactivateDeferredActiveObjects() -{ - while (!m_deferredActiveObjects.isEmpty()) { - QActiveObject *object = m_deferredActiveObjects.takeFirst(); - object->reactivateAndComplete(); - } - - // We do this because we want to return from processEvents. This is because - // each invocation of processEvents should only run each active object once. - // The active scheduler should run them continously, however. - m_interrupt = true; -} - bool QEventDispatcherSymbian::sendDeferredSocketEvents() { bool sentAnyEvents = false; @@ -1161,14 +1202,6 @@ void QEventDispatcherSymbian::registerTimer ( int timerId, int interval, QObject m_timerList.insert(timerId, timer); timer->timerAO->Start(); - - if (m_insideTimerEvent) - // If we are inside a timer event, we need to prevent event starvation - // by preventing newly created timers from running in the same event processing - // iteration. Do this by calling the maybeQueueForLater() function to "fake" that we have - // already run once. This will cause the next run to be added to the deferred - // queue instead. - timer->timerAO->maybeQueueForLater(); } bool QEventDispatcherSymbian::unregisterTimer ( int timerId ) @@ -1231,86 +1264,6 @@ void CQtActiveScheduler::Error(TInt aError) const QT_CATCH (const std::bad_alloc&) {} // ignore alloc fails, nothing more can be done } -bool QActiveObject::wait(CActive* ao, int ms) -{ - if (!ao->IsActive()) - return true; //request already complete - bool timedout = false; - if (ms > 0) { - TRequestStatus tstat; - RTimer t; - if (KErrNone != t.CreateLocal()) - return false; - t.HighRes(tstat, ms*1000); - User::WaitForRequest(tstat, ao->iStatus); - if (tstat != KRequestPending) { - timedout = true; - } else { - t.Cancel(); - //balance thread semaphore - User::WaitForRequest(tstat); - } - t.Close(); - } else { - User::WaitForRequest(ao->iStatus); - } - if (timedout) - return false; - - //evil cast to allow calling of protected virtual - ((QActiveObject*)ao)->RunL(); - - //clear active & pending flags - ao->iStatus = TRequestStatus(); - - return true; -} - -bool QActiveObject::wait(QList<CActive*> aos, int ms) -{ - QVector<TRequestStatus*> stati; - stati.reserve(aos.count() + 1); - foreach (CActive* ao, aos) { - if (!ao->IsActive()) - return true; //request already complete - stati.append(&(ao->iStatus)); - } - bool timedout = false; - TRequestStatus tstat; - RTimer t; - if (ms > 0) { - if (KErrNone != t.CreateLocal()) - return false; - t.HighRes(tstat, ms*1000); - stati.append(&tstat); - } - User::WaitForNRequest(stati.data(), stati.count()); - if (ms > 0) { - if (tstat != KRequestPending) { - timedout = true; - } else { - t.Cancel(); - //balance thread semaphore - User::WaitForRequest(tstat); - } - t.Close(); - } - if (timedout) - return false; - - foreach (CActive* ao, aos) { - if (ao->iStatus != KRequestPending) { - //evil cast to allow calling of protected virtual - ((QActiveObject*)ao)->RunL(); - - //clear active & pending flags - ao->iStatus = TRequestStatus(); - break; //only call one - } - } - return true; -} - QT_END_NAMESPACE #include "moc_qeventdispatcher_symbian_p.cpp" diff --git a/src/corelib/kernel/qeventdispatcher_symbian_p.h b/src/corelib/kernel/qeventdispatcher_symbian_p.h index e327a9c..1b81599 100644 --- a/src/corelib/kernel/qeventdispatcher_symbian_p.h +++ b/src/corelib/kernel/qeventdispatcher_symbian_p.h @@ -83,23 +83,14 @@ public: QActiveObject(TInt priority, QEventDispatcherSymbian *dispatcher); ~QActiveObject(); - bool maybeQueueForLater(); bool maybeDeferSocketEvent(); void reactivateAndComplete(); - - static bool wait(CActive* ao, int ms); - static bool wait(QList<CActive*> aos, int ms); protected: QEventDispatcherSymbian *m_dispatcher; - -private: - bool m_hasAlreadyRun : 1; - bool m_hasRunAgain : 1; - int m_iterationCount; }; -class QWakeUpActiveObject : public QActiveObject +class QWakeUpActiveObject : public CActive { public: QWakeUpActiveObject(QEventDispatcherSymbian *dispatcher); @@ -112,6 +103,7 @@ protected: void RunL(); private: + QEventDispatcherSymbian *m_dispatcher; TThreadId m_hostThreadId; }; @@ -132,7 +124,7 @@ struct SymbianTimerInfo : public QSharedData typedef QExplicitlySharedDataPointer<SymbianTimerInfo> SymbianTimerInfoPtr; // This is a bit of a proxy class. See comments in SetActive and Start for details. -class QTimerActiveObject : public QActiveObject +class QTimerActiveObject : public CActive { public: QTimerActiveObject(QEventDispatcherSymbian *dispatcher, SymbianTimerInfo *timerInfo); @@ -149,28 +141,13 @@ private: void StartTimer(); private: + QEventDispatcherSymbian *m_dispatcher; SymbianTimerInfo *m_timerInfo; QElapsedTimer m_timeoutTimer; int m_expectedTimeSinceLastEvent; RTimer m_rTimer; }; -class QCompleteDeferredAOs : public CActive -{ -public: - QCompleteDeferredAOs(QEventDispatcherSymbian *dispatcher); - ~QCompleteDeferredAOs(); - - void complete(); - -protected: - void DoCancel(); - void RunL(); - -private: - QEventDispatcherSymbian *m_dispatcher; -}; - class QSocketActiveObject : public QActiveObject { public: @@ -254,12 +231,6 @@ public: void wakeUpWasCalled(); void reactivateSocketNotifier(QSocketNotifier *notifier); - void addDeferredActiveObject(QActiveObject *object); - void removeDeferredActiveObject(QActiveObject *object); - void queueDeferredActiveObjectsCompletion(); - // Can be overridden to activate local active objects too, but do call baseclass! - virtual void reactivateDeferredActiveObjects(); - inline int iterationCount() const { return m_iterationCount; } void addDeferredSocketActiveObject(QActiveObject *object); @@ -282,7 +253,6 @@ private: QHash<QSocketNotifier *, QSocketActiveObject *> m_notifiers; QWakeUpActiveObject *m_wakeUpAO; - QCompleteDeferredAOs *m_completeDeferredAOs; volatile bool m_interrupt; QAtomicInt m_wakeUpDone; @@ -292,8 +262,6 @@ private: bool m_noSocketEvents; //deferred until socket events are enabled QList<QActiveObject *> m_deferredSocketEvents; - //deferred until idle - QList<QActiveObject *> m_deferredActiveObjects; int m_delay; int m_avgEventTime; diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp index acb6044..2882279 100644 --- a/src/corelib/kernel/qsharedmemory.cpp +++ b/src/corelib/kernel/qsharedmemory.cpp @@ -247,14 +247,14 @@ void QSharedMemory::setNativeKey(const QString &key) if (isAttached()) detach(); d->cleanHandle(); - d->key = QString(); + d->key.clear(); d->nativeKey = key; } bool QSharedMemoryPrivate::initKey() { - if (!cleanHandle()) - return false; + cleanHandle(); + #ifndef QT_NO_SYSTEMSEMAPHORE systemSemaphore.setKey(QString(), 1); systemSemaphore.setKey(key, 1); @@ -285,7 +285,7 @@ bool QSharedMemoryPrivate::initKey() return false; } #endif - errorString = QString(); + errorString.clear(); error = QSharedMemory::NoError; return true; } @@ -342,28 +342,24 @@ bool QSharedMemory::create(int size, AccessMode mode) if (!d->initKey()) return false; + if (size <= 0) { + d->error = QSharedMemory::InvalidSize; + d->errorString = QSharedMemory::tr("%1: create size is less then 0").arg(QLatin1String("QSharedMemory::create")); + return false; + } + #ifndef QT_NO_SYSTEMSEMAPHORE #ifndef Q_OS_WIN // Take ownership and force set initialValue because the semaphore // might have already existed from a previous crash. d->systemSemaphore.setKey(d->key, 1, QSystemSemaphore::Create); #endif -#endif - QString function = QLatin1String("QSharedMemory::create"); -#ifndef QT_NO_SYSTEMSEMAPHORE QSharedMemoryLocker lock(this); - if (!d->key.isNull() && !d->tryLocker(&lock, function)) + if (!d->key.isNull() && !d->tryLocker(&lock, QLatin1String("QSharedMemory::create"))) return false; #endif - if (size <= 0) { - d->error = QSharedMemory::InvalidSize; - d->errorString = - QSharedMemory::tr("%1: create size is less then 0").arg(function); - return false; - } - if (!d->create(size)) return false; diff --git a/src/corelib/kernel/qsharedmemory_p.h b/src/corelib/kernel/qsharedmemory_p.h index d5fafef..21b8612 100644 --- a/src/corelib/kernel/qsharedmemory_p.h +++ b/src/corelib/kernel/qsharedmemory_p.h @@ -70,12 +70,12 @@ namespace QSharedMemoryPrivate #include "private/qobject_p.h" #ifdef Q_OS_WIN -#include <qt_windows.h> +# include <qt_windows.h> #elif defined(Q_OS_SYMBIAN) -#include <e32std.h> -#include <sys/types.h> +# include <e32std.h> +# include <sys/types.h> #else -#include <sys/sem.h> +# include <sys/types.h> #endif QT_BEGIN_NAMESPACE @@ -139,7 +139,7 @@ public: key_t handle(); #endif bool initKey(); - bool cleanHandle(); + void cleanHandle(); bool create(int size); bool attach(QSharedMemory::AccessMode mode); bool detach(); @@ -151,7 +151,7 @@ public: #endif #ifndef QT_NO_SYSTEMSEMAPHORE - bool tryLocker(QSharedMemoryLocker *locker, const QString function) { + inline bool tryLocker(QSharedMemoryLocker *locker, const QString &function) { if (!locker->lock()) { errorString = QSharedMemory::tr("%1: unable to lock").arg(function); error = QSharedMemory::LockError; diff --git a/src/corelib/kernel/qsharedmemory_symbian.cpp b/src/corelib/kernel/qsharedmemory_symbian.cpp index fdd513a..cd1567a 100644 --- a/src/corelib/kernel/qsharedmemory_symbian.cpp +++ b/src/corelib/kernel/qsharedmemory_symbian.cpp @@ -41,19 +41,21 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" + #include "qcore_symbian_p.h" #include <qdebug.h> -QT_BEGIN_NAMESPACE - #ifndef QT_NO_SHAREDMEMORY #define QSHAREDMEMORY_DEBUG -QSharedMemoryPrivate::QSharedMemoryPrivate() : QObjectPrivate(), - memory(0), size(0), error(QSharedMemory::NoError), - systemSemaphore(QString()), lockedByMe(false) +QT_BEGIN_NAMESPACE + +QSharedMemoryPrivate::QSharedMemoryPrivate() + : QObjectPrivate(), memory(0), size(0), error(QSharedMemory::NoError), +#ifndef QT_NO_SYSTEMSEMAPHORE + systemSemaphore(QString()), lockedByMe(false) +#endif { } @@ -61,6 +63,7 @@ void QSharedMemoryPrivate::setErrorString(const QString &function, TInt errorCod { if (errorCode == KErrNone) return; + switch (errorCode) { case KErrAlreadyExists: error = QSharedMemory::AlreadyExists; @@ -88,40 +91,43 @@ void QSharedMemoryPrivate::setErrorString(const QString &function, TInt errorCod #if defined QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } key_t QSharedMemoryPrivate::handle() { + // don't allow making handles on empty keys + if (nativeKey.isEmpty()) { + error = QSharedMemory::KeyError; + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); + return 0; + } + // Not really cost effective to check here if shared memory is attachable, as it requires // exactly the same call as attaching, so always assume handle is valid and return failure // from attach. return 1; } -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { chunk.Close(); - return true; } bool QSharedMemoryPrivate::create(int size) { - QString function = QLatin1String("QSharedMemory::create"); - if (nativeKey.isEmpty()) { - error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: key error").arg(function); + if (!handle()) return false; - } TPtrC ptr(qt_QString2TPtrC(nativeKey)); TInt err = chunk.CreateGlobal(ptr, size, size); - setErrorString(function, err); - - if (err != KErrNone) + if (err != KErrNone) { + setErrorString(QLatin1String("QSharedMemory::create"), err); return false; + } // Zero out the created chunk Mem::FillZ(chunk.Base(), chunk.Size()); @@ -133,12 +139,8 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode /* mode */) { // Grab a pointer to the memory block if (!chunk.Handle()) { - QString function = QLatin1String("QSharedMemory::handle"); - if (nativeKey.isEmpty()) { - error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: unable to make key").arg(function); + if (!handle()) return false; - } TPtrC ptr(qt_QString2TPtrC(nativeKey)); @@ -147,7 +149,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode /* mode */) err = chunk.OpenGlobal(ptr, false); if (err != KErrNone) { - setErrorString(function, err); + setErrorString(QLatin1String("QSharedMemory::attach"), err); return false; } } @@ -168,6 +170,6 @@ bool QSharedMemoryPrivate::detach() return true; } -#endif //QT_NO_SHAREDMEMORY - QT_END_NAMESPACE + +#endif //QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp index 2bbda49..e991ce9 100644 --- a/src/corelib/kernel/qsharedmemory_unix.cpp +++ b/src/corelib/kernel/qsharedmemory_unix.cpp @@ -43,25 +43,26 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" -#include <qdir.h> -#include <qdebug.h> -#include <errno.h> +#include <qdebug.h> +#include <qfile.h> #ifndef QT_NO_SHAREDMEMORY #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> -#endif //QT_NO_SHAREDMEMORY +#endif // QT_NO_SHAREDMEMORY +#include <errno.h> #include "private/qcore_unix_p.h" #ifndef QT_NO_SHAREDMEMORY + +//#define QSHAREDMEMORY_DEBUG + QT_BEGIN_NAMESPACE QSharedMemoryPrivate::QSharedMemoryPrivate() @@ -78,6 +79,7 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) // EINVAL is handled in functions so they can give better error strings switch (errno) { case EACCES: + case EPERM: errorString = QSharedMemory::tr("%1: permission denied").arg(function); error = QSharedMemory::PermissionDenied; break; @@ -98,9 +100,10 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) default: errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(errno); error = QSharedMemory::UnknownError; -#if defined QSHAREDMEMORY_DEBUG +#ifdef QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key << "errno" << errno << EINVAL; #endif + break; } } @@ -117,21 +120,21 @@ key_t QSharedMemoryPrivate::handle() // don't allow making handles on empty keys if (nativeKey.isEmpty()) { - errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::KeyError; return 0; } // ftok requires that an actual file exists somewhere if (!QFile::exists(nativeKey)) { - errorString = QSharedMemory::tr("%1: UNIX key file doesn't exist").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: UNIX key file doesn't exist").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::NotFound; return 0; } unix_key = ftok(QFile::encodeName(nativeKey).constData(), 'Q'); if (-1 == unix_key) { - errorString = QSharedMemory::tr("%1: ftok failed").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: ftok failed").arg(QLatin1String("QSharedMemory::handle")); error = QSharedMemory::KeyError; unix_key = 0; } @@ -149,20 +152,20 @@ key_t QSharedMemoryPrivate::handle() -1 error 0 already existed 1 created - */ +*/ int QSharedMemoryPrivate::createUnixKeyFile(const QString &fileName) { if (QFile::exists(fileName)) return 0; int fd = qt_safe_open(QFile::encodeName(fileName).constData(), - O_EXCL | O_CREAT | O_RDWR, 0640); + O_EXCL | O_CREAT | O_RDWR, 0640); if (-1 == fd) { if (errno == EEXIST) return 0; return -1; } else { - close(fd); + qt_safe_close(fd); } return 1; } @@ -170,25 +173,21 @@ int QSharedMemoryPrivate::createUnixKeyFile(const QString &fileName) #ifndef QT_NO_SHAREDMEMORY -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { unix_key = 0; - return true; } bool QSharedMemoryPrivate::create(int size) { // build file if needed - bool createdFile = false; int built = createUnixKeyFile(nativeKey); if (built == -1) { - errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::handle:")); + errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::create")); error = QSharedMemory::KeyError; return false; } - if (built == 1) { - createdFile = true; - } + bool createdFile = built == 1; // get handle if (!handle()) { @@ -202,7 +201,7 @@ bool QSharedMemoryPrivate::create(int size) QString function = QLatin1String("QSharedMemory::create"); switch (errno) { case EINVAL: - errorString = QSharedMemory::tr("%1: system-imposed size restrictions").arg(QLatin1String("QSharedMemory::handle")); + errorString = QSharedMemory::tr("%1: system-imposed size restrictions").arg(function); error = QSharedMemory::InvalidSize; break; default: @@ -280,7 +279,7 @@ bool QSharedMemoryPrivate::detach() if (shmid_ds.shm_nattch == 0) { // mark for removal if (-1 == shmctl(id, IPC_RMID, &shmid_ds)) { - setErrorString(QLatin1String("QSharedMemory::remove")); + setErrorString(QLatin1String("QSharedMemory::detach")); switch (errno) { case EINVAL: return true; @@ -296,7 +295,6 @@ bool QSharedMemoryPrivate::detach() return true; } - QT_END_NAMESPACE #endif // QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsharedmemory_win.cpp b/src/corelib/kernel/qsharedmemory_win.cpp index 3cc14fe..567214e 100644 --- a/src/corelib/kernel/qsharedmemory_win.cpp +++ b/src/corelib/kernel/qsharedmemory_win.cpp @@ -41,24 +41,30 @@ #include "qsharedmemory.h" #include "qsharedmemory_p.h" -#include "qsystemsemaphore.h" -#include <qdebug.h> -QT_BEGIN_NAMESPACE +#include <qdebug.h> #ifndef QT_NO_SHAREDMEMORY -QSharedMemoryPrivate::QSharedMemoryPrivate() : QObjectPrivate(), - memory(0), size(0), error(QSharedMemory::NoError), - systemSemaphore(QString()), lockedByMe(false), hand(0) +//#define QSHAREDMEMORY_DEBUG + +QT_BEGIN_NAMESPACE + +QSharedMemoryPrivate::QSharedMemoryPrivate() + : QObjectPrivate(), memory(0), size(0), error(QSharedMemory::NoError), +#ifndef QT_NO_SYSTEMSEMAPHORE + systemSemaphore(QString()), lockedByMe(false), +#endif + hand(0) { } void QSharedMemoryPrivate::setErrorString(const QString &function) { - BOOL windowsError = GetLastError(); + DWORD windowsError = GetLastError(); if (windowsError == 0) return; + switch (windowsError) { case ERROR_ALREADY_EXISTS: error = QSharedMemory::AlreadyExists; @@ -89,19 +95,20 @@ void QSharedMemoryPrivate::setErrorString(const QString &function) default: errorString = QSharedMemory::tr("%1: unknown error %2").arg(function).arg(windowsError); error = QSharedMemory::UnknownError; -#if defined QSHAREDMEMORY_DEBUG +#ifdef QSHAREDMEMORY_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } HANDLE QSharedMemoryPrivate::handle() { if (!hand) { - QString function = QLatin1String("QSharedMemory::handle"); + // don't allow making handles on empty keys if (nativeKey.isEmpty()) { error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: unable to make key").arg(function); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::handle")); return false; } #ifndef Q_OS_WINCE @@ -111,43 +118,34 @@ HANDLE QSharedMemoryPrivate::handle() // attach as it seems. hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 0, (wchar_t*)nativeKey.utf16()); #endif - if (!hand) { - setErrorString(function); - return false; - } + if (!hand) + setErrorString(QLatin1String("QSharedMemory::handle")); } + return hand; } -bool QSharedMemoryPrivate::cleanHandle() +void QSharedMemoryPrivate::cleanHandle() { - if (hand != 0 && !CloseHandle(hand)) { - hand = 0; + if (hand != 0 && !CloseHandle(hand)) setErrorString(QLatin1String("QSharedMemory::cleanHandle")); - return false; - } hand = 0; - return true; } bool QSharedMemoryPrivate::create(int size) { - QString function = QLatin1String("QSharedMemory::create"); if (nativeKey.isEmpty()) { error = QSharedMemory::KeyError; - errorString = QSharedMemory::tr("%1: key error").arg(function); + errorString = QSharedMemory::tr("%1: key is empty").arg(QLatin1String("QSharedMemory::create")); return false; } // Create the file mapping. hand = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, (wchar_t*)nativeKey.utf16()); - setErrorString(function); + setErrorString(QLatin1String("QSharedMemory::create")); // hand is valid when it already exists unlike unix so explicitly check - if (error == QSharedMemory::AlreadyExists || !hand) - return false; - - return true; + return !(error == QSharedMemory::AlreadyExists || !hand); } bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) @@ -167,7 +165,7 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) // Windows doesn't set an error code on this one, // it should only be a kernel memory error. error = QSharedMemory::UnknownError; - errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach: ")); + errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach")); return false; } size = info.RegionSize; @@ -186,10 +184,11 @@ bool QSharedMemoryPrivate::detach() size = 0; // close handle - return cleanHandle(); -} - -#endif //QT_NO_SHAREDMEMORY + cleanHandle(); + return true; +} QT_END_NAMESPACE + +#endif // QT_NO_SHAREDMEMORY diff --git a/src/corelib/kernel/qsystemsemaphore_p.h b/src/corelib/kernel/qsystemsemaphore_p.h index d4e86e8..3e5f737 100644 --- a/src/corelib/kernel/qsystemsemaphore_p.h +++ b/src/corelib/kernel/qsystemsemaphore_p.h @@ -59,7 +59,7 @@ #include "qsharedmemory_p.h" #ifndef Q_OS_WINCE -# include <sys/types.h> +# include <sys/types.h> #endif #ifdef Q_OS_SYMBIAN @@ -70,11 +70,10 @@ QT_BEGIN_NAMESPACE class QSystemSemaphorePrivate { - public: QSystemSemaphorePrivate(); - QString makeKeyFileName() + inline QString makeKeyFileName() const { return QSharedMemoryPrivate::makePlatformSafeKey(key, QLatin1String("qipc_systemsem_")); } @@ -101,10 +100,10 @@ public: #elif defined(Q_OS_SYMBIAN) RSemaphore semaphore; #else + key_t unix_key; int semaphore; bool createdFile; bool createdSemaphore; - key_t unix_key; #endif QString errorString; QSystemSemaphore::SystemSemaphoreError error; @@ -115,4 +114,3 @@ QT_END_NAMESPACE #endif // QT_NO_SYSTEMSEMAPHORE #endif // QSYSTEMSEMAPHORE_P_H - diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp index 96c19af..bb60df7 100644 --- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp +++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp @@ -46,29 +46,32 @@ #include "qcore_symbian_p.h" #include <e32cmn.h> -QT_BEGIN_NAMESPACE #ifndef QT_NO_SYSTEMSEMAPHORE +//#define QSYSTEMSEMAPHORE_DEBUG + +QT_BEGIN_NAMESPACE + QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - error(QSystemSemaphore::NoError) + error(QSystemSemaphore::NoError) { } void QSystemSemaphorePrivate::setErrorString(const QString &function, int err) { - if (err == KErrNone){ + if (err == KErrNone) return; - } + switch(err){ case KErrAlreadyExists: errorString = QCoreApplication::tr("%1: already exists", "QSystemSemaphore").arg(function); error = QSystemSemaphore::AlreadyExists; - break; + break; case KErrNotFound: errorString = QCoreApplication::tr("%1: does not exist", "QSystemSemaphore").arg(function); error = QSystemSemaphore::NotFound; - break; + break; case KErrNoMemory: case KErrInUse: errorString = QCoreApplication::tr("%1: out of resources", "QSystemSemaphore").arg(function); @@ -77,22 +80,21 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function, int err) case KErrPermissionDenied: errorString = QCoreApplication::tr("%1: permission denied", "QSystemSemaphore").arg(function); error = QSystemSemaphore::PermissionDenied; - break; -default: - errorString = QCoreApplication::tr("%1: unknown error %2", "QSystemSemaphore").arg(function).arg(err); - error = QSystemSemaphore::UnknownError; - } - -#if defined QSYSTEMSEMAPHORE_DEBUG + break; + default: + errorString = QCoreApplication::tr("%1: unknown error %2", "QSystemSemaphore").arg(function).arg(err); + error = QSystemSemaphore::UnknownError; +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key; #endif + break; + } } int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) { - if (semaphore.Handle()) { + if (semaphore.Handle()) return semaphore.Handle(); - } // don't allow making handles on empty keys if (key.isEmpty()) @@ -106,12 +108,13 @@ int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode) while (err != KErrNoMemory && err != KErrNone && tryCount-- >= 0) { err = semaphore.CreateGlobal(name, initialValue, EOwnerProcess); if (err != KErrNoMemory && err != KErrNone) - err = semaphore.OpenGlobal(name,EOwnerProcess); + err = semaphore.OpenGlobal(name, EOwnerProcess); } - if (err){ - setErrorString(QLatin1String("QSystemSemaphore::handle"),err); + if (err) { + setErrorString(QLatin1String("QSystemSemaphore::handle"), err); return 0; } + return semaphore.Handle(); } @@ -125,14 +128,14 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) if (0 == handle()) return false; - if (count > 0) { + if (count > 0) semaphore.Signal(count); - } else { + else semaphore.Wait(); - } + return true; } -#endif //QT_NO_SYSTEMSEMAPHORE - QT_END_NAMESPACE + +#endif // QT_NO_SYSTEMSEMAPHORE diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp index 5e533e7..704afaf 100644 --- a/src/corelib/kernel/qsystemsemaphore_unix.cpp +++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp @@ -42,9 +42,9 @@ #include "qsystemsemaphore.h" #include "qsystemsemaphore_p.h" +#include <qcoreapplication.h> #include <qdebug.h> #include <qfile.h> -#include <qcoreapplication.h> #ifndef QT_NO_SYSTEMSEMAPHORE @@ -62,11 +62,13 @@ #define EIDRM EINVAL #endif +//#define QSYSTEMSEMAPHORE_DEBUG + QT_BEGIN_NAMESPACE QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - semaphore(-1), createdFile(false), - createdSemaphore(false), unix_key(-1), error(QSystemSemaphore::NoError) + unix_key(-1), semaphore(-1), createdFile(false), + createdSemaphore(false), error(QSystemSemaphore::NoError) { } @@ -95,33 +97,33 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function) default: errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(errno); error = QSystemSemaphore::UnknownError; -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key << "errno" << errno << EINVAL; #endif + break; } } /*! \internal - Setup unix_key - */ + Initialise the semaphore +*/ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) { - if (key.isEmpty()){ - errorString = QCoreApplication::tr("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + if (-1 != unix_key) + return unix_key; + + if (key.isEmpty()) { + errorString = QCoreApplication::tr("%1: key is empty", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } // ftok requires that an actual file exists somewhere - if (-1 != unix_key) - return unix_key; - - // Create the file needed for ftok int built = QSharedMemoryPrivate::createUnixKeyFile(fileName); if (-1 == built) { - errorString = QCoreApplication::tr("%1: unable to make key", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + errorString = QCoreApplication::tr("%1: unable to make key", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } @@ -130,7 +132,7 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) // Get the unix key for the created file unix_key = ftok(QFile::encodeName(fileName).constData(), 'Q'); if (-1 == unix_key) { - errorString = QCoreApplication::tr("%1: ftok failed", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle:")); + errorString = QCoreApplication::tr("%1: ftok failed", "QSystemSemaphore").arg(QLatin1String("QSystemSemaphore::handle")); error = QSystemSemaphore::KeyError; return -1; } @@ -145,17 +147,16 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) cleanHandle(); return -1; } + if (mode == QSystemSemaphore::Create) { + createdSemaphore = true; + createdFile = true; + } } else { createdSemaphore = true; // Force cleanup of file, it is possible that it can be left over from a crash createdFile = true; } - if (mode == QSystemSemaphore::Create) { - createdSemaphore = true; - createdFile = true; - } - // Created semaphore so initialize its value. if (createdSemaphore && initialValue >= 0) { qt_semun init_op; @@ -173,8 +174,8 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) /*! \internal - Cleanup the unix_key - */ + Clean up the semaphore +*/ void QSystemSemaphorePrivate::cleanHandle() { unix_key = -1; @@ -189,8 +190,8 @@ void QSystemSemaphorePrivate::cleanHandle() if (-1 != semaphore) { if (-1 == semctl(semaphore, 0, IPC_RMID, 0)) { setErrorString(QLatin1String("QSystemSemaphore::cleanHandle")); -#if defined QSYSTEMSEMAPHORE_DEBUG - qDebug() << QLatin1String("QSystemSemaphore::cleanHandle semctl failed."); +#ifdef QSYSTEMSEMAPHORE_DEBUG + qDebug("QSystemSemaphore::cleanHandle semctl failed."); #endif } semaphore = -1; @@ -201,7 +202,7 @@ void QSystemSemaphorePrivate::cleanHandle() /*! \internal - */ +*/ bool QSystemSemaphorePrivate::modifySemaphore(int count) { if (-1 == handle()) @@ -223,7 +224,7 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return modifySemaphore(count); } setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify failed") << count << semctl(semaphore, 0, GETVAL) << errno << EIDRM << EINVAL; #endif return false; @@ -232,7 +233,6 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return true; } - QT_END_NAMESPACE #endif // QT_NO_SYSTEMSEMAPHORE diff --git a/src/corelib/kernel/qsystemsemaphore_win.cpp b/src/corelib/kernel/qsystemsemaphore_win.cpp index 30cab7e..0e9d645 100644 --- a/src/corelib/kernel/qsystemsemaphore_win.cpp +++ b/src/corelib/kernel/qsystemsemaphore_win.cpp @@ -44,18 +44,20 @@ #include "qcoreapplication.h" #include <qdebug.h> -QT_BEGIN_NAMESPACE - #ifndef QT_NO_SYSTEMSEMAPHORE +//#define QSYSTEMSEMAPHORE_DEBUG + +QT_BEGIN_NAMESPACE + QSystemSemaphorePrivate::QSystemSemaphorePrivate() : - semaphore(0), error(QSystemSemaphore::NoError) + semaphore(0), error(QSystemSemaphore::NoError) { } void QSystemSemaphorePrivate::setErrorString(const QString &function) { - BOOL windowsError = GetLastError(); + DWORD windowsError = GetLastError(); if (windowsError == 0) return; @@ -72,9 +74,10 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function) default: errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(windowsError); error = QSystemSemaphore::UnknownError; -#if defined QSYSTEMSEMAPHORE_DEBUG +#ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << errorString << "key" << key; #endif + break; } } @@ -110,7 +113,7 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return false; if (count > 0) { - if (0 == ReleaseSemaphore(semaphore, count, 0)) { + if (0 == ReleaseSemaphore(semaphore, count, 0)) { setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); #if defined QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modifySemaphore ReleaseSemaphore failed"); @@ -130,6 +133,6 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) return true; } -#endif //QT_NO_SYSTEMSEMAPHORE +#endif // QT_NO_SYSTEMSEMAPHORE QT_END_NAMESPACE diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 9cd353a..eb29e6e 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -42,9 +42,96 @@ #include "quuid.h" #include "qdatastream.h" +#include "qendian.h" QT_BEGIN_NAMESPACE +#ifndef QT_NO_QUUID_STRING +template <class Char, class Integral> +void _q_toHex(Char *&dst, Integral value) +{ + static const char digits[] = "0123456789abcdef"; + + value = qToBigEndian(value); + + const char* p = reinterpret_cast<const char*>(&value); + + for (uint i = 0; i < sizeof(Integral); ++i, dst += 2) { + uint j = (p[i] >> 4) & 0xf; + dst[0] = Char(digits[j]); + j = p[i] & 0xf; + dst[1] = Char(digits[j]); + } +} + +template <class Char, class Integral> +bool _q_fromHex(const Char *&src, Integral &value) +{ + value = 0; + + for (uint i = 0; i < sizeof(Integral) * 2; ++i) { + int ch = *src++; + int tmp; + if (ch >= '0' && ch <= '9') + tmp = ch - '0'; + else if (ch >= 'a' && ch <= 'f') + tmp = ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + tmp = ch - 'A' + 10; + else + return false; + + value = value * 16 + tmp; + } + + return true; +} + +template <class Char> +void _q_uuidToHex(Char *&dst, const uint &d1, const ushort &d2, const ushort &d3, const uchar (&d4)[8]) +{ + *dst++ = Char('{'); + _q_toHex(dst, d1); + *dst++ = Char('-'); + _q_toHex(dst, d2); + *dst++ = Char('-'); + _q_toHex(dst, d3); + *dst++ = Char('-'); + for (int i = 0; i < 2; i++) + _q_toHex(dst, d4[i]); + *dst++ = Char('-'); + for (int i = 2; i < 8; i++) + _q_toHex(dst, d4[i]); + *dst = Char('}'); +} + +template <class Char> +bool _q_uuidFromHex(const Char *&src, uint &d1, ushort &d2, ushort &d3, uchar (&d4)[8]) +{ + if (*src == Char('{')) + src++; + if (!_q_fromHex(src, d1) + || *src++ != Char('-') + || !_q_fromHex(src, d2) + || *src++ != Char('-') + || !_q_fromHex(src, d3) + || *src++ != Char('-') + || !_q_fromHex(src, d4[0]) + || !_q_fromHex(src, d4[1]) + || *src++ != Char('-') + || !_q_fromHex(src, d4[2]) + || !_q_fromHex(src, d4[3]) + || !_q_fromHex(src, d4[4]) + || !_q_fromHex(src, d4[5]) + || !_q_fromHex(src, d4[6]) + || !_q_fromHex(src, d4[7])) { + return false; + } + + return true; +} +#endif + /*! \class QUuid \brief The QUuid class stores a Universally Unique Identifier (UUID). @@ -231,60 +318,112 @@ QT_BEGIN_NAMESPACE */ QUuid::QUuid(const QString &text) { - bool ok; - if (text.isEmpty()) { + if (text.length() < 36) { *this = QUuid(); return; } - QString temp = text.toUpper(); - if (temp[0] != QLatin1Char('{')) - temp = QLatin1Char('{') + text; - if (text[(int)text.length()-1] != QLatin1Char('}')) - temp += QLatin1Char('}'); - - data1 = temp.mid(1, 8).toULongLong(&ok, 16); - if (!ok) { + + const ushort *data = reinterpret_cast<const ushort *>(text.unicode()); + + if (*data == '{' && text.length() < 37) { *this = QUuid(); return; } - data2 = temp.mid(10, 4).toUInt(&ok, 16); - if (!ok) { + if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { *this = QUuid(); return; } - data3 = temp.mid(15, 4).toUInt(&ok, 16); - if (!ok) { +} + +/*! + \internal +*/ +QUuid::QUuid(const char *text) +{ + if (!text) { *this = QUuid(); return; } - data4[0] = temp.mid(20, 2).toUInt(&ok, 16); - if (!ok) { + + if (!_q_uuidFromHex(text, data1, data2, data3, data4)) { *this = QUuid(); return; } - data4[1] = temp.mid(22, 2).toUInt(&ok, 16); - if (!ok) { +} + +/*! + Creates a QUuid object from the QByteArray \a text, which must be + formatted as five hex fields separated by '-', e.g., + "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where 'x' is a hex + digit. The curly braces shown here are optional, but it is normal to + include them. If the conversion fails, a null UUID is created. See + toByteArray() for an explanation of how the five hex fields map to the + public data members in QUuid. + + \since 4.8 + + \sa toByteArray(), QUuid() +*/ +QUuid::QUuid(const QByteArray &text) +{ + if (text.length() < 36) { *this = QUuid(); return; } - for (int i = 2; i<8; i++) { - data4[i] = temp.mid(25 + (i-2)*2, 2).toUShort(&ok, 16); - if (!ok) { - *this = QUuid(); - return; - } + + const char *data = text.constData(); + + if (*data == '{' && text.length() < 37) { + *this = QUuid(); + return; + } + + if (!_q_uuidFromHex(data, data1, data2, data3, data4)) { + *this = QUuid(); + return; } } +#endif /*! - \internal + Creates a QUuid object from the binary representation of the UUID, as + specified by RFC 4122 section 4.1.2. See toRfc4122() for a further + explanation of the order of bytes required. + + The byte array accepted is NOT a human readable format. + + If the conversion fails, a null UUID is created. + + \since 4.8 + + \sa toRfc4122(), QUuid() */ -QUuid::QUuid(const char *text) +QUuid QUuid::fromRfc4122(const QByteArray &bytes) { - *this = QUuid(QString::fromLatin1(text)); + if (bytes.isEmpty() || bytes.length() != 16) + return QUuid(); + + uint d1; + ushort d2, d3; + uchar d4[8]; + + const uchar *data = reinterpret_cast<const uchar *>(bytes.constData()); + + d1 = qFromBigEndian<quint32>(data); + data += sizeof(quint32); + d2 = qFromBigEndian<quint16>(data); + data += sizeof(quint16); + d3 = qFromBigEndian<quint16>(data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + d4[i] = *(data); + data++; + } + + return QUuid(d1, d2, d3, d4[0], d4[1], d4[2], d4[3], d4[4], d4[5], d4[6], d4[7]); } -#endif /*! \fn bool QUuid::operator==(const QUuid &other) const @@ -308,11 +447,6 @@ QUuid::QUuid(const char *text) \sa toString() */ -static QString uuidhex(uint data, int digits) -{ - return QString::number(data, 16).rightJustified(digits, QLatin1Char('0')); -} - /*! Returns the string representation of this QUuid. The string is formatted as five hex fields separated by '-' and enclosed in @@ -349,25 +483,114 @@ static QString uuidhex(uint data, int digits) */ QString QUuid::toString() const { - QString result; - - QChar dash = QLatin1Char('-'); - result = QLatin1Char('{') + uuidhex(data1,8); - result += dash; - result += uuidhex(data2,4); - result += dash; - result += uuidhex(data3,4); - result += dash; - result += uuidhex(data4[0],2); - result += uuidhex(data4[1],2); - result += dash; - for (int i = 2; i < 8; i++) - result += uuidhex(data4[i],2); + QString result(38, Qt::Uninitialized); + ushort *data = (ushort *)result.unicode(); + + _q_uuidToHex(data, data1, data2, data3, data4); - return result + QLatin1Char('}'); + return result; +} + +/*! + Returns the binary representation of this QUuid. The byte array is + formatted as five hex fields separated by '-' and enclosed in + curly braces, i.e., "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" where + 'x' is a hex digit. From left to right, the five hex fields are + obtained from the four public data members in QUuid as follows: + + \table + \header + \o Field # + \o Source + + \row + \o 1 + \o data1 + + \row + \o 2 + \o data2 + + \row + \o 3 + \o data3 + + \row + \o 4 + \o data4[0] .. data4[1] + + \row + \o 5 + \o data4[2] .. data4[7] + + \endtable + + \since 4.8 +*/ +QByteArray QUuid::toByteArray() const +{ + QByteArray result(38, Qt::Uninitialized); + char *data = result.data(); + + _q_uuidToHex(data, data1, data2, data3, data4); + + return result; } #endif +/*! + Returns the binary representation of this QUuid. The byte array is in big + endian format, and formatted according to RFC 4122, section 4.1.2 - + "Layout and byte order". + + The order is as follows: + + \table + \header + \o Field # + \o Source + + \row + \o 1 + \o data1 + + \row + \o 2 + \o data2 + + \row + \o 3 + \o data3 + + \row + \o 4 + \o data4[0] .. data4[7] + + \endtable + + \since 4.8 +*/ +QByteArray QUuid::toRfc4122() const +{ + // we know how many bytes a UUID has, I hope :) + QByteArray bytes(16, Qt::Uninitialized); + uchar *data = reinterpret_cast<uchar*>(bytes.data()); + + qToBigEndian(data1, data); + data += sizeof(quint32); + qToBigEndian(data2, data); + data += sizeof(quint16); + qToBigEndian(data3, data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + *(data) = data4[i]; + data++; + } + + return bytes; +} + #ifndef QT_NO_DATASTREAM /*! \relates QUuid @@ -375,11 +598,30 @@ QString QUuid::toString() const */ QDataStream &operator<<(QDataStream &s, const QUuid &id) { - s << (quint32)id.data1; - s << (quint16)id.data2; - s << (quint16)id.data3; - for (int i = 0; i < 8; i++) - s << (quint8)id.data4[i]; + QByteArray bytes; + if (s.byteOrder() == QDataStream::BigEndian) { + bytes = id.toRfc4122(); + } else { + // we know how many bytes a UUID has, I hope :) + bytes = QByteArray(16, Qt::Uninitialized); + uchar *data = reinterpret_cast<uchar*>(bytes.data()); + + qToLittleEndian(id.data1, data); + data += sizeof(quint32); + qToLittleEndian(id.data2, data); + data += sizeof(quint16); + qToLittleEndian(id.data3, data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + *(data) = id.data4[i]; + data++; + } + } + + if (s.writeRawData(bytes.data(), 16) != 16) { + s.setStatus(QDataStream::WriteFailed); + } return s; } @@ -389,19 +631,30 @@ QDataStream &operator<<(QDataStream &s, const QUuid &id) */ QDataStream &operator>>(QDataStream &s, QUuid &id) { - quint32 u32; - quint16 u16; - quint8 u8; - s >> u32; - id.data1 = u32; - s >> u16; - id.data2 = u16; - s >> u16; - id.data3 = u16; - for (int i = 0; i < 8; i++) { - s >> u8; - id.data4[i] = u8; + QByteArray bytes(16, Qt::Uninitialized); + if (s.readRawData(bytes.data(), 16) != 16) { + s.setStatus(QDataStream::ReadPastEnd); + return s; } + + if (s.byteOrder() == QDataStream::BigEndian) { + id = QUuid::fromRfc4122(bytes); + } else { + const uchar *data = reinterpret_cast<const uchar *>(bytes.constData()); + + id.data1 = qFromLittleEndian<quint32>(data); + data += sizeof(quint32); + id.data2 = qFromLittleEndian<quint16>(data); + data += sizeof(quint16); + id.data3 = qFromLittleEndian<quint16>(data); + data += sizeof(quint16); + + for (int i = 0; i < 8; ++i) { + id.data4[i] = *(data); + data++; + } + } + return s; } #endif // QT_NO_DATASTREAM diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h index f42ca91..832d5bc 100644 --- a/src/corelib/plugin/quuid.h +++ b/src/corelib/plugin/quuid.h @@ -108,8 +108,12 @@ struct Q_CORE_EXPORT QUuid QUuid(const QString &); QUuid(const char *); QString toString() const; - operator QString() const { return toString(); } + operator QString() const { return toString(); } // ### Qt5 remove + QUuid(const QByteArray &); + QByteArray toByteArray() const; #endif + QByteArray toRfc4122() const; + static QUuid fromRfc4122(const QByteArray &); bool isNull() const; bool operator==(const QUuid &orig) const diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 4303731..a6fee43 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -75,6 +75,7 @@ #if defined(Q_OS_SYMBIAN) #include <e32std.h> +#include <tz.h> #endif QT_BEGIN_NAMESPACE @@ -4029,23 +4030,32 @@ static QDateTimePrivate::Spec utcToLocal(QDate &date, QTime &time) #elif defined(Q_OS_SYMBIAN) // months and days are zero index based _LIT(KUnixEpoch, "19700000:000000.000000"); - TTimeIntervalSeconds utcOffset = User::UTCOffset(); TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC); TTime epochTTime; TInt err = epochTTime.Set(KUnixEpoch); tm res; if(err == KErrNone) { TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC; - utcTTime = utcTTime + utcOffset; - TDateTime utcDateTime = utcTTime.DateTime(); - res.tm_sec = utcDateTime.Second(); - res.tm_min = utcDateTime.Minute(); - res.tm_hour = utcDateTime.Hour(); - res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct - res.tm_mon = utcDateTime.Month(); - res.tm_year = utcDateTime.Year() - 1900; - res.tm_isdst = 0; - brokenDown = &res; + TRAP(err, + RTz tz; + User::LeaveIfError(tz.Connect()); + CleanupClosePushL(tz); + res.tm_isdst = tz.IsDaylightSavingOnL(*tz.GetTimeZoneIdL(),utcTTime); + User::LeaveIfError(tz.ConvertToLocalTime(utcTTime)); + CleanupStack::PopAndDestroy(&tz)); + if (KErrNone == err) { + TDateTime localDateTime = utcTTime.DateTime(); + res.tm_sec = localDateTime.Second(); + res.tm_min = localDateTime.Minute(); + res.tm_hour = localDateTime.Hour(); + res.tm_mday = localDateTime.Day() + 1; // non-zero based index for tm struct + res.tm_mon = localDateTime.Month(); + res.tm_year = localDateTime.Year() - 1900; + // Symbian's timezone server doesn't know how to handle DST before year 1997 + if (res.tm_year < 97) + res.tm_isdst = -1; + brokenDown = &res; + } } #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) // use the reentrant version of localtime() where available @@ -4120,23 +4130,27 @@ static void localToUtc(QDate &date, QTime &time, int isdst) #elif defined(Q_OS_SYMBIAN) // months and days are zero index based _LIT(KUnixEpoch, "19700000:000000.000000"); - TTimeIntervalSeconds utcOffset = TTimeIntervalSeconds(0 - User::UTCOffset().Int()); TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC); TTime epochTTime; TInt err = epochTTime.Set(KUnixEpoch); tm res; if(err == KErrNone) { - TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC; - utcTTime = utcTTime + utcOffset; - TDateTime utcDateTime = utcTTime.DateTime(); - res.tm_sec = utcDateTime.Second(); - res.tm_min = utcDateTime.Minute(); - res.tm_hour = utcDateTime.Hour(); - res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct - res.tm_mon = utcDateTime.Month(); - res.tm_year = utcDateTime.Year() - 1900; - res.tm_isdst = (int)isdst; - brokenDown = &res; + TTime localTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC; + RTz tz; + if (KErrNone == tz.Connect()) { + if (KErrNone == tz.ConvertToUniversalTime(localTTime)) { + TDateTime utcDateTime = localTTime.DateTime(); + res.tm_sec = utcDateTime.Second(); + res.tm_min = utcDateTime.Minute(); + res.tm_hour = utcDateTime.Hour(); + res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct + res.tm_mon = utcDateTime.Month(); + res.tm_year = utcDateTime.Year() - 1900; + res.tm_isdst = (int)isdst; + brokenDown = &res; + } + tz.Close(); + } } #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) // use the reentrant version of gmtime() where available diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index ef49906..5a2e153 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -48,6 +48,11 @@ static QSystemLocale *QSystemLocale_globalSystemLocale(); QT_END_NAMESPACE #endif +#if !defined(QWS) && defined(Q_OS_MAC) +# include "private/qcore_mac_p.h" +# include <CoreFoundation/CoreFoundation.h> +#endif + #include "qplatformdefs.h" #include "qdatastream.h" @@ -65,10 +70,6 @@ QT_END_NAMESPACE # include "qt_windows.h" # include <time.h> #endif -#if !defined(QWS) && defined(Q_OS_MAC) -# include "private/qcore_mac_p.h" -# include <CoreFoundation/CoreFoundation.h> -#endif #include "private/qnumeric_p.h" #include "private/qsystemlibrary_p.h" @@ -76,7 +77,6 @@ QT_BEGIN_NAMESPACE #if defined(Q_OS_SYMBIAN) void qt_symbianUpdateSystemPrivate(); -void qt_symbianInitSystemLocale(); #endif #ifndef QT_NO_SYSTEMLOCALE @@ -470,9 +470,6 @@ static const QSystemLocale *systemLocale() { if (_systemLocale) return _systemLocale; -#if defined(Q_OS_SYMBIAN) - qt_symbianInitSystemLocale(); -#endif return QSystemLocale_globalSystemLocale(); } @@ -942,19 +939,32 @@ QLocale::Country QLocale::country() const QString QLocale::name() const { - Language l = language(); + const QLocalePrivate *dd = d(); - QString result = d()->languageCode(); + if (dd->m_language_id == QLocale::AnyLanguage) + return QString(); + if (dd->m_language_id == QLocale::C) + return QLatin1String("C"); - if (l == C) - return result; + const unsigned char *c = language_code_list + 3*(uint(dd->m_language_id)); - Country c = country(); - if (c == AnyCountry) - return result; + QString result(7, Qt::Uninitialized); + ushort *data = (ushort *)result.unicode(); + const ushort *begin = data; - result.append(QLatin1Char('_')); - result.append(d()->countryCode()); + *data++ = ushort(c[0]); + *data++ = ushort(c[1]); + if (c[2] != 0) + *data++ = ushort(c[2]); + if (dd->m_country_id != AnyCountry) { + *data++ = '_'; + const unsigned char *c = country_code_list + 3*(uint(dd->m_country_id)); + *data++ = ushort(c[0]); + *data++ = ushort(c[1]); + if (c[2] != 0) + *data++ = ushort(c[2]); + } + result.resize(data - begin); return result; } diff --git a/src/corelib/tools/qlocale_symbian.cpp b/src/corelib/tools/qlocale_symbian.cpp index a4f6cc8..cdf0ab1 100644 --- a/src/corelib/tools/qlocale_symbian.cpp +++ b/src/corelib/tools/qlocale_symbian.cpp @@ -50,6 +50,7 @@ #include <e32const.h> #include <e32base.h> #include <e32property.h> +#include <numberconversion.h> #include <bacntf.h> #include "private/qcore_symbian_p.h" #include "private/qcoreapplication_p.h" @@ -60,27 +61,6 @@ QT_BEGIN_NAMESPACE static TExtendedLocale _s60Locale; -// Type definitions for runtime resolved function pointers -typedef void (*FormatFunc)(TTime&, TDes&, const TDesC&, const TLocale&); -typedef TPtrC (*FormatSpecFunc)(TExtendedLocale&); - -// Runtime resolved functions -static FormatFunc ptrTimeFormatL = NULL; -static FormatSpecFunc ptrGetTimeFormatSpec = NULL; -static FormatSpecFunc ptrGetLongDateFormatSpec = NULL; -static FormatSpecFunc ptrGetShortDateFormatSpec = NULL; - -// Default functions if functions cannot be resolved -static void defaultTimeFormatL(TTime&, TDes& des, const TDesC&, const TLocale&) -{ - des.Zero(); -} - -static TPtrC defaultFormatSpec(TExtendedLocale&) -{ - return TPtrC(KNullDesC); -} - /* Definition of struct for mapping Symbian to ISO locale */ @@ -699,9 +679,9 @@ static QString symbianDateFormat(bool short_format) TPtrC dateFormat; if (short_format) { - dateFormat.Set(ptrGetShortDateFormatSpec(_s60Locale)); + dateFormat.Set(_s60Locale.GetShortDateFormatSpec()); } else { - dateFormat.Set(ptrGetLongDateFormatSpec(_s60Locale)); + dateFormat.Set(_s60Locale.GetLongDateFormatSpec()); } return s60ToQtFormat(qt_TDesC2QString(dateFormat)); @@ -713,7 +693,7 @@ static QString symbianDateFormat(bool short_format) */ static QString symbianTimeFormat() { - return s60ToQtFormat(qt_TDesC2QString(ptrGetTimeFormatSpec(_s60Locale))); + return s60ToQtFormat(qt_TDesC2QString(_s60Locale.GetTimeFormatSpec())); } /*! @@ -737,17 +717,20 @@ static QString symbianDateToString(const QDate &date, bool short_format) TPtrC dateFormat; if (short_format) { - dateFormat.Set(ptrGetShortDateFormatSpec(_s60Locale)); + dateFormat.Set(_s60Locale.GetShortDateFormatSpec()); } else { - dateFormat.Set(ptrGetLongDateFormatSpec(_s60Locale)); + dateFormat.Set(_s60Locale.GetLongDateFormatSpec()); } - TRAPD(err, ptrTimeFormatL(timeStr, buffer, dateFormat, *_s60Locale.GetLocale());) + TLocale *formatLocale = _s60Locale.GetLocale(); + TRAPD(err, timeStr.FormatL(buffer, dateFormat, *formatLocale);) - if (err == KErrNone) + if (err == KErrNone) { + NumberConversion::ConvertDigits(buffer, formatLocale->DigitType()); return qt_TDes2QString(buffer); - else + } else { return QString(); + } } /*! @@ -767,17 +750,15 @@ static QString symbianTimeToString(const QTime &time) TTime timeStr(dateTime); TBuf<KMaxTimeFormatSpec*2> buffer; - TRAPD(err, ptrTimeFormatL( - timeStr, - buffer, - ptrGetTimeFormatSpec(_s60Locale), - *_s60Locale.GetLocale()); - ) + TLocale *formatLocale = _s60Locale.GetLocale(); + TRAPD(err, timeStr.FormatL(buffer, _s60Locale.GetTimeFormatSpec(), *formatLocale);) - if (err == KErrNone) + if (err == KErrNone) { + NumberConversion::ConvertDigits(buffer, formatLocale->DigitType()); return qt_TDes2QString(buffer); - else + } else { return QString(); + } } /*! @@ -802,37 +783,6 @@ void qt_symbianUpdateSystemPrivate() _s60Locale.LoadSystemSettings(); } -void qt_symbianInitSystemLocale() -{ - static QBasicAtomicInt initDone = Q_BASIC_ATOMIC_INITIALIZER(0); - if (initDone == 2) - return; - if (initDone.testAndSetRelaxed(0, 1)) { - // Initialize platform version dependent function pointers - ptrTimeFormatL = reinterpret_cast<FormatFunc> - (qt_resolveS60PluginFunc(S60Plugin_TimeFormatL)); - ptrGetTimeFormatSpec = reinterpret_cast<FormatSpecFunc> - (qt_resolveS60PluginFunc(S60Plugin_GetTimeFormatSpec)); - ptrGetLongDateFormatSpec = reinterpret_cast<FormatSpecFunc> - (qt_resolveS60PluginFunc(S60Plugin_GetLongDateFormatSpec)); - ptrGetShortDateFormatSpec = reinterpret_cast<FormatSpecFunc> - (qt_resolveS60PluginFunc(S60Plugin_GetShortDateFormatSpec)); - if (!ptrTimeFormatL) - ptrTimeFormatL = &defaultTimeFormatL; - if (!ptrGetTimeFormatSpec) - ptrGetTimeFormatSpec = &defaultFormatSpec; - if (!ptrGetLongDateFormatSpec) - ptrGetLongDateFormatSpec = &defaultFormatSpec; - if (!ptrGetShortDateFormatSpec) - ptrGetShortDateFormatSpec = &defaultFormatSpec; - bool ret = initDone.testAndSetRelease(1, 2); - Q_ASSERT(ret); - Q_UNUSED(ret); - } - while(initDone != 2) - QThread::yieldCurrentThread(); -} - QLocale QSystemLocale::fallbackLocale() const { TLanguage lang = User::Language(); diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 0c2cf16..3dfce4b 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -122,3 +122,8 @@ INCLUDEPATH += ../3rdparty/md5 \ # Note: libm should be present by default becaue this is C++ !macx-icc:!vxworks:!symbian:unix:LIBS_PRIVATE += -lm +symbian { + # QLocale Symbian implementation needs this + LIBS += -lnumberconversion +} + diff --git a/src/declarative/debugger/debugger.pri b/src/declarative/debugger/debugger.pri index 044db3c..3134c79 100644 --- a/src/declarative/debugger/debugger.pri +++ b/src/declarative/debugger/debugger.pri @@ -9,7 +9,7 @@ SOURCES += \ $$PWD/qdeclarativedebugtrace.cpp \ $$PWD/qdeclarativedebughelper.cpp \ $$PWD/qdeclarativedebugserver.cpp \ - $$PWD/qdeclarativeobserverservice.cpp \ + $$PWD/qdeclarativeinspectorservice.cpp \ $$PWD/qjsdebuggeragent.cpp \ $$PWD/qjsdebugservice.cpp @@ -24,7 +24,7 @@ HEADERS += \ $$PWD/qdeclarativedebughelper_p.h \ $$PWD/qdeclarativedebugserver_p.h \ $$PWD/qdeclarativedebugserverconnection_p.h \ - $$PWD/qdeclarativeobserverservice_p.h \ - $$PWD/qdeclarativeobserverinterface_p.h \ + $$PWD/qdeclarativeinspectorservice_p.h \ + $$PWD/qdeclarativeinspectorinterface_p.h \ $$PWD/qjsdebuggeragent_p.h \ $$PWD/qjsdebugservice_p.h diff --git a/src/declarative/debugger/qdeclarativedebug.cpp b/src/declarative/debugger/qdeclarativedebug.cpp index 32c2b47..620ee1d 100644 --- a/src/declarative/debugger/qdeclarativedebug.cpp +++ b/src/declarative/debugger/qdeclarativedebug.cpp @@ -638,14 +638,15 @@ QDeclarativeDebugExpressionQuery *QDeclarativeEngineDebug::queryExpressionResult bool QDeclarativeEngineDebug::setBindingForObject(int objectDebugId, const QString &propertyName, const QVariant &bindingExpression, - bool isLiteralValue) + bool isLiteralValue, + QString source, int line) { Q_D(QDeclarativeEngineDebug); if (d->client->status() == QDeclarativeDebugClient::Enabled && objectDebugId != -1) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("SET_BINDING") << objectDebugId << propertyName << bindingExpression << isLiteralValue; + ds << QByteArray("SET_BINDING") << objectDebugId << propertyName << bindingExpression << isLiteralValue << source << line; d->client->sendMessage(message); return true; } else { diff --git a/src/declarative/debugger/qdeclarativedebug_p.h b/src/declarative/debugger/qdeclarativedebug_p.h index ae92d6a..f822637 100644 --- a/src/declarative/debugger/qdeclarativedebug_p.h +++ b/src/declarative/debugger/qdeclarativedebug_p.h @@ -101,7 +101,8 @@ public: const QString &expr, QObject *parent = 0); bool setBindingForObject(int objectDebugId, const QString &propertyName, - const QVariant &bindingExpression, bool isLiteralValue); + const QVariant &bindingExpression, bool isLiteralValue, + QString source = QString(), int line = -1); bool resetBindingForObject(int objectDebugId, const QString &propertyName); bool setMethodBody(int objectDebugId, const QString &methodName, const QString &methodBody); diff --git a/src/declarative/debugger/qdeclarativeobserverinterface_p.h b/src/declarative/debugger/qdeclarativeinspectorinterface_p.h index efb47fa..aa29d68 100644 --- a/src/declarative/debugger/qdeclarativeobserverinterface_p.h +++ b/src/declarative/debugger/qdeclarativeinspectorinterface_p.h @@ -50,17 +50,17 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class Q_DECLARATIVE_EXPORT QDeclarativeObserverInterface +class Q_DECLARATIVE_EXPORT QDeclarativeInspectorInterface { public: - QDeclarativeObserverInterface() {} - virtual ~QDeclarativeObserverInterface() {} + QDeclarativeInspectorInterface() {} + virtual ~QDeclarativeInspectorInterface() {} virtual void activate() = 0; virtual void deactivate() = 0; }; -Q_DECLARE_INTERFACE(QDeclarativeObserverInterface, "com.trolltech.Qt.QDeclarativeObserverInterface/1.0") +Q_DECLARE_INTERFACE(QDeclarativeInspectorInterface, "com.trolltech.Qt.QDeclarativeInspectorInterface/1.0") QT_END_NAMESPACE diff --git a/src/declarative/debugger/qdeclarativeobserverservice.cpp b/src/declarative/debugger/qdeclarativeinspectorservice.cpp index 43d9281..9fec006 100644 --- a/src/declarative/debugger/qdeclarativeobserverservice.cpp +++ b/src/declarative/debugger/qdeclarativeinspectorservice.cpp @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#include "private/qdeclarativeobserverservice_p.h" -#include "private/qdeclarativeobserverinterface_p.h" +#include "private/qdeclarativeinspectorservice_p.h" +#include "private/qdeclarativeinspectorinterface_p.h" #include <QtCore/QCoreApplication> #include <QtCore/QDebug> @@ -51,30 +51,30 @@ QT_BEGIN_NAMESPACE -Q_GLOBAL_STATIC(QDeclarativeObserverService, serviceInstance) +Q_GLOBAL_STATIC(QDeclarativeInspectorService, serviceInstance) -QDeclarativeObserverService::QDeclarativeObserverService() +QDeclarativeInspectorService::QDeclarativeInspectorService() : QDeclarativeDebugService(QLatin1String("QDeclarativeObserverMode")) - , m_observer(0) + , m_inspectorPlugin(0) { } -QDeclarativeObserverService *QDeclarativeObserverService::instance() +QDeclarativeInspectorService *QDeclarativeInspectorService::instance() { return serviceInstance(); } -void QDeclarativeObserverService::addView(QDeclarativeView *view) +void QDeclarativeInspectorService::addView(QDeclarativeView *view) { m_views.append(view); } -void QDeclarativeObserverService::removeView(QDeclarativeView *view) +void QDeclarativeInspectorService::removeView(QDeclarativeView *view) { m_views.removeAll(view); } -void QDeclarativeObserverService::sendMessage(const QByteArray &message) +void QDeclarativeInspectorService::sendMessage(const QByteArray &message) { if (status() != Enabled) return; @@ -82,33 +82,33 @@ void QDeclarativeObserverService::sendMessage(const QByteArray &message) QDeclarativeDebugService::sendMessage(message); } -void QDeclarativeObserverService::statusChanged(Status status) +void QDeclarativeInspectorService::statusChanged(Status status) { if (m_views.isEmpty()) return; if (status == Enabled) { - if (!m_observer) - m_observer = loadObserverPlugin(); + if (!m_inspectorPlugin) + m_inspectorPlugin = loadInspectorPlugin(); - if (!m_observer) { - qWarning() << "Error while loading observer plugin"; + if (!m_inspectorPlugin) { + qWarning() << "Error while loading inspector plugin"; return; } - m_observer->activate(); + m_inspectorPlugin->activate(); } else { - if (m_observer) - m_observer->deactivate(); + if (m_inspectorPlugin) + m_inspectorPlugin->deactivate(); } } -void QDeclarativeObserverService::messageReceived(const QByteArray &message) +void QDeclarativeInspectorService::messageReceived(const QByteArray &message) { emit gotMessage(message); } -QDeclarativeObserverInterface *QDeclarativeObserverService::loadObserverPlugin() +QDeclarativeInspectorInterface *QDeclarativeInspectorService::loadInspectorPlugin() { QStringList pluginCandidates; const QStringList paths = QCoreApplication::libraryPaths(); @@ -124,11 +124,11 @@ QDeclarativeObserverInterface *QDeclarativeObserverService::loadObserverPlugin() if (!loader.load()) continue; - QDeclarativeObserverInterface *observer = - qobject_cast<QDeclarativeObserverInterface*>(loader.instance()); + QDeclarativeInspectorInterface *inspector = + qobject_cast<QDeclarativeInspectorInterface*>(loader.instance()); - if (observer) - return observer; + if (inspector) + return inspector; loader.unload(); } return 0; diff --git a/src/declarative/debugger/qdeclarativeobserverservice_p.h b/src/declarative/debugger/qdeclarativeinspectorservice_p.h index c883d4b..9fe0d601f 100644 --- a/src/declarative/debugger/qdeclarativeobserverservice_p.h +++ b/src/declarative/debugger/qdeclarativeinspectorservice_p.h @@ -54,15 +54,15 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) class QDeclarativeView; -class QDeclarativeObserverInterface; +class QDeclarativeInspectorInterface; -class Q_DECLARATIVE_EXPORT QDeclarativeObserverService : public QDeclarativeDebugService +class Q_DECLARATIVE_EXPORT QDeclarativeInspectorService : public QDeclarativeDebugService { Q_OBJECT public: - QDeclarativeObserverService(); - static QDeclarativeObserverService *instance(); + QDeclarativeInspectorService(); + static QDeclarativeInspectorService *instance(); void addView(QDeclarativeView *); void removeView(QDeclarativeView *); @@ -78,10 +78,10 @@ protected: virtual void messageReceived(const QByteArray &); private: - static QDeclarativeObserverInterface *loadObserverPlugin(); + static QDeclarativeInspectorInterface *loadInspectorPlugin(); QList<QDeclarativeView*> m_views; - QDeclarativeObserverInterface *m_observer; + QDeclarativeInspectorInterface *m_inspectorPlugin; }; QT_END_NAMESPACE diff --git a/src/declarative/debugger/qjsdebuggeragent.cpp b/src/declarative/debugger/qjsdebuggeragent.cpp index 9b76592..dff637b 100644 --- a/src/declarative/debugger/qjsdebuggeragent.cpp +++ b/src/declarative/debugger/qjsdebuggeragent.cpp @@ -56,7 +56,7 @@ class QJSDebuggerAgentPrivate { public: QJSDebuggerAgentPrivate(QJSDebuggerAgent *q) - : q(q), state(NoState) + : q(q), state(NoState), isInitialized(false) {} void continueExec(); @@ -79,6 +79,7 @@ public: QHash<QString, JSAgentBreakpointData> fileNameToBreakpoints; QStringList watchExpressions; QSet<qint64> knownObjectIds; + bool isInitialized; }; namespace { @@ -252,6 +253,14 @@ QJSDebuggerAgent::~QJSDebuggerAgent() delete d; } +/*! + Indicates whether the agent got the list of breakpoints. + */ +bool QJSDebuggerAgent::isInitialized() const +{ + return d->isInitialized; +} + void QJSDebuggerAgent::setBreakpoints(const JSAgentBreakpoints &breakpoints) { d->breakpoints = breakpoints; @@ -259,6 +268,8 @@ void QJSDebuggerAgent::setBreakpoints(const JSAgentBreakpoints &breakpoints) d->fileNameToBreakpoints.clear(); foreach (const JSAgentBreakpointData &bp, breakpoints) d->fileNameToBreakpoints.insertMulti(fileName(QString::fromUtf8(bp.fileUrl)), bp); + + d->isInitialized = true; } void QJSDebuggerAgent::setWatchExpressions(const QStringList &watchExpressions) diff --git a/src/declarative/debugger/qjsdebuggeragent_p.h b/src/declarative/debugger/qjsdebuggeragent_p.h index 5aa3c9c..309588e 100644 --- a/src/declarative/debugger/qjsdebuggeragent_p.h +++ b/src/declarative/debugger/qjsdebuggeragent_p.h @@ -145,6 +145,8 @@ public: QJSDebuggerAgent(QDeclarativeEngine *engine, QObject *parent = 0); ~QJSDebuggerAgent(); + bool isInitialized() const; + void setBreakpoints(const JSAgentBreakpoints &); void setWatchExpressions(const QStringList &); diff --git a/src/declarative/debugger/qjsdebugservice.cpp b/src/declarative/debugger/qjsdebugservice.cpp index 4ce2c90..ad84f65 100644 --- a/src/declarative/debugger/qjsdebugservice.cpp +++ b/src/declarative/debugger/qjsdebugservice.cpp @@ -71,6 +71,16 @@ void QJSDebugService::addEngine(QDeclarativeEngine *engine) Q_ASSERT(!m_engines.contains(engine)); m_engines.append(engine); + + if (status() == Enabled && !m_engines.isEmpty() && !m_agent) { + m_agent = new QJSDebuggerAgent(engine, engine); + connect(m_agent, SIGNAL(stopped(bool,QString)), + this, SLOT(executionStopped(bool,QString))); + + while (!m_agent->isInitialized()) { + waitForMessage(); + } + } } void QJSDebugService::removeEngine(QDeclarativeEngine *engine) diff --git a/src/declarative/debugger/qpacketprotocol.cpp b/src/declarative/debugger/qpacketprotocol.cpp index c24df61..9caaa79 100644 --- a/src/declarative/debugger/qpacketprotocol.cpp +++ b/src/declarative/debugger/qpacketprotocol.cpp @@ -164,47 +164,45 @@ public Q_SLOTS: void readyToRead() { - if(-1 == inProgressSize) { - // We need a size header of sizeof(qint32) - if(sizeof(qint32) > (uint)dev->bytesAvailable()) - return; - - // Read size header - int read = dev->read((char *)&inProgressSize, sizeof(qint32)); - Q_ASSERT(read == sizeof(qint32)); - Q_UNUSED(read); - - // Check sizing constraints - if(inProgressSize > maxPacketSize) { - QObject::disconnect(dev, SIGNAL(readyRead()), - this, SLOT(readyToRead())); - QObject::disconnect(dev, SIGNAL(aboutToClose()), - this, SLOT(aboutToClose())); - QObject::disconnect(dev, SIGNAL(bytesWritten(qint64)), - this, SLOT(bytesWritten(qint64))); - dev = 0; - emit invalidPacket(); - return; - } - - inProgressSize -= sizeof(qint32); - + while (true) { // Need to get trailing data - readyToRead(); - } else { - inProgress.append(dev->read(inProgressSize - inProgress.size())); - - if(inProgressSize == inProgress.size()) { - // Packet has arrived! - packets.append(inProgress); - inProgressSize = -1; - inProgress.clear(); - - emit readyRead(); - waitingForPacket = false; - - // Need to get trailing data - readyToRead(); + if (-1 == inProgressSize) { + // We need a size header of sizeof(qint32) + if (sizeof(qint32) > (uint)dev->bytesAvailable()) + return; + + // Read size header + int read = dev->read((char *)&inProgressSize, sizeof(qint32)); + Q_ASSERT(read == sizeof(qint32)); + Q_UNUSED(read); + + // Check sizing constraints + if (inProgressSize > maxPacketSize) { + QObject::disconnect(dev, SIGNAL(readyRead()), + this, SLOT(readyToRead())); + QObject::disconnect(dev, SIGNAL(aboutToClose()), + this, SLOT(aboutToClose())); + QObject::disconnect(dev, SIGNAL(bytesWritten(qint64)), + this, SLOT(bytesWritten(qint64))); + dev = 0; + emit invalidPacket(); + return; + } + + inProgressSize -= sizeof(qint32); + } else { + inProgress.append(dev->read(inProgressSize - inProgress.size())); + + if (inProgressSize == inProgress.size()) { + // Packet has arrived! + packets.append(inProgress); + inProgressSize = -1; + inProgress.clear(); + + waitingForPacket = false; + emit readyRead(); + } else + return; } } } diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index b74b18c..055e4b9 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -26,7 +26,7 @@ include(debugger/debugger.pri) symbian: { TARGET.UID3=0x2001E623 - LIBS += -lefsrv + LIBS += -lefsrv -lhal contains(QT_CONFIG, freetype) { DEFINES += QT_NO_FONTCONFIG diff --git a/src/declarative/graphicsitems/qdeclarativeanchors_p.h b/src/declarative/graphicsitems/qdeclarativeanchors_p.h index d222ef5..cffcd54 100644 --- a/src/declarative/graphicsitems/qdeclarativeanchors_p.h +++ b/src/declarative/graphicsitems/qdeclarativeanchors_p.h @@ -79,7 +79,6 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeAnchors : public QObject Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged) Q_PROPERTY(QGraphicsObject *fill READ fill WRITE setFill RESET resetFill NOTIFY fillChanged) Q_PROPERTY(QGraphicsObject *centerIn READ centerIn WRITE setCenterIn RESET resetCenterIn NOTIFY centerInChanged) - Q_PROPERTY(bool mirrored READ mirrored NOTIFY mirroredChanged REVISION 1) public: QDeclarativeAnchors(QObject *parent=0); @@ -184,7 +183,6 @@ Q_SIGNALS: void verticalCenterOffsetChanged(); void horizontalCenterOffsetChanged(); void baselineOffsetChanged(); - Q_REVISION(1) void mirroredChanged(); private: friend class QDeclarativeItem; diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp index b7fcbb5..8787a5e 100644 --- a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp +++ b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp @@ -87,6 +87,32 @@ QT_BEGIN_NAMESPACE */ /*! + \qmlproperty url AnimatedImage::source + + This property holds the URL that refers to the source image. + + AnimatedImage can handle any image format supported by Qt, loaded from any + URL scheme supported by Qt. + + \sa QDeclarativeImageProvider +*/ + +/*! + \qmlproperty bool AnimatedImage::asynchronous + + Specifies that images on the local filesystem should be loaded + asynchronously in a separate thread. The default value is + false, causing the user interface thread to block while the + image is loaded. Setting \a asynchronous to true is useful where + maintaining a responsive user interface is more desirable + than having images immediately visible. + + Note that this property is only valid for images read from the + local filesystem. Images loaded via a network resource (e.g. HTTP) + are always loaded asynchonously. +*/ + +/*! \qmlproperty bool AnimatedImage::cache \since Quick 1.1 diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp index ce7566b..13bb8ef 100644 --- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp +++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp @@ -232,8 +232,8 @@ void QDeclarativeFlickablePrivate::AxisData::addVelocitySample(qreal v, qreal ma void QDeclarativeFlickablePrivate::AxisData::updateVelocity() { + velocity = 0; if (velocityBuffer.count() > QML_FLICK_DISCARDSAMPLES) { - velocity = 0; int count = velocityBuffer.count()-QML_FLICK_DISCARDSAMPLES; for (int i = 0; i < count; ++i) { qreal v = velocityBuffer.at(i); diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp index 34925f1..fc5cd8b 100644 --- a/src/declarative/graphicsitems/qdeclarativegridview.cpp +++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp @@ -206,7 +206,6 @@ public: void mirrorChange() { Q_Q(QDeclarativeGridView); regenerate(); - emit q->effectiveLayoutDirectionChanged(); } qreal position() const { @@ -818,7 +817,9 @@ void QDeclarativeGridViewPrivate::createHighlight() if (highlight) { if (trackedItem == highlight) trackedItem = 0; - delete highlight->item; + if (highlight->item->scene()) + highlight->item->scene()->removeItem(highlight->item); + highlight->item->deleteLater(); delete highlight; highlight = 0; delete highlightXAnimator; @@ -1802,9 +1803,12 @@ void QDeclarativeGridView::setHighlightRangeMode(HighlightRangeMode mode) on the \l GridView:flow property. \endlist - \bold Note: If GridView::flow is set to GridView.LeftToRight, this is not to be confused if - GridView::layoutDirection is set to Qt.RightToLeft. The GridView.LeftToRight flow value simply - indicates that the flow is horizontal. + When using the attached property \l {LayoutMirroring::enabled} for locale layouts, + the layout direction of the grid view will be mirrored. However, the actual property + \c layoutDirection will remain unchanged. You can use the property + \l {LayoutMirroring::enabled} to determine whether the direction has been mirrored. + + \sa {LayoutMirroring}{LayoutMirroring} */ Qt::LayoutDirection QDeclarativeGridView::layoutDirection() const @@ -1820,21 +1824,9 @@ void QDeclarativeGridView::setLayoutDirection(Qt::LayoutDirection layoutDirectio d->layoutDirection = layoutDirection; d->regenerate(); emit layoutDirectionChanged(); - emit effectiveLayoutDirectionChanged(); } } -/*! - \qmlproperty enumeration GridView::effectiveLayoutDirection - This property holds the effective layout direction of the grid. - - When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts, - the visual layout direction of the grid will be mirrored. However, the - property \l {GridView::layoutDirection}{layoutDirection} will remain unchanged. - - \sa GridView::layoutDirection, {LayoutMirroring}{LayoutMirroring} -*/ - Qt::LayoutDirection QDeclarativeGridView::effectiveLayoutDirection() const { Q_D(const QDeclarativeGridView); diff --git a/src/declarative/graphicsitems/qdeclarativegridview_p.h b/src/declarative/graphicsitems/qdeclarativegridview_p.h index d2dff48..078d033 100644 --- a/src/declarative/graphicsitems/qdeclarativegridview_p.h +++ b/src/declarative/graphicsitems/qdeclarativegridview_p.h @@ -75,7 +75,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeGridView : public QDeclarativeFlickable Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged) Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1) - Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1) Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged) Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged) Q_PROPERTY(int cellWidth READ cellWidth WRITE setCellWidth NOTIFY cellWidthChanged) @@ -194,7 +193,6 @@ Q_SIGNALS: void delegateChanged(); void flowChanged(); Q_REVISION(1) void layoutDirectionChanged(); - Q_REVISION(1) void effectiveLayoutDirectionChanged(); void keyNavigationWrapsChanged(); void cacheBufferChanged(); void snapModeChanged(); diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp index 91b430d..ccf0de0 100644 --- a/src/declarative/graphicsitems/qdeclarativeitem.cpp +++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp @@ -898,7 +898,6 @@ void QDeclarativeItemPrivate::setLayoutMirror(bool mirror) _anchors->d_func()->fillChanged(); _anchors->d_func()->centerInChanged(); _anchors->d_func()->updateHorizontalAnchors(); - emit _anchors->mirroredChanged(); } mirrorChange(); if (attachedLayoutDirection) { diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index b52b6fc..7a5e433 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -298,7 +298,6 @@ public: void mirrorChange() { Q_Q(QDeclarativeListView); regenerate(); - emit q->effectiveLayoutDirectionChanged(); } bool isRightToLeft() const { @@ -943,7 +942,9 @@ void QDeclarativeListViewPrivate::createHighlight() if (highlight) { if (trackedItem == highlight) trackedItem = 0; - delete highlight->item; + if (highlight->item->scene()) + highlight->item->scene()->removeItem(highlight->item); + highlight->item->deleteLater(); delete highlight; highlight = 0; delete highlightPosAnimator; @@ -2169,7 +2170,12 @@ void QDeclarativeListView::setOrientation(QDeclarativeListView::Orientation orie \o Qt.RightToLeft - Items will be laid out from right to let. \endlist - \sa ListView::effectiveLayoutDirection + When using the attached property \l {LayoutMirroring::enabled} for locale layouts, + the layout direction of the horizontal list will be mirrored. However, the actual property + \c layoutDirection will remain unchanged. You can use the property + \l {LayoutMirroring::enabled} to determine whether the direction has been mirrored. + + \sa {LayoutMirroring}{LayoutMirroring} */ Qt::LayoutDirection QDeclarativeListView::layoutDirection() const @@ -2185,21 +2191,9 @@ void QDeclarativeListView::setLayoutDirection(Qt::LayoutDirection layoutDirectio d->layoutDirection = layoutDirection; d->regenerate(); emit layoutDirectionChanged(); - emit effectiveLayoutDirectionChanged(); } } -/*! - \qmlproperty enumeration ListView::effectiveLayoutDirection - This property holds the effective layout direction of the horizontal list. - - When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts, - the visual layout direction of the horizontal list will be mirrored. However, the - property \l {ListView::layoutDirection}{layoutDirection} will remain unchanged. - - \sa ListView::layoutDirection, {LayoutMirroring}{LayoutMirroring} -*/ - Qt::LayoutDirection QDeclarativeListView::effectiveLayoutDirection() const { Q_D(const QDeclarativeListView); diff --git a/src/declarative/graphicsitems/qdeclarativelistview_p.h b/src/declarative/graphicsitems/qdeclarativelistview_p.h index 2cd6ba7..00f9bee 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview_p.h +++ b/src/declarative/graphicsitems/qdeclarativelistview_p.h @@ -114,7 +114,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeListView : public QDeclarativeFlickable Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged) Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1) - Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1) Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged) Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged) Q_PROPERTY(QDeclarativeViewSection *section READ sectionCriteria CONSTANT) @@ -229,7 +228,6 @@ Q_SIGNALS: void spacingChanged(); void orientationChanged(); Q_REVISION(1) void layoutDirectionChanged(); - Q_REVISION(1) void effectiveLayoutDirectionChanged(); void currentIndexChanged(); void currentSectionChanged(); void highlightMoveSpeedChanged(); diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp index 20ca0f6..18f008a 100644 --- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp +++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp @@ -496,9 +496,6 @@ void QDeclarativeMouseArea::mousePressEvent(QGraphicsSceneMouseEvent *event) d->pressAndHoldTimer.start(PressAndHoldDelay, this); setKeepMouseGrab(d->stealMouse); event->setAccepted(setPressed(true)); - - if(!event->isAccepted() && d->forwardToList.count()) - d->forwardEvent(event); } } @@ -576,9 +573,6 @@ void QDeclarativeMouseArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event) me.setX(d->lastPos.x()); me.setY(d->lastPos.y()); emit positionChanged(&me); - - if(!event->isAccepted() && d->forwardToList.count()) - d->forwardEvent(event); } @@ -600,9 +594,6 @@ void QDeclarativeMouseArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (s && s->mouseGrabberItem() == this) ungrabMouse(); setKeepMouseGrab(false); - - if(!event->isAccepted() && d->forwardToList.count()) - d->forwardEvent(event); } d->doubleClick = false; } @@ -994,11 +985,4 @@ QDeclarativeDrag *QDeclarativeMouseArea::drag() */ -QDeclarativeListProperty<QGraphicsObject> QDeclarativeMouseArea::forwardTo() -{ - Q_D(QDeclarativeMouseArea); - return d->forwardTo; -} - - QT_END_NAMESPACE diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p.h index 8fd453f..f6f970b 100644 --- a/src/declarative/graphicsitems/qdeclarativemousearea_p.h +++ b/src/declarative/graphicsitems/qdeclarativemousearea_p.h @@ -130,7 +130,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeMouseArea : public QDeclarativeItem Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged) Q_PROPERTY(QDeclarativeDrag *drag READ drag CONSTANT) //### add flicking to QDeclarativeDrag or add a QDeclarativeFlick ??? Q_PROPERTY(bool preventStealing READ preventStealing WRITE setPreventStealing NOTIFY preventStealingChanged REVISION 1) - Q_PROPERTY(QDeclarativeListProperty<QGraphicsObject> forwardTo READ forwardTo); public: QDeclarativeMouseArea(QDeclarativeItem *parent=0); @@ -158,8 +157,6 @@ public: bool preventStealing() const; void setPreventStealing(bool prevent); - QDeclarativeListProperty<QGraphicsObject> forwardTo(); - Q_SIGNALS: void hoveredChanged(); void pressedChanged(); diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h index 6626c56..f6ea00d 100644 --- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h +++ b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h @@ -70,8 +70,6 @@ public: : absorb(true), hovered(false), pressed(false), longPress(false), moved(false), stealMouse(false), doubleClick(false), preventStealing(false), drag(0) { - Q_Q(QDeclarativeMouseArea); - forwardTo = QDeclarativeListProperty<QGraphicsObject>(q, forwardToList); } ~QDeclarativeMouseAreaPrivate(); @@ -91,18 +89,6 @@ public: lastModifiers = event->modifiers(); } - void forwardEvent(QGraphicsSceneMouseEvent* event) - { - Q_Q(QDeclarativeMouseArea); - for(int i=0; i < forwardToList.count(); i++){ - event->setPos(forwardToList[i]->mapFromScene(event->scenePos())); - forwardToList[i]->scene()->sendEvent(forwardToList[i], event); - if(event->isAccepted()) - break; - } - event->setPos(q->mapFromScene(event->scenePos())); - } - bool isPressAndHoldConnected() { Q_Q(QDeclarativeMouseArea); static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QDeclarativeMouseEvent*)"); @@ -135,9 +121,6 @@ public: Qt::MouseButtons lastButtons; Qt::KeyboardModifiers lastModifiers; QBasicTimer pressAndHoldTimer; - - QDeclarativeListProperty<QGraphicsObject> forwardTo; - QList<QGraphicsObject*> forwardToList; }; QT_END_NAMESPACE diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp index 79e52cd..94f128d 100644 --- a/src/declarative/graphicsitems/qdeclarativepathview.cpp +++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp @@ -203,7 +203,9 @@ void QDeclarativePathViewPrivate::createHighlight() bool changed = false; if (highlightItem) { - delete highlightItem; + if (highlightItem->scene()) + highlightItem->scene()->removeItem(highlightItem); + highlightItem->deleteLater(); highlightItem = 0; changed = true; } diff --git a/src/declarative/graphicsitems/qdeclarativepositioners.cpp b/src/declarative/graphicsitems/qdeclarativepositioners.cpp index 3f4d6de..f3d1a68 100644 --- a/src/declarative/graphicsitems/qdeclarativepositioners.cpp +++ b/src/declarative/graphicsitems/qdeclarativepositioners.cpp @@ -597,7 +597,12 @@ QDeclarativeRow::QDeclarativeRow(QDeclarativeItem *parent) the right anchor remains to the right of the row. \endlist - \sa Grid::layoutDirection, Flow::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example} + When using the attached property \l {LayoutMirroring::enabled} for locale layouts, + the visual layout direction of the row positioner will be mirrored. However, the + property \c layoutDirection will remain unchanged. You can use the property + \l {LayoutMirroring::enabled} to determine whether the direction has been mirrored. + + \sa Grid::layoutDirection, Flow::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}, {LayoutMirroring}{LayoutMirroring} */ Qt::LayoutDirection QDeclarativeRow::layoutDirection() const { @@ -616,21 +621,9 @@ void QDeclarativeRow::setLayoutDirection(Qt::LayoutDirection layoutDirection) d->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry); prePositioning(); emit layoutDirectionChanged(); - emit effectiveLayoutDirectionChanged(); } } -/*! - \qmlproperty enumeration Row::effectiveLayoutDirection - This property holds the effective layout direction of the row positioner. - - When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts, - the visual layout direction of the row positioner will be mirrored. However, the - property \l {Row::layoutDirection}{layoutDirection} will remain unchanged. - - \sa Row::layoutDirection, {LayoutMirroring}{LayoutMirroring} -*/ - Qt::LayoutDirection QDeclarativeRow::effectiveLayoutDirection() const { return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this); @@ -900,7 +893,12 @@ void QDeclarativeGrid::setFlow(Flow flow) \l Grid::flow property. \endlist - \sa Flow::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example} + When using the attached property \l {LayoutMirroring::enabled} for locale layouts, + the visual layout direction of the grid positioner will be mirrored. However, the + property \c layoutDirection will remain unchanged. You can use the property + \l {LayoutMirroring::enabled} to determine whether the direction has been mirrored. + + \sa Flow::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}, {LayoutMirroring}{LayoutMirroring} */ Qt::LayoutDirection QDeclarativeGrid::layoutDirection() const { @@ -918,22 +916,10 @@ void QDeclarativeGrid::setLayoutDirection(Qt::LayoutDirection layoutDirection) else d->removeItemChangeListener(d, QDeclarativeItemPrivate::Geometry); prePositioning(); - emit layoutDirectionChanged(); - emit effectiveLayoutDirectionChanged(); + emit layoutDirectionChanged();; } } -/*! - \qmlproperty enumeration Grid::effectiveLayoutDirection - This property holds the effective layout direction of the grid positioner. - - When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts, - the visual layout direction of the grid positioner will be mirrored. However, the - property \l {Grid::layoutDirection}{layoutDirection} will remain unchanged. - - \sa Grid::layoutDirection, {LayoutMirroring}{LayoutMirroring} -*/ - Qt::LayoutDirection QDeclarativeGrid::effectiveLayoutDirection() const { return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this); @@ -1265,7 +1251,12 @@ void QDeclarativeFlow::setFlow(Flow flow) \l Flow::flow property. \endlist - \sa Grid::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example} + When using the attached property \l {LayoutMirroring::enabled} for locale layouts, + the visual layout direction of the flow positioner will be mirrored. However, the + property \c layoutDirection will remain unchanged. You can use the property + \l {LayoutMirroring::enabled} to determine whether the direction has been mirrored. + + \sa Grid::layoutDirection, Row::layoutDirection, {declarative/righttoleft/layoutdirection}{Layout directions example}, {LayoutMirroring}{LayoutMirroring} */ Qt::LayoutDirection QDeclarativeFlow::layoutDirection() const @@ -1281,21 +1272,9 @@ void QDeclarativeFlow::setLayoutDirection(Qt::LayoutDirection layoutDirection) d->layoutDirection = layoutDirection; prePositioning(); emit layoutDirectionChanged(); - emit effectiveLayoutDirectionChanged(); } } -/*! - \qmlproperty enumeration Flow::effectiveLayoutDirection - This property holds the effective layout direction of the flow positioner. - - When using the attached property \l {LayoutMirroring::enabled}{LayoutMirroring::enabled} for locale layouts, - the visual layout direction of the grid positioner will be mirrored. However, the - property \l {Flow::layoutDirection}{layoutDirection} will remain unchanged. - - \sa Flow::layoutDirection, {LayoutMirroring}{LayoutMirroring} -*/ - Qt::LayoutDirection QDeclarativeFlow::effectiveLayoutDirection() const { return QDeclarativeBasePositionerPrivate::getEffectiveLayoutDirection(this); diff --git a/src/declarative/graphicsitems/qdeclarativepositioners_p.h b/src/declarative/graphicsitems/qdeclarativepositioners_p.h index 3d62a88..1e6c118 100644 --- a/src/declarative/graphicsitems/qdeclarativepositioners_p.h +++ b/src/declarative/graphicsitems/qdeclarativepositioners_p.h @@ -130,7 +130,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeRow: public QDeclarativeBasePositioner { Q_OBJECT Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1) - Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1) public: QDeclarativeRow(QDeclarativeItem *parent=0); @@ -140,7 +139,6 @@ public: Q_SIGNALS: Q_REVISION(1) void layoutDirectionChanged(); - Q_REVISION(1) void effectiveLayoutDirectionChanged(); protected: virtual void doPositioning(QSizeF *contentSize); @@ -156,7 +154,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeGrid : public QDeclarativeBasePositioner Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged) Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged) Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1) - Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1) public: QDeclarativeGrid(QDeclarativeItem *parent=0); @@ -180,7 +177,6 @@ Q_SIGNALS: void columnsChanged(); void flowChanged(); Q_REVISION(1) void layoutDirectionChanged(); - Q_REVISION(1) void effectiveLayoutDirectionChanged(); protected: virtual void doPositioning(QSizeF *contentSize); @@ -199,7 +195,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeFlow: public QDeclarativeBasePositioner Q_OBJECT Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged) Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged REVISION 1) - Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged REVISION 1) public: QDeclarativeFlow(QDeclarativeItem *parent=0); @@ -214,7 +209,6 @@ public: Q_SIGNALS: void flowChanged(); Q_REVISION(1) void layoutDirectionChanged(); - Q_REVISION(1) void effectiveLayoutDirectionChanged(); protected: virtual void doPositioning(QSizeF *contentSize); diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp index 96bd792..54ff406 100644 --- a/src/declarative/graphicsitems/qdeclarativetext.cpp +++ b/src/declarative/graphicsitems/qdeclarativetext.cpp @@ -1040,7 +1040,6 @@ void QDeclarativeText::setStyleColor(const QColor &color) /*! \qmlproperty enumeration Text::horizontalAlignment \qmlproperty enumeration Text::verticalAlignment - \qmlproperty enumeration Text::effectiveHorizontalAlignment Sets the horizontal and vertical alignment of the text within the Text items width and height. By default, the text is vertically aligned to the top. Horizontal @@ -1056,10 +1055,10 @@ void QDeclarativeText::setStyleColor(const QColor &color) need to either modify the Item::anchors, or set horizontalAlignment to Text.AlignHCenter and bind the width to that of the parent. - When using the attached property LayoutMirroring::enabled to mirror application + When using the attached property \l {LayoutMirroring::enabled} to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment - of Text, use the read-only property \c effectiveHorizontalAlignment. + of Text, use the property \l {LayoutMirroring::enabled}. */ QDeclarativeText::HAlignment QDeclarativeText::hAlign() const { @@ -1109,10 +1108,7 @@ bool QDeclarativeTextPrivate::setHAlign(QDeclarativeText::HAlignment alignment, if (hAlign != alignment || forceAlign) { QDeclarativeText::HAlignment oldEffectiveHAlign = q->effectiveHAlign(); hAlign = alignment; - emit q->horizontalAlignmentChanged(hAlign); - if (oldEffectiveHAlign != q->effectiveHAlign()) - emit q->effectiveHorizontalAlignmentChanged(); return true; } return false; @@ -1134,7 +1130,6 @@ void QDeclarativeTextPrivate::mirrorChange() if (q->isComponentComplete()) { if (!hAlignImplicit && (hAlign == QDeclarativeText::AlignRight || hAlign == QDeclarativeText::AlignLeft)) { updateLayout(); - emit q->effectiveHorizontalAlignmentChanged(); } } } diff --git a/src/declarative/graphicsitems/qdeclarativetext_p.h b/src/declarative/graphicsitems/qdeclarativetext_p.h index b711582..1004b71 100644 --- a/src/declarative/graphicsitems/qdeclarativetext_p.h +++ b/src/declarative/graphicsitems/qdeclarativetext_p.h @@ -70,7 +70,6 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeText : public QDeclarativeImplici Q_PROPERTY(TextStyle style READ style WRITE setStyle NOTIFY styleChanged) Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor NOTIFY styleColorChanged) Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged) - Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1) Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged) Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged) Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1) @@ -191,7 +190,6 @@ Q_SIGNALS: void paintedSizeChanged(); Q_REVISION(1) void lineHeightChanged(qreal lineHeight); Q_REVISION(1) void lineHeightModeChanged(LineHeightMode mode); - Q_REVISION(1) void effectiveHorizontalAlignmentChanged(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp index 6806df0..20b2e76 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp @@ -458,7 +458,6 @@ void QDeclarativeTextEdit::setSelectedTextColor(const QColor &color) /*! \qmlproperty enumeration TextEdit::horizontalAlignment \qmlproperty enumeration TextEdit::verticalAlignment - \qmlproperty enumeration TextEdit::effectiveHorizontalAlignment Sets the horizontal and vertical alignment of the text within the TextEdit item's width and height. By default, the text alignment follows the natural alignment @@ -480,10 +479,10 @@ void QDeclarativeTextEdit::setSelectedTextColor(const QColor &color) \o TextEdit.AlignVCenter \endlist - When using the attached property LayoutMirroring::enabled to mirror application + When using the attached property \l {LayoutMirroring::enabled} to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment - of TextEdit, use the read-only property \c effectiveHorizontalAlignment. + of TextEdit, use the property \l {LayoutMirroring::enabled}. */ QDeclarativeTextEdit::HAlignment QDeclarativeTextEdit::hAlign() const { @@ -538,8 +537,6 @@ bool QDeclarativeTextEditPrivate::setHAlign(QDeclarativeTextEdit::HAlignment ali QDeclarativeTextEdit::HAlignment oldEffectiveHAlign = q->effectiveHAlign(); hAlign = alignment; emit q->horizontalAlignmentChanged(alignment); - if (oldEffectiveHAlign != q->effectiveHAlign()) - emit q->effectiveHorizontalAlignmentChanged(); return true; } return false; @@ -562,7 +559,6 @@ void QDeclarativeTextEditPrivate::mirrorChange() if (!hAlignImplicit && (hAlign == QDeclarativeTextEdit::AlignRight || hAlign == QDeclarativeTextEdit::AlignLeft)) { updateDefaultTextOption(); q->updateSize(); - emit q->effectiveHorizontalAlignmentChanged(); } } } diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p.h index f9a6c73..d8fc3bc 100644 --- a/src/declarative/graphicsitems/qdeclarativetextedit_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextedit_p.h @@ -73,7 +73,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextEdit : public QDeclarativeImplicitSizePa Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged) Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged) - Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1) Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign NOTIFY verticalAlignmentChanged) Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged) Q_PROPERTY(int lineCount READ lineCount NOTIFY lineCountChanged REVISION 1) @@ -249,7 +248,6 @@ Q_SIGNALS: Q_REVISION(1) void linkActivated(const QString &link); Q_REVISION(1) void canPasteChanged(); Q_REVISION(1) void inputMethodComposingChanged(); - Q_REVISION(1) void effectiveHorizontalAlignmentChanged(); public Q_SLOTS: void selectAll(); diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index dd5a58e..bc9b6fd 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -236,11 +236,11 @@ void QDeclarativeTextInput::setFont(const QFont &font) if (oldFont != d->font) { d->control->setFont(d->font); + updateSize(); + updateCursorRectangle(); if(d->cursorItem){ d->cursorItem->setHeight(QFontMetrics(d->font).height()); - moveCursor(); } - updateSize(); } emit fontChanged(d->sourceFont); } @@ -326,7 +326,6 @@ void QDeclarativeTextInput::setSelectedTextColor(const QColor &color) /*! \qmlproperty enumeration TextInput::horizontalAlignment - \qmlproperty enumeration TextInput::effectiveHorizontalAlignment Sets the horizontal alignment of the text within the TextInput item's width and height. By default, the text alignment follows the natural alignment @@ -342,10 +341,10 @@ void QDeclarativeTextInput::setSelectedTextColor(const QColor &color) The valid values for \c horizontalAlignment are \c TextInput.AlignLeft, \c TextInput.AlignRight and \c TextInput.AlignHCenter. - When using the attached property LayoutMirroring::enabled to mirror application + When using the attached property \l {LayoutMirroring::enabled} to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment - of TextInput, use the read-only property \c effectiveHorizontalAlignment. + of TextInput, use the property \l {LayoutMirroring::enabled}. */ QDeclarativeTextInput::HAlignment QDeclarativeTextInput::hAlign() const { @@ -359,8 +358,7 @@ void QDeclarativeTextInput::setHAlign(HAlignment align) bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror; d->hAlignImplicit = false; if (d->setHAlign(align, forceAlign) && isComponentComplete()) { - updateRect(); - d->updateHorizontalScroll(); + updateCursorRectangle(); } } @@ -369,8 +367,7 @@ void QDeclarativeTextInput::resetHAlign() Q_D(QDeclarativeTextInput); d->hAlignImplicit = true; if (d->determineHorizontalAlignment() && isComponentComplete()) { - updateRect(); - d->updateHorizontalScroll(); + updateCursorRectangle(); } } @@ -400,8 +397,6 @@ bool QDeclarativeTextInputPrivate::setHAlign(QDeclarativeTextInput::HAlignment a QDeclarativeTextInput::HAlignment oldEffectiveHAlign = q->effectiveHAlign(); hAlign = alignment; emit q->horizontalAlignmentChanged(alignment); - if (oldEffectiveHAlign != q->effectiveHAlign()) - emit q->effectiveHorizontalAlignmentChanged(); return true; } return false; @@ -423,9 +418,8 @@ void QDeclarativeTextInputPrivate::mirrorChange() Q_Q(QDeclarativeTextInput); if (q->isComponentComplete()) { if (!hAlignImplicit && (hAlign == QDeclarativeTextInput::AlignRight || hAlign == QDeclarativeTextInput::AlignLeft)) { - q->updateRect(); + q->updateCursorRectangle(); updateHorizontalScroll(); - emit q->effectiveHorizontalAlignmentChanged(); } } } @@ -683,7 +677,7 @@ void QDeclarativeTextInput::setAutoScroll(bool b) d->autoScroll = b; //We need to repaint so that the scrolling is taking into account. updateSize(true); - d->updateHorizontalScroll(); + updateCursorRectangle(); emit autoScrollChanged(d->autoScroll); } @@ -947,10 +941,6 @@ void QDeclarativeTextInput::setCursorDelegate(QDeclarativeComponent* c) d->cursorComponent = c; if(!c){ //note that the components are owned by something else - disconnect(d->control, SIGNAL(cursorPositionChanged(int,int)), - this, SLOT(moveCursor())); - disconnect(d->control, SIGNAL(updateMicroFocus()), - this, SLOT(moveCursor())); delete d->cursorItem; }else{ d->startCreatingCursor(); @@ -962,10 +952,6 @@ void QDeclarativeTextInput::setCursorDelegate(QDeclarativeComponent* c) void QDeclarativeTextInputPrivate::startCreatingCursor() { Q_Q(QDeclarativeTextInput); - q->connect(control, SIGNAL(cursorPositionChanged(int,int)), - q, SLOT(moveCursor()), Qt::UniqueConnection); - q->connect(control, SIGNAL(updateMicroFocus()), - q, SLOT(moveCursor()), Qt::UniqueConnection); if(cursorComponent->isReady()){ q->createCursor(); }else if(cursorComponent->isLoading()){ @@ -1001,15 +987,6 @@ void QDeclarativeTextInput::createCursor() d->cursorItem->setHeight(d->control->height()-1); // -1 to counter QLineControl's +1 which is not consistent with Text. } -void QDeclarativeTextInput::moveCursor() -{ - Q_D(QDeclarativeTextInput); - if(!d->cursorItem) - return; - d->updateHorizontalScroll(); - d->cursorItem->setX(d->control->cursorToX() - d->hscroll); -} - /*! \qmlmethod rect TextInput::positionToRectangle(int pos) @@ -1118,8 +1095,6 @@ void QDeclarativeTextInput::inputMethodEvent(QInputMethodEvent *ev) ev->ignore(); } else { d->control->processInputMethodEvent(ev); - updateSize(); - d->updateHorizontalScroll(); } } if (!ev->isAccepted()) @@ -1297,7 +1272,7 @@ void QDeclarativeTextInput::geometryChanged(const QRectF &newGeometry, Q_D(QDeclarativeTextInput); if (newGeometry.width() != oldGeometry.width()) { updateSize(); - d->updateHorizontalScroll(); + updateCursorRectangle(); } QDeclarativePaintedItem::geometryChanged(newGeometry, oldGeometry); } @@ -1643,7 +1618,6 @@ void QDeclarativeTextInput::moveCursorSelection(int position) { Q_D(QDeclarativeTextInput); d->control->moveCursor(position, true); - d->updateHorizontalScroll(); } /*! @@ -1901,7 +1875,7 @@ void QDeclarativeTextInputPrivate::init() canPaste = !control->isReadOnly() && QApplication::clipboard()->text().length() != 0; #endif // QT_NO_CLIPBOARD q->connect(control, SIGNAL(updateMicroFocus()), - q, SLOT(updateMicroFocus())); + q, SLOT(updateCursorRectangle())); q->connect(control, SIGNAL(displayTextChanged(QString)), q, SLOT(updateRect())); q->updateSize(); @@ -1917,9 +1891,7 @@ void QDeclarativeTextInputPrivate::init() void QDeclarativeTextInput::cursorPosChanged() { Q_D(QDeclarativeTextInput); - d->updateHorizontalScroll(); - updateRect();//TODO: Only update rect between pos's - updateMicroFocus(); + updateCursorRectangle(); emit cursorPositionChanged(); d->control->resetCursorBlinkTimer(); @@ -1935,6 +1907,17 @@ void QDeclarativeTextInput::cursorPosChanged() } } +void QDeclarativeTextInput::updateCursorRectangle() +{ + Q_D(QDeclarativeTextInput); + d->updateHorizontalScroll(); + updateRect();//TODO: Only update rect between pos's + updateMicroFocus(); + emit cursorRectangleChanged(); + if (d->cursorItem) + d->cursorItem->setX(d->control->cursorToX() - d->hscroll); +} + void QDeclarativeTextInput::selectionChanged() { Q_D(QDeclarativeTextInput); diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p.h index aaf8859..2c2f230 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput_p.h +++ b/src/declarative/graphicsitems/qdeclarativetextinput_p.h @@ -71,11 +71,10 @@ class Q_AUTOTEST_EXPORT QDeclarativeTextInput : public QDeclarativeImplicitSizeP Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor NOTIFY selectedTextColorChanged) Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged) - Q_PROPERTY(HAlignment effectiveHorizontalAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION 1) Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged) Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged) Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged) - Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorPositionChanged) + Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged) Q_PROPERTY(QDeclarativeComponent *cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged) Q_PROPERTY(int selectionStart READ selectionStart NOTIFY selectionStartChanged) Q_PROPERTY(int selectionEnd READ selectionEnd NOTIFY selectionEndChanged) @@ -221,6 +220,7 @@ public: Q_SIGNALS: void textChanged(); void cursorPositionChanged(); + void cursorRectangleChanged(); void selectionStartChanged(); void selectionEndChanged(); void selectedTextChanged(); @@ -246,7 +246,6 @@ Q_SIGNALS: Q_REVISION(1) void mouseSelectionModeChanged(SelectionMode mode); Q_REVISION(1) void canPasteChanged(); Q_REVISION(1) void inputMethodComposingChanged(); - Q_REVISION(1) void effectiveHorizontalAlignmentChanged(); protected: virtual void geometryChanged(const QRectF &newGeometry, @@ -279,8 +278,8 @@ private Q_SLOTS: void q_textChanged(); void selectionChanged(); void createCursor(); - void moveCursor(); void cursorPosChanged(); + void updateCursorRectangle(); void updateRect(const QRect &r = QRect()); void q_canPasteChanged(); diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index b81f631..8679445 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -771,9 +771,6 @@ QNetworkAccessManager *QDeclarativeEngine::networkAccessManager() const All required image providers should be added to the engine before any QML sources files are loaded. - Note that images loaded from a QDeclarativeImageProvider are cached - by QPixmapCache, similar to any image loaded by QML. - \sa removeImageProvider() */ void QDeclarativeEngine::addImageProvider(const QString &providerId, QDeclarativeImageProvider *provider) @@ -1716,9 +1713,6 @@ QScriptValue QDeclarativeEnginePrivate::rect(QScriptContext *ctxt, QScriptEngine qsreal w = ctxt->argument(2).toNumber(); qsreal h = ctxt->argument(3).toNumber(); - if (w < 0 || h < 0) - return engine->nullValue(); - return QDeclarativeEnginePrivate::get(engine)->scriptValueFromVariant(QVariant::fromValue(QRectF(x, y, w, h))); } diff --git a/src/declarative/qml/qdeclarativeimageprovider.cpp b/src/declarative/qml/qdeclarativeimageprovider.cpp index 559adf4..fa88c00 100644 --- a/src/declarative/qml/qdeclarativeimageprovider.cpp +++ b/src/declarative/qml/qdeclarativeimageprovider.cpp @@ -136,7 +136,8 @@ public: Image providers that support QImage loading automatically include support for asychronous loading of images. To enable asynchronous loading for an - \l Image source, set \l Image::asynchronous to \c true. When this is enabled, + image source, set the \c asynchronous property to \c true for the relevant + \l Image, \l BorderImage or \l AnimatedImage object. When this is enabled, the image request to the provider is run in a low priority thread, allowing image loading to be executed in the background, and reducing the performance impact on the user interface. @@ -147,6 +148,17 @@ public: \c true, the value is ignored and the image is loaded synchronously. + + \section2 Image caching + + Images returned by a QDeclarativeImageProvider are automatically cached, + similar to any image loaded by the QML engine. When an image with a + "image://" prefix is loaded from cache, requestImage() and requestPixmap() + will not be called for the relevant image provider. If an image should always + be fetched from the image provider, and should not be cached at all, set the + \c cache property to \c false for the relevant \l Image, \l BorderImage or + \l AnimatedImage object. + \sa QDeclarativeEngine::addImageProvider() */ diff --git a/src/declarative/qml/qperformancetimer.cpp b/src/declarative/qml/qperformancetimer.cpp index 9fc0d35..659a339 100644 --- a/src/declarative/qml/qperformancetimer.cpp +++ b/src/declarative/qml/qperformancetimer.cpp @@ -45,14 +45,15 @@ #include <sys/time.h> #include <unistd.h> #include <mach/mach_time.h> -#elif defined(Q_OS_UNIX) -#include <sys/time.h> -#include <time.h> -#include <unistd.h> #elif defined(Q_OS_SYMBIAN) #include <e32std.h> #include <sys/time.h> #include <hal.h> +#include <hal_data.h> +#elif defined(Q_OS_UNIX) +#include <sys/time.h> +#include <time.h> +#include <unistd.h> #elif defined(Q_OS_WIN) #include <windows.h> #endif @@ -84,6 +85,29 @@ qint64 QPerformanceTimer::elapsed() const return absoluteToNSecs(cpu_time - t1); } +////////////////////////////// Symbian ////////////////////////////// +#elif defined(Q_OS_SYMBIAN) + +static qint64 getTimeFromTick(quint64 elapsed) +{ + static TInt freq = 0; + if (!freq) + HAL::Get(HALData::EFastCounterFrequency, freq); + + return (elapsed * 1000000000) / freq; +} + +void QPerformanceTimer::start() +{ + t1 = User::FastCounter(); +} + +qint64 QPerformanceTimer::elapsed() const +{ + return getTimeFromTick(User::FastCounter() - t1); +} + + ////////////////////////////// Unix ////////////////////////////// #elif defined(Q_OS_UNIX) @@ -158,29 +182,6 @@ qint64 QPerformanceTimer::elapsed() const return sec * Q_INT64_C(1000000000) + frac; } -////////////////////////////// Symbian ////////////////////////////// -#elif defined(Q_OS_SYMBIAN) - -static qint64 getTimeFromTick(quint64 elapsed) -{ - static TInt freq; - if (!freq) - HAL::Get(HALData::EFastCounterFrequency, freq); - - // ### not sure on units - return elapsed / freq; -} - -void QPerformanceTimer::start() -{ - t1 = User::FastCounter(); -} - -qint64 QPerformanceTimer::elapsed() const -{ - return getTimeFromTick(User::FastCounter() - t1); -} - ////////////////////////////// Windows ////////////////////////////// #elif defined(Q_OS_WIN) diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp index efaa7f0..ce21bcd 100644 --- a/src/declarative/util/qdeclarativeanimation.cpp +++ b/src/declarative/util/qdeclarativeanimation.cpp @@ -1522,6 +1522,7 @@ void QDeclarativeAnimationGroupPrivate::append_animation(QDeclarativeListPropert QDeclarativeAnimationGroup *q = qobject_cast<QDeclarativeAnimationGroup *>(list->object); if (q) { a->setGroup(q); + // This is an optimization for the parenting that already occurs via addAnimation QDeclarative_setParent_noEvent(a->qtAnimation(), q->d_func()->ag); q->d_func()->ag->addAnimation(a->qtAnimation()); } @@ -1531,9 +1532,12 @@ void QDeclarativeAnimationGroupPrivate::clear_animation(QDeclarativeListProperty { QDeclarativeAnimationGroup *q = qobject_cast<QDeclarativeAnimationGroup *>(list->object); if (q) { - for (int i = 0; i < q->d_func()->animations.count(); ++i) - q->d_func()->animations.at(i)->setGroup(0); - q->d_func()->animations.clear(); + while (q->d_func()->animations.count()) { + QDeclarativeAbstractAnimation *firstAnim = q->d_func()->animations.at(0); + QDeclarative_setParent_noEvent(firstAnim->qtAnimation(), 0); + q->d_func()->ag->removeAnimation(firstAnim->qtAnimation()); + firstAnim->setGroup(0); + } } } diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp index 07d3977..3557425 100644 --- a/src/declarative/util/qdeclarativepixmapcache.cpp +++ b/src/declarative/util/qdeclarativepixmapcache.cpp @@ -584,6 +584,7 @@ public: void unreferencePixmap(QDeclarativePixmapData *); void referencePixmap(QDeclarativePixmapData *); + void flushCache(); protected: virtual void timerEvent(QTimerEvent *); @@ -682,6 +683,14 @@ void QDeclarativePixmapStore::timerEvent(QTimerEvent *) } } +/* + Remove all unreferenced pixmaps from the cache. +*/ +void QDeclarativePixmapStore::flushCache() +{ + shrinkCache(m_unreferencedCost); +} + QDeclarativePixmapReply::QDeclarativePixmapReply(QDeclarativePixmapData *d) : data(d), reader(0), requestSize(d->requestSize), loading(false), redirectCount(0) { @@ -1075,6 +1084,11 @@ bool QDeclarativePixmap::connectDownloadProgress(QObject *object, int method) return QMetaObject::connect(d->reply, QDeclarativePixmapReply::downloadProgressIndex, object, method); } +void QDeclarativePixmap::flushCache() +{ + pixmapStore()->flushCache(); +} + QT_END_NAMESPACE #include <qdeclarativepixmapcache.moc> diff --git a/src/declarative/util/qdeclarativepixmapcache_p.h b/src/declarative/util/qdeclarativepixmapcache_p.h index 396c196..4976906 100644 --- a/src/declarative/util/qdeclarativepixmapcache_p.h +++ b/src/declarative/util/qdeclarativepixmapcache_p.h @@ -103,6 +103,8 @@ public: bool connectDownloadProgress(QObject *, const char *); bool connectDownloadProgress(QObject *, int); + static void flushCache(); + private: Q_DISABLE_COPY(QDeclarativePixmap) QDeclarativePixmapData *d; diff --git a/src/declarative/util/qdeclarativetransition.cpp b/src/declarative/util/qdeclarativetransition.cpp index 273060b..b63407c 100644 --- a/src/declarative/util/qdeclarativetransition.cpp +++ b/src/declarative/util/qdeclarativetransition.cpp @@ -130,6 +130,9 @@ public: endState->complete(); } static void append_animation(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, QDeclarativeAbstractAnimation *a); + static int animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list); + static QDeclarativeAbstractAnimation* animation_at(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, int pos); + static void clear_animations(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list); QList<QDeclarativeAbstractAnimation *> animations; }; @@ -141,6 +144,28 @@ void QDeclarativeTransitionPrivate::append_animation(QDeclarativeListProperty<QD a->setDisableUserControl(); } +int QDeclarativeTransitionPrivate::animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list) +{ + QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object); + return q->d_func()->animations.count(); +} + +QDeclarativeAbstractAnimation* QDeclarativeTransitionPrivate::animation_at(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, int pos) +{ + QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object); + return q->d_func()->animations.at(pos); +} + +void QDeclarativeTransitionPrivate::clear_animations(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list) +{ + QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object); + while (q->d_func()->animations.count()) { + QDeclarativeAbstractAnimation *firstAnim = q->d_func()->animations.at(0); + q->d_func()->group.removeAnimation(firstAnim->qtAnimation()); + q->d_func()->animations.removeAll(firstAnim); + } +} + void ParallelAnimationWrapper::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { QParallelAnimationGroup::updateState(newState, oldState); @@ -309,7 +334,10 @@ void QDeclarativeTransition::setToState(const QString &t) QDeclarativeListProperty<QDeclarativeAbstractAnimation> QDeclarativeTransition::animations() { Q_D(QDeclarativeTransition); - return QDeclarativeListProperty<QDeclarativeAbstractAnimation>(this, &d->animations, QDeclarativeTransitionPrivate::append_animation); + return QDeclarativeListProperty<QDeclarativeAbstractAnimation>(this, &d->animations, QDeclarativeTransitionPrivate::append_animation, + QDeclarativeTransitionPrivate::animation_count, + QDeclarativeTransitionPrivate::animation_at, + QDeclarativeTransitionPrivate::clear_animations); } QT_END_NAMESPACE diff --git a/src/declarative/util/qdeclarativetransitionmanager.cpp b/src/declarative/util/qdeclarativetransitionmanager.cpp index 944b37f..6e96ac9 100644 --- a/src/declarative/util/qdeclarativetransitionmanager.cpp +++ b/src/declarative/util/qdeclarativetransitionmanager.cpp @@ -56,12 +56,12 @@ class QDeclarativeTransitionManagerPrivate { public: QDeclarativeTransitionManagerPrivate() - : state(0), transition(0) {} + : state(0) {} void applyBindings(); typedef QList<QDeclarativeSimpleAction> SimpleActionList; QDeclarativeState *state; - QDeclarativeTransition *transition; + QDeclarativeGuard<QDeclarativeTransition> transition; QDeclarativeStateOperation::ActionList bindingsList; SimpleActionList completeList; }; @@ -253,7 +253,7 @@ void QDeclarativeTransitionManager::cancel() { if (d->transition) { // ### this could potentially trigger a complete in rare circumstances - d->transition->stop(); + d->transition->stop(); d->transition = 0; } diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp index f6be2d7..bab991b 100644 --- a/src/declarative/util/qdeclarativeview.cpp +++ b/src/declarative/util/qdeclarativeview.cpp @@ -49,7 +49,7 @@ #include <qdeclarativeguard_p.h> #include <private/qdeclarativedebugtrace_p.h> -#include <private/qdeclarativeobserverservice_p.h> +#include <private/qdeclarativeinspectorservice_p.h> #include <qscriptvalueiterator.h> #include <qdebug.h> @@ -301,7 +301,7 @@ void QDeclarativeViewPrivate::init() q->viewport()->setAttribute(Qt::WA_NoSystemBackground); #endif - QDeclarativeObserverService::instance()->addView(q); + QDeclarativeInspectorService::instance()->addView(q); } /*! @@ -309,7 +309,7 @@ void QDeclarativeViewPrivate::init() */ QDeclarativeView::~QDeclarativeView() { - QDeclarativeObserverService::instance()->removeView(this); + QDeclarativeInspectorService::instance()->removeView(this); } /*! \property QDeclarativeView::source diff --git a/src/gui/accessible/qaccessible_win.cpp b/src/gui/accessible/qaccessible_win.cpp index 3c42864..79ac442 100644 --- a/src/gui/accessible/qaccessible_win.cpp +++ b/src/gui/accessible/qaccessible_win.cpp @@ -47,6 +47,11 @@ #include "qt_windows.h" #include "qwidget.h" #include "qsettings.h" +#include <QtCore/qmap.h> +#include <QtCore/qpair.h> +#include <QtGui/qgraphicsitem.h> +#include <QtGui/qgraphicsscene.h> +#include <QtGui/qgraphicsview.h> #include <winuser.h> #if !defined(WINABLEAPI) @@ -148,6 +153,106 @@ static const char *roleString(QAccessible::Role role) return roles[int(role)]; } +static const char *eventString(QAccessible::Event ev) +{ + static const char *events[] = { + "null", // 0 + "SoundPlayed" /*= 0x0001*/, + "Alert" /*= 0x0002*/, + "ForegroundChanged" /*= 0x0003*/, + "MenuStart" /*= 0x0004*/, + "MenuEnd" /*= 0x0005*/, + "PopupMenuStart" /*= 0x0006*/, + "PopupMenuEnd" /*= 0x0007*/, + "ContextHelpStart" /*= 0x000C*/, // 8 + "ContextHelpEnd" /*= 0x000D*/, + "DragDropStart" /*= 0x000E*/, + "DragDropEnd" /*= 0x000F*/, + "DialogStart" /*= 0x0010*/, + "DialogEnd" /*= 0x0011*/, + "ScrollingStart" /*= 0x0012*/, + "ScrollingEnd" /*= 0x0013*/, + "MenuCommand" /*= 0x0018*/, // 16 + + // Values from IAccessible2 + "ActionChanged" /*= 0x0101*/, // 17 + "ActiveDescendantChanged", + "AttributeChanged", + "DocumentContentChanged", + "DocumentLoadComplete", + "DocumentLoadStopped", + "DocumentReload", + "HyperlinkEndIndexChanged", + "HyperlinkNumberOfAnchorsChanged", + "HyperlinkSelectedLinkChanged", + "HypertextLinkActivated", + "HypertextLinkSelected", + "HyperlinkStartIndexChanged", + "HypertextChanged", + "HypertextNLinksChanged", + "ObjectAttributeChanged", + "PageChanged", + "SectionChanged", + "TableCaptionChanged", + "TableColumnDescriptionChanged", + "TableColumnHeaderChanged", + "TableModelChanged", + "TableRowDescriptionChanged", + "TableRowHeaderChanged", + "TableSummaryChanged", + "TextAttributeChanged", + "TextCaretMoved", + // TextChanged, deprecated, use TextUpdated + //TextColumnChanged = TextCaretMoved + 2, + "TextInserted", + "TextRemoved", + "TextUpdated", + "TextSelectionChanged", + "VisibleDataChanged", /*= 0x0101+32*/ + "ObjectCreated" /*= 0x8000*/, // 49 + "ObjectDestroyed" /*= 0x8001*/, + "ObjectShow" /*= 0x8002*/, + "ObjectHide" /*= 0x8003*/, + "ObjectReorder" /*= 0x8004*/, + "Focus" /*= 0x8005*/, + "Selection" /*= 0x8006*/, + "SelectionAdd" /*= 0x8007*/, + "SelectionRemove" /*= 0x8008*/, + "SelectionWithin" /*= 0x8009*/, + "StateChanged" /*= 0x800A*/, + "LocationChanged" /*= 0x800B*/, + "NameChanged" /*= 0x800C*/, + "DescriptionChanged" /*= 0x800D*/, + "ValueChanged" /*= 0x800E*/, + "ParentChanged" /*= 0x800F*/, + "HelpChanged" /*= 0x80A0*/, + "DefaultActionChanged" /*= 0x80B0*/, + "AcceleratorChanged" /*= 0x80C0*/ + }; + int e = int(ev); + if (e <= 0x80c0) { + const int last = sizeof(events)/sizeof(char*) - 1; + + if (e <= 0x07) + return events[e]; + else if (e <= 0x13) + return events[e - 0x0c + 8]; + else if (e == 0x18) + return events[16]; + else if (e <= 0x0101 + 32) + return events[e - 0x101 + 17]; + else if (e <= 0x800f) + return events[e - 0x8000 + 49]; + else if (e == 0x80a0) + return events[last - 2]; + else if (e == 0x80b0) + return events[last - 1]; + else if (e == 0x80c0) + return events[last]; + } + return "unknown"; +}; + void showDebug(const char* funcName, const QAccessibleInterface *iface) { qDebug() << "Role:" << roleString(iface->role(0)) @@ -159,6 +264,12 @@ void showDebug(const char* funcName, const QAccessibleInterface *iface) # define showDebug(f, iface) #endif +// This stuff is used for widgets/items with no window handle: +typedef QMap<int, QPair<QObject*,int> > NotifyMap; +Q_GLOBAL_STATIC(NotifyMap, qAccessibleRecentSentEvents) +static int eventNum = 0; + + void QAccessible::initialize() { @@ -251,18 +362,35 @@ void QAccessible::updateAccessibility(QObject *o, int who, Event reason) // An event has to be associated with a window, // so find the first parent that is a widget. QWidget *w = 0; - if (o->isWidgetType()) { - w = (QWidget*)o; - } else { - QObject *p = o; - while ((p = p->parent()) != 0) { - if (p->isWidgetType()) { - w = (QWidget*)p; + QObject *p = o; + do { + if (p->isWidgetType()) { + w = static_cast<QWidget*>(p); + if (w->internalWinId()) break; + } + if (QGraphicsObject *gfxObj = qobject_cast<QGraphicsObject*>(p)) { + QGraphicsItem *parentItem = gfxObj->parentItem(); + if (parentItem) { + p = parentItem->toGraphicsObject(); + } else { + QGraphicsView *view = 0; + if (QGraphicsScene *scene = gfxObj->scene()) { + QWidget *fw = QApplication::focusWidget(); + const QList<QGraphicsView*> views = scene->views(); + for (int i = 0 ; i < views.count() && view != fw; ++i) { + view = views.at(i); + } + } + p = view; } + } else { + p = p->parent(); } - } + } while (p); + + //qDebug() << "updateAccessibility(), hwnd:" << w << ", object:" << o << "," << eventString(reason); if (!w) { if (reason != QAccessible::ContextHelpStart && reason != QAccessible::ContextHelpEnd) @@ -282,12 +410,81 @@ void QAccessible::updateAccessibility(QObject *o, int who, Event reason) } } + WId wid = w->internalWinId(); if (reason != MenuCommand) { // MenuCommand is faked - ptrNotifyWinEvent(reason, w->winId(), OBJID_CLIENT, who); + if (w != o) { + // See comment "SENDING EVENTS TO OBJECTS WITH NO WINDOW HANDLE" + eventNum %= 50; //[0..49] + int eventId = - eventNum - 1; + + qAccessibleRecentSentEvents()->insert(eventId, qMakePair(o,who)); + ptrNotifyWinEvent(reason, wid, OBJID_CLIENT, eventId ); + + ++eventNum; + } else { + ptrNotifyWinEvent(reason, wid, OBJID_CLIENT, who); + } } #endif // Q_WS_WINCE } +/* == SENDING EVENTS TO OBJECTS WITH NO WINDOW HANDLE == + + If the user requested to send the event to a widget with no window, + we need to send an event to an object with no hwnd. + The way we do that is to send it to the *first* ancestor widget + with a window. + Then we'll need a way of identifying the child: + We'll just keep a list of the most recent events that we have sent, + where each entry in the list is identified by a negative value + between [-50,-1]. This negative value we will pass on to + NotifyWinEvent() as the child id. When the negative value have + reached -50, it will wrap around to -1. This seems to be enough + + Now, when the client receives that event, he will first call + AccessibleObjectFromEvent() where dwChildID is the special + negative value. AccessibleObjectFromEvent does two steps: + 1. It will first sent a WM_GETOBJECT to the server, asking + for the IAccessible interface for the HWND. + 2. With the IAccessible interface it got hold of it will call + acc_getChild where the child id argument is the special + negative identifier. In our reimplementation of get_accChild + we check for this if the child id is negative. If it is, then + we'll look up in our table for the entry that is associated + with that value. + The entry will then contain a pointer to the QObject /QWidget + that we can use to call queryAccessibleInterface() on. + + + The following figure shows how the interaction between server and + client is in the case when the server is sending an event. + +SERVER (Qt) | CLIENT | +--------------------------------------------+---------------------------------------+ + | +acc->updateAccessibility(obj, childIndex) | + | +recentEvents()->insert(- 1 - eventNum, | + qMakePair(obj, childIndex) | +NotifyWinEvent(hwnd, childId) => | + | AccessibleObjectFromEvent(event, hwnd, OBJID_CLIENT, childId ) + | will do: + <=== 1. send WM_GETOBJECT(hwnd, OBJID_CLIENT) +widget ~= hwnd +iface = queryAccessibleInteface(widget) +(create IAccessible interface wrapper for + iface) + return iface ===> IAccessible* iface; (for hwnd) + | + <=== call iface->get_accChild(childId) +get_accChild() { | + if (varChildID.lVal < 0) { + QPair ref = recentEvents().value(varChildID.lVal); + [...] + } +*/ + + void QAccessible::setRootObject(QObject *o) { if (rootObjectHandler) { @@ -418,15 +615,18 @@ public: delete accessible; } + /* IUnknown */ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID *); ULONG STDMETHODCALLTYPE AddRef(); ULONG STDMETHODCALLTYPE Release(); + /* IDispatch */ HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int *); HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int, unsigned long, ITypeInfo **); HRESULT STDMETHODCALLTYPE GetIDsOfNames(const _GUID &, wchar_t **, unsigned int, unsigned long, long *); HRESULT STDMETHODCALLTYPE Invoke(long, const _GUID &, unsigned long, unsigned short, tagDISPPARAMS *, tagVARIANT *, tagEXCEPINFO *, unsigned int *); + /* IAccessible */ HRESULT STDMETHODCALLTYPE accHitTest(long xLeft, long yTop, VARIANT *pvarID); HRESULT STDMETHODCALLTYPE accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varID); HRESULT STDMETHODCALLTYPE accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEnd); @@ -451,6 +651,7 @@ public: HRESULT STDMETHODCALLTYPE get_accFocus(VARIANT *pvarID); HRESULT STDMETHODCALLTYPE get_accSelection(VARIANT *pvarChildren); + /* IOleWindow */ HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); @@ -896,9 +1097,30 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accChild(VARIANT varChildID, I if (varChildID.vt == VT_EMPTY) return E_INVALIDARG; + + int childIndex = varChildID.lVal; QAccessibleInterface *acc = 0; - RelationFlag rel = varChildID.lVal ? Child : Self; - accessible->navigate(rel, varChildID.lVal, &acc); + + if (childIndex < 0) { + const int entry = childIndex; + QPair<QObject*, int> ref = qAccessibleRecentSentEvents()->value(entry); + if (ref.first) { + acc = queryAccessibleInterface(ref.first); + if (acc && ref.second) { + if (ref.second) { + QAccessibleInterface *res; + int index = acc->navigate(Child, ref.second, &res); + delete acc; + if (index == -1) + return E_INVALIDARG; + acc = res; + } + } + } + } else { + RelationFlag rel = childIndex ? Child : Self; + accessible->navigate(rel, childIndex, &acc); + } if (acc) { QWindowsAccessible* wacc = new QWindowsAccessible(acc); @@ -1203,7 +1425,7 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::GetWindow(HWND *phwnd) if (!o || !o->isWidgetType()) return E_FAIL; - *phwnd = static_cast<QWidget*>(o)->winId(); + *phwnd = static_cast<QWidget*>(o)->effectiveWinId(); return S_OK; } diff --git a/src/gui/dialogs/dialogs.pri b/src/gui/dialogs/dialogs.pri index 6ba707c..1dddb44 100644 --- a/src/gui/dialogs/dialogs.pri +++ b/src/gui/dialogs/dialogs.pri @@ -109,7 +109,11 @@ SOURCES += \ dialogs/qprintpreviewdialog.cpp symbian:contains(QT_CONFIG, s60) { - LIBS += -lCommonDialogs + contains(CONFIG, is_using_gnupoc) { + LIBS += -lcommondialogs + } else { + LIBS += -lCommonDialogs + } SOURCES += dialogs/qfiledialog_symbian.cpp \ dialogs/qcolordialog_symbian.cpp } diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp index c22af65..5e8533e 100644 --- a/src/gui/dialogs/qfiledialog.cpp +++ b/src/gui/dialogs/qfiledialog.cpp @@ -66,6 +66,9 @@ #if defined(Q_OS_WINCE) extern bool qt_priv_ptr_valid; #endif +#if defined(Q_OS_UNIX) +#include <pwd.h> +#endif #endif QT_BEGIN_NAMESPACE @@ -858,23 +861,78 @@ void QFileDialog::selectFile(const QString &filename) d->lineEdit()->setText(file); } +#ifdef Q_OS_UNIX +Q_AUTOTEST_EXPORT QString qt_tildeExpansion(const QString &path, bool *expanded = 0) +{ + if (expanded != 0) + *expanded = false; + if (!path.startsWith(QLatin1Char('~'))) + return path; + QString ret = path; + QStringList tokens = ret.split(QDir::separator()); + if (tokens.first() == QLatin1String("~")) { + ret.replace(0, 1, QDir::homePath()); + } else { + QString userName = tokens.first(); + userName.remove(0, 1); +#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) + passwd pw; + passwd *tmpPw; + char buf[200]; + const int bufSize = sizeof(buf); + int err = getpwnam_r(userName.toLocal8Bit().constData(), &pw, buf, bufSize, &tmpPw); + if (err || !tmpPw) + return ret; + const QString homePath = QString::fromLocal8Bit(pw.pw_dir); +#else + passwd *pw = getpwnam(userName.toLocal8Bit().constData()); + if (!pw) + return ret; + const QString homePath = QString::fromLocal8Bit(pw->pw_dir); +#endif + ret.replace(0, tokens.first().length(), homePath); + } + if (expanded != 0) + *expanded = true; + return ret; +} +#endif + /** Returns the text in the line edit which can be one or more file names */ QStringList QFileDialogPrivate::typedFiles() const { + Q_Q(const QFileDialog); QStringList files; QString editText = lineEdit()->text(); - if (!editText.contains(QLatin1Char('"'))) + if (!editText.contains(QLatin1Char('"'))) { +#ifdef Q_OS_UNIX + const QString prefix = q->directory().absolutePath() + QDir::separator(); + if (QFile::exists(prefix + editText)) + files << editText; + else + files << qt_tildeExpansion(editText); +#else files << editText; - else { +#endif + } else { // " is used to separate files like so: "file1" "file2" "file3" ... // ### need escape character for filenames with quotes (") QStringList tokens = editText.split(QLatin1Char('\"')); for (int i=0; i<tokens.size(); ++i) { if ((i % 2) == 0) continue; // Every even token is a separator +#ifdef Q_OS_UNIX + const QString token = tokens.at(i); + const QString prefix = q->directory().absolutePath() + QDir::separator(); + if (QFile::exists(prefix + token)) + files << token; + else + files << qt_tildeExpansion(token); +#else files << toInternal(tokens.at(i)); +#endif } } return addDefaultSuffixToFiles(files); @@ -3338,6 +3396,17 @@ QStringList QFSCompleter::splitPath(const QString &path) const pathCopy = pathCopy.mid(2); else doubleSlash.clear(); +#elif defined(Q_OS_UNIX) + bool expanded; + pathCopy = qt_tildeExpansion(pathCopy, &expanded); + if (expanded) { + QFileSystemModel *dirModel; + if (proxyModel) + dirModel = qobject_cast<QFileSystemModel *>(proxyModel->sourceModel()); + else + dirModel = sourceModel; + dirModel->fetchMore(dirModel->index(pathCopy)); + } #endif QRegExp re(QLatin1Char('[') + QRegExp::escape(sep) + QLatin1Char(']')); @@ -3354,14 +3423,14 @@ QStringList QFSCompleter::splitPath(const QString &path) const parts.append(QString()); #else QStringList parts = pathCopy.split(re); - if (path[0] == sep[0]) // read the "/" at the beginning as the split removed it + if (pathCopy[0] == sep[0]) // read the "/" at the beginning as the split removed it parts[0] = sep[0]; #endif #if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN) bool startsFromRoot = !parts.isEmpty() && parts[0].endsWith(QLatin1Char(':')); #else - bool startsFromRoot = path[0] == sep[0]; + bool startsFromRoot = pathCopy[0] == sep[0]; #endif if (parts.count() == 1 || (parts.count() > 1 && !startsFromRoot)) { const QFileSystemModel *dirModel; diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp index a4a7a22..16ef5b6 100644 --- a/src/gui/dialogs/qfiledialog_symbian.cpp +++ b/src/gui/dialogs/qfiledialog_symbian.cpp @@ -44,7 +44,7 @@ #ifndef QT_NO_FILEDIALOG #include <private/qfiledialog_p.h> -#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3) +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) #include <driveinfo.h> #include <AknCommonDialogsDynMem.h> #include <CAknMemorySelectionDialogMultiDrive.h> @@ -58,7 +58,7 @@ extern QStringList qt_make_filter_list(const QString &filter); // defined in qfi extern QStringList qt_clean_filter_list(const QString &filter); // defined in qfiledialog.cpp enum DialogMode { DialogOpen, DialogSave, DialogFolder }; -#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3) +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) class CExtensionFilter : public MAknFileFilter { public: @@ -104,7 +104,7 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st const QString filter, DialogMode dialogMode) { QString selection; -#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3) +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) TFileName startFolder; if (!startDirectory.isEmpty()) { QString dir = QDir::toNativeSeparators(QFileDialogPrivate::workingDirectory(startDirectory)); diff --git a/src/gui/embedded/qkbd_qws.cpp b/src/gui/embedded/qkbd_qws.cpp index 77ae47b..5edc4d9 100644 --- a/src/gui/embedded/qkbd_qws.cpp +++ b/src/gui/embedded/qkbd_qws.cpp @@ -225,7 +225,7 @@ bool QWSKbPrivate::loadKeymap(const QString &file) ds >> qmap_magic >> qmap_version >> qmap_keymap_size >> qmap_keycompose_size; if (ds.status() != QDataStream::Ok || qmap_magic != QWSKeyboard::FileMagic || qmap_version != 1 || qmap_keymap_size == 0) { - qWarning("'%s' is ot a valid.qmap keymap file.", qPrintable(file)); + qWarning("'%s' is not a valid .qmap keymap file.", qPrintable(file)); return false; } diff --git a/src/gui/embedded/qkbdum_qws.cpp b/src/gui/embedded/qkbdum_qws.cpp index 4fbe03e..97561b5 100644 --- a/src/gui/embedded/qkbdum_qws.cpp +++ b/src/gui/embedded/qkbdum_qws.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qkbdum_qws.h" -#include "qvfbhdr.h" #if !defined(QT_NO_QWS_KEYBOARD) && !defined(QT_NO_QWS_KBD_UM) @@ -55,6 +54,7 @@ #include <qwindowsystem_qws.h> #include <qsocketnotifier.h> #include "qplatformdefs.h" +#include "qvfbhdr.h" QT_BEGIN_NAMESPACE diff --git a/src/gui/embedded/qlock.cpp b/src/gui/embedded/qlock.cpp index bb442e4..ac15431 100644 --- a/src/gui/embedded/qlock.cpp +++ b/src/gui/embedded/qlock.cpp @@ -99,7 +99,6 @@ QT_END_NAMESPACE #endif #include <string.h> #include <errno.h> -#include <qdebug.h> #include <private/qcore_unix_p.h> // overrides QT_OPEN @@ -138,8 +137,6 @@ public: */ /*! - \fn QLock::QLock(const QString &filename, char id, bool create) - Creates a lock. \a filename is the file path of the Unix-domain socket the \l{Qt for Embedded Linux} client is using. \a id is the name of the particular lock to be created on that socket. If \a create is true @@ -147,76 +144,79 @@ public: create is false the lock should exist already (as the Qt for Embedded Linux client expects). */ - QLock::QLock(const QString &filename, char id, bool create) { data = new QLockData; data->count = 0; #ifdef Q_NO_SEMAPHORE - data->file = QString(filename+id).toLocal8Bit().constData(); - for(int x = 0; x < 2; x++) { - data->id = QT_OPEN(data->file, O_RDWR | (x ? O_CREAT : 0), S_IRWXU); - if(data->id != -1 || !create) { + data->file = filename.toLocal8Bit() + id; + for (int x = 0; x < 2; ++x) { + data->id = QT_OPEN(data->file.constData(), O_RDWR | (x ? O_CREAT : 0), S_IRWXU); + if (data->id != -1 || !create) { data->owned = x; break; } } #else key_t semkey = ftok(filename.toLocal8Bit().constData(), id); - data->id = semget(semkey,0,0); + data->id = semget(semkey, 0, 0); data->owned = create; if (create) { - qt_semun arg; arg.val = 0; + qt_semun arg; + arg.val = 0; if (data->id != -1) - semctl(data->id,0,IPC_RMID,arg); - data->id = semget(semkey,1,IPC_CREAT|0600); + semctl(data->id, 0, IPC_RMID, arg); + data->id = semget(semkey, 1, IPC_CREAT | 0600); arg.val = MAX_LOCKS; - semctl(data->id,0,SETVAL,arg); - - QWSSignalHandler::instance()->addSemaphore(data->id); + semctl(data->id, 0, SETVAL, arg); } #endif - if (data->id == -1) { - int eno = errno; - qWarning("Cannot %s semaphore %s '%c'", (create ? "create" : "get"), - qPrintable(filename), id); - qDebug() << "Error" << eno << strerror(eno); + if (!isValid()) { + qWarning("QLock::QLock: Cannot %s semaphore %s '%c' (%d, %s)", + (create ? "create" : "get"), qPrintable(filename), id, + errno, strerror(errno)); } + +#ifndef QT_NO_QWS_SIGNALHANDLER + QWSSignalHandler::instance()->addLock(this); +#endif } /*! - \fn QLock::~QLock() - Destroys a lock */ - QLock::~QLock() { - if (locked()) +#ifndef QT_NO_QWS_SIGNALHANDLER + QWSSignalHandler::instance()->removeLock(this); +#endif + + while (locked()) unlock(); #ifdef Q_NO_SEMAPHORE - if(isValid()) { + if (isValid()) QT_CLOSE(data->id); - if(data->owned) - unlink(data->file); - } +#endif + if (data->owned) { +#ifdef Q_NO_SEMAPHORE + unlink(data->file.constData()); #else - if(data->owned) - QWSSignalHandler::instance()->removeSemaphore(data->id); + qt_semun semval; + semval.val = 0; + semctl(data->id, 0, IPC_RMID, semval); #endif + } delete data; + data = 0; } /*! - \fn bool QLock::isValid() const - Returns true if the lock constructor was successful; returns false if the lock could not be created or was not available to connect to. */ - bool QLock::isValid() const { - return (data->id != -1); + return data && data->id != -1; } /*! @@ -230,96 +230,72 @@ bool QLock::isValid() const will only be unlocked after a corresponding number of unlock() calls. */ - void QLock::lock(Type t) { if (!data->count) { + type = t; + + int rv; #ifdef Q_NO_SEMAPHORE - int op = LOCK_SH; - if(t == Write) - op = LOCK_EX; - for(int rv=1; rv;) { - rv = flock(data->id, op); - if (rv == -1 && errno != EINTR) - qDebug("Semop lock failure %s",strerror(errno)); - } + int op = type == Write ? LOCK_EX : LOCK_SH; + + EINTR_LOOP(rv, flock(data->id, op)); #else sembuf sops; sops.sem_num = 0; + sops.sem_op = type == Write ? -MAX_LOCKS : -1; sops.sem_flg = SEM_UNDO; - if (t == Write) { - sops.sem_op = -MAX_LOCKS; - type = Write; - } else { - sops.sem_op = -1; - type = Read; - } - - int rv; - do { - rv = semop(data->id,&sops,1); - if (rv == -1 && errno != EINTR) - qDebug("Semop lock failure %s",strerror(errno)); - } while (rv == -1 && errno == EINTR); + EINTR_LOOP(rv, semop(data->id, &sops, 1)); #endif + if (rv == -1) { + qDebug("QLock::lock(): %s", strerror(errno)); + return; + } + } else if (type == Read && t == Write) { + qDebug("QLock::lock(): Attempt to lock for write while locked for read"); } data->count++; } /*! - \fn void QLock::unlock() - Unlocks the semaphore. If other processes were blocking waiting to lock() the semaphore, one of them will wake up and succeed in - lock()ing. + locking. */ - void QLock::unlock() { - if(data->count) { + if (data->count) { data->count--; - if(!data->count) { + if (!data->count) { + int rv; #ifdef Q_NO_SEMAPHORE - for(int rv=1; rv;) { - rv = flock(data->id, LOCK_UN); - if (rv == -1 && errno != EINTR) - qDebug("Semop lock failure %s",strerror(errno)); - } + EINTR_LOOP(rv, flock(data->id, LOCK_UN)); #else sembuf sops; sops.sem_num = 0; - sops.sem_op = 1; + sops.sem_op = type == Write ? MAX_LOCKS : 1; sops.sem_flg = SEM_UNDO; - if (type == Write) - sops.sem_op = MAX_LOCKS; - int rv; - do { - rv = semop(data->id,&sops,1); - if (rv == -1 && errno != EINTR) - qDebug("Semop unlock failure %s",strerror(errno)); - } while (rv == -1 && errno == EINTR); + EINTR_LOOP(rv, semop(data->id, &sops, 1)); #endif + if (rv == -1) + qDebug("QLock::unlock(): %s", strerror(errno)); } } else { - qDebug("Unlock without corresponding lock"); + qDebug("QLock::unlock(): Unlock without corresponding lock"); } } /*! - \fn bool QLock::locked() const - Returns true if the lock is currently held by the current process; otherwise returns false. */ - bool QLock::locked() const { - return (data->count > 0); + return isValid() && data->count > 0; } QT_END_NAMESPACE #endif // QT_NO_QWS_MULTIPROCESS - diff --git a/src/gui/embedded/qmousepc_qws.cpp b/src/gui/embedded/qmousepc_qws.cpp index 5d3b182..c22cab9 100644 --- a/src/gui/embedded/qmousepc_qws.cpp +++ b/src/gui/embedded/qmousepc_qws.cpp @@ -261,7 +261,7 @@ public: usleep(50000); QT_WRITE(fd,"@EeI!",5); usleep(10000); - static const char ibuf[] = { 246, 244 }; + static const unsigned char ibuf[] = { 246, 244 }; QT_WRITE(fd,ibuf,1); QT_WRITE(fd,ibuf+1,1); if (tcflush(fd,TCIOFLUSH) == -1) { diff --git a/src/gui/embedded/qscreenlinuxfb_qws.cpp b/src/gui/embedded/qscreenlinuxfb_qws.cpp index 67c8a31..4b41b5b 100644 --- a/src/gui/embedded/qscreenlinuxfb_qws.cpp +++ b/src/gui/embedded/qscreenlinuxfb_qws.cpp @@ -110,7 +110,9 @@ QLinuxFbScreenPrivate::QLinuxFbScreenPrivate() #endif ttyfd(-1), oldKdMode(KD_TEXT) { +#ifndef QT_NO_QWS_SIGNALHANDLER QWSSignalHandler::instance()->addObject(this); +#endif } QLinuxFbScreenPrivate::~QLinuxFbScreenPrivate() @@ -263,6 +265,9 @@ QLinuxFbScreen::QLinuxFbScreen(int display_id) QLinuxFbScreen::~QLinuxFbScreen() { +#ifdef QT_NO_QWS_SIGNALHANDLER + delete d_ptr; +#endif } /*! diff --git a/src/gui/embedded/qwindowsystem_qws.cpp b/src/gui/embedded/qwindowsystem_qws.cpp index 0e4e27c..36802a8 100644 --- a/src/gui/embedded/qwindowsystem_qws.cpp +++ b/src/gui/embedded/qwindowsystem_qws.cpp @@ -2494,7 +2494,7 @@ QWSWindow *QWSServer::windowAt(const QPoint& pos) } #ifndef QT_NO_QWS_KEYBOARD -static int keyUnicode(int keycode) +static inline int keyUnicode(int keycode) { int code = 0xffff; @@ -2550,18 +2550,16 @@ void QWSServer::sendKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers mod void QWSServerPrivate::sendKeyEventUnfiltered(int unicode, int keycode, Qt::KeyboardModifiers modifiers, bool isPress, bool autoRepeat) { + QWSWindow *win = keyboardGrabber ? keyboardGrabber : qwsServerPrivate->focusw; - QWSKeyEvent event; - QWSWindow *win = keyboardGrabber ? keyboardGrabber : - qwsServerPrivate->focusw; - - event.simpleData.window = win ? win->winId() : 0; - - event.simpleData.unicode = #ifndef QT_NO_QWS_KEYBOARD - unicode < 0 ? keyUnicode(keycode) : + if (unicode < 0) + unicode = keyUnicode(keycode); #endif - unicode; + + QWSKeyEvent event; + event.simpleData.window = win ? win->winId() : 0; + event.simpleData.unicode = unicode; event.simpleData.keycode = keycode; event.simpleData.modifiers = modifiers; event.simpleData.is_press = isPress; @@ -4127,11 +4125,11 @@ void QWSServer::processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers #endif // If we press a key and it's going to be blocked, wake up the screen - if ( block && isPress ) - qwsServerPrivate->_q_screenSaverWake(); - - if ( block ) + if (block) { + if (isPress) + qwsServerPrivate->_q_screenSaverWake(); return; + } if (keyFilters) { for (int i = 0; i < keyFilters->size(); ++i) { diff --git a/src/gui/embedded/qwslock.cpp b/src/gui/embedded/qwslock.cpp index 0d65b61..c14f50b 100644 --- a/src/gui/embedded/qwslock.cpp +++ b/src/gui/embedded/qwslock.cpp @@ -45,8 +45,6 @@ #include "qwssignalhandler_p.h" -#include <qglobal.h> -#include <qdebug.h> #include <stdio.h> #include <errno.h> #include <string.h> @@ -68,164 +66,141 @@ QT_BEGIN_NAMESPACE #error QWSLock currently requires semaphores #endif -QWSLock::QWSLock() +QWSLock::QWSLock(int id) : semId(id) { - semId = semget(IPC_PRIVATE, 3, IPC_CREAT | 0666); + static unsigned short initialValues[3] = { 1, 1, 0 }; - if (semId == -1) { - perror("QWSLock::QWSLock"); - qFatal("Unable to create semaphore"); - } - QWSSignalHandler::instance()->addSemaphore(semId); - - qt_semun semval; - semval.val = 1; - - if (semctl(semId, BackingStore, SETVAL, semval) == -1) { - perror("QWSLock::QWSLock"); - qFatal("Unable to initialize backingstore semaphore"); - } - lockCount[BackingStore] = 0; - - if (semctl(semId, Communication, SETVAL, semval) == -1) { - perror("QWSLock::QWSLock"); - qFatal("Unable to initialize communication semaphore"); - } - lockCount[Communication] = 0; +#ifndef QT_NO_QWS_SIGNALHANDLER + QWSSignalHandler::instance()->addWSLock(this); +#endif - semval.val = 0; - if (semctl(semId, RegionEvent, SETVAL, semval) == -1) { - perror("QWSLock::QWSLock"); - qFatal("Unable to initialize region event semaphore"); + if (semId == -1) { + semId = semget(IPC_PRIVATE, 3, IPC_CREAT | 0666); + if (semId == -1) { + perror("QWSLock::QWSLock"); + qFatal("Unable to create semaphore"); + } + + qt_semun semval; + semval.array = initialValues; + if (semctl(semId, 0, SETALL, semval) == -1) { + perror("QWSLock::QWSLock"); + qFatal("Unable to initialize semaphores"); + } } -} -QWSLock::QWSLock(int id) -{ - semId = id; - QWSSignalHandler::instance()->addSemaphore(semId); lockCount[0] = lockCount[1] = 0; } QWSLock::~QWSLock() { - if (semId == -1) - return; - QWSSignalHandler::instance()->removeSemaphore(semId); -} +#ifndef QT_NO_QWS_SIGNALHANDLER + QWSSignalHandler::instance()->removeWSLock(this); +#endif -static bool forceLock(int semId, int semNum, int) -{ - int ret; - do { - sembuf sops = { semNum, -1, 0 }; - - // As the BackingStore lock is a mutex, and only one process may own - // the lock, it's safe to use SEM_UNDO. On the other hand, the - // Communication lock is locked by the client but unlocked by the - // server and therefore can't use SEM_UNDO. - if (semNum == QWSLock::BackingStore) - sops.sem_flg |= SEM_UNDO; - - ret = semop(semId, &sops, 1); - if (ret == -1 && errno != EINTR) - qDebug("QWSLock::lock: %s", strerror(errno)); - } while (ret == -1 && errno == EINTR); - - return (ret != -1); + if (semId != -1) { + qt_semun semval; + semval.val = 0; + semctl(semId, 0, IPC_RMID, semval); + semId = -1; + } } -static bool up(int semId, int semNum) +bool QWSLock::up(unsigned short semNum) { int ret; - do { - sembuf sops = { semNum, 1, 0 }; - ret = semop(semId, &sops, 1); - if (ret == -1 && errno != EINTR) - qDebug("QWSLock::up: %s", strerror(errno)); - } while (ret == -1 && errno == EINTR); - - return (ret != -1); + + sembuf sops = { semNum, 1, 0 }; + // As the BackingStore lock is a mutex, and only one process may own + // the lock, it's safe to use SEM_UNDO. On the other hand, the + // Communication lock is locked by the client but unlocked by the + // server and therefore can't use SEM_UNDO. + if (semNum == BackingStore) + sops.sem_flg |= SEM_UNDO; + + EINTR_LOOP(ret, semop(semId, &sops, 1)); + if (ret == -1) { + qDebug("QWSLock::up(): %s", strerror(errno)); + return false; + } + + return true; } -static bool down(int semId, int semNum) +bool QWSLock::down(unsigned short semNum, int) { int ret; - do { - sembuf sops = { semNum, -1, 0 }; - ret = semop(semId, &sops, 1); - if (ret == -1 && errno != EINTR) - qDebug("QWSLock::down: %s", strerror(errno)); - } while (ret == -1 && errno == EINTR); - - return (ret != -1); + + sembuf sops = { semNum, -1, 0 }; + // As the BackingStore lock is a mutex, and only one process may own + // the lock, it's safe to use SEM_UNDO. On the other hand, the + // Communication lock is locked by the client but unlocked by the + // server and therefore can't use SEM_UNDO. + if (semNum == BackingStore) + sops.sem_flg |= SEM_UNDO; + + EINTR_LOOP(ret, semop(semId, &sops, 1)); + if (ret == -1) { + qDebug("QWSLock::down(): %s", strerror(errno)); + return false; + } + + return true; } -static int getValue(int semId, int semNum) +int QWSLock::getValue(unsigned short semNum) const { - int ret; - do { - ret = semctl(semId, semNum, GETVAL, 0); - if (ret == -1 && errno != EINTR) - qDebug("QWSLock::getValue: %s", strerror(errno)); - } while (ret == -1 && errno == EINTR); - + int ret = semctl(semId, semNum, GETVAL, 0); + if (ret == -1) + qDebug("QWSLock::getValue(): %s", strerror(errno)); return ret; } bool QWSLock::lock(LockType type, int timeout) { if (type == RegionEvent) - return up(semId, RegionEvent); + return up(type); - if (hasLock(type)) { + if (lockCount[type] > 0) { ++lockCount[type]; return true; } - if (!forceLock(semId, type, timeout)) - return false; - ++lockCount[type]; - return true; + if (down(type, timeout)) { + ++lockCount[type]; + return true; + } + + return false; } bool QWSLock::hasLock(LockType type) { if (type == RegionEvent) - return (getValue(semId, RegionEvent) == 0); + return getValue(type) == 0; - return (lockCount[type] > 0); + return lockCount[type] > 0; } void QWSLock::unlock(LockType type) { if (type == RegionEvent) { - down(semId, RegionEvent); + down(type, -1); return; } - if (hasLock(type)) { + if (lockCount[type] > 0) { --lockCount[type]; - if (hasLock(type)) + if (lockCount[type] > 0) return; } - const int semNum = type; - int ret; - do { - sembuf sops = {semNum, 1, 0}; - if (semNum == QWSLock::BackingStore) - sops.sem_flg |= SEM_UNDO; - - ret = semop(semId, &sops, 1); - if (ret == -1 && errno != EINTR) - qDebug("QWSLock::unlock: %s", strerror(errno)); - } while (ret == -1 && errno == EINTR); + up(type); } bool QWSLock::wait(LockType type, int timeout) { - bool ok = forceLock(semId, type, timeout); + bool ok = down(type, timeout); if (ok) unlock(type); return ok; diff --git a/src/gui/embedded/qwslock_p.h b/src/gui/embedded/qwslock_p.h index 9a7f279..d020b22 100644 --- a/src/gui/embedded/qwslock_p.h +++ b/src/gui/embedded/qwslock_p.h @@ -55,17 +55,16 @@ #include <qglobal.h> -QT_BEGIN_NAMESPACE - #ifndef QT_NO_QWS_MULTIPROCESS +QT_BEGIN_NAMESPACE + class QWSLock { public: enum LockType { BackingStore, Communication, RegionEvent }; - QWSLock(); - QWSLock(int lockId); + QWSLock(int lockId = -1); ~QWSLock(); bool lock(LockType type, int timeout = -1); @@ -75,11 +74,16 @@ public: int id() const { return semId; } private: + bool up(unsigned short semNum); + bool down(unsigned short semNum, int timeout); + int getValue(unsigned short semNum) const; + int semId; int lockCount[2]; }; - QT_END_NAMESPACE + #endif // QT_NO_QWS_MULTIPROCESS + #endif // QWSLOCK_P_H diff --git a/src/gui/embedded/qwssharedmemory.cpp b/src/gui/embedded/qwssharedmemory.cpp index 66bedee..a677626 100644 --- a/src/gui/embedded/qwssharedmemory.cpp +++ b/src/gui/embedded/qwssharedmemory.cpp @@ -43,51 +43,51 @@ #if !defined(QT_NO_QWS_MULTIPROCESS) +#include <sys/types.h> +#include <sys/ipc.h> #include <sys/shm.h> +//#define QT_SHM_DEBUG + QT_BEGIN_NAMESPACE QWSSharedMemory::QWSSharedMemory() - : shmBase(0), shmSize(0), character(0), shmId(-1), key(-1) + : shmId(-1), shmBase(0), shmSize(0) { } - QWSSharedMemory::~QWSSharedMemory() { detach(); } -/* - man page says: - On Linux, it is possible to attach a shared memory segment even if it - is already marked to be deleted. However, POSIX.1-2001 does not spec- - ify this behaviour and many other implementations do not support it. -*/ - bool QWSSharedMemory::create(int size) { if (shmId != -1) detach(); - shmId = shmget(IPC_PRIVATE, size, IPC_CREAT|0600); + shmId = shmget(IPC_PRIVATE, size, IPC_CREAT | 0600); if (shmId == -1) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::create allocating shared memory"); + perror("QWSSharedMemory::create():"); qWarning("Error allocating shared memory of size %d", size); #endif return false; } - shmBase = shmat(shmId,0,0); + shmBase = shmat(shmId, 0, 0); + // On Linux, it is possible to attach a shared memory segment even if it + // is already marked to be deleted. However, POSIX.1-2001 does not specify + // this behaviour and many other implementations do not support it. shmctl(shmId, IPC_RMID, 0); - if (shmBase == (void*)-1) { + if (shmBase == (void*)-1 || !shmBase) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::create attaching to shared memory"); + perror("QWSSharedMemory::create():"); qWarning("Error attaching to shared memory id %d", shmId); #endif - shmBase = 0; + detach(); return false; } + return true; } @@ -95,91 +95,49 @@ bool QWSSharedMemory::attach(int id) { if (shmId == id) return id != -1; - if (shmId != -1) - detach(); - shmBase = shmat(id,0,0); - if (shmBase == (void*)-1) { + detach(); + + if (id == -1) + return false; + + shmId = id; + shmBase = shmat(shmId, 0, 0); + if (shmBase == (void*)-1 || !shmBase) { #ifdef QT_SHM_DEBUG - perror("QWSSharedMemory::attach attaching to shared memory"); - qWarning("Error attaching to shared memory 0x%x of size %d", - id, size()); + perror("QWSSharedMemory::attach():"); + qWarning("Error attaching to shared memory id %d", shmId); #endif - shmBase = 0; + detach(); return false; } - shmId = id; + return true; } - -void QWSSharedMemory::detach () +void QWSSharedMemory::detach() { - if (!shmBase) - return; - shmdt (shmBase); + if (shmBase && shmBase != (void*)-1) + shmdt(shmBase); shmBase = 0; shmSize = 0; shmId = -1; } -void QWSSharedMemory::setPermissions (mode_t mode) +int QWSSharedMemory::size() const { - struct shmid_ds shm; - shmctl (shmId, IPC_STAT, &shm); - shm.shm_perm.mode = mode; - shmctl (shmId, IPC_SET, &shm); -} - -int QWSSharedMemory::size () const -{ - struct shmid_ds shm; - shmctl (shmId, IPC_STAT, &shm); - return shm.shm_segsz; -} + if (shmId == -1) + return 0; + if (!shmSize) { + struct shmid_ds shm; + shmctl(shmId, IPC_STAT, &shm); + const_cast<QWSSharedMemory *>(this)->shmSize = shm.shm_segsz; + } -// old API - - - -QWSSharedMemory::QWSSharedMemory (int size, const QString &filename, char c) -{ - shmSize = size; - shmFile = filename; - shmBase = 0; - shmId = -1; - character = c; - key = ftok (shmFile.toLatin1().constData(), c); -} - - - -bool QWSSharedMemory::create () -{ - shmId = shmget (key, shmSize, IPC_CREAT | 0666); - return (shmId != -1); -} - -void QWSSharedMemory::destroy () -{ - if (shmId != -1) - shmctl(shmId, IPC_RMID, 0); -} - -bool QWSSharedMemory::attach () -{ - if (shmId == -1) - shmId = shmget (key, shmSize, 0); - - shmBase = shmat (shmId, 0, 0); - if ((long)shmBase == -1) - shmBase = 0; - - return (long)shmBase != 0; + return shmSize; } - QT_END_NAMESPACE #endif // QT_NO_QWS_MULTIPROCESS diff --git a/src/gui/embedded/qwssharedmemory_p.h b/src/gui/embedded/qwssharedmemory_p.h index 31e69c4..f3ce241 100644 --- a/src/gui/embedded/qwssharedmemory_p.h +++ b/src/gui/embedded/qwssharedmemory_p.h @@ -53,49 +53,31 @@ // We mean it. // -#include "qplatformdefs.h" -#include "QtCore/qstring.h" +#include <qplatformdefs.h> QT_BEGIN_NAMESPACE #if !defined(QT_NO_QWS_MULTIPROCESS) -class QWSSharedMemory { +class QWSSharedMemory +{ public: - QWSSharedMemory(); ~QWSSharedMemory(); - void setPermissions(mode_t mode); - int size() const; - void *address() { return shmBase; } - - int id() const { return shmId; } - - void detach(); - bool create(int size); bool attach(int id); + void detach(); - //bool create(int size, const QString &filename, char c = 'Q'); - //bool attach(const QString &filename, char c = 'Q'); -// old API - - QWSSharedMemory(int, const QString &, char c = 'Q'); - void * base() { return address(); } - - bool create(); - void destroy(); + int id() const { return shmId; } - bool attach(); + void *address() const { return shmBase; } + int size() const; private: + int shmId; void *shmBase; int shmSize; - QString shmFile; - char character; - int shmId; - key_t key; }; #endif // QT_NO_QWS_MULTIPROCESS diff --git a/src/gui/embedded/qwssignalhandler.cpp b/src/gui/embedded/qwssignalhandler.cpp index 730dbae..b13a57d 100644 --- a/src/gui/embedded/qwssignalhandler.cpp +++ b/src/gui/embedded/qwssignalhandler.cpp @@ -43,13 +43,10 @@ #ifndef QT_NO_QWS_SIGNALHANDLER -#include <sys/types.h> -#ifndef QT_NO_QWS_MULTIPROCESS -# include <sys/ipc.h> -# include <sys/sem.h> +#include "qlock_p.h" +#include "qwslock_p.h" -# include <private/qcore_unix_p.h> -#endif +#include <sys/types.h> #include <signal.h> QT_BEGIN_NAMESPACE @@ -87,42 +84,33 @@ QWSSignalHandler::QWSSignalHandler() QWSSignalHandler::~QWSSignalHandler() { -#ifndef QT_NO_QWS_MULTIPROCESS - while (!semaphores.isEmpty()) - removeSemaphore(semaphores.last()); -#endif + clear(); } -#ifndef QT_NO_QWS_MULTIPROCESS -void QWSSignalHandler::removeSemaphore(int semno) +void QWSSignalHandler::clear() { - const int index = semaphores.lastIndexOf(semno); - if (index != -1) { - qt_semun semval; - semval.val = 0; - semctl(semaphores.at(index), 0, IPC_RMID, semval); - semaphores.remove(index); - } +#if !defined(QT_NO_QWS_MULTIPROCESS) + // it is safe to call d-tors directly here since, on normal exit, + // lists should be empty; otherwise, we don't care about semi-alive objects + // and the only important thing here is to unregister the system semaphores. + while (!locks.isEmpty()) + locks.takeLast()->~QLock(); + while (!wslocks.isEmpty()) + wslocks.takeLast()->~QWSLock(); +#endif + objects.clear(); } -#endif // QT_NO_QWS_MULTIPROCESS void QWSSignalHandler::handleSignal(int signum) { QWSSignalHandler *h = instance(); - - signal(signum, h->oldHandlers[signum]); - -#ifndef QT_NO_QWS_MULTIPROCESS - qt_semun semval; - semval.val = 0; - for (int i = 0; i < h->semaphores.size(); ++i) - semctl(h->semaphores.at(i), 0, IPC_RMID, semval); -#endif - - h->objects.clear(); + if (h) { + signal(signum, h->oldHandlers[signum]); + h->clear(); + } raise(signum); } QT_END_NAMESPACE -#endif // QT_QWS_NO_SIGNALHANDLER +#endif // QT_NO_QWS_SIGNALHANDLER diff --git a/src/gui/embedded/qwssignalhandler_p.h b/src/gui/embedded/qwssignalhandler_p.h index dda9c76..217eda1 100644 --- a/src/gui/embedded/qwssignalhandler_p.h +++ b/src/gui/embedded/qwssignalhandler_p.h @@ -57,14 +57,17 @@ #ifndef QT_NO_QWS_SIGNALHANDLER -#include <QtCore/qmap.h> -#include <QtCore/qvector.h> +#include <QtCore/qhash.h> +#include <QtCore/qlist.h> #include <QtCore/qobjectcleanuphandler.h> QT_BEGIN_NAMESPACE typedef void (*qt_sighandler_t)(int); +class QLock; +class QWSLock; + class QWSSignalHandlerPrivate; class Q_GUI_EXPORT QWSSignalHandler @@ -75,17 +78,24 @@ public: ~QWSSignalHandler(); #ifndef QT_NO_QWS_MULTIPROCESS - inline void addSemaphore(int semno) { semaphores.append(semno); } - void removeSemaphore(int semno); + inline void addLock(QLock *lock) { locks.append(lock); } + inline void removeLock(QLock *lock) { locks.removeOne(lock); } + inline void addWSLock(QWSLock *wslock) { wslocks.append(wslock); } + inline void removeWSLock(QWSLock *wslock) { wslocks.removeOne(wslock); } #endif inline void addObject(QObject *object) { (void)objects.add(object); } private: QWSSignalHandler(); + + void clear(); + static void handleSignal(int signal); - QMap<int, qt_sighandler_t> oldHandlers; + + QHash<int, qt_sighandler_t> oldHandlers; #ifndef QT_NO_QWS_MULTIPROCESS - QVector<int> semaphores; + QList<QLock *> locks; + QList<QWSLock *> wslocks; #endif QObjectCleanupHandler objects; diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index e8f80b4..ef53963 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -7395,15 +7395,19 @@ void QGraphicsItem::updateMicroFocus() if (QWidget *fw = QApplication::focusWidget()) { if (scene()) { for (int i = 0 ; i < scene()->views().count() ; ++i) { - if (scene()->views().at(i) == fw) - if (QInputContext *inputContext = fw->inputContext()) + if (scene()->views().at(i) == fw) { + if (QInputContext *inputContext = fw->inputContext()) { inputContext->update(); - } - } #ifndef QT_NO_ACCESSIBILITY - // ##### is this correct - QAccessible::updateAccessibility(fw, 0, QAccessible::StateChanged); + // ##### is this correct + if (toGraphicsObject()) + QAccessible::updateAccessibility(toGraphicsObject(), 0, QAccessible::StateChanged); #endif + break; + } + } + } + } } #endif } diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 7e70f47..655725b 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -245,6 +245,10 @@ #include <QtGui/qtransform.h> #include <QtGui/qinputcontext.h> #include <QtGui/qgraphicseffect.h> +#ifndef QT_NO_ACCESSIBILITY +# include <QtGui/qaccessible.h> +#endif + #include <private/qapplication_p.h> #include <private/qobject_p.h> #ifdef Q_WS_X11 @@ -837,6 +841,14 @@ void QGraphicsScenePrivate::setFocusItemHelper(QGraphicsItem *item, if (item) focusItem = item; updateInputMethodSensitivityInViews(); + +#ifndef QT_NO_ACCESSIBILITY + if (focusItem) { + if (QGraphicsObject *focusObj = focusItem->toGraphicsObject()) { + QAccessible::updateAccessibility(focusObj, 0, QAccessible::Focus); + } + } +#endif if (item) { QFocusEvent event(QEvent::FocusIn, focusReason); sendEvent(item, &event); diff --git a/src/gui/image/qpixmap_mac.cpp b/src/gui/image/qpixmap_mac.cpp index cb30161..bdf1f90 100644 --- a/src/gui/image/qpixmap_mac.cpp +++ b/src/gui/image/qpixmap_mac.cpp @@ -648,7 +648,7 @@ void QMacPixmapData::macCreatePixels() } if (pixels) - memcpy(base_pixels, pixels, pixelsSize); + memcpy(base_pixels, pixels, qMin(pixelsSize, (uint) numBytes)); pixels = base_pixels; pixelsSize = numBytes; } diff --git a/src/gui/inputmethod/qcoefepinputcontext_p.h b/src/gui/inputmethod/qcoefepinputcontext_p.h index 433c0e9..5d3d8d9 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_p.h +++ b/src/gui/inputmethod/qcoefepinputcontext_p.h @@ -159,6 +159,7 @@ private: MFepPointerEventHandlerDuringInlineEdit *m_pointerHandler; QBasicTimer m_tempPreeditStringTimeout; bool m_hasTempPreeditString; + QString m_cachedPreeditString; int m_splitViewResizeBy; Qt::WindowStates m_splitViewPreviousWindowStates; diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index daa448b..ebf0ff8 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -141,6 +141,16 @@ QCoeFepInputContext::~QCoeFepInputContext() void QCoeFepInputContext::reset() { + Qt::InputMethodHints currentHints = Qt::ImhNone; + if (focusWidget()) { + QWidget *proxy = focusWidget()->focusProxy(); + currentHints = proxy ? proxy->inputMethodHints() : focusWidget()->inputMethodHints(); + } + // Store a copy of preedit text, if prediction is active and input context is reseted. + // This is to ensure that we can replace preedit string after losing focus to FEP manager's + // internal sub-windows. + if (m_cachedPreeditString.isEmpty() && !(currentHints & Qt::ImhNoPredictiveText)) + m_cachedPreeditString = m_preeditString; commitCurrentString(true); } @@ -175,6 +185,8 @@ void QCoeFepInputContext::setFocusWidget(QWidget *w) void QCoeFepInputContext::widgetDestroyed(QWidget *w) { + m_cachedPreeditString.clear(); + // Make sure that the input capabilities of whatever new widget got focused are queried. CCoeControl *ctrl = w->effectiveWinId(); if (ctrl->IsFocused()) { @@ -353,6 +365,11 @@ bool QCoeFepInputContext::symbianFilterEvent(QWidget *keyWidget, const QSymbianE } } + if (event->type() == QSymbianEvent::ResourceChangeEvent + && event->resourceChangeType() == KEikMessageFadeAllWindows) { + reset(); + } + return false; } @@ -826,13 +843,6 @@ void QCoeFepInputContext::applyFormat(QList<QInputMethodEvent::Attribute> *attri } } - if (attributes->size() == oldSize) { - // S60 didn't provide any format, so let's give our own instead. - attributes->append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, - 0, - m_preeditString.size(), - standardFormat(PreeditFormat))); - } } void QCoeFepInputContext::queueInputCapabilitiesChanged() @@ -862,6 +872,8 @@ void QCoeFepInputContext::ensureInputCapabilitiesChanged() void QCoeFepInputContext::translateInputWidget() { QGraphicsView *gv = qobject_cast<QGraphicsView *>(S60->splitViewLastWidget); + if (!gv) + return; QRect splitViewRect = qt_TRect2QRect(static_cast<CEikAppUi*>(S60->appUi())->ClientRect()); QRectF cursor = gv->scene()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); @@ -909,6 +921,8 @@ void QCoeFepInputContext::StartFepInlineEditL(const TDesC& aInitialInlineText, if (!w) return; + m_cachedPreeditString.clear(); + commitTemporaryPreeditString(); QList<QInputMethodEvent::Attribute> attributes; @@ -965,7 +979,10 @@ void QCoeFepInputContext::UpdateFepInlineTextL(const TDesC& aNewInlineText, QVariant())); QString newPreeditString = qt_TDesC2QString(aNewInlineText); QInputMethodEvent event(newPreeditString, attributes); - if (newPreeditString.isEmpty() && m_preeditString.isEmpty()) { + if (!m_cachedPreeditString.isEmpty()) { + event.setCommitString(QLatin1String(""), -m_cachedPreeditString.length(), m_cachedPreeditString.length()); + m_cachedPreeditString.clear(); + } else if (newPreeditString.isEmpty() && m_preeditString.isEmpty()) { // In Symbian world this means "erase last character". event.setCommitString(QLatin1String(""), -1, 1); } @@ -1155,7 +1172,18 @@ void QCoeFepInputContext::commitCurrentString(bool cancelFepTransaction) m_hasTempPreeditString = false; - if (cancelFepTransaction) { + //Only cancel FEP transactions with prediction, when there is still active window. + Qt::InputMethodHints currentHints = Qt::ImhNone; + if (focusWidget()) { + if (focusWidget()->focusProxy()) + currentHints = focusWidget()->focusProxy()->inputMethodHints(); + else + currentHints = focusWidget()->inputMethodHints(); + } + bool predictive = !(currentHints & Qt::ImhNoPredictiveText); + bool widgetAndWindowAvailable = QApplication::activeWindow() && focusWidget(); + + if (cancelFepTransaction && ((predictive && widgetAndWindowAvailable) || !predictive)) { CCoeFep* fep = CCoeEnv::Static()->Fep(); if (fep) fep->CancelTransaction(); diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm index eb0fd8d..0b9cad8 100644 --- a/src/gui/kernel/qapplication_mac.mm +++ b/src/gui/kernel/qapplication_mac.mm @@ -715,6 +715,7 @@ void qt_event_request_showsheet(QWidget *w) { Q_ASSERT(qt_mac_is_macsheet(w)); #ifdef QT_MAC_USE_COCOA + w->repaint(); [NSApp beginSheet:qt_mac_window_for(w) modalForWindow:qt_mac_window_for(w->parentWidget()) modalDelegate:nil didEndSelector:nil contextInfo:0]; #else diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp index 14f7790..1197c77 100644 --- a/src/gui/kernel/qapplication_qws.cpp +++ b/src/gui/kernel/qapplication_qws.cpp @@ -112,19 +112,6 @@ #include <qvfbhdr.h> -#ifndef QT_NO_QWS_MULTIPROCESS -#ifdef QT_NO_QSHM -#include <sys/ipc.h> -#include <sys/shm.h> -#ifndef Q_OS_DARWIN -# include <sys/sem.h> -#endif -#include <sys/socket.h> -#else -#include "private/qwssharedmemory_p.h" -#endif -#endif - QT_BEGIN_NAMESPACE #ifndef QT_NO_DIRECTPAINTER @@ -230,7 +217,7 @@ QString qws_dataDir() qFatal("Qt for Embedded Linux data directory has incorrect permissions: %s", dataDir.constData()); #endif - result.append("/"); + result.append(QLatin1Char('/')); return result; } @@ -3565,13 +3552,8 @@ bool QETWidget::translateKeyEvent(const QWSKeyEvent *event, bool grab) /* grab i QEvent::KeyPress : QEvent::KeyRelease; bool autor = event->simpleData.is_auto_repeat; QString text; - char ascii = 0; - if (event->simpleData.unicode) { - QChar ch(event->simpleData.unicode); - if (ch.unicode() != 0xffff) - text += ch; - ascii = ch.toLatin1(); - } + if (event->simpleData.unicode && event->simpleData.unicode != 0xffff) + text += QChar(event->simpleData.unicode); code = event->simpleData.keycode; #if defined QT3_SUPPORT && !defined(QT_NO_SHORTCUT) diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index e9d58c7..31d02d4 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -74,6 +74,7 @@ # include <centralrepository.h> # include "qs60mainappui.h" # include "qinputcontext.h" +# include <private/qgraphicssystemex_symbian_p.h> #endif #if defined(Q_WS_S60) @@ -1694,7 +1695,7 @@ void qt_init(QApplicationPrivate * /* priv */, int) if (commandLine) { // After this construction, CEikonEnv will be available from CEikonEnv::Static(). // (much like our qApp). - QtEikonEnv* coe = new QtEikonEnv; + CEikonEnv* coe = new CEikonEnv; //not using QT_TRAP_THROWING, because coe owns the cleanupstack so it can't be pushed there. TRAPD(err, coe->ConstructAppFromCommandLineL(factory, *commandLine)); if(err != KErrNone) { @@ -1850,26 +1851,12 @@ void qt_init(QApplicationPrivate * /* priv */, int) #ifdef Q_SYMBIAN_SEMITRANSPARENT_BG_SURFACE QApplicationPrivate::instance()->useTranslucentEGLSurfaces = true; - const TUid KIvePropertyCat = {0x2726beef}; - enum TIvePropertyChipType { - EVCBCM2727B1 = 0x00000000, - EVCBCM2763A0 = 0x04000100, - EVCBCM2763B0 = 0x04000102, - EVCBCM2763C0 = 0x04000103, - EVCBCM2763C1 = 0x04000104, - EVCBCMUnknown = 0x7fffffff - }; - - TInt chipType = EVCBCMUnknown; - if (RProperty::Get(KIvePropertyCat, 0 /*chip type*/, chipType) == KErrNone) { - if (chipType == EVCBCM2727B1) { - // We have only 32MB GPU memory. Use raster surfaces - // for transparent TLWs. - QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; - } - } else { + if (QSymbianGraphicsSystemEx::hasBCM2727()) { + // We have only 32MB GPU memory. Use raster surfaces + // for transparent TLWs. QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; } + if (QApplicationPrivate::graphics_system_name == QLatin1String("raster")) QApplicationPrivate::instance()->useTranslucentEGLSurfaces = false; #else @@ -2027,7 +2014,7 @@ void QApplicationPrivate::openPopup(QWidget *popup) QApplicationPrivate::popupWidgets->append(popup); // Cancel focus widget pointer capture and long tap timer - if (QApplication::focusWidget()) { + if (QApplication::focusWidget() && QApplication::focusWidget()->effectiveWinId()) { static_cast<QSymbianControl*>(QApplication::focusWidget()->effectiveWinId())->CancelLongTapTimer(); QApplication::focusWidget()->effectiveWinId()->SetPointerCapture(false); } @@ -2278,6 +2265,7 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent #if defined(Q_SYMBIAN_SUPPORTS_MULTIPLE_SCREENS) case EEventDisplayChanged: #endif + { if (callSymbianEventFilters(symbianEvent)) return 1; if (S60) @@ -2289,6 +2277,12 @@ int QApplicationPrivate::symbianProcessWsEvent(const QSymbianEvent *symbianEvent QResizeEvent e(qt_desktopWidget->size(), oldSize); QApplication::sendEvent(qt_desktopWidget, &e); } + // Close non-native QMenus (that should act like context menus, i.e. close + // automatically when the orientation changes). + QMenu *activeMenu = qobject_cast<QMenu *>(QApplication::activePopupWidget()); + if (activeMenu) + activeMenu->close(); + } return 0; // Propagate to CONE case EEventWindowVisibilityChanged: if (controlInMap) { diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 13ff85b..e32fdeb 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -320,7 +320,7 @@ static int qCocoaViewCount = 0; } - CGContextFlush(context); + CGContextSynchronize(context); qt_mac_release_graphics_context(context); return; } diff --git a/src/gui/kernel/qdesktopwidget.qdoc b/src/gui/kernel/qdesktopwidget.qdoc index f71155e..b93bcb3 100644 --- a/src/gui/kernel/qdesktopwidget.qdoc +++ b/src/gui/kernel/qdesktopwidget.qdoc @@ -151,6 +151,11 @@ on Mac OS X, or the task bar on Windows). The default screen is used if \a screen is -1. + \note In Symbian devices the available geometry reported by QDesktopWidget is + not guaranteed to be correct at the time the geometry change resize event + is passed to widgets. The correct way to listen for available geometry changes + is to connect to the workAreaResized() signal of QDesktopWidget. + \sa screenNumber(), screenGeometry() */ @@ -179,6 +184,11 @@ Returns the geometry of the screen with index \a screen. The default screen is used if \a screen is -1. + \note In Symbian devices the screen geometry reported by QDesktopWidget is + not guaranteed to be correct at the time the geometry change resize event + is passed to widgets. The correct way to listen for screen geometry changes + is to connect to the resized() signal of QDesktopWidget. + \sa screenNumber() */ diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp index 750ddf8..0c683b4 100644 --- a/src/gui/kernel/qdnd_x11.cpp +++ b/src/gui/kernel/qdnd_x11.cpp @@ -1166,12 +1166,20 @@ void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive) // some XEMBEDding, so try to find the real QMimeData used // based on the timestamp for this drop. QMimeData *dropData = 0; - int at = findXdndDropTransactionByTime(qt_xdnd_target_current_time); - if (at != -1) + const int at = findXdndDropTransactionByTime(qt_xdnd_target_current_time); + if (at != -1) { dropData = QDragManager::dragPrivate(X11->dndDropTransactions.at(at).object)->data; + // Can't use the source QMimeData if we need the image conversion code from xdndObtainData + if (dropData && dropData->hasImage()) + dropData = 0; + } // if we can't find it, then use the data in the drag manager - if (!dropData) - dropData = (manager->object) ? manager->dragPrivate()->data : manager->dropData; + if (!dropData) { + if (manager->object && !manager->dragPrivate()->data->hasImage()) + dropData = manager->dragPrivate()->data; + else + dropData = manager->dropData; + } // Drop coming from another app? Update keyboard modifiers. if (!qt_xdnd_dragging) { @@ -1855,8 +1863,16 @@ static QVariant xdndObtainData(const char *format, QVariant::Type requestedType) && (!(w->windowType() == Qt::Desktop) || w->acceptDrops())) { QDragPrivate * o = QDragManager::self()->dragPrivate(); - if (o->data->hasFormat(QLatin1String(format))) - result = o->data->data(QLatin1String(format)); + const QString mimeType = QString::fromLatin1(format); + if (o->data->hasFormat(mimeType)) { + result = o->data->data(mimeType); + } else if (mimeType.startsWith(QLatin1String("image/")) && o->data->hasImage()) { + // ### duplicated from QInternalMimeData::renderDataHelper + QImage image = qvariant_cast<QImage>(o->data->imageData()); + QBuffer buf(&result); + buf.open(QBuffer::WriteOnly); + image.save(&buf, mimeType.mid(mimeType.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper()); + } return result; } diff --git a/src/gui/kernel/qeventdispatcher_s60.cpp b/src/gui/kernel/qeventdispatcher_s60.cpp index 3f20c08..d5a2761 100644 --- a/src/gui/kernel/qeventdispatcher_s60.cpp +++ b/src/gui/kernel/qeventdispatcher_s60.cpp @@ -45,62 +45,6 @@ QT_BEGIN_NAMESPACE -QtEikonEnv::QtEikonEnv() - : m_lastIterationCount(0) - , m_savedStatusCode(KRequestPending) - , m_hasAlreadyRun(false) -{ -} - -QtEikonEnv::~QtEikonEnv() -{ -} - -void QtEikonEnv::RunL() -{ - QEventDispatcherS60 *dispatcher = qobject_cast<QEventDispatcherS60 *>(QAbstractEventDispatcher::instance()); - if (!dispatcher) { - CEikonEnv::RunL(); - return; - } - - if (m_lastIterationCount != dispatcher->iterationCount()) { - m_hasAlreadyRun = false; - m_lastIterationCount = dispatcher->iterationCount(); - } - - if (m_hasAlreadyRun) { - // Fool the active scheduler into believing we are still waiting for events. - // The window server thinks we are not, however. - m_savedStatusCode = iStatus.Int(); - iStatus = KRequestPending; - SetActive(); - dispatcher->queueDeferredActiveObjectsCompletion(); - } else { - m_hasAlreadyRun = true; - CEikonEnv::RunL(); - } -} - -void QtEikonEnv::DoCancel() -{ - complete(); - - CEikonEnv::DoCancel(); -} - -void QtEikonEnv::complete() -{ - if (m_hasAlreadyRun) { - if (m_savedStatusCode != KRequestPending) { - TRequestStatus *status = &iStatus; - QEventDispatcherSymbian::RequestComplete(status, m_savedStatusCode); - m_savedStatusCode = KRequestPending; - } - m_hasAlreadyRun = false; - } -} - QEventDispatcherS60::QEventDispatcherS60(QObject *parent) : QEventDispatcherSymbian(parent), m_noInputEvents(false) @@ -183,14 +127,4 @@ void QEventDispatcherS60::removeInputEventsForWidget(QObject *object) } } -// reimpl -void QEventDispatcherS60::reactivateDeferredActiveObjects() -{ - if (S60->qtOwnsS60Environment) { - static_cast<QtEikonEnv *>(CCoeEnv::Static())->complete(); - } - - QEventDispatcherSymbian::reactivateDeferredActiveObjects(); -} - QT_END_NAMESPACE diff --git a/src/gui/kernel/qeventdispatcher_s60_p.h b/src/gui/kernel/qeventdispatcher_s60_p.h index 49ec568..c7cf2b2 100644 --- a/src/gui/kernel/qeventdispatcher_s60_p.h +++ b/src/gui/kernel/qeventdispatcher_s60_p.h @@ -62,31 +62,6 @@ QT_BEGIN_NAMESPACE class QEventDispatcherS60; -class QtEikonEnv : public CEikonEnv -{ -public: - QtEikonEnv(); - ~QtEikonEnv(); - - // from CActive. - void RunL(); - void DoCancel(); - - void complete(); - -private: - // Workaround for a BC break from S60 3.2 -> 5.0, where the CEikonEnv override was removed. - // To avoid linking to that when we build against 3.2, define an empty body here. - // Reserved_*() have been verified to be empty in the S60 code. - void Reserved_1() {} - void Reserved_2() {} - -private: - int m_lastIterationCount; - TInt m_savedStatusCode; - bool m_hasAlreadyRun; -}; - class Q_GUI_EXPORT QEventDispatcherS60 : public QEventDispatcherSymbian { Q_OBJECT @@ -102,8 +77,6 @@ public: void saveInputEvent(QSymbianControl *control, QWidget *widget, QInputEvent *event); - void reactivateDeferredActiveObjects(); - private: bool sendDeferredInputEvents(); diff --git a/src/gui/kernel/qplatformclipboard_qpa.cpp b/src/gui/kernel/qplatformclipboard_qpa.cpp index 7905185..f8e4b62 100644 --- a/src/gui/kernel/qplatformclipboard_qpa.cpp +++ b/src/gui/kernel/qplatformclipboard_qpa.cpp @@ -83,7 +83,7 @@ QPlatformClipboard::~QPlatformClipboard() } -const QMimeData *QPlatformClipboard::mimeData(QClipboard::Mode mode) const +QMimeData *QPlatformClipboard::mimeData(QClipboard::Mode mode) { //we know its clipboard Q_UNUSED(mode); diff --git a/src/gui/kernel/qplatformclipboard_qpa.h b/src/gui/kernel/qplatformclipboard_qpa.h index 41aa951..6a40fbc 100644 --- a/src/gui/kernel/qplatformclipboard_qpa.h +++ b/src/gui/kernel/qplatformclipboard_qpa.h @@ -59,7 +59,7 @@ class Q_GUI_EXPORT QPlatformClipboard public: virtual ~QPlatformClipboard(); - virtual const QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard ) const; + virtual QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard); virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard); virtual bool supportsMode(QClipboard::Mode mode) const; void emitChanged(QClipboard::Mode mode); diff --git a/src/gui/kernel/qsessionmanager_qws.cpp b/src/gui/kernel/qsessionmanager_qws.cpp index efe688e..e437635 100644 --- a/src/gui/kernel/qsessionmanager_qws.cpp +++ b/src/gui/kernel/qsessionmanager_qws.cpp @@ -43,6 +43,9 @@ #ifndef QT_NO_SESSIONMANAGER +#include <qapplication.h> +#include <private/qobject_p.h> + QT_BEGIN_NAMESPACE class QSessionManagerPrivate : public QObjectPrivate diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp index 7d7c56f..57893f9 100644 --- a/src/gui/kernel/qsoftkeymanager.cpp +++ b/src/gui/kernel/qsoftkeymanager.cpp @@ -50,7 +50,7 @@ #include "private/qsoftkeymanager_s60_p.h" #endif -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) #include "private/qt_s60_p.h" #endif @@ -105,7 +105,7 @@ QSoftKeyManager::QSoftKeyManager() : QAction *QSoftKeyManager::createAction(StandardSoftKey standardKey, QWidget *actionWidget) { QAction *action = new QAction(standardSoftKeyText(standardKey), actionWidget); -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) int key = 0; switch (standardKey) { case OkSoftKey: @@ -171,7 +171,7 @@ void QSoftKeyManager::cleanupHash(QObject *obj) Q_D(QSoftKeyManager); QAction *action = qobject_cast<QAction*>(obj); d->keyedActions.remove(action); -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) d->softKeyCommandActions.remove(action); #endif } @@ -193,9 +193,11 @@ void QSoftKeyManager::sendKeyEvent() void QSoftKeyManager::updateSoftKeys() { - QSoftKeyManager::instance()->d_func()->pendingUpdate = true; - QEvent *event = new QEvent(QEvent::UpdateSoftKeys); - QApplication::postEvent(QSoftKeyManager::instance(), event); + if (QApplication::activeWindow()) { + QSoftKeyManager::instance()->d_func()->pendingUpdate = true; + QEvent *event = new QEvent(QEvent::UpdateSoftKeys); + QApplication::postEvent(QSoftKeyManager::instance(), event); + } } bool QSoftKeyManager::appendSoftkeys(const QWidget &source, int level) diff --git a/src/gui/kernel/qsoftkeymanager_common_p.h b/src/gui/kernel/qsoftkeymanager_common_p.h index bf4c747..5b76e60 100644 --- a/src/gui/kernel/qsoftkeymanager_common_p.h +++ b/src/gui/kernel/qsoftkeymanager_common_p.h @@ -72,7 +72,7 @@ protected: QMultiHash<int, QAction*> requestedSoftKeyActions; QWidget *initialSoftKeySource; bool pendingUpdate; -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) QHash<QAction*, int> softKeyCommandActions; #endif }; diff --git a/src/gui/kernel/qsoftkeymanager_s60.cpp b/src/gui/kernel/qsoftkeymanager_s60.cpp index ab71064..acdb0e5 100644 --- a/src/gui/kernel/qsoftkeymanager_s60.cpp +++ b/src/gui/kernel/qsoftkeymanager_s60.cpp @@ -113,7 +113,7 @@ void QSoftKeyManagerPrivateS60::ensureCbaVisibilityAndResponsiviness(CEikButtonG void QSoftKeyManagerPrivateS60::clearSoftkeys(CEikButtonGroupContainer &cba) { -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) QT_TRAP_THROWING( //EAknSoftkeyEmpty is used, because using -1 adds softkeys without actions on Symbian3 cba.SetCommandL(0, EAknSoftkeyEmpty, KNullDesC); @@ -297,7 +297,7 @@ bool QSoftKeyManagerPrivateS60::setSoftkey(CEikButtonGroupContainer &cba, QString text = softkeyText(*action); TPtrC nativeText = qt_QString2TPtrC(text); int command = S60_COMMAND_START + position; -#ifdef SYMBIAN_VERSION_SYMBIAN3 +#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) if (softKeyCommandActions.contains(action)) command = softKeyCommandActions.value(action); #endif diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index ea2412b..a2109b4 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -6434,6 +6434,10 @@ void QWidget::setFocus(Qt::FocusReason reason) if (!(testAttribute(Qt::WA_WState_Created) && window()->windowType() != Qt::Popup && internalWinId())) //setFocusWidget will already post a focus event for us (that the AT client receives) on Windows # endif +# ifdef Q_OS_UNIX + // menus update the focus manually and this would create bogus events + if (!(f->inherits("QMenuBar") || f->inherits("QMenu") || f->inherits("QMenuItem"))) +# endif QAccessible::updateAccessibility(f, 0, QAccessible::Focus); #endif #ifndef QT_NO_GRAPHICSVIEW @@ -11354,8 +11358,10 @@ void QWidget::updateMicroFocus() } #endif #ifndef QT_NO_ACCESSIBILITY - // ##### is this correct - QAccessible::updateAccessibility(this, 0, QAccessible::StateChanged); + if (isVisible()) { + // ##### is this correct + QAccessible::updateAccessibility(this, 0, QAccessible::StateChanged); + } #endif } diff --git a/src/gui/kernel/qwidget_qpa.cpp b/src/gui/kernel/qwidget_qpa.cpp index a9bfba6..c7ce99a 100644 --- a/src/gui/kernel/qwidget_qpa.cpp +++ b/src/gui/kernel/qwidget_qpa.cpp @@ -731,12 +731,19 @@ QPlatformWindowFormat QWidget::platformWindowFormat() const { Q_D(const QWidget); + QPlatformWindowFormat format; + QTLWExtra *extra = d->maybeTopData(); if (extra){ - return extra->platformWindowFormat; + format = extra->platformWindowFormat; } else { - return QPlatformWindowFormat::defaultFormat(); + format = QPlatformWindowFormat::defaultFormat(); } + + if (testAttribute(Qt::WA_TranslucentBackground)) + format.setAlpha(true); + + return format; } void QWidgetPrivate::createSysExtra() diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index f1496b1..d5ae364 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -6,6 +6,7 @@ HEADERS += \ painting/qcolor.h \ painting/qcolor_p.h \ painting/qcolormap.h \ + painting/qcosmeticstroker_p.h \ painting/qdrawutil.h \ painting/qemulationpaintengine_p.h \ painting/qgraphicssystem_p.h \ @@ -15,7 +16,7 @@ HEADERS += \ painting/qoutlinemapper_p.h \ painting/qpaintdevice.h \ painting/qpaintengine.h \ - painting/qpaintengine_p.h \ + painting/qpaintengine_p.h \ painting/qpaintengine_alpha_p.h \ painting/qpaintengine_preview_p.h \ painting/qpaintengineex_p.h \ @@ -54,6 +55,7 @@ SOURCES += \ painting/qbrush.cpp \ painting/qcolor.cpp \ painting/qcolor_p.cpp \ + painting/qcosmeticstroker.cpp \ painting/qcssutil.cpp \ painting/qdrawutil.cpp \ painting/qemulationpaintengine.cpp \ diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp new file mode 100644 index 0000000..cdc0978 --- /dev/null +++ b/src/gui/painting/qcosmeticstroker.cpp @@ -0,0 +1,1010 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qcosmeticstroker_p.h" +#include "private/qpainterpath_p.h" +#include <qdebug.h> +#include <math.h> + +QT_BEGIN_NAMESPACE + +#if 0 +inline QString capString(int caps) +{ + QString str; + if (caps & QCosmeticStroker::CapBegin) { + str += "CapBegin "; + } + if (caps & QCosmeticStroker::CapEnd) { + str += "CapEnd "; + } + return str; +} +#endif + +#define toF26Dot6(x) ((int)((x)*64.)) + +static inline uint sourceOver(uint d, uint color) +{ + return color + BYTE_MUL(d, qAlpha(~color)); +} + +inline static int F16Dot16FixedDiv(int x, int y) +{ + if (qAbs(x) > 0x7fff) + return (((qlonglong)x) << 16) / y; + return (x << 16) / y; +} + +typedef void (*DrawPixel)(QCosmeticStroker *stroker, int x, int y, int coverage); + +namespace { + +struct Dasher { + QCosmeticStroker *stroker; + int *pattern; + int offset; + int dashIndex; + int dashOn; + + Dasher(QCosmeticStroker *s, bool reverse, int start, int stop) + : stroker(s) + { + int delta = stop - start; + if (reverse) { + pattern = stroker->reversePattern; + offset = stroker->patternLength - stroker->patternOffset - delta - ((start & 63) - 32); + dashOn = 0; + } else { + pattern = stroker->pattern; + offset = stroker->patternOffset - ((start & 63) - 32); + dashOn = 1; + } + offset %= stroker->patternLength; + if (offset < 0) + offset += stroker->patternLength; + + dashIndex = 0; + while (offset>= pattern[dashIndex]) + ++dashIndex; + +// qDebug() << " dasher" << offset/64. << reverse << dashIndex; + stroker->patternOffset += delta; + stroker->patternOffset %= stroker->patternLength; + } + + bool on() const { + return (dashIndex + dashOn) & 1; + } + void adjust() { + offset += 64; + if (offset >= pattern[dashIndex]) { + ++dashIndex; + dashIndex %= stroker->patternSize; + } + offset %= stroker->patternLength; +// qDebug() << "dasher.adjust" << offset/64. << dashIndex; + } +}; + +struct NoDasher { + NoDasher(QCosmeticStroker *, bool, int, int) {} + bool on() const { return true; } + void adjust(int = 0) {} +}; + +}; + +template<DrawPixel drawPixel, class Dasher> +static void drawLine(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); +template<DrawPixel drawPixel, class Dasher> +static void drawLineAA(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); + +inline void drawPixel(QCosmeticStroker *stroker, int x, int y, int coverage) +{ + const QRect &cl = stroker->clip; + if (x < cl.x() || x > cl.right() || y < cl.y() || y > cl.bottom()) + return; + + int lastx = stroker->spans[stroker->current_span-1].x + stroker->spans[stroker->current_span-1].len ; + int lasty = stroker->spans[stroker->current_span-1].y; + + if (stroker->current_span == QCosmeticStroker::NSPANS || y < lasty || (y == lasty && x < lastx)) { + stroker->blend(stroker->current_span, stroker->spans, &stroker->state->penData); + stroker->current_span = 0; + } + + stroker->spans[stroker->current_span].x = ushort(x); + stroker->spans[stroker->current_span].len = 1; + stroker->spans[stroker->current_span].y = y; + stroker->spans[stroker->current_span].coverage = coverage*stroker->opacity >> 8; + ++stroker->current_span; +} + +inline void drawPixelARGB32(QCosmeticStroker *stroker, int x, int y, int coverage) +{ + const QRect &cl = stroker->clip; + if (x < cl.x() || x > cl.right() || y < cl.y() || y > cl.bottom()) + return; + + int offset = x + stroker->ppl*y; + uint c = BYTE_MUL(stroker->color, coverage); + stroker->pixels[offset] = sourceOver(stroker->pixels[offset], c); +} + +inline void drawPixelARGB32Opaque(QCosmeticStroker *stroker, int x, int y, int) +{ + const QRect &cl = stroker->clip; + if (x < cl.x() || x > cl.right() || y < cl.y() || y > cl.bottom()) + return; + + int offset = x + stroker->ppl*y; + stroker->pixels[offset] = sourceOver(stroker->pixels[offset], stroker->color); +} + +enum StrokeSelection { + Aliased = 0, + AntiAliased = 1, + Solid = 0, + Dashed = 2, + RegularDraw = 0, + FastDraw = 4 +}; + +static StrokeLine strokeLine(int strokeSelection) +{ + StrokeLine stroke; + + switch (strokeSelection) { + case Aliased|Solid|RegularDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLine)<drawPixel, NoDasher>; + break; + case Aliased|Solid|FastDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLine)<drawPixelARGB32Opaque, NoDasher>; + break; + case Aliased|Dashed|RegularDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLine)<drawPixel, Dasher>; + break; + case Aliased|Dashed|FastDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLine)<drawPixelARGB32Opaque, Dasher>; + break; + case AntiAliased|Solid|RegularDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLineAA)<drawPixel, NoDasher>; + break; + case AntiAliased|Solid|FastDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLineAA)<drawPixelARGB32, NoDasher>; + break; + case AntiAliased|Dashed|RegularDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLineAA)<drawPixel, Dasher>; + break; + case AntiAliased|Dashed|FastDraw: + stroke = &QT_PREPEND_NAMESPACE(drawLineAA)<drawPixelARGB32, Dasher>; + break; + default: + Q_ASSERT(false); + stroke = 0; + } + return stroke; +} + +void QCosmeticStroker::setup() +{ + blend = state->penData.blend; + if (state->clip && state->clip->enabled && state->clip->hasRectClip && !state->clip->clipRect.isEmpty()) { + clip &= state->clip->clipRect; + blend = state->penData.unclipped_blend; + } + + int strokeSelection = 0; + if (blend == state->penData.unclipped_blend + && state->penData.type == QSpanData::Solid + && (state->penData.rasterBuffer->format == QImage::Format_ARGB32_Premultiplied + || state->penData.rasterBuffer->format == QImage::Format_RGB32) + && state->compositionMode() == QPainter::CompositionMode_SourceOver) + strokeSelection |= FastDraw; + + if (state->renderHints & QPainter::Antialiasing) + strokeSelection |= AntiAliased; + + const QVector<qreal> &penPattern = state->lastPen.dashPattern(); + if (penPattern.isEmpty()) { + Q_ASSERT(!pattern && !reversePattern); + pattern = 0; + reversePattern = 0; + patternLength = 0; + patternSize = 0; + } else { + pattern = (int *)malloc(penPattern.size()*sizeof(int)); + reversePattern = (int *)malloc(penPattern.size()*sizeof(int)); + patternSize = penPattern.size(); + + patternLength = 0; + for (int i = 0; i < patternSize; ++i) { + patternLength += (int) qMax(1. , penPattern.at(i)*64.); + pattern[i] = patternLength; + } + patternLength = 0; + for (int i = 0; i < patternSize; ++i) { + patternLength += (int) qMax(1., penPattern.at(patternSize - 1 - i)*64.); + reversePattern[i] = patternLength; + } + strokeSelection |= Dashed; +// qDebug() << "setup: size=" << patternSize << "length=" << patternLength/64.; + } + + stroke = strokeLine(strokeSelection); + + qreal width = state->lastPen.widthF(); + if (width == 0) + opacity = 256; + else if (state->lastPen.isCosmetic()) + opacity = (int) 256*width; + else + opacity = (int) 256*width*state->txscale; + opacity = qBound(0, opacity, 256); + + drawCaps = state->lastPen.capStyle() != Qt::FlatCap; + + if (strokeSelection & FastDraw) { + color = INTERPOLATE_PIXEL_256(state->penData.solid.color, opacity, 0, 0); + QRasterBuffer *buffer = state->penData.rasterBuffer; + pixels = (uint *)buffer->buffer(); + ppl = buffer->bytesPerLine()>>2; + } + + // setup FP clip bounds + xmin = clip.left() - 1; + xmax = clip.right() + 2; + ymin = clip.top() - 1; + ymax = clip.bottom() + 2; + + lastPixel.x = -1; +} + +// returns true if the whole line gets clipped away +bool QCosmeticStroker::clipLine(qreal &x1, qreal &y1, qreal &x2, qreal &y2) +{ + // basic/rough clipping is done in floating point coordinates to avoid + // integer overflow problems. + if (x1 < xmin) { + if (x2 <= xmin) + goto clipped; + y1 += (y2 - y1)/(x2 - x1) * (xmin - x1); + x1 = xmin; + } else if (x1 > xmax) { + if (x2 >= xmax) + goto clipped; + y1 += (y2 - y1)/(x2 - x1) * (xmax - x1); + x1 = xmax; + } + if (x2 < xmin) { + lastPixel.x = -1; + y2 += (y2 - y1)/(x2 - x1) * (xmin - x2); + x2 = xmin; + } else if (x2 > xmax) { + lastPixel.x = -1; + y2 += (y2 - y1)/(x2 - x1) * (xmax - x2); + x2 = xmax; + } + + if (y1 < ymin) { + if (y2 <= ymin) + goto clipped; + x1 += (x2 - x1)/(y2 - y1) * (ymin - y1); + y1 = ymin; + } else if (y1 > ymax) { + if (y2 >= ymax) + goto clipped; + x1 += (x2 - x1)/(y2 - y1) * (ymax - y1); + y1 = ymax; + } + if (y2 < ymin) { + lastPixel.x = -1; + x2 += (x2 - x1)/(y2 - y1) * (ymin - y2); + y2 = ymin; + } else if (y2 > ymax) { + lastPixel.x = -1; + x2 += (x2 - x1)/(y2 - y1) * (ymax - y2); + y2 = ymax; + } + + return false; + + clipped: + lastPixel.x = -1; + return true; +} + + +void QCosmeticStroker::drawLine(const QPointF &p1, const QPointF &p2) +{ + QPointF start = p1 * state->matrix; + QPointF end = p2 * state->matrix; + + patternOffset = state->lastPen.dashOffset()*64; + lastPixel.x = -1; + + stroke(this, start.x(), start.y(), end.x(), end.y(), drawCaps ? CapBegin|CapEnd : 0); + + blend(current_span, spans, &state->penData); + current_span = 0; +} + +void QCosmeticStroker::drawPoints(const QPoint *points, int num) +{ + const QPoint *end = points + num; + while (points < end) { + QPointF p = QPointF(*points) * state->matrix; + drawPixel(this, qRound(p.x()), qRound(p.y()), 255); + ++points; + } + + blend(current_span, spans, &state->penData); + current_span = 0; +} + +void QCosmeticStroker::drawPoints(const QPointF *points, int num) +{ + const QPointF *end = points + num; + while (points < end) { + QPointF p = (*points) * state->matrix; + drawPixel(this, qRound(p.x()), qRound(p.y()), 255); + ++points; + } + + blend(current_span, spans, &state->penData); + current_span = 0; +} + +void QCosmeticStroker::calculateLastPoint(qreal rx1, qreal ry1, qreal rx2, qreal ry2) +{ + // this is basically the same code as used in the aliased stroke method, + // but it only determines the direction and last point of a line + // + // This is being used to have proper dropout control for closed contours + // by calculating the direction and last pixel of the last segment in the contour. + // the info is then used to perform dropout control when drawing the first line segment + // of the contour + lastPixel.x = -1; + lastPixel.y = -1; + + if (clipLine(rx1, ry1, rx2, ry2)) + return; + + const int half = 32; + int x1 = toF26Dot6(rx1) + half; + int y1 = toF26Dot6(ry1) + half; + int x2 = toF26Dot6(rx2) + half; + int y2 = toF26Dot6(ry2) + half; + + int dx = qAbs(x2 - x1); + int dy = qAbs(y2 - y1); + + if (dx < dy) { + // vertical + bool swapped = false; + if (y1 > y2) { + swapped = true; + qSwap(y1, y2); + qSwap(x1, x2); + --x1; --x2; --y1; --y2; + } + int xinc = F16Dot16FixedDiv(x2 - x1, y2 - y1); + int x = x1 << 10; + + int y = (y1+32) >> 6; + int ys = (y2+32) >> 6; + + if (y != ys) { + x += ( ((((y << 6) + 32 - y1))) * xinc ) >> 6; + + if (swapped) { + lastPixel.x = x >> 16; + lastPixel.y = y; + lastDir = QCosmeticStroker::BottomToTop; + } else { + lastPixel.x = (x + (ys - y - 1)*xinc) >> 16; + lastPixel.y = ys - 1; + lastDir = QCosmeticStroker::TopToBottom; + } + lastAxisAligned = qAbs(xinc) < (1 << 14); + } + } else { + // horizontal + if (!dx) + return; + + bool swapped = false; + if (x1 > x2) { + swapped = true; + qSwap(x1, x2); + qSwap(y1, y2); + --x1; --x2; --y1; --y2; + } + int yinc = F16Dot16FixedDiv(y2 - y1, x2 - x1); + int y = y1 << 10; + + int x = (x1+32) >> 6; + int xs = (x2+32) >> 6; + + if (x != xs) { + y += ( ((((x << 6) + 32 - x1))) * yinc ) >> 6; + + if (swapped) { + lastPixel.x = x; + lastPixel.y = y >> 16; + lastDir = QCosmeticStroker::RightToLeft; + } else { + lastPixel.x = xs - 1; + lastPixel.y = (y + (xs - x - 1)*yinc) >> 16; + lastDir = QCosmeticStroker::LeftToRight; + } + lastAxisAligned = qAbs(yinc) < (1 << 14); + } + } +// qDebug() << " moveTo: setting last pixel to x/y dir" << lastPixel.x << lastPixel.y << lastDir; +} + +static inline const QPainterPath::ElementType *subPath(const QPainterPath::ElementType *t, const QPainterPath::ElementType *end, + const qreal *points, bool *closed) +{ + const QPainterPath::ElementType *start = t; + ++t; + + // find out if the subpath is closed + while (t < end) { + if (*t == QPainterPath::MoveToElement) + break; + ++t; + } + + int offset = t - start - 1; +// qDebug() << "subpath" << offset << points[0] << points[1] << points[2*offset] << points[2*offset+1]; + *closed = (points[0] == points[2*offset] && points[1] == points[2*offset + 1]); + + return t; +} + +void QCosmeticStroker::drawPath(const QVectorPath &path) +{ +// qDebug() << ">>>> drawpath" << path.convertToPainterPath() +// << "antialiasing:" << (bool)(state->renderHints & QPainter::Antialiasing) << " implicit close:" << path.hasImplicitClose(); + if (path.isEmpty()) + return; + + const qreal *points = path.points(); + const QPainterPath::ElementType *type = path.elements(); + + if (type) { + const QPainterPath::ElementType *end = type + path.elementCount(); + + while (type < end) { + Q_ASSERT(type == path.elements() || *type == QPainterPath::MoveToElement); + + QPointF p = QPointF(points[0], points[1]) * state->matrix; + QPointF movedTo = p; + patternOffset = state->lastPen.dashOffset()*64; + lastPixel.x = -1; + + bool closed; + const QPainterPath::ElementType *e = subPath(type, end, points, &closed); + if (closed) { + const qreal *p = points + 2*(e-type); + QPointF p1 = QPointF(p[-4], p[-3]) * state->matrix; + QPointF p2 = QPointF(p[-2], p[-1]) * state->matrix; + calculateLastPoint(p1.x(), p1.y(), p2.x(), p2.y()); + } + int caps = (!closed & drawCaps) ? CapBegin : NoCaps; +// qDebug() << "closed =" << closed << capString(caps); + + points += 2; + ++type; + + while (type < e) { + QPointF p2 = QPointF(points[0], points[1]) * state->matrix; + switch (*type) { + case QPainterPath::MoveToElement: + Q_ASSERT(!"Logic error"); + break; + + case QPainterPath::LineToElement: + if (!closed && drawCaps && type == e - 1) + caps |= CapEnd; + stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps); + p = p2; + points += 2; + ++type; + break; + + case QPainterPath::CurveToElement: { + if (!closed && drawCaps && type == e - 3) + caps |= CapEnd; + QPointF p3 = QPointF(points[2], points[3]) * state->matrix; + QPointF p4 = QPointF(points[4], points[5]) * state->matrix; + renderCubic(p, p2, p3, p4, caps); + p = p4; + type += 3; + points += 6; + break; + } + case QPainterPath::CurveToDataElement: + Q_ASSERT(!"QPainterPath::toSubpathPolygons(), bad element type"); + break; + } + caps = NoCaps; + } + } + } else { // !type, simple polygon + QPointF p = QPointF(points[0], points[1]) * state->matrix; + QPointF movedTo = p; + patternOffset = state->lastPen.dashOffset()*64; + lastPixel.x = -1; + + const qreal *end = points + 2*path.elementCount(); + // handle closed path case + bool closed = path.hasImplicitClose() || (points[0] == end[-2] && points[1] == end[-1]); + int caps = (!closed & drawCaps) ? CapBegin : NoCaps; + if (closed) { + QPointF p2 = QPointF(end[-2], end[-1]) * state->matrix; + calculateLastPoint(p2.x(), p2.y(), p.x(), p.y()); + } + + points += 2; + while (points < end) { + QPointF p2 = QPointF(points[0], points[1]) * state->matrix; + + if (!closed && drawCaps && points == end - 2) + caps |= CapEnd; + + stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps); + + p = p2; + points += 2; + caps = NoCaps; + } + if (path.hasImplicitClose()) + stroke(this, p.x(), p.y(), movedTo.x(), movedTo.y(), NoCaps); + } + + + blend(current_span, spans, &state->penData); + current_span = 0; +} + +void QCosmeticStroker::renderCubic(const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &p4, int caps) +{ +// qDebug() << ">>>> renderCubic" << p1 << p2 << p3 << p4 << capString(caps); + const int maxSubDivisions = 6; + PointF points[3*maxSubDivisions + 4]; + + points[3].x = p1.x(); + points[3].y = p1.y(); + points[2].x = p2.x(); + points[2].y = p2.y(); + points[1].x = p3.x(); + points[1].y = p3.y(); + points[0].x = p4.x(); + points[0].y = p4.y(); + + PointF *p = points; + int level = maxSubDivisions; + + renderCubicSubdivision(p, level, caps); +} + +static void splitCubic(QCosmeticStroker::PointF *points) +{ + const qreal half = .5; + qreal a, b, c, d; + + points[6].x = points[3].x; + c = points[1].x; + d = points[2].x; + points[1].x = a = ( points[0].x + c ) * half; + points[5].x = b = ( points[3].x + d ) * half; + c = ( c + d ) * half; + points[2].x = a = ( a + c ) * half; + points[4].x = b = ( b + c ) * half; + points[3].x = ( a + b ) * half; + + points[6].y = points[3].y; + c = points[1].y; + d = points[2].y; + points[1].y = a = ( points[0].y + c ) * half; + points[5].y = b = ( points[3].y + d ) * half; + c = ( c + d ) * half; + points[2].y = a = ( a + c ) * half; + points[4].y = b = ( b + c ) * half; + points[3].y = ( a + b ) * half; +} + +void QCosmeticStroker::renderCubicSubdivision(QCosmeticStroker::PointF *points, int level, int caps) +{ + if (level) { + qreal dx = points[3].x - points[0].x; + qreal dy = points[3].y - points[0].y; + qreal len = ((qreal).25) * (qAbs(dx) + qAbs(dy)); + + if (qAbs(dx * (points[0].y - points[2].y) - dy * (points[0].x - points[2].x)) >= len || + qAbs(dx * (points[0].y - points[1].y) - dy * (points[0].x - points[1].x)) >= len) { + splitCubic(points); + + --level; + renderCubicSubdivision(points + 3, level, caps & CapBegin); + renderCubicSubdivision(points, level, caps & CapEnd); + return; + } + } + + stroke(this, points[3].x, points[3].y, points[0].x, points[0].y, caps); +} + +static inline int swapCaps(int caps) +{ + return ((caps & QCosmeticStroker::CapBegin) << 1) | + ((caps & QCosmeticStroker::CapEnd) >> 1); +} + +// adjust line by half a pixel +static inline void capAdjust(int caps, int &x1, int &x2, int &y, int yinc) +{ + if (caps & QCosmeticStroker::CapBegin) { + x1 -= 32; + y -= yinc >> 1; + } + if (caps & QCosmeticStroker::CapEnd) { + x2 += 32; + } +} + +/* + The hard part about this is dropout control and avoiding douple drawing of points when + the drawing shifts from horizontal to vertical or back. + */ +template<DrawPixel drawPixel, class Dasher> +static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) +{ + if (stroker->clipLine(rx1, ry1, rx2, ry2)) + return; + + static const int half = 32; + int x1 = toF26Dot6(rx1) + half; + int y1 = toF26Dot6(ry1) + half; + int x2 = toF26Dot6(rx2) + half; + int y2 = toF26Dot6(ry2) + half; + + int dx = qAbs(x2 - x1); + int dy = qAbs(y2 - y1); + + QCosmeticStroker::Point last = stroker->lastPixel; + +// qDebug() << "stroke" << x1/64. << y1/64. << x2/64. << y2/64. << capString(caps); + + if (dx < dy) { + // vertical + + bool swapped = false; + if (y1 > y2) { + swapped = true; + qSwap(y1, y2); + qSwap(x1, x2); + caps = swapCaps(caps); + --x1; --x2; --y1; --y2; + } + int xinc = F16Dot16FixedDiv(x2 - x1, y2 - y1); + int x = x1 << 10; + + capAdjust(caps, y1, y2, x, xinc); + + int y = (y1+32) >> 6; + int ys = (y2+32) >> 6; + + if (y != ys) { + x += ( ((((y << 6) + 32 - y1))) * xinc ) >> 6; + + // calculate first and last pixel and perform dropout control + QCosmeticStroker::Direction dir = QCosmeticStroker::TopToBottom; + QCosmeticStroker::Point first; + first.x = x >> 16; + first.y = y; + last.x = (x + (ys - y - 1)*xinc) >> 16; + last.y = ys - 1; + if (swapped) { + qSwap(first, last); + dir = QCosmeticStroker::BottomToTop; + } + bool axisAligned = qAbs(xinc) < (1 << 14); + if (stroker->lastPixel.x >= 0) { + if (first.x == stroker->lastPixel.x && + first.y == stroker->lastPixel.y) { + // remove duplicated pixel + if (swapped) { + --ys; + } else { + ++y; + x += xinc; + } + } else if (stroker->lastDir != dir && + (((axisAligned && stroker->lastAxisAligned) && + stroker->lastPixel.x != first.x && stroker->lastPixel.y != first.y) || + (qAbs(stroker->lastPixel.x - first.x) > 1 && + qAbs(stroker->lastPixel.y - first.y) > 1))) { + // have a missing pixel, insert it + if (swapped) { + ++ys; + } else { + --y; + x -= xinc; + } + } + } + stroker->lastDir = dir; + stroker->lastAxisAligned = axisAligned; + + Dasher dasher(stroker, swapped, y << 6, ys << 6); + + do { + if (dasher.on()) + drawPixel(stroker, x >> 16, y, 255); + dasher.adjust(); + x += xinc; + } while (++y < ys); + } + } else { + // horizontal + if (!dx) + return; + + bool swapped = false; + if (x1 > x2) { + swapped = true; + qSwap(x1, x2); + qSwap(y1, y2); + caps = swapCaps(caps); + --x1; --x2; --y1; --y2; + } + int yinc = F16Dot16FixedDiv(y2 - y1, x2 - x1); + int y = y1 << 10; + + capAdjust(caps, x1, x2, y, yinc); + + int x = (x1+32) >> 6; + int xs = (x2+32) >> 6; + + + if (x != xs) { + y += ( ((((x << 6) + 32 - x1))) * yinc ) >> 6; + + // calculate first and last pixel to perform dropout control + QCosmeticStroker::Direction dir = QCosmeticStroker::LeftToRight; + QCosmeticStroker::Point first; + first.x = x; + first.y = y >> 16; + last.x = xs - 1; + last.y = (y + (xs - x - 1)*yinc) >> 16; + if (swapped) { + qSwap(first, last); + dir = QCosmeticStroker::RightToLeft; + } + bool axisAligned = qAbs(yinc) < (1 << 14); + if (stroker->lastPixel.x >= 0) { + if (first.x == stroker->lastPixel.x && first.y == stroker->lastPixel.y) { + // remove duplicated pixel + if (swapped) { + --xs; + } else { + ++x; + y += yinc; + } + } else if (stroker->lastDir != dir && + (((axisAligned && stroker->lastAxisAligned) && + stroker->lastPixel.x != first.x && stroker->lastPixel.y != first.y) || + (qAbs(stroker->lastPixel.x - first.x) > 1 && + qAbs(stroker->lastPixel.y - first.y) > 1))) { + // have a missing pixel, insert it + if (swapped) { + ++xs; + } else { + --x; + y -= yinc; + } + } + } + stroker->lastDir = dir; + stroker->lastAxisAligned = axisAligned; + + Dasher dasher(stroker, swapped, x << 6, xs << 6); + + do { + if (dasher.on()) + drawPixel(stroker, x, y >> 16, 255); + dasher.adjust(); + y += yinc; + } while (++x < xs); + } + } + stroker->lastPixel = last; +} + + +template<DrawPixel drawPixel, class Dasher> +static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) +{ + if (stroker->clipLine(rx1, ry1, rx2, ry2)) + return; + + int x1 = toF26Dot6(rx1); + int y1 = toF26Dot6(ry1); + int x2 = toF26Dot6(rx2); + int y2 = toF26Dot6(ry2); + + int dx = x2 - x1; + int dy = y2 - y1; + + if (qAbs(dx) < qAbs(dy)) { + // vertical + + int xinc = F16Dot16FixedDiv(dx, dy); + + bool swapped = false; + if (y1 > y2) { + qSwap(y1, y2); + qSwap(x1, x2); + swapped = true; + caps = swapCaps(caps); + } + + int x = (x1 - 32) << 10; + x -= ( ((y1 & 63) - 32) * xinc ) >> 6; + + capAdjust(caps, y1, y2, x, xinc); + + Dasher dasher(stroker, swapped, y1, y2); + + int y = y1 >> 6; + int ys = y2 >> 6; + + int alphaStart, alphaEnd; + if (y == ys) { + alphaStart = y2 - y1; + Q_ASSERT(alphaStart >= 0 && alphaStart < 64); + alphaEnd = 0; + } else { + alphaStart = 64 - (y1 & 63); + alphaEnd = (y2 & 63); + } +// qDebug() << "vertical" << x1/64. << y1/64. << x2/64. << y2/64.; +// qDebug() << " x=" << x << "dx=" << dx << "xi=" << (x>>16) << "xsi=" << ((x+(ys-y)*dx)>>16) << "y=" << y << "ys=" << ys; + + // draw first pixel + if (dasher.on()) { + uint alpha = (quint8)(x >> 8); + drawPixel(stroker, x>>16, y, (255-alpha) * alphaStart >> 6); + drawPixel(stroker, (x>>16) + 1, y, alpha * alphaStart >> 6); + } + dasher.adjust(); + x += xinc; + ++y; + if (y < ys) { + do { + if (dasher.on()) { + uint alpha = (quint8)(x >> 8); + drawPixel(stroker, x>>16, y, (255-alpha)); + drawPixel(stroker, (x>>16) + 1, y, alpha); + } + dasher.adjust(); + x += xinc; + } while (++y < ys); + } + // draw last pixel + if (alphaEnd && dasher.on()) { + uint alpha = (quint8)(x >> 8); + drawPixel(stroker, x>>16, y, (255-alpha) * alphaEnd >> 6); + drawPixel(stroker, (x>>16) + 1, y, alpha * alphaEnd >> 6); + } + } else { + // horizontal + if (!dx) + return; + + int yinc = F16Dot16FixedDiv(dy, dx); + + bool swapped = false; + if (x1 > x2) { + qSwap(x1, x2); + qSwap(y1, y2); + swapped = true; + caps = swapCaps(caps); + } + + int y = (y1 - 32) << 10; + y -= ( ((x1 & 63) - 32) * yinc ) >> 6; + + capAdjust(caps, x1, x2, y, yinc); + + Dasher dasher(stroker, swapped, x1, x2); + + int x = x1 >> 6; + int xs = x2 >> 6; + +// qDebug() << "horizontal" << x1/64. << y1/64. << x2/64. << y2/64.; +// qDebug() << " y=" << y << "dy=" << dy << "x=" << x << "xs=" << xs << "yi=" << (y>>16) << "ysi=" << ((y+(xs-x)*dy)>>16); + int alphaStart, alphaEnd; + if (x == xs) { + alphaStart = x2 - x1; + Q_ASSERT(alphaStart >= 0 && alphaStart < 64); + alphaEnd = 0; + } else { + alphaStart = 64 - (x1 & 63); + alphaEnd = (x2 & 63); + } + + // draw first pixel + if (dasher.on()) { + uint alpha = (quint8)(y >> 8); + drawPixel(stroker, x, y>>16, (255-alpha) * alphaStart >> 6); + drawPixel(stroker, x, (y>>16) + 1, alpha * alphaStart >> 6); + } + dasher.adjust(); + y += yinc; + ++x; + // draw line + if (x < xs) { + do { + if (dasher.on()) { + uint alpha = (quint8)(y >> 8); + drawPixel(stroker, x, y>>16, (255-alpha)); + drawPixel(stroker, x, (y>>16) + 1, alpha); + } + dasher.adjust(); + y += yinc; + } while (++x < xs); + } + // draw last pixel + if (alphaEnd && dasher.on()) { + uint alpha = (quint8)(y >> 8); + drawPixel(stroker, x, y>>16, (255-alpha) * alphaEnd >> 6); + drawPixel(stroker, x, (y>>16) + 1, alpha * alphaEnd >> 6); + } + } +} + +QT_END_NAMESPACE diff --git a/src/gui/painting/qcosmeticstroker_p.h b/src/gui/painting/qcosmeticstroker_p.h new file mode 100644 index 0000000..0aa71fc --- /dev/null +++ b/src/gui/painting/qcosmeticstroker_p.h @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCOSMETICSTROKER_P_H +#define QCOSMETICSTROKER_P_H + +#include <private/qdrawhelper_p.h> +#include <private/qvectorpath_p.h> +#include <private/qpaintengine_raster_p.h> +#include <qpen.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +class QCosmeticStroker; + + +typedef void (*StrokeLine)(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); + +class QCosmeticStroker +{ +public: + struct Point { + int x; + int y; + }; + struct PointF { + qreal x; + qreal y; + }; + + enum Caps { + NoCaps = 0, + CapBegin = 0x1, + CapEnd = 0x2, + }; + + // used to avoid drop outs or duplicated points + enum Direction { + TopToBottom, + BottomToTop, + LeftToRight, + RightToLeft + }; + + QCosmeticStroker(QRasterPaintEngineState *s, const QRect &dr) + : state(s), + clip(dr), + pattern(0), + reversePattern(0), + patternSize(0), + patternLength(0), + patternOffset(0), + current_span(0), + lastDir(LeftToRight), + lastAxisAligned(false) + { setup(); } + ~QCosmeticStroker() { free(pattern); free(reversePattern); } + void drawLine(const QPointF &p1, const QPointF &p2); + void drawPath(const QVectorPath &path); + void drawPoints(const QPoint *points, int num); + void drawPoints(const QPointF *points, int num); + + + QRasterPaintEngineState *state; + QRect clip; + // clip bounds in real + qreal xmin, xmax; + qreal ymin, ymax; + + StrokeLine stroke; + bool drawCaps; + + int *pattern; + int *reversePattern; + int patternSize; + int patternLength; + int patternOffset; + + enum { NSPANS = 255 }; + QT_FT_Span spans[NSPANS]; + int current_span; + ProcessSpans blend; + + int opacity; + + uint color; + uint *pixels; + int ppl; + + Direction lastDir; + Point lastPixel; + bool lastAxisAligned; + +private: + void setup(); + + void renderCubic(const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &p4, int caps); + void renderCubicSubdivision(PointF *points, int level, int caps); + // used for closed subpaths + void calculateLastPoint(qreal rx1, qreal ry1, qreal rx2, qreal ry2); + +public: + bool clipLine(qreal &x1, qreal &y1, qreal &x2, qreal &y2); +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QCOSMETICLINE_H diff --git a/src/gui/painting/qgraphicssystemex_symbian.cpp b/src/gui/painting/qgraphicssystemex_symbian.cpp index b53353b..4469704 100644 --- a/src/gui/painting/qgraphicssystemex_symbian.cpp +++ b/src/gui/painting/qgraphicssystemex_symbian.cpp @@ -44,10 +44,39 @@ #include "private/qbackingstore_p.h" #include "private/qapplication_p.h" -#include <QDebug> +#include <e32property.h> QT_BEGIN_NAMESPACE +static bool bcm2727Initialized = false; +static bool bcm2727 = false; + +bool QSymbianGraphicsSystemEx::hasBCM2727() +{ + if (bcm2727Initialized) + return bcm2727; + + const TUid KIvePropertyCat = {0x2726beef}; + enum TIvePropertyChipType { + EVCBCM2727B1 = 0x00000000, + EVCBCM2763A0 = 0x04000100, + EVCBCM2763B0 = 0x04000102, + EVCBCM2763C0 = 0x04000103, + EVCBCM2763C1 = 0x04000104, + EVCBCMUnknown = 0x7fffffff + }; + + TInt chipType = EVCBCMUnknown; + if (RProperty::Get(KIvePropertyCat, 0, chipType) == KErrNone) { + if (chipType == EVCBCM2727B1) + bcm2727 = true; + } + + bcm2727Initialized = true; + + return bcm2727; +} + void QSymbianGraphicsSystemEx::releaseCachedGpuResources() { // Do nothing here @@ -64,11 +93,6 @@ void QSymbianGraphicsSystemEx::releaseAllGpuResources() } } -bool QSymbianGraphicsSystemEx::hasBCM2727() -{ - return !QApplicationPrivate::instance()->useTranslucentEGLSurfaces; -} - void QSymbianGraphicsSystemEx::forceToRaster(QWidget *window) { if (window && window->isWindow()) { diff --git a/src/gui/painting/qgraphicssystemex_symbian_p.h b/src/gui/painting/qgraphicssystemex_symbian_p.h index c1d1bdf..1f2a7c6 100644 --- a/src/gui/painting/qgraphicssystemex_symbian_p.h +++ b/src/gui/painting/qgraphicssystemex_symbian_p.h @@ -62,9 +62,10 @@ class QWidget; class Q_GUI_EXPORT QSymbianGraphicsSystemEx : public QGraphicsSystemEx { public: + static bool hasBCM2727(); + virtual void releaseCachedGpuResources(); virtual void releaseAllGpuResources(); - virtual bool hasBCM2727(); virtual void forceToRaster(QWidget *window); }; diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp index 7c17c1b..8b607b2 100644 --- a/src/gui/painting/qoutlinemapper.cpp +++ b/src/gui/painting/qoutlinemapper.cpp @@ -47,6 +47,8 @@ QT_BEGIN_NAMESPACE +static const qreal aliasedCoordinateDelta = 0.5 - 0.015625; + #define qreal_to_fixed_26_6(f) (int(f * 64)) @@ -214,6 +216,13 @@ void QOutlineMapper::endOutline() elements = m_elements_dev.data(); } + if (m_round_coords) { + // round coordinates to match outlines drawn with drawLine_midpoint_i + for (int i = 0; i < m_elements.size(); ++i) + elements[i] = QPointF(qFloor(elements[i].x() + aliasedCoordinateDelta), + qFloor(elements[i].y() + aliasedCoordinateDelta)); + } + controlPointRect = boundingRect(elements, element_count); #ifdef QT_DEBUG_CONVERT diff --git a/src/gui/painting/qoutlinemapper_p.h b/src/gui/painting/qoutlinemapper_p.h index 1432d6f..388858c 100644 --- a/src/gui/painting/qoutlinemapper_p.h +++ b/src/gui/painting/qoutlinemapper_p.h @@ -95,7 +95,8 @@ public: m_tags(0), m_contours(0), m_polygon_dev(0), - m_in_clip_elements(false) + m_in_clip_elements(false), + m_round_coords(false) { } @@ -201,6 +202,8 @@ public: QT_FT_Outline *convertPath(const QPainterPath &path); QT_FT_Outline *convertPath(const QVectorPath &path); + void setCoordinateRounding(bool coordinateRounding) { m_round_coords = coordinateRounding; } + inline QPainterPath::ElementType *elementTypes() const { return m_element_types.size() == 0 ? 0 : m_element_types.data(); } public: @@ -234,6 +237,9 @@ public: bool m_valid; bool m_in_clip_elements; + +private: + bool m_round_coords; }; QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintengine_mac_p.h b/src/gui/painting/qpaintengine_mac_p.h index c87501e..2434011 100644 --- a/src/gui/painting/qpaintengine_mac_p.h +++ b/src/gui/painting/qpaintengine_mac_p.h @@ -121,6 +121,8 @@ public: void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) { QPaintEngine::drawPolygon(points, pointCount, mode); } + bool supportsTransformations(qreal, const QTransform &) const { return true; }; + protected: friend class QMacPrintEngine; friend class QMacPrintEnginePrivate; diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 5ce94f8..30553b5 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -69,6 +69,7 @@ // #include <private/qrasterizer_p.h> #include <private/qimage_p.h> #include <private/qstatictext_p.h> +#include <private/qcosmeticstroker_p.h> #include "qmemrotate_p.h" #include "qpaintengine_raster_p.h" @@ -126,6 +127,9 @@ void dumpClip(int width, int height, const QClipData *clip); // 4 pixels. #define int_dim(pos, dim) (int(pos+dim) - int(pos)) +// use the same rounding as in qrasterizer.cpp (6 bit fixed point) +static const qreal aliasedCoordinateDelta = 0.5 - 0.015625; + #ifdef Q_WS_WIN extern bool qt_cleartype_enabled; #endif @@ -156,16 +160,6 @@ enum LineDrawMode { LineDrawIncludeLastPixel }; -static void drawLine_midpoint_i(int x1, int y1, int x2, int y2, ProcessSpans span_func, QSpanData *data, - LineDrawMode style, const QIntRect &rect); -static void drawLine_midpoint_dashed_i(int x1, int y1, int x2, int y2, - QPen *pen, ProcessSpans span_func, QSpanData *data, - LineDrawMode style, const QIntRect &devRect, - int *patternOffset); -// static void drawLine_midpoint_f(qreal x1, qreal y1, qreal x2, qreal y2, -// ProcessSpans span_func, QSpanData *data, -// LineDrawMode style, const QRect &devRect); - static void drawEllipse_midpoint_i(const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data); @@ -789,14 +783,12 @@ void QRasterPaintEngine::updatePen(const QPen &pen) s->stroker = 0; } + ensureState(); // needed because of tx_noshear... s->flags.fast_pen = pen_style > Qt::NoPen - && s->penData.blend - && !s->flags.antialiased - && (penWidth == 0 || (penWidth <= 1 - && (s->matrix.type() <= QTransform::TxTranslate - || pen.isCosmetic()))); + && s->penData.blend + && ((pen.isCosmetic() && penWidth <= 1) + || (s->flags.tx_noshear && penWidth * s->txscale <= 1)); - ensureState(); // needed because of tx_noshear... s->flags.non_complex_pen = qpen_capStyle(s->lastPen) <= Qt::SquareCap && s->flags.tx_noshear; s->strokeFlags = 0; @@ -1513,6 +1505,7 @@ void QRasterPaintEngine::drawRects(const QRect *rects, int rectCount) qDebug(" - QRasterPaintEngine::drawRect(), rectCount=%d", rectCount); #endif Q_D(QRasterPaintEngine); + ensureState(); QRasterPaintEngineState *s = state(); // Fill @@ -1541,32 +1534,14 @@ void QRasterPaintEngine::drawRects(const QRect *rects, int rectCount) ensurePen(); if (s->penData.blend) { - if (s->flags.fast_pen && s->lastPen.brush().isOpaque()) { - const QRect *r = rects; - const QRect *lastRect = rects + rectCount; - while (r < lastRect) { - int left = r->x(); - int right = r->x() + r->width(); - int top = r->y(); - int bottom = r->y() + r->height(); - -#ifdef Q_WS_MAC - int pts[] = { top, left, - top, right, - bottom, right, - bottom, left }; -#else - int pts[] = { left, top, - right, top, - right, bottom, - left, bottom }; -#endif - - strokePolygonCosmetic((QPoint *) pts, 4, WindingMode); - ++r; + QRectVectorPath path; + if (s->flags.fast_pen) { + QCosmeticStroker stroker(s, d->deviceRect); + for (int i = 0; i < rectCount; ++i) { + path.set(rects[i]); + stroker.drawPath(path); } } else { - QRectVectorPath path; for (int i = 0; i < rectCount; ++i) { path.set(rects[i]); stroke(path, s->pen); @@ -1581,13 +1556,13 @@ void QRasterPaintEngine::drawRects(const QRect *rects, int rectCount) void QRasterPaintEngine::drawRects(const QRectF *rects, int rectCount) { #ifdef QT_DEBUG_DRAW - qDebug(" - QRasterPaintEngine::drawRect(), rectCount=%d", rectCount); + qDebug(" - QRasterPaintEngine::drawRect(QRectF*), rectCount=%d", rectCount); #endif #ifdef QT_FAST_SPANS Q_D(QRasterPaintEngine); + ensureState(); QRasterPaintEngineState *s = state(); - ensureState(); if (s->flags.tx_noshear) { ensureBrush(); @@ -1605,59 +1580,17 @@ void QRasterPaintEngine::drawRects(const QRectF *rects, int rectCount) ensurePen(); if (s->penData.blend) { - qreal width = s->pen.isCosmetic() - ? (s->lastPen.widthF() == 0 ? 1 : s->lastPen.widthF()) - : s->lastPen.widthF() * s->txscale; - - if (s->flags.fast_pen && s->lastPen.brush().isOpaque()) { - for (int i = 0; i < rectCount; ++i) { - const QRectF &r = rects[i]; - qreal left = r.x(); - qreal right = r.x() + r.width(); - qreal top = r.y(); - qreal bottom = r.y() + r.height(); - qreal pts[] = { left, top, - right, top, - right, bottom, - left, bottom }; - strokePolygonCosmetic((QPointF *) pts, 4, WindingMode); - } - } else if (width <= 1 && qpen_style(s->lastPen) == Qt::SolidLine) { - d->initializeRasterizer(&s->penData); - + QRectVectorPath path; + if (s->flags.fast_pen) { + QCosmeticStroker stroker(s, d->deviceRect); for (int i = 0; i < rectCount; ++i) { - const QRectF &rect = rects[i].normalized(); - if (rect.isEmpty()) { - qreal pts[] = { rect.left(), rect.top(), rect.right(), rect.bottom() }; - QVectorPath vp(pts, 2, 0, QVectorPath::LinesHint); - QPaintEngineEx::stroke(vp, s->lastPen); - } else { - const QPointF tl = s->matrix.map(rect.topLeft()); - const QPointF tr = s->matrix.map(rect.topRight()); - const QPointF bl = s->matrix.map(rect.bottomLeft()); - const QPointF br = s->matrix.map(rect.bottomRight()); - const qreal w = width / (rect.width() * s->txscale); - const qreal h = width / (rect.height() * s->txscale); - d->rasterizer->rasterizeLine(tl, tr, w); // top - d->rasterizer->rasterizeLine(bl, br, w); // bottom - d->rasterizer->rasterizeLine(bl, tl, h); // left - d->rasterizer->rasterizeLine(br, tr, h); // right - } + path.set(rects[i]); + stroker.drawPath(path); } } else { for (int i = 0; i < rectCount; ++i) { - const QRectF &r = rects[i]; - qreal left = r.x(); - qreal right = r.x() + r.width(); - qreal top = r.y(); - qreal bottom = r.y() + r.height(); - qreal pts[] = { left, top, - right, top, - right, bottom, - left, bottom, - left, top }; - QVectorPath vp(pts, 5, 0, QVectorPath::RectangleHint); - QPaintEngineEx::stroke(vp, s->lastPen); + path.set(rects[i]); + QPaintEngineEx::stroke(path, s->lastPen); } } } @@ -1674,36 +1607,16 @@ void QRasterPaintEngine::drawRects(const QRectF *rects, int rectCount) */ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) { + Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); + ensurePen(pen); if (!s->penData.blend) return; - if (s->flags.fast_pen && !path.isCurved() - && s->lastPen.brush().isOpaque()) { - int count = path.elementCount(); - QPointF *points = (QPointF *) path.points(); - const QPainterPath::ElementType *types = path.elements(); - if (types) { - int first = 0; - int last; - while (first < count) { - while (first < count && types[first] != QPainterPath::MoveToElement) ++first; - last = first + 1; - while (last < count && types[last] == QPainterPath::LineToElement) ++last; - strokePolygonCosmetic(points + first, last - first, - path.hasImplicitClose() && last == count // only close last one.. - ? WindingMode - : PolylineMode); - first = last; - } - } else { - strokePolygonCosmetic(points, count, - path.hasImplicitClose() - ? WindingMode - : PolylineMode); - } - + if (s->flags.fast_pen) { + QCosmeticStroker stroker(s, d->deviceRect); + stroker.drawPath(path); } else if (s->flags.non_complex_pen && path.shape() == QVectorPath::LinesHint) { qreal width = s->lastPen.isCosmetic() ? (qpen_widthf(s->lastPen) == 0 ? 1 : qpen_widthf(s->lastPen)) @@ -1760,10 +1673,10 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) static inline QRect toNormalizedFillRect(const QRectF &rect) { - int x1 = qRound(rect.x()); - int y1 = qRound(rect.y()); - int x2 = qRound(rect.right()); - int y2 = qRound(rect.bottom()); + int x1 = qRound(rect.x() + aliasedCoordinateDelta); + int y1 = qRound(rect.y() + aliasedCoordinateDelta); + int x2 = qRound(rect.right() + aliasedCoordinateDelta); + int y2 = qRound(rect.bottom() + aliasedCoordinateDelta); if (x2 < x1) qSwap(x1, x2); @@ -1818,26 +1731,6 @@ void QRasterPaintEngine::fill(const QVectorPath &path, const QBrush &brush) } } - if (path.shape() == QVectorPath::EllipseHint) { - if (!s->flags.antialiased && s->matrix.type() <= QTransform::TxScale) { - const qreal *p = path.points(); - QPointF tl = QPointF(p[0], p[1]) * s->matrix; - QPointF br = QPointF(p[4], p[5]) * s->matrix; - QRectF r = s->matrix.mapRect(QRectF(tl, br)); - - ProcessSpans penBlend = d->getPenFunc(r, &s->penData); - ProcessSpans brushBlend = d->getBrushFunc(r, &s->brushData); - const QRect brect = QRect(int(r.x()), int(r.y()), - int_dim(r.x(), r.width()), - int_dim(r.y(), r.height())); - if (brect == r) { - drawEllipse_midpoint_i(brect, d->deviceRect, penBlend, brushBlend, - &s->penData, &s->brushData); - return; - } - } - } - // ### Optimize for non transformed ellipses and rectangles... QRectF cpRect = path.controlPointRect(); const QRect deviceRect = s->matrix.mapRect(cpRect).toRect(); @@ -2032,6 +1925,7 @@ void QRasterPaintEngine::fillPolygon(const QPointF *points, int pointCount, Poly */ void QRasterPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) { + Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); #ifdef QT_DEBUG_DRAW @@ -2048,20 +1942,23 @@ void QRasterPaintEngine::drawPolygon(const QPointF *points, int pointCount, Poly } ensurePen(); - ensureBrush(); if (mode != PolylineMode) { // Do the fill... + ensureBrush(); if (s->brushData.blend) { + d->outlineMapper->setCoordinateRounding(s->penData.blend && s->flags.fast_pen && s->lastPen.brush().isOpaque()); fillPolygon(points, pointCount, mode); + d->outlineMapper->setCoordinateRounding(false); } } // Do the outline... if (s->penData.blend) { - if (s->flags.fast_pen && s->lastPen.brush().isOpaque()) - strokePolygonCosmetic(points, pointCount, mode); - else { - QVectorPath vp((qreal *) points, pointCount, 0, QVectorPath::polygonFlags(mode)); + QVectorPath vp((qreal *) points, pointCount, 0, QVectorPath::polygonFlags(mode)); + if (s->flags.fast_pen) { + QCosmeticStroker stroker(s, d->deviceRect); + stroker.drawPath(vp); + } else { QPaintEngineEx::stroke(vp, s->lastPen); } } @@ -2090,13 +1987,7 @@ void QRasterPaintEngine::drawPolygon(const QPoint *points, int pointCount, Polyg return; } - ensureState(); ensurePen(); - if (!(s->flags.int_xform && s->flags.fast_pen && (!s->penData.blend || s->pen.brush().isOpaque()))) { - // this calls the float version - QPaintEngineEx::drawPolygon(points, pointCount, mode); - return; - } // Do the fill if (mode != PolylineMode) { @@ -2104,6 +1995,7 @@ void QRasterPaintEngine::drawPolygon(const QPoint *points, int pointCount, Polyg if (s->brushData.blend) { // Compose polygon fill.., ensureOutlineMapper(); + d->outlineMapper->setCoordinateRounding(s->penData.blend != 0); d->outlineMapper->beginOutline(mode == WindingMode ? Qt::WindingFill : Qt::OddEvenFill); d->outlineMapper->moveTo(*points); const QPoint *p = points; @@ -2117,235 +2009,30 @@ void QRasterPaintEngine::drawPolygon(const QPoint *points, int pointCount, Polyg ProcessSpans brushBlend = d->getBrushFunc(d->outlineMapper->controlPointRect, &s->brushData); d->rasterize(d->outlineMapper->outline(), brushBlend, &s->brushData, d->rasterBuffer.data()); + d->outlineMapper->setCoordinateRounding(false); } } // Do the outline... if (s->penData.blend) { - if (s->flags.fast_pen && s->lastPen.brush().isOpaque()) - strokePolygonCosmetic(points, pointCount, mode); - else { - int count = pointCount * 2; - QVarLengthArray<qreal> fpoints(count); -#ifdef Q_WS_MAC - for (int i=0; i<count; i+=2) { - fpoints[i] = ((int *) points)[i+1]; - fpoints[i+1] = ((int *) points)[i]; - } -#else - for (int i=0; i<count; ++i) - fpoints[i] = ((int *) points)[i]; -#endif - QVectorPath vp((qreal *) fpoints.data(), pointCount, 0, QVectorPath::polygonFlags(mode)); - QPaintEngineEx::stroke(vp, s->lastPen); + int count = pointCount * 2; + QVarLengthArray<qreal> fpoints(count); + #ifdef Q_WS_MAC + for (int i=0; i<count; i+=2) { + fpoints[i] = ((int *) points)[i+1]; + fpoints[i+1] = ((int *) points)[i]; } - } -} - -/*! - \internal -*/ -void QRasterPaintEngine::strokePolygonCosmetic(const QPointF *points, int pointCount, PolygonDrawMode mode) -{ - Q_D(QRasterPaintEngine); - QRasterPaintEngineState *s = state(); - - Q_ASSERT(s->penData.blend); - Q_ASSERT(s->flags.fast_pen); - - bool needs_closing = mode != PolylineMode && points[0] != points[pointCount-1]; - - // Use fast path for 0 width / trivial pens. - QIntRect devRect; - devRect.set(d->deviceRect); - - LineDrawMode mode_for_last = (s->lastPen.capStyle() != Qt::FlatCap - ? LineDrawIncludeLastPixel - : LineDrawNormal); - int dashOffset = int(s->lastPen.dashOffset()); - - // Draw all the line segments. - for (int i=1; i<pointCount; ++i) { - - QPointF lp1 = points[i-1] * s->matrix; - QPointF lp2 = points[i] * s->matrix; - - const QRectF brect(lp1, lp2); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) { - drawLine_midpoint_i(qFloor(lp1.x()), qFloor(lp1.y()), - qFloor(lp2.x()), qFloor(lp2.y()), - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect); + #else + for (int i=0; i<count; ++i) + fpoints[i] = ((int *) points)[i]; + #endif + QVectorPath vp((qreal *) fpoints.data(), pointCount, 0, QVectorPath::polygonFlags(mode)); + + if (s->flags.fast_pen) { + QCosmeticStroker stroker(s, d->deviceRect); + stroker.drawPath(vp); } else { - drawLine_midpoint_dashed_i(qFloor(lp1.x()), qFloor(lp1.y()), - qFloor(lp2.x()), qFloor(lp2.y()), - &s->lastPen, - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect, &dashOffset); - } - } - - // Polygons are implicitly closed. - if (needs_closing) { - QPointF lp1 = points[pointCount-1] * s->matrix; - QPointF lp2 = points[0] * s->matrix; - - const QRectF brect(lp1, lp2); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) { - drawLine_midpoint_i(qFloor(lp1.x()), qFloor(lp1.y()), - qFloor(lp2.x()), qFloor(lp2.y()), - penBlend, &s->penData, - LineDrawIncludeLastPixel, - devRect); - } else { - drawLine_midpoint_dashed_i(qFloor(lp1.x()), qFloor(lp1.y()), - qFloor(lp2.x()), qFloor(lp2.y()), - &s->lastPen, - penBlend, &s->penData, - LineDrawIncludeLastPixel, - devRect, &dashOffset); - } - } - -} - -/*! - \internal -*/ -void QRasterPaintEngine::strokePolygonCosmetic(const QPoint *points, int pointCount, PolygonDrawMode mode) -{ - Q_D(QRasterPaintEngine); - QRasterPaintEngineState *s = state(); - - // We assert here because this function is called from drawRects - // and drawPolygon and they already do ensurePen(), so we skip that - // here to avoid duplicate checks.. - Q_ASSERT(s->penData.blend); - - bool needs_closing = mode != PolylineMode && points[0] != points[pointCount-1]; - - QIntRect devRect; - devRect.set(d->deviceRect); - - LineDrawMode mode_for_last = (s->lastPen.capStyle() != Qt::FlatCap - ? LineDrawIncludeLastPixel - : LineDrawNormal); - - int m11 = int(s->matrix.m11()); - int m22 = int(s->matrix.m22()); - int dx = int(s->matrix.dx()); - int dy = int(s->matrix.dy()); - int m13 = int(s->matrix.m13()); - int m23 = int(s->matrix.m23()); - bool affine = !m13 && !m23; - - int dashOffset = int(s->lastPen.dashOffset()); - - if (affine) { - // Draw all the line segments. - for (int i=1; i<pointCount; ++i) { - const QPoint lp1 = points[i-1] * s->matrix; - const QPoint lp2 = points[i] * s->matrix; - const QRect brect(lp1, lp2); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(lp1.x(), lp1.y(), - lp2.x(), lp2.y(), - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect); - else - drawLine_midpoint_dashed_i(lp1.x(), lp1.y(), - lp2.x(), lp2.y(), - &s->lastPen, - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect, &dashOffset); - - } - - // Polygons are implicitly closed. - if (needs_closing) { - const QPoint lp1 = points[pointCount - 1] * s->matrix; - const QPoint lp2 = points[0] * s->matrix; - const QRect brect(lp1, lp2); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(lp1.x(), lp1.y(), - lp2.x(), lp2.y(), - penBlend, &s->penData, LineDrawIncludeLastPixel, - devRect); - else - drawLine_midpoint_dashed_i(lp1.x(), lp1.y(), - lp2.x(), lp2.y(), - &s->lastPen, - penBlend, &s->penData, LineDrawIncludeLastPixel, - devRect, &dashOffset); - } - } else { - // Draw all the line segments. - for (int i=1; i<pointCount; ++i) { - int x1 = points[i-1].x() * m11 + dx; - int y1 = points[i-1].y() * m22 + dy; - qreal w = m13*points[i-1].x() + m23*points[i-1].y() + 1.; - w = 1/w; - x1 = int(x1*w); - y1 = int(y1*w); - int x2 = points[i].x() * m11 + dx; - int y2 = points[i].y() * m22 + dy; - w = m13*points[i].x() + m23*points[i].y() + 1.; - w = 1/w; - x2 = int(x2*w); - y2 = int(y2*w); - - const QRect brect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(x1, y1, x2, y2, - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect); - else - drawLine_midpoint_dashed_i(x1, y1, x2, y2, - &s->lastPen, - penBlend, &s->penData, - i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel, - devRect, &dashOffset); - - } - - int x1 = points[pointCount-1].x() * m11 + dx; - int y1 = points[pointCount-1].y() * m22 + dy; - qreal w = m13*points[pointCount-1].x() + m23*points[pointCount-1].y() + 1.; - w = 1/w; - x1 = int(x1*w); - y1 = int(y1*w); - int x2 = points[0].x() * m11 + dx; - int y2 = points[0].y() * m22 + dy; - w = m13*points[0].x() + m23*points[0].y() + 1.; - w = 1/w; - x2 = int(x2 * w); - y2 = int(y2 * w); - // Polygons are implicitly closed. - - if (needs_closing) { - const QRect brect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(x1, y1, x2, y2, - penBlend, &s->penData, LineDrawIncludeLastPixel, - devRect); - else - drawLine_midpoint_dashed_i(x1, y1, x2, y2, - &s->lastPen, - penBlend, &s->penData, LineDrawIncludeLastPixel, - devRect, &dashOffset); + QPaintEngineEx::stroke(vp, s->lastPen); } } } @@ -2579,7 +2266,10 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe int sr_b = qCeil(sr.bottom()) - 1; if (s->matrix.type() <= QTransform::TxScale && !s->flags.antialiased && sr_l == sr_r && sr_t == sr_b) { + // as fillRect will apply the aliased coordinate delta we need to + // subtract it here as we don't use it for image drawing QTransform old = s->matrix; + s->matrix = s->matrix * QTransform::fromTranslate(-aliasedCoordinateDelta, -aliasedCoordinateDelta); // Do whatever fillRect() does, but without premultiplying the color if it's already premultiplied. QRgb color = img.pixel(sr_l, sr_t); @@ -2723,9 +2413,11 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe d->initializeRasterizer(&d->image_filler_xform); d->rasterizer->setAntialiased(s->flags.antialiased); + const QPointF offs = s->flags.antialiased ? QPointF() : QPointF(aliasedCoordinateDelta, aliasedCoordinateDelta); + const QRectF &rect = r.normalized(); - const QPointF a = s->matrix.map((rect.topLeft() + rect.bottomLeft()) * 0.5f); - const QPointF b = s->matrix.map((rect.topRight() + rect.bottomRight()) * 0.5f); + const QPointF a = s->matrix.map((rect.topLeft() + rect.bottomLeft()) * 0.5f) - offs; + const QPointF b = s->matrix.map((rect.topRight() + rect.bottomRight()) * 0.5f) - offs; if (s->flags.tx_noshear) d->rasterizer->rasterizeLine(a, b, rect.height() / rect.width()); @@ -2734,12 +2426,13 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe return; } #endif + const qreal offs = s->flags.antialiased ? qreal(0) : aliasedCoordinateDelta; QPainterPath path; path.addRect(r); QTransform m = s->matrix; s->matrix = QTransform(m.m11(), m.m12(), m.m13(), m.m21(), m.m22(), m.m23(), - m.m31(), m.m32(), m.m33()); + m.m31() - offs, m.m32() - offs, m.m33()); fillPath(path, &d->image_filler_xform); s->matrix = m; } else { @@ -3167,7 +2860,15 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, } else #endif { - QFontEngineGlyphCache::Type glyphType = fontEngine->glyphFormat >= 0 ? QFontEngineGlyphCache::Type(fontEngine->glyphFormat) : d->glyphCacheType; + QFontEngineGlyphCache::Type glyphType; + if (fontEngine->glyphFormat >= 0) { + glyphType = QFontEngineGlyphCache::Type(fontEngine->glyphFormat); + } else if (s->matrix.type() > QTransform::TxTranslate + && d->glyphCacheType == QFontEngineGlyphCache::Raster_RGBMask) { + glyphType = QFontEngineGlyphCache::Raster_A8; + } else { + glyphType = d->glyphCacheType; + } QImageTextureGlyphCache *cache = static_cast<QImageTextureGlyphCache *>(fontEngine->glyphCache(0, glyphType, s->matrix)); @@ -3191,6 +2892,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, rightShift = 3; // divide by 8 int margin = cache->glyphMargin(); + const QFixed offs = QFixed::fromReal(aliasedCoordinateDelta); const uchar *bits = image.bits(); for (int i=0; i<numGlyphs; ++i) { @@ -3201,7 +2903,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, continue; int x = qFloor(positions[i].x) + c.baseLineX - margin; - int y = qFloor(positions[i].y) - c.baseLineY - margin; + int y = qFloor(positions[i].y + offs) - c.baseLineY - margin; // printf("drawing [%d %d %d %d] baseline [%d %d], glyph: %d, to: %d %d, pos: %d %d\n", // c.x, c.y, @@ -3239,13 +2941,15 @@ void QRasterPaintEngine::drawGlyphsS60(const QPointF &p, const QTextItemInt &ti) fe->setFontScale(matrix.m11()); ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions); + const QFixed aliasDelta = QFixed::fromReal(aliasedCoordinateDelta); + for (int i=0; i<glyphs.size(); ++i) { TOpenFontCharMetrics tmetrics; const TUint8 *glyphBitmapBytes; TSize glyphBitmapSize; fe->getCharacterData(glyphs[i], tmetrics, glyphBitmapBytes, glyphBitmapSize); - const int x = qFloor(positions[i].x + tmetrics.HorizBearingX()); - const int y = qFloor(positions[i].y - tmetrics.HorizBearingY()); + const int x = qFloor(positions[i].x + tmetrics.HorizBearingX() + aliasDelta); + const int y = qFloor(positions[i].y - tmetrics.HorizBearingY() + aliasDelta); alphaPenBlt(glyphBitmapBytes, glyphBitmapSize.iWidth, 8, x, y, glyphBitmapSize.iWidth, glyphBitmapSize.iHeight); } @@ -3346,19 +3050,6 @@ QRasterPaintEnginePrivate::getBrushFunc(const QRectF &rect, } inline ProcessSpans -QRasterPaintEnginePrivate::getPenFunc(const QRect &rect, - const QSpanData *data) const -{ - Q_Q(const QRasterPaintEngine); - const QRasterPaintEngineState *s = q->state(); - - if (!s->flags.fast_pen && s->matrix.type() > QTransform::TxTranslate) - return data->blend; - const int penWidth = s->flags.fast_pen ? 1 : qCeil(s->pen.widthF()); - return isUnclipped(rect, penWidth) ? data->unclipped_blend : data->blend; -} - -inline ProcessSpans QRasterPaintEnginePrivate::getPenFunc(const QRectF &rect, const QSpanData *data) const { @@ -3379,8 +3070,13 @@ void QRasterPaintEngine::drawStaticTextItem(QStaticTextItem *textItem) ensurePen(); ensureState(); - drawCachedGlyphs(textItem->numGlyphs, textItem->glyphs, textItem->glyphPositions, - textItem->fontEngine()); + QFontEngine *fontEngine = textItem->fontEngine(); + if (!supportsTransformations(fontEngine)) { + drawCachedGlyphs(textItem->numGlyphs, textItem->glyphs, textItem->glyphPositions, + fontEngine); + } else { + QPaintEngineEx::drawStaticTextItem(textItem); + } } /*! @@ -3403,36 +3099,7 @@ void QRasterPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte #if defined (Q_WS_WIN) || defined(Q_WS_MAC) - bool drawCached = true; - - if (s->matrix.type() >= QTransform::TxProject) - drawCached = false; - - // don't try to cache huge fonts - const qreal pixelSize = ti.fontEngine->fontDef.pixelSize; - if (pixelSize * pixelSize * qAbs(s->matrix.determinant()) >= 64 * 64) - drawCached = false; - - // ### Remove the TestFontEngine and Box engine crap, in these - // ### cases we should delegate painting to the font engine - // ### directly... - -#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE) - QFontEngine::Type fontEngineType = ti.fontEngine->type(); - // qDebug() << "type" << fontEngineType << s->matrix.type(); - if ((fontEngineType == QFontEngine::Win && !((QFontEngineWin *) ti.fontEngine)->ttf && s->matrix.type() > QTransform::TxTranslate) - || (s->matrix.type() <= QTransform::TxTranslate - && (fontEngineType == QFontEngine::TestFontEngine - || fontEngineType == QFontEngine::Box))) { - drawCached = false; - } -#else - if (s->matrix.type() > QTransform::TxTranslate) - drawCached = false; -#endif - if (drawCached) { - QRasterPaintEngineState *s = state(); - + if (!supportsTransformations(ti.fontEngine)) { QVarLengthArray<QFixedPoint> positions; QVarLengthArray<glyph_t> glyphs; @@ -3467,7 +3134,7 @@ void QRasterPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte || (fontEngine->type() == QFontEngine::Proxy && !(static_cast<QProxyFontEngine *>(fontEngine)->drawAsOutline())) )) { - fontEngine->draw(this, qFloor(p.x()), qFloor(p.y()), ti); + fontEngine->draw(this, qFloor(p.x() + aliasedCoordinateDelta), qFloor(p.y() + aliasedCoordinateDelta), ti); return; } #endif // Q_WS_QWS @@ -3490,6 +3157,7 @@ void QRasterPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte for(int i = 0; i < glyphs.size(); i++) { QImage img = fontEngine->alphaMapForGlyph(glyphs[i]); glyph_metrics_t metrics = fontEngine->boundingBox(glyphs[i]); + // ### hm, perhaps an QFixed offs = QFixed::fromReal(aliasedCoordinateDelta) is needed here? alphaPenBlt(img.bits(), img.bytesPerLine(), img.depth(), qRound(positions[i].x + metrics.x), qRound(positions[i].y + metrics.y), @@ -3544,48 +3212,16 @@ void QRasterPaintEngine::drawPoints(const QPointF *points, int pointCount) QRasterPaintEngineState *s = state(); ensurePen(); - qreal pw = s->lastPen.widthF(); - if (!s->flags.fast_pen && (s->matrix.type() > QTransform::TxTranslate || pw > 1)) { - QPaintEngineEx::drawPoints(points, pointCount); - - } else { - if (!s->penData.blend) - return; - - QVarLengthArray<QT_FT_Span, 4096> array(pointCount); - QT_FT_Span span = { 0, 1, 0, 255 }; - const QPointF *end = points + pointCount; - qreal trans_x, trans_y; - int x, y; - int left = d->deviceRect.x(); - int right = left + d->deviceRect.width(); - int top = d->deviceRect.y(); - int bottom = top + d->deviceRect.height(); - int count = 0; - while (points < end) { - s->matrix.map(points->x(), points->y(), &trans_x, &trans_y); - x = qFloor(trans_x); - y = qFloor(trans_y); - if (x >= left && x < right && y >= top && y < bottom) { - if (count > 0) { - const QT_FT_Span &last = array[count - 1]; - // spans must be sorted on y (primary) and x (secondary) - if (y < last.y || (y == last.y && x < last.x)) { - s->penData.blend(count, array.constData(), &s->penData); - count = 0; - } - } - - span.x = x; - span.y = y; - array[count++] = span; - } - ++points; - } + if (!s->penData.blend) + return; - if (count > 0) - s->penData.blend(count, array.constData(), &s->penData); + if (!s->flags.fast_pen) { + QPaintEngineEx::drawPoints(points, pointCount); + return; } + + QCosmeticStroker stroker(s, d->deviceRect); + stroker.drawPoints(points, pointCount); } @@ -3595,48 +3231,16 @@ void QRasterPaintEngine::drawPoints(const QPoint *points, int pointCount) QRasterPaintEngineState *s = state(); ensurePen(); - double pw = s->lastPen.widthF(); - if (!s->flags.fast_pen && (s->matrix.type() > QTransform::TxTranslate || pw > 1)) { - QPaintEngineEx::drawPoints(points, pointCount); - - } else { - if (!s->penData.blend) - return; - - QVarLengthArray<QT_FT_Span, 4096> array(pointCount); - QT_FT_Span span = { 0, 1, 0, 255 }; - const QPoint *end = points + pointCount; - qreal trans_x, trans_y; - int x, y; - int left = d->deviceRect.x(); - int right = left + d->deviceRect.width(); - int top = d->deviceRect.y(); - int bottom = top + d->deviceRect.height(); - int count = 0; - while (points < end) { - s->matrix.map(points->x(), points->y(), &trans_x, &trans_y); - x = qFloor(trans_x); - y = qFloor(trans_y); - if (x >= left && x < right && y >= top && y < bottom) { - if (count > 0) { - const QT_FT_Span &last = array[count - 1]; - // spans must be sorted on y (primary) and x (secondary) - if (y < last.y || (y == last.y && x < last.x)) { - s->penData.blend(count, array.constData(), &s->penData); - count = 0; - } - } - - span.x = x; - span.y = y; - array[count++] = span; - } - ++points; - } + if (!s->penData.blend) + return; - if (count > 0) - s->penData.blend(count, array.constData(), &s->penData); + if (!s->flags.fast_pen) { + QPaintEngineEx::drawPoints(points, pointCount); + return; } + + QCosmeticStroker stroker(s, d->deviceRect); + stroker.drawPoints(points, pointCount); } /*! @@ -3645,59 +3249,22 @@ void QRasterPaintEngine::drawPoints(const QPoint *points, int pointCount) void QRasterPaintEngine::drawLines(const QLine *lines, int lineCount) { #ifdef QT_DEBUG_DRAW - qDebug() << " - QRasterPaintEngine::drawLine()"; + qDebug() << " - QRasterPaintEngine::drawLines(QLine*)" << lineCount; #endif Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); ensurePen(); + if (!s->penData.blend) + return; + if (s->flags.fast_pen) { - QIntRect bounds; bounds.set(d->deviceRect); - LineDrawMode mode = s->lastPen.capStyle() == Qt::FlatCap - ? LineDrawNormal - : LineDrawIncludeLastPixel; - - int m11 = int(s->matrix.m11()); - int m22 = int(s->matrix.m22()); - int dx = qFloor(s->matrix.dx()); - int dy = qFloor(s->matrix.dy()); + QCosmeticStroker stroker(s, d->deviceRect); for (int i=0; i<lineCount; ++i) { - int dashOffset = int(s->lastPen.dashOffset()); - if (s->flags.int_xform) { - const QLine &l = lines[i]; - int x1 = l.x1() * m11 + dx; - int y1 = l.y1() * m22 + dy; - int x2 = l.x2() * m11 + dx; - int y2 = l.y2() * m22 + dy; - - const QRect brect(QPoint(x1, y1), QPoint(x2, y2)); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(x1, y1, x2, y2, - penBlend, &s->penData, mode, bounds); - else - drawLine_midpoint_dashed_i(x1, y1, x2, y2, - &s->lastPen, penBlend, - &s->penData, mode, bounds, - &dashOffset); - } else { - QLineF line = lines[i] * s->matrix; - const QRectF brect(QPointF(line.x1(), line.y1()), - QPointF(line.x2(), line.y2())); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(int(line.x1()), int(line.y1()), - int(line.x2()), int(line.y2()), - penBlend, &s->penData, mode, bounds); - else - drawLine_midpoint_dashed_i(int(line.x1()), int(line.y1()), - int(line.x2()), int(line.y2()), - &s->lastPen, penBlend, - &s->penData, mode, bounds, - &dashOffset); - } + const QLine &l = lines[i]; + stroker.drawLine(l.p1(), l.p2()); } - } else if (s->penData.blend) { + } else { QPaintEngineEx::drawLines(lines, lineCount); } } @@ -3754,7 +3321,7 @@ void QRasterPaintEnginePrivate::rasterizeLine_dashed(QLineF line, void QRasterPaintEngine::drawLines(const QLineF *lines, int lineCount) { #ifdef QT_DEBUG_DRAW - qDebug() << " - QRasterPaintEngine::drawLine()"; + qDebug() << " - QRasterPaintEngine::drawLines(QLineF *)" << lineCount; #endif Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); @@ -3763,28 +3330,10 @@ void QRasterPaintEngine::drawLines(const QLineF *lines, int lineCount) if (!s->penData.blend) return; if (s->flags.fast_pen) { - QIntRect bounds; - bounds.set(d->deviceRect); - LineDrawMode mode = s->lastPen.capStyle() == Qt::FlatCap - ? LineDrawNormal - : LineDrawIncludeLastPixel; - + QCosmeticStroker stroker(s, d->deviceRect); for (int i=0; i<lineCount; ++i) { - int dashOffset = int(s->lastPen.dashOffset()); - QLineF line = lines[i] * s->matrix; - const QRectF brect(QPointF(line.x1(), line.y1()), - QPointF(line.x2(), line.y2())); - ProcessSpans penBlend = d->getPenFunc(brect, &s->penData); - if (qpen_style(s->lastPen) == Qt::SolidLine) - drawLine_midpoint_i(int(line.x1()), int(line.y1()), - int(line.x2()), int(line.y2()), - penBlend, &s->penData, mode, bounds); - else - drawLine_midpoint_dashed_i(int(line.x1()), int(line.y1()), - int(line.x2()), int(line.y2()), - &s->lastPen, - penBlend, &s->penData, mode, - bounds, &dashOffset); + QLineF line = lines[i]; + stroker.drawLine(line.p1(), line.p2()); } } else { QPaintEngineEx::drawLines(lines, lineCount); @@ -3802,7 +3351,8 @@ void QRasterPaintEngine::drawEllipse(const QRectF &rect) ensurePen(); if (((qpen_style(s->lastPen) == Qt::SolidLine && s->flags.fast_pen) - || (qpen_style(s->lastPen) == Qt::NoPen && !s->flags.antialiased)) + || (qpen_style(s->lastPen) == Qt::NoPen)) + && !s->flags.antialiased && qMax(rect.width(), rect.height()) < QT_RASTER_COORD_LIMIT && !rect.isEmpty() && s->matrix.type() <= QTransform::TxScale) // no shear @@ -3870,6 +3420,37 @@ void QRasterPaintEngine::releaseDC(HDC) const #endif +bool QRasterPaintEngine::supportsTransformations(const QFontEngine *fontEngine) const +{ + const QTransform &m = state()->matrix; +#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE) + QFontEngine::Type fontEngineType = fontEngine->type(); + if ((fontEngineType == QFontEngine::Win && !((QFontEngineWin *) fontEngine)->ttf && m.type() > QTransform::TxTranslate) + || (m.type() <= QTransform::TxTranslate + && (fontEngineType == QFontEngine::TestFontEngine + || fontEngineType == QFontEngine::Box))) { + return true; + } +#endif + return supportsTransformations(fontEngine->fontDef.pixelSize, m); +} + +bool QRasterPaintEngine::supportsTransformations(qreal pixelSize, const QTransform &m) const +{ +#if defined(Q_WS_MAC) + // Mac font engines don't support scaling and rotation + if (m.type() > QTransform::TxTranslate) +#else + if (m.type() >= QTransform::TxProject) +#endif + return true; + + if (pixelSize * pixelSize * qAbs(m.determinant()) >= 64 * 64) + return true; + + return false; +} + /*! \internal */ @@ -4821,7 +4402,7 @@ static void qt_span_fill_clipped(int spanCount, const QSpan *spans, void *userDa while (spans < end) { QSpan *clipped = cspans; spans = qt_intersect_spans(fillData->clip, ¤tClip, spans, end, &clipped, NSPANS); -// qDebug() << "processed " << processed << "clipped" << clipped-cspans +// qDebug() << "processed " << spanCount - (end - spans) << "clipped" << clipped-cspans // << "span:" << cspans->x << cspans->y << cspans->len << spans->coverage; if (clipped - cspans) @@ -5473,759 +5054,6 @@ void QSpanData::initTexture(const QImage *image, int alpha, QTextureData::Type _ adjustSpanMethods(); } -#ifdef Q_WS_WIN - - -#endif - - -/*! - \internal - - Draws a line using the floating point midpoint algorithm. The line - \a line is already in device coords at this point. -*/ - -static void drawLine_midpoint_i(int x1, int y1, int x2, int y2, ProcessSpans span_func, QSpanData *data, - LineDrawMode style, const QIntRect &devRect) -{ -#ifdef QT_DEBUG_DRAW - qDebug() << " - drawLine_midpoint_i" << QLine(QPoint(x1, y1), QPoint(x2, y2)); -#endif - - int x, y; - int dx, dy, d, incrE, incrNE; - - dx = x2 - x1; - dy = y2 - y1; - - const int NSPANS = 256; - QT_FT_Span spans[NSPANS]; - int current = 0; - bool ordered = true; - - if (dy == 0) { - // specialcase horizontal lines - if (y1 >= devRect.y1 && y1 < devRect.y2) { - int start = qMax(devRect.x1, qMin(x1, x2)); - int stop = qMax(x1, x2) + 1; - int stop_clipped = qMin(devRect.x2, stop); - int len = stop_clipped - start; - if (style == LineDrawNormal && stop == stop_clipped) - len--; - if (len > 0) { - spans[0].x = ushort(start); - spans[0].len = ushort(len); - spans[0].y = y1; - spans[0].coverage = 255; - span_func(1, spans, data); - } - } - return; - } else if (dx == 0) { - // specialcase vertical lines - if (x1 >= devRect.x1 && x1 < devRect.x2) { - int start = qMax(devRect.y1, qMin(y1, y2)); - int stop = qMax(y1, y2) + 1; - int stop_clipped = qMin(devRect.y2, stop); - int len = stop_clipped - start; - if (style == LineDrawNormal && stop == stop_clipped) - len--; - // hw: create spans directly instead to possibly avoid clipping - if (len > 0) - fillRect_normalized(QRect(x1, start, 1, len).normalized(), data, 0); - } - return; - } - - - if (qAbs(dx) >= qAbs(dy)) { /* if x is the major axis: */ - - if (x2 < x1) { /* if coordinates are out of order */ - qt_swap_int(x1, x2); - dx = -dx; - - qt_swap_int(y1, y2); - dy = -dy; - } - - int x_lower_limit = - 128; - if (x1 < x_lower_limit) { - int cy = dy * (x_lower_limit - x1) / dx + y1; - drawLine_midpoint_i(x_lower_limit, cy, x2, y2, span_func, data, style, devRect); - return; - } - - if (style == LineDrawNormal) - --x2; - - // In the loops below we increment before call the span function so - // we need to stop one pixel before - x2 = qMin(x2, devRect.x2 - 1); - - // completely clipped, so abort - if (x2 <= x1) { - return; - } - - int x = x1; - int y = y1; - - if (y2 <= y1) - ordered = false; - - { - const int index = (ordered ? current : NSPANS - 1 - current); - spans[index].coverage = 255; - spans[index].x = x; - spans[index].y = y; - - if (x >= devRect.x1 && y >= devRect.y1 && y < devRect.y2) - spans[index].len = 1; - else - spans[index].len = 0; - } - - if (y2 > y1) { // 315 -> 360 and 135 -> 180 (unit circle degrees) - y2 = qMin(y2, devRect.y2 - 1); - - incrE = dy * 2; - d = incrE - dx; - incrNE = (dy - dx) * 2; - - if (y > y2) - goto flush_and_return; - - while (x < x2) { - ++x; - if (d > 0) { - if (spans[current].len > 0) - ++current; - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - - ++y; - d += incrNE; - if (y > y2) - goto flush_and_return; - - spans[current].len = 0; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - } else { - d += incrE; - if (x == devRect.x1) - spans[current].x = devRect.x1; - } - - if (x < devRect.x1 || y < devRect.y1) - continue; - - Q_ASSERT(x<devRect.x2); - Q_ASSERT(y<devRect.y2); - Q_ASSERT(spans[current].y == y); - spans[current].len++; - } - if (spans[current].len > 0) { - ++current; - } - } else { // 0-45 and 180->225 (unit circle degrees) - - y1 = qMin(y1, devRect.y2 - 1); - - incrE = dy * 2; - d = incrE + dx; - incrNE = (dy + dx) * 2; - - if (y < devRect.y1) - goto flush_and_return; - - while (x < x2) { - ++x; - if (d < 0) { - if (spans[NSPANS - 1 - current].len > 0) - ++current; - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - - --y; - d += incrNE; - if (y < devRect.y1) - goto flush_and_return; - - const int index = NSPANS - 1 - current; - spans[index].len = 0; - spans[index].coverage = 255; - spans[index].x = x; - spans[index].y = y; - } else { - d += incrE; - if (x == devRect.x1) - spans[NSPANS - 1 - current].x = devRect.x1; - } - - if (x < devRect.x1 || y > y1) - continue; - - Q_ASSERT(x<devRect.x2 && y<devRect.y2); - Q_ASSERT(spans[NSPANS - 1 - current].y == y); - spans[NSPANS - 1 - current].len++; - } - if (spans[NSPANS - 1 - current].len > 0) { - ++current; - } - } - - } else { - - // if y is the major axis: - - if (y2 < y1) { /* if coordinates are out of order */ - qt_swap_int(y1, y2); - dy = -dy; - - qt_swap_int(x1, x2); - dx = -dx; - } - - int y_lower_limit = - 128; - if (y1 < y_lower_limit) { - int cx = dx * (y_lower_limit - y1) / dy + x1; - drawLine_midpoint_i(cx, y_lower_limit, x2, y2, span_func, data, style, devRect); - return; - } - - if (style == LineDrawNormal) - --y2; - - // In the loops below we increment before call the span function so - // we need to stop one pixel before - y2 = qMin(y2, devRect.y2 - 1); - - // completely clipped, so abort - if (y2 <= y1) { - return; - } - - x = x1; - y = y1; - - if (x>=devRect.x1 && y>=devRect.y1 && x < devRect.x2) { - Q_ASSERT(x >= devRect.x1 && y >= devRect.y1 && x < devRect.x2 && y < devRect.y2); - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - - if (x2 > x1) { // 90 -> 135 and 270 -> 315 (unit circle degrees) - x2 = qMin(x2, devRect.x2 - 1); - incrE = dx * 2; - d = incrE - dy; - incrNE = (dx - dy) * 2; - - if (x > x2) - goto flush_and_return; - - while (y < y2) { - if (d > 0) { - ++x; - d += incrNE; - if (x > x2) - goto flush_and_return; - } else { - d += incrE; - } - ++y; - if (x < devRect.x1 || y < devRect.y1) - continue; - Q_ASSERT(x<devRect.x2 && y<devRect.y2); - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - } else { // 45 -> 90 and 225 -> 270 (unit circle degrees) - x1 = qMin(x1, devRect.x2 - 1); - incrE = dx * 2; - d = incrE + dy; - incrNE = (dx + dy) * 2; - - if (x < devRect.x1) - goto flush_and_return; - - while (y < y2) { - if (d < 0) { - --x; - d += incrNE; - if (x < devRect.x1) - goto flush_and_return; - } else { - d += incrE; - } - ++y; - if (y < devRect.y1 || x > x1) - continue; - Q_ASSERT(x>=devRect.x1 && x<devRect.x2 && y>=devRect.y1 && y<devRect.y2); - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - } - } -flush_and_return: - if (current > 0) - span_func(current, ordered ? spans : spans + (NSPANS - current), data); -} - -static void offset_pattern(int offset, bool *inDash, int *dashIndex, int *currentOffset, const QVarLengthArray<qreal> &pattern) -{ - while (offset--) { - if (--*currentOffset == 0) { - *inDash = !*inDash; - *dashIndex = ((*dashIndex + 1) % pattern.size()); - *currentOffset = int(pattern[*dashIndex]); - } - } -} - -static void drawLine_midpoint_dashed_i(int x1, int y1, int x2, int y2, - QPen *pen, - ProcessSpans span_func, QSpanData *data, - LineDrawMode style, const QIntRect &devRect, - int *patternOffset) -{ -#ifdef QT_DEBUG_DRAW - qDebug() << " - drawLine_midpoint_dashed_i" << x1 << y1 << x2 << y2 << *patternOffset; -#endif - - int x, y; - int dx, dy, d, incrE, incrNE; - - dx = x2 - x1; - dy = y2 - y1; - - Q_ASSERT(*patternOffset >= 0); - - const QVector<qreal> penPattern = pen->dashPattern(); - QVarLengthArray<qreal> pattern(penPattern.size()); - - int patternLength = 0; - for (int i = 0; i < penPattern.size(); ++i) - patternLength += qMax<qreal>(1.0, (penPattern.at(i))); - - // pattern must be reversed if coordinates are out of order - int reverseLength = -1; - if (dy == 0 && x1 > x2) - reverseLength = x1 - x2; - else if (dx == 0 && y1 > y2) - reverseLength = y1 - y2; - else if (qAbs(dx) >= qAbs(dy) && x2 < x1) // x major axis - reverseLength = qAbs(dx); - else if (qAbs(dy) >= qAbs(dx) && y2 < y1) // y major axis - reverseLength = qAbs(dy); - - const bool reversed = (reverseLength > -1); - if (reversed) { // reverse pattern - for (int i = 0; i < penPattern.size(); ++i) - pattern[penPattern.size() - 1 - i] = qMax<qreal>(1.0, penPattern.at(i)); - - *patternOffset = (patternLength - 1 - *patternOffset); - *patternOffset += patternLength - (reverseLength % patternLength); - *patternOffset = *patternOffset % patternLength; - } else { - for (int i = 0; i < penPattern.size(); ++i) - pattern[i] = qMax<qreal>(1.0, penPattern.at(i)); - } - - int dashIndex = 0; - bool inDash = !reversed; - int currPattern = int(pattern[dashIndex]); - - // adjust pattern for offset - offset_pattern(*patternOffset, &inDash, &dashIndex, &currPattern, pattern); - - const int NSPANS = 256; - QT_FT_Span spans[NSPANS]; - int current = 0; - bool ordered = true; - - if (dy == 0) { - // specialcase horizontal lines - if (y1 >= devRect.y1 && y1 < devRect.y2) { - int start_unclipped = qMin(x1, x2); - int start = qMax(devRect.x1, start_unclipped); - int stop = qMax(x1, x2) + 1; - int stop_clipped = qMin(devRect.x2, stop); - int len = stop_clipped - start; - if (style == LineDrawNormal && stop == stop_clipped) - len--; - - // adjust pattern for starting offset - offset_pattern(start - start_unclipped, &inDash, &dashIndex, &currPattern, pattern); - - if (len > 0) { - int x = start; - while (x < stop_clipped) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - const int dash = qMin(currPattern, stop_clipped - x); - if (inDash) { - spans[current].x = ushort(x); - spans[current].len = ushort(dash); - spans[current].y = y1; - spans[current].coverage = 255; - ++current; - } - if (dash < currPattern) { - currPattern -= dash; - } else { - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - inDash = !inDash; - } - x += dash; - } - } - } - goto flush_and_return; - } else if (dx == 0) { - if (x1 >= devRect.x1 && x1 < devRect.x2) { - int start_unclipped = qMin(y1, y2); - int start = qMax(devRect.y1, start_unclipped); - int stop = qMax(y1, y2) + 1; - int stop_clipped = qMin(devRect.y2, stop); - if (style == LineDrawNormal && stop == stop_clipped) - --stop; - else - stop = stop_clipped; - - // adjust pattern for starting offset - offset_pattern(start - start_unclipped, &inDash, &dashIndex, &currPattern, pattern); - - // loop over dashes - int y = start; - while (y < stop) { - const int dash = qMin(currPattern, stop - y); - if (inDash) { - for (int i = 0; i < dash; ++i) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].x = x1; - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].y = ushort(y + i); - ++current; - } - } - if (dash < currPattern) { - currPattern -= dash; - } else { - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - inDash = !inDash; - } - y += dash; - } - } - goto flush_and_return; - } - - if (qAbs(dx) >= qAbs(dy)) { /* if x is the major axis: */ - - if (x2 < x1) { /* if coordinates are out of order */ - qt_swap_int(x1, x2); - dx = -dx; - - qt_swap_int(y1, y2); - dy = -dy; - } - - if (style == LineDrawNormal) - --x2; - - // In the loops below we increment before call the span function so - // we need to stop one pixel before - x2 = qMin(x2, devRect.x2 - 1); - - // completely clipped, so abort - if (x2 <= x1) - goto flush_and_return; - - int x = x1; - int y = y1; - - if (x >= devRect.x1 && y >= devRect.y1 && y < devRect.y2) { - Q_ASSERT(x < devRect.x2); - if (inDash) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - - if (y2 > y1) { // 315 -> 360 and 135 -> 180 (unit circle degrees) - y2 = qMin(y2, devRect.y2 - 1); - - incrE = dy * 2; - d = incrE - dx; - incrNE = (dy - dx) * 2; - - if (y > y2) - goto flush_and_return; - - while (x < x2) { - if (d > 0) { - ++y; - d += incrNE; - if (y > y2) - goto flush_and_return; - } else { - d += incrE; - } - ++x; - - const bool skip = x < devRect.x1 || y < devRect.y1; - Q_ASSERT(skip || (x < devRect.x2 && y < devRect.y2)); - if (inDash && !skip) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - } else { // 0-45 and 180->225 (unit circle degrees) - y1 = qMin(y1, devRect.y2 - 1); - - incrE = dy * 2; - d = incrE + dx; - incrNE = (dy + dx) * 2; - - if (y < devRect.y1) - goto flush_and_return; - - while (x < x2) { - if (d < 0) { - if (current > 0) { - span_func(current, spans, data); - current = 0; - } - - --y; - d += incrNE; - if (y < devRect.y1) - goto flush_and_return; - } else { - d += incrE; - } - ++x; - - const bool skip = x < devRect.x1 || y > y1; - Q_ASSERT(skip || (x < devRect.x2 && y < devRect.y2)); - if (inDash && !skip) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - } - } else { - - // if y is the major axis: - - if (y2 < y1) { /* if coordinates are out of order */ - qt_swap_int(y1, y2); - dy = -dy; - - qt_swap_int(x1, x2); - dx = -dx; - } - - if (style == LineDrawNormal) - --y2; - - // In the loops below we increment before call the span function so - // we need to stop one pixel before - y2 = qMin(y2, devRect.y2 - 1); - - // completely clipped, so abort - if (y2 <= y1) - goto flush_and_return; - - x = x1; - y = y1; - - if (x>=devRect.x1 && y>=devRect.y1 && x < devRect.x2) { - Q_ASSERT(x < devRect.x2); - if (inDash) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - - if (x2 > x1) { // 90 -> 135 and 270 -> 315 (unit circle degrees) - x2 = qMin(x2, devRect.x2 - 1); - incrE = dx * 2; - d = incrE - dy; - incrNE = (dx - dy) * 2; - - if (x > x2) - goto flush_and_return; - - while (y < y2) { - if (d > 0) { - ++x; - d += incrNE; - if (x > x2) - goto flush_and_return; - } else { - d += incrE; - } - ++y; - const bool skip = x < devRect.x1 || y < devRect.y1; - Q_ASSERT(skip || (x < devRect.x2 && y < devRect.y2)); - if (inDash && !skip) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - } else { // 45 -> 90 and 225 -> 270 (unit circle degrees) - x1 = qMin(x1, devRect.x2 - 1); - incrE = dx * 2; - d = incrE + dy; - incrNE = (dx + dy) * 2; - - if (x < devRect.x1) - goto flush_and_return; - - while (y < y2) { - if (d < 0) { - --x; - d += incrNE; - if (x < devRect.x1) - goto flush_and_return; - } else { - d += incrE; - } - ++y; - const bool skip = y < devRect.y1 || x > x1; - Q_ASSERT(skip || (x >= devRect.x1 && x < devRect.x2 && y < devRect.y2)); - if (inDash && !skip) { - if (current == NSPANS) { - span_func(NSPANS, spans, data); - current = 0; - } - spans[current].len = 1; - spans[current].coverage = 255; - spans[current].x = x; - spans[current].y = y; - ++current; - } - if (--currPattern <= 0) { - inDash = !inDash; - dashIndex = (dashIndex + 1) % pattern.size(); - currPattern = int(pattern[dashIndex]); - } - } - } - } -flush_and_return: - if (current > 0) - span_func(current, ordered ? spans : spans + (NSPANS - current), data); - - // adjust offset - if (reversed) { - *patternOffset = (patternLength - 1 - *patternOffset); - } else { - *patternOffset = 0; - for (int i = 0; i <= dashIndex; ++i) - *patternOffset += int(pattern[i]); - *patternOffset += patternLength - currPattern - 1; - *patternOffset = (*patternOffset % patternLength); - } -} - /*! \internal \a x and \a y is relative to the midpoint of \a rect. diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h index 8859df0..8774fda 100644 --- a/src/gui/painting/qpaintengine_raster_p.h +++ b/src/gui/painting/qpaintengine_raster_p.h @@ -196,9 +196,6 @@ public: void stroke(const QVectorPath &path, const QPen &pen); void fill(const QVectorPath &path, const QBrush &brush); - void strokePolygonCosmetic(const QPoint *pts, int pointCount, PolygonDrawMode mode); - void strokePolygonCosmetic(const QPointF *pt, int pointCount, PolygonDrawMode mode); - void clip(const QVectorPath &path, Qt::ClipOperation op); void clip(const QRect &rect, Qt::ClipOperation op); void clip(const QRegion ®ion, Qt::ClipOperation op); @@ -249,6 +246,8 @@ public: virtual void drawBufferSpan(const uint *buffer, int bufsize, int x, int y, int length, uint const_alpha); #endif + bool supportsTransformations(const QFontEngine *fontEngine) const; + bool supportsTransformations(qreal pixelSize, const QTransform &m) const; protected: QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *); @@ -328,7 +327,6 @@ public: bool isUnclipped_normalized(const QRect &rect) const; bool isUnclipped(const QRect &rect, int penWidth) const; bool isUnclipped(const QRectF &rect, int penWidth) const; - ProcessSpans getPenFunc(const QRect &rect, const QSpanData *data) const; ProcessSpans getPenFunc(const QRectF &rect, const QSpanData *data) const; ProcessSpans getBrushFunc(const QRect &rect, const QSpanData *data) const; ProcessSpans getBrushFunc(const QRectF &rect, const QSpanData *data) const; diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index 30cf206..8510416 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -44,6 +44,8 @@ #include "qstroker_p.h" #include "qbezier_p.h" #include <private/qpainterpath_p.h> +#include <private/qfontengine_p.h> +#include <private/qstatictext_p.h> #include <qvarlengtharray.h> #include <qdebug.h> @@ -831,7 +833,7 @@ void QPaintEngineEx::drawEllipse(const QRectF &r) int point_count = 0; x.points[0] = qt_curves_for_arc(r, 0, -360, x.points + 1, &point_count); - QVectorPath vp((qreal *) pts, point_count, qpaintengineex_ellipse_types, QVectorPath::EllipseHint); + QVectorPath vp((qreal *) pts, point_count + 1, qpaintengineex_ellipse_types, QVectorPath::EllipseHint); draw(vp); } @@ -1057,5 +1059,48 @@ Q_GUI_EXPORT QPainterPath qt_painterPathFromVectorPath(const QVectorPath &path) return p; } +void QPaintEngineEx::drawStaticTextItem(QStaticTextItem *staticTextItem) +{ + QPainterPath path; +#ifndef Q_WS_MAC + path.setFillRule(Qt::WindingFill); +#endif + + if (staticTextItem->numGlyphs == 0) + return; + + QFontEngine *fontEngine = staticTextItem->fontEngine(); + fontEngine->addGlyphsToPath(staticTextItem->glyphs, staticTextItem->glyphPositions, + staticTextItem->numGlyphs, &path, 0); + if (!path.isEmpty()) { + QPainterState *s = state(); + QPainter::RenderHints oldHints = s->renderHints; + bool changedHints = false; + if (bool(oldHints & QPainter::TextAntialiasing) + && !bool(fontEngine->fontDef.styleStrategy & QFont::NoAntialias) + && !bool(oldHints & QPainter::Antialiasing)) { + s->renderHints |= QPainter::Antialiasing; + renderHintsChanged(); + changedHints = true; + } + + fill(qtVectorPathForPath(path), staticTextItem->color); + + if (changedHints) { + s->renderHints = oldHints; + renderHintsChanged(); + } + } +} + +bool QPaintEngineEx::supportsTransformations(qreal pixelSize, const QTransform &m) const +{ + Q_UNUSED(pixelSize); + + if (!m.isAffine()) + return true; + + return false; +} QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintengineex_p.h b/src/gui/painting/qpaintengineex_p.h index 9730033..c605685 100644 --- a/src/gui/painting/qpaintengineex_p.h +++ b/src/gui/painting/qpaintengineex_p.h @@ -202,7 +202,7 @@ public: virtual void updateState(const QPaintEngineState &state); - virtual void drawStaticTextItem(QStaticTextItem *) = 0; + virtual void drawStaticTextItem(QStaticTextItem *); virtual void setState(QPainterState *s); inline QPainterState *state() { return static_cast<QPainterState *>(QPaintEngine::state); } @@ -227,6 +227,7 @@ public: IsEmulationEngine = 0x02 // If set, this object is a QEmulationEngine. }; virtual uint flags() const {return 0;} + virtual bool supportsTransformations(qreal pixelSize, const QTransform &m) const; protected: QPaintEngineEx(QPaintEngineExPrivate &data); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 17b7451..5a566d1 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -152,14 +152,6 @@ static inline uint line_emulation(uint emulation) | QPaintEngine_OpaqueBackground); } -static bool qt_paintengine_supports_transformations(QPaintEngine::Type type) -{ - return type == QPaintEngine::OpenGL2 - || type == QPaintEngine::OpenVG - || type == QPaintEngine::OpenGL - || type == QPaintEngine::CoreGraphics; -} - #ifndef QT_NO_DEBUG static bool qt_painter_thread_test(int devType, const char *what, bool extraCondition = false) { @@ -2868,6 +2860,9 @@ void QPainter::setClipRect(const QRect &rect, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipRegion = rect; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) @@ -2923,6 +2918,9 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipRegion = r; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) @@ -3328,6 +3326,9 @@ void QPainter::setClipPath(const QPainterPath &path, Qt::ClipOperation op) return; } + if (d->state->clipOperation == Qt::NoClip && op == Qt::IntersectClip) + op = Qt::ReplaceClip; + d->state->clipPath = path; d->state->clipOperation = op; if (op == Qt::NoClip || op == Qt::ReplaceClip) @@ -5809,35 +5810,37 @@ void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphRun) if (!font.isValid()) return; - QVector<quint32> glyphIndexes = glyphRun.glyphIndexes(); - QVector<QPointF> glyphPositions = glyphRun.positions(); + QGlyphRunPrivate *glyphRun_d = QGlyphRunPrivate::get(glyphRun); - int count = qMin(glyphIndexes.size(), glyphPositions.size()); - QVarLengthArray<QFixedPoint, 128> fixedPointPositions(count); + const quint32 *glyphIndexes = glyphRun_d->glyphIndexData; + const QPointF *glyphPositions = glyphRun_d->glyphPositionData; - bool paintEngineSupportsTransformations = - d->extended != 0 - ? qt_paintengine_supports_transformations(d->extended->type()) - : qt_paintengine_supports_transformations(d->engine->type()); + int count = qMin(glyphRun_d->glyphIndexDataSize, glyphRun_d->glyphPositionDataSize); + QVarLengthArray<QFixedPoint, 128> fixedPointPositions(count); - // If the matrix is not affine, the paint engine will fall back to - // drawing the glyphs as paths, which in turn means we should not - // preprocess the glyph positions - if (!d->state->matrix.isAffine()) - paintEngineSupportsTransformations = true; + QRawFontPrivate *fontD = QRawFontPrivate::get(font); + bool supportsTransformations; + if (d->extended != 0) { + supportsTransformations = d->extended->supportsTransformations(fontD->fontEngine->fontDef.pixelSize, + d->state->matrix); + } else { + supportsTransformations = d->engine->type() == QPaintEngine::CoreGraphics + || d->state->matrix.isAffine(); + } for (int i=0; i<count; ++i) { - QPointF processedPosition = position + glyphPositions.at(i); - if (!paintEngineSupportsTransformations) + QPointF processedPosition = position + glyphPositions[i]; + if (!supportsTransformations) processedPosition = d->state->transform().map(processedPosition); fixedPointPositions[i] = QFixedPoint::fromPointF(processedPosition); } - d->drawGlyphs(glyphIndexes.data(), fixedPointPositions.data(), count, font, glyphRun.overline(), + d->drawGlyphs(glyphIndexes, fixedPointPositions.data(), count, font, glyphRun.overline(), glyphRun.underline(), glyphRun.strikeOut()); } -void QPainterPrivate::drawGlyphs(quint32 *glyphArray, QFixedPoint *positions, int glyphCount, +void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, QFixedPoint *positions, + int glyphCount, const QRawFont &font, bool overline, bool underline, bool strikeOut) { @@ -6004,11 +6007,12 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText return; } - bool paintEngineSupportsTransformations = qt_paintengine_supports_transformations(d->extended->type()); - if (paintEngineSupportsTransformations && !staticText_d->untransformedCoordinates) { + bool supportsTransformations = d->extended->supportsTransformations(staticText_d->font.pixelSize(), + d->state->matrix); + if (supportsTransformations && !staticText_d->untransformedCoordinates) { staticText_d->untransformedCoordinates = true; staticText_d->needsRelayout = true; - } else if (!paintEngineSupportsTransformations && staticText_d->untransformedCoordinates) { + } else if (!supportsTransformations && staticText_d->untransformedCoordinates) { staticText_d->untransformedCoordinates = false; staticText_d->needsRelayout = true; } @@ -6468,8 +6472,7 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const const qreal underlineOffset = fe->underlinePosition().toReal(); // deliberately ceil the offset to avoid the underline coming too close to // the text above it. - const qreal aliasedCoordinateDelta = 0.5 - 0.015625; - const qreal underlinePos = pos.y() + qCeil(underlineOffset) - aliasedCoordinateDelta; + const qreal underlinePos = pos.y() + qCeil(underlineOffset); if (underlineStyle == QTextCharFormat::SpellCheckUnderline) { underlineStyle = QTextCharFormat::UnderlineStyle(QApplication::style()->styleHint(QStyle::SH_SpellCheckUnderlineStyle)); diff --git a/src/gui/painting/qpainter_p.h b/src/gui/painting/qpainter_p.h index 35cdf86..79d4b4b 100644 --- a/src/gui/painting/qpainter_p.h +++ b/src/gui/painting/qpainter_p.h @@ -232,7 +232,7 @@ public: void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation); #if !defined(QT_NO_RAWFONT) - void drawGlyphs(quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount, + void drawGlyphs(const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount, const QRawFont &font, bool overline = false, bool underline = false, bool strikeOut = false); #endif diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp index 6c5edbc..1d3f581 100644 --- a/src/gui/painting/qrasterizer.cpp +++ b/src/gui/painting/qrasterizer.cpp @@ -62,8 +62,8 @@ typedef int Q16Dot16; #define SPAN_BUFFER_SIZE 256 -#define COORD_ROUNDING 0 // 0: round up, 1: round down -#define COORD_OFFSET 0 // 26.6, 32 is half a pixel +#define COORD_ROUNDING 1 // 0: round up, 1: round down +#define COORD_OFFSET 32 // 26.6, 32 is half a pixel static inline QT_FT_Vector PointToVector(const QPointF &p) { diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index 53fefa4..4bb4759 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -296,14 +296,10 @@ void QTextureGlyphCache::fillInPendingGlyphs() QImage QTextureGlyphCache::textureMapForGlyph(glyph_t g, QFixed subPixelPosition) const { #if defined(Q_WS_X11) - if (m_transform.type() > QTransform::TxTranslate && m_current_fontengine->type() == QFontEngine::Freetype) { + if (m_type != Raster_RGBMask && m_transform.type() > QTransform::TxTranslate && m_current_fontengine->type() == QFontEngine::Freetype) { QFontEngineFT::GlyphFormat format = QFontEngineFT::Format_None; QImage::Format imageFormat = QImage::Format_Invalid; switch (m_type) { - case Raster_RGBMask: - format = QFontEngineFT::Format_A32; - imageFormat = QImage::Format_RGB32; - break; case Raster_A8: format = QFontEngineFT::Format_A8; imageFormat = QImage::Format_Indexed8; @@ -367,7 +363,9 @@ void QImageTextureGlyphCache::createTextureData(int width, int height) int QImageTextureGlyphCache::glyphMargin() const { -#if (defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)) || defined(Q_WS_X11) +#if (defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)) + return 1; +#elif defined(Q_WS_X11) return 0; #else return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; @@ -386,7 +384,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP } #endif - if (m_type == QFontEngineGlyphCache::Raster_RGBMask) { + if (m_type == QFontEngineGlyphCache::Raster_RGBMask) { QImage ref(m_image.bits() + (c.x * 4 + c.y * m_image.bytesPerLine()), qMax(mask.width(), c.w), qMax(mask.height(), c.h), m_image.bytesPerLine(), m_image.format()); diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp index aecbf2b..1eb5e61 100644 --- a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp +++ b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp @@ -171,10 +171,8 @@ void QUnifiedToolbarSurface::flush(QWidget *widget) if (!d->image) return; - if (widget->d_func()->flushRequested) { - // We call display: directly to avoid flickering in the toolbar. - qt_mac_display(widget); - } + if (widget->d_func()->flushRequested) + qt_mac_setNeedsDisplay(widget); } void QUnifiedToolbarSurface::prepareBuffer(QImage::Format format, QWidget *widget) diff --git a/src/gui/painting/qwindowsurface_qws.cpp b/src/gui/painting/qwindowsurface_qws.cpp index c52f864..7e8cf9b 100644 --- a/src/gui/painting/qwindowsurface_qws.cpp +++ b/src/gui/painting/qwindowsurface_qws.cpp @@ -806,6 +806,10 @@ QWSMemorySurface::QWSMemorySurface(QWidget *w) QWSMemorySurface::~QWSMemorySurface() { +#ifndef QT_NO_QWS_MULTIPROCESS + if (memlock != QWSDisplay::Data::getClientLock()) + delete memlock; +#endif } @@ -852,9 +856,9 @@ void QWSMemorySurface::setLock(int lockId) { if (memlock && memlock->id() == lockId) return; - delete memlock; + if (memlock != QWSDisplay::Data::getClientLock()) + delete memlock; memlock = (lockId == -1 ? 0 : new QWSLock(lockId)); - return; } #endif // QT_NO_QWS_MULTIPROCESS @@ -946,37 +950,39 @@ void QWSLocalMemSurface::setGeometry(const QRect &rect) } uchar *deleteLater = 0; - // In case of a Hide event we need to delete the memory after sending the - // event to the server in order to let the server animate the event. - if (size.isEmpty()) { - deleteLater = mem; - mem = 0; - } if (img.size() != size) { - delete[] mem; if (size.isEmpty()) { + if (memsize) { + // In case of a Hide event we need to delete the memory after sending the + // event to the server in order to let the server animate the event. + deleteLater = mem; + memsize = 0; + } mem = 0; img = QImage(); } else { const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); - const int memsize = bpl * size.height(); - mem = new uchar[memsize]; + const int imagesize = bpl * size.height(); + if (memsize < imagesize) { + delete[] mem; + memsize = imagesize; + mem = new uchar[memsize]; + } img = QImage(mem, size.width(), size.height(), bpl, format); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect); + delete[] deleteLater; } QByteArray QWSLocalMemSurface::permanentState() const { - QByteArray array; - array.resize(sizeof(uchar*) + 3 * sizeof(int) + - sizeof(SurfaceFlags)); + QByteArray array(sizeof(uchar*) + 3 * sizeof(int) + sizeof(SurfaceFlags), Qt::Uninitialized); char *ptr = array.data(); @@ -997,6 +1003,11 @@ QByteArray QWSLocalMemSurface::permanentState() const void QWSLocalMemSurface::setPermanentState(const QByteArray &data) { + if (memsize) { + delete[] mem; + memsize = 0; + } + int width; int height; QImage::Format format; @@ -1023,6 +1034,10 @@ void QWSLocalMemSurface::setPermanentState(const QByteArray &data) void QWSLocalMemSurface::releaseSurface() { + if (memsize) { + delete[] mem; + memsize = 0; + } mem = 0; img = QImage(); } @@ -1064,17 +1079,15 @@ bool QWSSharedMemSurface::setMemory(int memId) void QWSSharedMemSurface::setDirectRegion(const QRegion &r, int id) { QWSMemorySurface::setDirectRegion(r, id); - if(mem.address()) + if (mem.address()) *(uint *)mem.address() = id; } const QRegion QWSSharedMemSurface::directRegion() const { - QWSSharedMemory *cmem = const_cast<QWSSharedMemory *>(&mem); - if (cmem->address() && ((int*)cmem->address())[0] == directRegionId()) + if (mem.address() && *(uint *)mem.address() == uint(directRegionId()) return QWSMemorySurface::directRegion(); - else - return QRegion(); + return QRegion(); } #endif @@ -1117,8 +1130,6 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) mem.detach(); img = QImage(); } else { - mem.detach(); - QWidget *win = window(); const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); @@ -1127,9 +1138,12 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) #else const int imagesize = bpl * size.height(); #endif - if (!mem.create(imagesize)) { - perror("QWSSharedMemSurface::setGeometry allocating shared memory"); - qFatal("Error creating shared memory of size %d", imagesize); + if (mem.size() < imagesize) { + mem.detach(); + if (!mem.create(imagesize)) { + perror("QWSSharedMemSurface::setGeometry allocating shared memory"); + qFatal("Error creating shared memory of size %d", imagesize); + } } #ifdef QT_QWS_CLIENTBLIT *((uint *)mem.address()) = 0; @@ -1147,8 +1161,7 @@ void QWSSharedMemSurface::setGeometry(const QRect &rect) QByteArray QWSSharedMemSurface::permanentState() const { - QByteArray array; - array.resize(6 * sizeof(int)); + QByteArray array(6 * sizeof(int), Qt::Uninitialized); int *ptr = reinterpret_cast<int*>(array.data()); @@ -1222,8 +1235,8 @@ bool QWSOnScreenSurface::isValid() const QByteArray QWSOnScreenSurface::permanentState() const { - QByteArray array; - array.resize(sizeof(int)); + QByteArray array(sizeof(int), Qt::Uninitialized); + int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = QApplication::desktop()->screenNumber(window()); return array; @@ -1263,8 +1276,7 @@ QWSYellowSurface::~QWSYellowSurface() QByteArray QWSYellowSurface::permanentState() const { - QByteArray array; - array.resize(2 * sizeof(int)); + QByteArray array(2 * sizeof(int), Qt::Uninitialized); int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = surfaceSize.width(); diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 634cf00..219b963 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -91,11 +91,8 @@ static const qreal goldenRatio = 1.618; const layoutHeader QS60StylePrivate::m_layoutHeaders[] = { // *** generated layout data *** -{240,320,1,19,"QVGA Landscape"}, -{320,240,1,19,"QVGA Portrait"}, {360,640,1,19,"NHD Landscape"}, {640,360,1,19,"NHD Portrait"}, -{352,800,1,12,"E90 Landscape"}, {480,640,1,19,"VGA Landscape"} // *** End of generated data *** }; @@ -104,11 +101,8 @@ const int QS60StylePrivate::m_numberOfLayouts = const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = { // *** generated pixel metrics *** -{5,0,-909,0,0,2,0,2,-1,7,12,22,15,15,7,198,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1,106}, -{5,0,-909,0,0,1,0,2,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1,106}, {7,0,-909,0,0,2,0,5,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,11,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,3,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, {7,0,-909,0,0,2,0,5,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,13,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,3,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, -{7,0,-909,0,0,2,0,2,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106}, {9,0,-909,0,0,2,0,5,-1,34,99,76,51,51,25,352,-909,-909,-909,29,25,7,0,0,43,34,42,76,7,7,2,-909,-909,0,9,14,0,23,39,30,30,37,37,9,391,40,0,-909,-909,-909,-909,0,0,29,2,-909,0,0,-909,29,-909,-909,-909,-909,115,37,96,48,96,19,19,9,1,25,-909,9,101,24,9,0,7,7,7,16,7,7,-909,3,-909,-909,-909,-909,9,9,3,1,184} // *** End of generated data *** }; @@ -532,29 +526,14 @@ void QS60StylePrivate::setCurrentLayout(int index) void QS60StylePrivate::drawPart(QS60StyleEnums::SkinParts skinPart, QPainter *painter, const QRect &rect, SkinElementFlags flags) { - static const bool doCache = -#if defined(Q_WS_S60) - // Freezes on 3.1. Anyways, caching is only really needed on touch UI - !(QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || QSysInfo::s60Version() == QSysInfo::SV_S60_3_2); -#else - true; -#endif - - const QPixmap skinPartPixMap((doCache ? cachedPart : part)(skinPart, rect.size(), painter, flags)); + const QPixmap skinPartPixMap((cachedPart)(skinPart, rect.size(), painter, flags)); if (!skinPartPixMap.isNull()) painter->drawPixmap(rect.topLeft(), skinPartPixMap); } void QS60StylePrivate::drawFrame(SkinFrameElements frameElement, QPainter *painter, const QRect &rect, SkinElementFlags flags) { - static const bool doCache = -#if defined(Q_WS_S60) - // Freezes on 3.1. Anyways, caching is only really needed on touch UI - !(QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || QSysInfo::s60Version() == QSysInfo::SV_S60_3_2); -#else - true; -#endif - const QPixmap frameElementPixMap((doCache ? cachedFrame : frame)(frameElement, rect.size(), flags)); + const QPixmap frameElementPixMap((cachedFrame)(frameElement, rect.size(), flags)); if (!frameElementPixMap.isNull()) painter->drawPixmap(rect.topLeft(), frameElementPixMap); } @@ -1040,23 +1019,10 @@ void QS60Style::drawComplexControl(ComplexControl control, const QStyleOptionCom drawPrimitive(PE_FrameFocusRect, optionSlider, painter, widget);*/ //Groove graphics - if (QS60StylePrivate::hasSliderGrooveGraphic()) { - const QS60StylePrivate::SkinElements grooveElement = horizontal ? - QS60StylePrivate::SE_SliderGrooveHorizontal : - QS60StylePrivate::SE_SliderGrooveVertical; - QS60StylePrivate::drawSkinElement(grooveElement, painter, sliderGroove, flags); - } else { - const QPoint sliderGrooveCenter = sliderGroove.center(); - const bool horizontal = optionSlider->orientation == Qt::Horizontal; - painter->save(); - if (widget) - painter->setPen(widget->palette().windowText().color()); - if (horizontal) - painter->drawLine(0, sliderGrooveCenter.y(), sliderGroove.right(), sliderGrooveCenter.y()); - else - painter->drawLine(sliderGrooveCenter.x(), 0, sliderGrooveCenter.x(), sliderGroove.bottom()); - painter->restore(); - } + const QS60StylePrivate::SkinElements grooveElement = horizontal ? + QS60StylePrivate::SE_SliderGrooveHorizontal : + QS60StylePrivate::SE_SliderGrooveVertical; + QS60StylePrivate::drawSkinElement(grooveElement, painter, sliderGroove, flags); //Handle graphics const QRect sliderHandle = subControlRect(control, optionSlider, SC_SliderHandle, widget); @@ -1155,11 +1121,10 @@ void QS60Style::drawComplexControl(ComplexControl control, const QStyleOptionCom case Qt::UpArrow: pe = PE_IndicatorArrowUp; break; - case Qt::DownArrow: + default: pe = PE_IndicatorArrowDown; break; - default: - break; } + } toolButton.rect = button; drawPrimitive(pe, &toolButton, painter, widget); } @@ -1333,8 +1298,8 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) { const bool isDisabled = !(option->state & State_Enabled); const bool isFlat = button->features & QStyleOptionButton::Flat; - QS60StyleEnums::SkinParts skinPart; - QS60StylePrivate::SkinElements skinElement; + QS60StyleEnums::SkinParts skinPart = QS60StyleEnums::SP_QsnFrButtonCenterInactive; + QS60StylePrivate::SkinElements skinElement = QS60StylePrivate::SE_ButtonInactive; if (!isDisabled) { const bool isPressed = (option->state & State_Sunken) || (option->state & State_On); @@ -1345,11 +1310,6 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, skinElement = isPressed ? QS60StylePrivate::SE_ButtonPressed : QS60StylePrivate::SE_ButtonNormal; } - } else { - if (isFlat) - skinPart =QS60StyleEnums::SP_QsnFrButtonCenterInactive; - else - skinElement = QS60StylePrivate::SE_ButtonInactive; } if (isFlat) QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, flags); @@ -1485,26 +1445,14 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, checkMarkOption.rect = selectionRect; // Draw selection mark. if (isSelected && selectItems) { - proxy()->drawPrimitive(PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget); // @todo: this should happen in the rect retrievel i.e. subElementRect() if (textRect.right() > selectionRect.left()) textRect.setRight(selectionRect.left()); } else if (voptAdj.features & QStyleOptionViewItemV2::HasCheckIndicator) { checkMarkOption.state = checkMarkOption.state & ~State_HasFocus; - switch (vopt->checkState) { - case Qt::Unchecked: - checkMarkOption.state |= State_Off; - break; - case Qt::PartiallyChecked: - checkMarkOption.state |= State_NoChange; - break; - case Qt::Checked: - checkMarkOption.state |= State_On; - break; - } - drawPrimitive(PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget); } + proxy()->drawPrimitive(PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget); } // draw the text @@ -1837,7 +1785,7 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, drawPrimitive(PE_IndicatorMenuCheckMark, &optionCheckBox, painter, widget); //draw icon and/or checkState - QPixmap pix = menuItem->icon.pixmap(pixelMetric(PM_SmallIconSize), + QPixmap pix = menuItem->icon.pixmap(iconRect.width(), enabled ? QIcon::Normal : QIcon::Disabled); const bool itemWithIcon = !pix.isNull(); if (itemWithIcon) { @@ -1985,36 +1933,31 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, if (!tbWidget || (widget && qobject_cast<QToolBar *>(widget->parentWidget()))) break; - // Normally in S60 5.0+ there is no background for toolbar, but in some cases with versatile QToolBar, + // Normally in S60 there is no background for toolbar, but in some cases with versatile QToolBar, // it looks a bit strange. So, lets fillRect with Button. - if (!QS60StylePrivate::isToolBarBackground()) { - QList<QAction *> actions = tbWidget->actions(); - bool justToolButtonsInToolBar = true; - for (int i = 0; i < actions.size(); ++i) { - QWidget *childWidget = tbWidget->widgetForAction(actions.at(i)); - const QToolButton *button = qobject_cast<const QToolButton *>(childWidget); - if (!button){ - justToolButtonsInToolBar = false; - } - } - - // Draw frame background - // for vertical toolbars with text only and - // for toolbars with extension buttons and - // for toolbars with widgets in them. - if (!justToolButtonsInToolBar || - (tbWidget && - (tbWidget->orientation() == Qt::Vertical) && - (tbWidget->toolButtonStyle() == Qt::ToolButtonTextOnly))) { - painter->save(); - if (widget) - painter->setBrush(widget->palette().button()); - painter->setOpacity(0.3); - painter->fillRect(toolBar->rect, painter->brush()); - painter->restore(); - } - } else { - QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ToolBar, painter, toolBar->rect, flags); + QList<QAction *> actions = tbWidget->actions(); + bool justToolButtonsInToolBar = true; + for (int i = 0; i < actions.size(); ++i) { + QWidget *childWidget = tbWidget->widgetForAction(actions.at(i)); + const QToolButton *button = qobject_cast<const QToolButton *>(childWidget); + if (!button) + justToolButtonsInToolBar = false; + } + + // Draw frame background + // for vertical toolbars with text only and + // for toolbars with extension buttons and + // for toolbars with widgets in them. + if (!justToolButtonsInToolBar + || (tbWidget + && tbWidget->orientation() == Qt::Vertical + && tbWidget->toolButtonStyle() == Qt::ToolButtonTextOnly)) { + painter->save(); + if (widget) + painter->setBrush(widget->palette().button()); + painter->setOpacity(0.3); + painter->fillRect(toolBar->rect, painter->brush()); + painter->restore(); } } break; @@ -2159,12 +2102,28 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti #ifndef QT_NO_ITEMVIEWS if (const QAbstractItemView *itemView = (qobject_cast<const QAbstractItemView *>(widget))) { if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) { + QStyleOptionViewItemV4 voptAdj = *vopt; const bool checkBoxVisible = vopt->features & QStyleOptionViewItemV2::HasCheckIndicator; const bool singleSelection = itemView->selectionMode() == QAbstractItemView::SingleSelection || itemView->selectionMode() == QAbstractItemView::NoSelection; // draw either checkbox at the beginning if (checkBoxVisible && singleSelection) { - drawPrimitive(PE_IndicatorCheckBox, option, painter, widget); + if (vopt->features & QStyleOptionViewItemV2::HasCheckIndicator) { + switch (vopt->checkState) { + case Qt::Unchecked: + voptAdj.state |= State_Off; + break; + case Qt::PartiallyChecked: + voptAdj.state |= State_NoChange; + break; + case Qt::Checked: + voptAdj.state |= State_On; + break; + default: + break; + } + } + drawPrimitive(PE_IndicatorCheckBox, &voptAdj, painter, widget); // ... or normal "tick" selection at the end. } else if (option->state & State_Selected) { QRect tickRect = option->rect; @@ -2226,21 +2185,16 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti break; #ifndef QT_NO_TOOLBUTTON case PE_IndicatorArrowDown: + QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafScrollArrowDown, painter, option->rect, flags); + break; case PE_IndicatorArrowLeft: + QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafScrollArrowLeft, painter, option->rect, flags); + break; case PE_IndicatorArrowRight: - case PE_IndicatorArrowUp: { - QS60StyleEnums::SkinParts skinPart; - if (element==PE_IndicatorArrowDown) - skinPart = QS60StyleEnums::SP_QgnGrafScrollArrowDown; - else if (element==PE_IndicatorArrowLeft) - skinPart = QS60StyleEnums::SP_QgnGrafScrollArrowLeft; - else if (element==PE_IndicatorArrowRight) - skinPart = QS60StyleEnums::SP_QgnGrafScrollArrowRight; - else if (element==PE_IndicatorArrowUp) - skinPart = QS60StyleEnums::SP_QgnGrafScrollArrowUp; - - QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, flags); - } + QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafScrollArrowRight, painter, option->rect, flags); + break; + case PE_IndicatorArrowUp: + QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafScrollArrowUp, painter, option->rect, flags); break; #endif //QT_NO_TOOLBUTTON #ifndef QT_NO_SPINBOX @@ -2427,52 +2381,46 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti case PE_IndicatorBranch: #if defined(Q_WS_S60) - // 3.1 AVKON UI does not have tree view component, use common style for drawing there - if (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1) { -#else - if (true) { -#endif - QCommonStyle::drawPrimitive(element, option, painter, widget); - } else { - if (const QStyleOptionViewItemV2 *vopt = qstyleoption_cast<const QStyleOptionViewItemV2 *>(option)) { - const bool rightLine = option->state & State_Item; - const bool downLine = option->state & State_Sibling; - const bool upLine = option->state & (State_Open | State_Children | State_Item | State_Sibling); - QS60StylePrivate::SkinElementFlags adjustedFlags = flags; - - QS60StyleEnums::SkinParts skinPart; - bool drawSkinPart = false; - if (rightLine && downLine && upLine) { - skinPart = QS60StyleEnums::SP_QgnIndiHlLineBranch; - drawSkinPart = true; - } else if (rightLine && upLine) { - skinPart = QS60StyleEnums::SP_QgnIndiHlLineEnd; - drawSkinPart = true; - } else if (upLine && downLine) { - skinPart = QS60StyleEnums::SP_QgnIndiHlLineStraight; - drawSkinPart = true; - } + if (const QStyleOptionViewItemV2 *vopt = qstyleoption_cast<const QStyleOptionViewItemV2 *>(option)) { + const bool rightLine = option->state & State_Item; + const bool downLine = option->state & State_Sibling; + const bool upLine = option->state & (State_Open | State_Children | State_Item | State_Sibling); + QS60StylePrivate::SkinElementFlags adjustedFlags = flags; - if (option->direction == Qt::RightToLeft) - adjustedFlags |= QS60StylePrivate::SF_Mirrored_X_Axis; - - if (drawSkinPart) - QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, adjustedFlags); - - if (option->state & State_Children) { - QS60StyleEnums::SkinParts skinPart = - (option->state & State_Open) ? QS60StyleEnums::SP_QgnIndiHlColSuper : QS60StyleEnums::SP_QgnIndiHlExpSuper; - const QRect selectionRect = subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); - const int minDimension = qMin(option->rect.width(), option->rect.height()); - const int magicTweak = (option->direction == Qt::RightToLeft) ? -3 : 3; //@todo: magic - //The branch indicator icon in S60 is supposed to be superimposed on top of branch lines. - QRect iconRect(QPoint(option->rect.left() + magicTweak, selectionRect.top() + 1), QSize(minDimension, minDimension)); - if (!QS60StylePrivate::isTouchSupported()) - iconRect.translate(0, -4); //@todo: magic - QS60StylePrivate::drawSkinPart(skinPart, painter, iconRect, adjustedFlags); - } + QS60StyleEnums::SkinParts skinPart; + bool drawSkinPart = false; + if (rightLine && downLine && upLine) { + skinPart = QS60StyleEnums::SP_QgnIndiHlLineBranch; + drawSkinPart = true; + } else if (rightLine && upLine) { + skinPart = QS60StyleEnums::SP_QgnIndiHlLineEnd; + drawSkinPart = true; + } else if (upLine && downLine) { + skinPart = QS60StyleEnums::SP_QgnIndiHlLineStraight; + drawSkinPart = true; + } + + if (option->direction == Qt::RightToLeft) + adjustedFlags |= QS60StylePrivate::SF_Mirrored_X_Axis; + + if (drawSkinPart) + QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, adjustedFlags); + + if (option->state & State_Children) { + QS60StyleEnums::SkinParts skinPart = + (option->state & State_Open) ? QS60StyleEnums::SP_QgnIndiHlColSuper : QS60StyleEnums::SP_QgnIndiHlExpSuper; + const QRect selectionRect = subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); + const int minDimension = qMin(option->rect.width(), option->rect.height()); + const int magicTweak = (option->direction == Qt::RightToLeft) ? -3 : 3; + //The branch indicator icon in S60 is supposed to be superimposed on top of branch lines. + QRect iconRect(QPoint(option->rect.left() + magicTweak, selectionRect.top() + 1), QSize(minDimension, minDimension)); + iconRect.translate(0, -4); + QS60StylePrivate::drawSkinPart(skinPart, painter, iconRect, adjustedFlags); } } +#else + QCommonStyle::drawPrimitive(element, option, painter, widget); +#endif break; case PE_PanelItemViewRow: // ### Qt 5: remove #ifndef QT_NO_ITEMVIEWS @@ -2494,10 +2442,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti case PE_PanelScrollAreaCorner: break; case PE_IndicatorItemViewItemDrop: - if (QS60StylePrivate::isTouchSupported()) - QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_DropArea, painter, option->rect, flags); - else - commonStyleDraws = true; + QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_DropArea, painter, option->rect, flags); break; // todo: items are below with #ifdefs "just in case". in final version, remove all non-required cases case PE_FrameLineEdit: @@ -2673,13 +2618,11 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt, } } sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget); - if (QS60StylePrivate::isTouchSupported()) { - //Make itemview easier to use in touch devices - sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin)); - //QCommonStyle does not adjust height with horizontal margin, it only adjusts width - if (ct == CT_MenuItem) - sz.setHeight(sz.height() - 8); //QCommonstyle adds 8 to height that this style handles through PM values - } + //Make itemview easier to use in touch devices + sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin)); + //QCommonStyle does not adjust height with horizontal margin, it only adjusts width + if (ct == CT_MenuItem) + sz.setHeight(sz.height() - 8); //QCommonstyle adds 8 to height that this style handles through PM values break; #ifndef QT_NO_COMBOBOX case CT_ComboBox: { @@ -3313,8 +3256,7 @@ void QS60Style::polish(QApplication *application) QCommonStyle::polish(qApp); d->m_originalPalette = application->palette(); d->setThemePalette(application); - if (QS60StylePrivate::isTouchSupported()) - qApp->installEventFilter(this); + qApp->installEventFilter(this); } /*! @@ -3329,8 +3271,7 @@ void QS60Style::unpolish(QApplication *application) const QPalette newPalette = QApplication::style()->standardPalette(); QApplication::setPalette(newPalette); QApplicationPrivate::setSystemPalette(d->m_originalPalette); - if (QS60StylePrivate::isTouchSupported()) - qApp->removeEventFilter(this); + qApp->removeEventFilter(this); } /*! @@ -3341,11 +3282,10 @@ bool QS60Style::event(QEvent *e) #ifdef QT_KEYPAD_NAVIGATION Q_D(QS60Style); const QEvent::Type eventType = e->type(); - if ((eventType == QEvent::FocusIn || - eventType == QEvent::FocusOut || - eventType == QEvent::EnterEditFocus || - eventType == QEvent::LeaveEditFocus) && - QS60StylePrivate::isTouchSupported()) + if (eventType == QEvent::FocusIn + || eventType == QEvent::FocusOut + || eventType == QEvent::EnterEditFocus + || eventType == QEvent::LeaveEditFocus) return false; #endif diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h index ee981c0..1cf069b 100644 --- a/src/gui/styles/qs60style_p.h +++ b/src/gui/styles/qs60style_p.h @@ -516,9 +516,6 @@ public: void setBackgroundTexture(QApplication *application) const; static void deleteBackground(); - static bool isTouchSupported(); - static bool isToolBarBackground(); - static bool hasSliderGrooveGraphic(); static bool isSingleClickUi(); static bool isWidgetPressed(const QWidget *widget); diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp index f272ff4..58d70a4 100644 --- a/src/gui/styles/qs60style_s60.cpp +++ b/src/gui/styles/qs60style_s60.cpp @@ -579,7 +579,6 @@ QPixmap QS60StyleModeSpecifics::colorSkinnedGraphicsLX( const TAknsItemID skinId = m_partMap[stylepartIndex].skinID; TInt fallbackGraphicID = -1; - HBufC* iconFile = HBufC::NewLC( KMaxFileName ); fallbackInfo(stylepart, fallbackGraphicID); TAknsItemID colorGroup = KAknsIIDQsnIconColors; @@ -613,7 +612,7 @@ QPixmap QS60StyleModeSpecifics::colorSkinnedGraphicsLX( defaultColor); QPixmap result = fromFbsBitmap(icon, iconMask, flags, targetSize); - CleanupStack::PopAndDestroy(3); //icon, iconMask, iconFile + CleanupStack::PopAndDestroy(2); //icon, iconMask return result; } @@ -693,21 +692,6 @@ QPixmap QS60StyleModeSpecifics::fromFbsBitmap(CFbsBitmap *icon, CFbsBitmap *mask return pixmap; } -bool QS60StylePrivate::isTouchSupported() -{ - return bool(AknLayoutUtils::PenEnabled()); -} - -bool QS60StylePrivate::isToolBarBackground() -{ - return (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || QSysInfo::s60Version() == QSysInfo::SV_S60_3_2); -} - -bool QS60StylePrivate::hasSliderGrooveGraphic() -{ - return QSysInfo::s60Version() != QSysInfo::SV_S60_3_1; -} - bool QS60StylePrivate::isSingleClickUi() { return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0); @@ -1068,20 +1052,8 @@ void QS60StyleModeSpecifics::frameIdAndCenterId(QS60StylePrivate::SkinFrameEleme switch(frameElement) { case QS60StylePrivate::SF_ToolTip: - if (QSysInfo::s60Version() != QSysInfo::SV_S60_3_1) { - centerId.Set(EAknsMajorGeneric, 0x19c2); - frameId.Set(EAknsMajorSkin, 0x5300); - } else { - centerId.Set(KAknsIIDQsnFrPopupCenter); - frameId.iMinor = centerId.iMinor - 9; - } - break; - case QS60StylePrivate::SF_ToolBar: - if (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || - QSysInfo::s60Version() == QSysInfo::SV_S60_3_2) { - centerId.Set(KAknsIIDQsnFrPopupCenterSubmenu); - frameId.Set(KAknsIIDQsnFrPopupSub); - } + centerId.Set(EAknsMajorGeneric, 0x19c2); + frameId.Set(EAknsMajorSkin, 0x5300); break; case QS60StylePrivate::SF_PopupBackground: centerId.Set(KAknsIIDQsnFrPopupCenterSubmenu); @@ -1223,10 +1195,7 @@ void QS60StylePrivate::setActiveLayout() //not found, lets try with either of dimensions if (activeLayoutIndex==-1){ - const QSysInfo::S60Version currentRelease = QSysInfo::s60Version(); const bool landscape = screenHeight < screenWidth; - - activeLayoutIndex = (currentRelease == QSysInfo::SV_S60_3_1 || currentRelease == QSysInfo::SV_S60_3_2) ? 0 : 2; activeLayoutIndex += (!landscape) ? 1 : 0; } @@ -1282,9 +1251,7 @@ bool QS60StyleModeSpecifics::disabledPartGraphic(QS60StyleEnums::SkinParts &part case QS60StyleEnums::SP_QsnFrButtonSideLInactive: case QS60StyleEnums::SP_QsnFrButtonSideRInactive: case QS60StyleEnums::SP_QsnFrButtonCenterInactive: - if (!(QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 || - QSysInfo::s60Version()==QSysInfo::SV_S60_3_2)) - disabledGraphic = true; + disabledGraphic = true; break; default: break; @@ -1300,9 +1267,7 @@ bool QS60StyleModeSpecifics::disabledFrameGraphic(QS60StylePrivate::SkinFrameEle switch(frame){ // inactive button graphics are available from 5.0 onwards case QS60StylePrivate::SF_ButtonInactive: - if (!(QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 || - QSysInfo::s60Version()==QSysInfo::SV_S60_3_2)) - disabledGraphic = true; + disabledGraphic = true; break; default: break; @@ -1313,9 +1278,6 @@ bool QS60StyleModeSpecifics::disabledFrameGraphic(QS60StylePrivate::SkinFrameEle QPixmap QS60StyleModeSpecifics::generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags) { - if (!QS60StylePrivate::isTouchSupported()) - return QPixmap(); - QS60StyleEnums::SkinParts updatedPart = part; switch(part){ // AVKON UI has a abnormal handling for scrollbar graphics. It is possible that the root @@ -1541,7 +1503,7 @@ QVariant QS60StyleModeSpecifics::themeDefinition( //Animation definitions case QS60StyleEnums::TD_AnimationData: { - CAknsBmpAnimItemData *animationData; + CAknsBmpAnimItemData *animationData = 0; TAknsItemID animationSkinId = partSpecificThemeId(part); QList<QVariant> list; @@ -1557,9 +1519,6 @@ QVariant QS60StyleModeSpecifics::themeDefinition( QS60StyleEnums::AnimationMode playMode; switch(animationData->PlayMode()) { - case CBitmapAnimClientData::EPlay: - playMode = QS60StyleEnums::AM_PlayOnce; - break; case CBitmapAnimClientData::ECycle: playMode = QS60StyleEnums::AM_Looping; break; @@ -1567,6 +1526,7 @@ QVariant QS60StyleModeSpecifics::themeDefinition( playMode = QS60StyleEnums::AM_Bounce; break; default: + playMode = QS60StyleEnums::AM_PlayOnce; break; } list.append(QVariant((int)playMode)); diff --git a/src/gui/styles/qs60style_simulated.cpp b/src/gui/styles/qs60style_simulated.cpp index ca02cdf..d0789a8 100644 --- a/src/gui/styles/qs60style_simulated.cpp +++ b/src/gui/styles/qs60style_simulated.cpp @@ -318,25 +318,6 @@ QPixmap QS60StylePrivate::backgroundTexture(bool /*skipCreation*/) return *m_background; } -bool QS60StylePrivate::isTouchSupported() -{ -#ifdef QT_KEYPAD_NAVIGATION - return !QApplication::keypadNavigationEnabled(); -#else - return true; -#endif -} - -bool QS60StylePrivate::isToolBarBackground() -{ - return true; -} - -bool QS60StylePrivate::hasSliderGrooveGraphic() -{ - return false; -} - bool QS60StylePrivate::isSingleClickUi() { return false; diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 7a8a912..98186df 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -879,10 +879,10 @@ QStringList QFontDatabasePrivate::addTTFile(const QByteArray &file, const QByteA TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { - os2->ulUnicodeRange1, os2->ulUnicodeRange2, os2->ulUnicodeRange3, os2->ulUnicodeRange4 + static_cast<quint32>(os2->ulUnicodeRange1), static_cast<quint32>(os2->ulUnicodeRange2), static_cast<quint32>(os2->ulUnicodeRange3), static_cast<quint32>(os2->ulUnicodeRange4) }; quint32 codePageRange[2] = { - os2->ulCodePageRange1, os2->ulCodePageRange2 + static_cast<quint32>(os2->ulCodePageRange1), static_cast<quint32>(os2->ulCodePageRange2) }; writingSystems = qt_determine_writing_systems_from_truetype_bits(unicodeRange, codePageRange); diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp index 8a13d91..a5fdcb5 100644 --- a/src/gui/text/qfontdatabase_x11.cpp +++ b/src/gui/text/qfontdatabase_x11.cpp @@ -1996,6 +1996,11 @@ void QFontDatabase::load(const QFontPrivate *d, int script) QFontCache::instance()->insertEngine(key, fe); } +// Needed for fontconfig version < 2.2.97 +#ifndef FC_FAMILYLANG +#define FC_FAMILYLANG "familylang" +#endif + static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt) { #if defined(QT_NO_FONTCONFIG) diff --git a/src/gui/text/qfontengine_coretext.mm b/src/gui/text/qfontengine_coretext.mm index 24bd750..9a83599 100644 --- a/src/gui/text/qfontengine_coretext.mm +++ b/src/gui/text/qfontengine_coretext.mm @@ -100,7 +100,12 @@ QCoreTextFontEngineMulti::QCoreTextFontEngineMulti(const QCFString &name, const QCFType<CTFontDescriptorRef> descriptor = CTFontDescriptorCreateWithNameAndSize(name, fontDef.pixelSize); QCFType<CTFontRef> baseFont = CTFontCreateWithFontDescriptor(descriptor, fontDef.pixelSize, &transform); - ctfont = CTFontCreateCopyWithSymbolicTraits(baseFont, fontDef.pixelSize, &transform, symbolicTraits, symbolicTraits); + ctfont = NULL; + // There is a side effect in Core Text: if we apply 0 as symbolic traits to a font in normal weight, + // we will get the light version of that font (while the way supposed to work doesn't: + // setting kCTFontWeightTrait to some value between -1.0 to 0.0 has no effect on font selection) + if (fontDef.weight != QFont::Normal || symbolicTraits) + ctfont = CTFontCreateCopyWithSymbolicTraits(baseFont, fontDef.pixelSize, &transform, symbolicTraits, symbolicTraits); // CTFontCreateCopyWithSymbolicTraits returns NULL if we ask for a trait that does // not exist for the given font. (for example italic) @@ -725,10 +730,10 @@ void QCoreTextFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *position } } -QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition, int /*margin*/, bool aa) +QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition, int margin, bool aa) { const glyph_metrics_t br = boundingBox(glyph); - QImage im(qRound(br.width)+2, qRound(br.height)+2, QImage::Format_RGB32); + QImage im(qRound(br.width) + margin * 2, qRound(br.height) + margin * 2, QImage::Format_RGB32); im.fill(0); CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); @@ -740,9 +745,8 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition 8, im.bytesPerLine(), colorspace, cgflags); CGContextSetFontSize(ctx, fontDef.pixelSize); - CGContextSetShouldAntialias(ctx, aa || - (fontDef.pointSize > qt_antialiasing_threshold - && !(fontDef.styleStrategy & QFont::NoAntialias))); + CGContextSetShouldAntialias(ctx, (aa || fontDef.pointSize > qt_antialiasing_threshold) + && !(fontDef.styleStrategy & QFont::NoAntialias)); CGContextSetShouldSmoothFonts(ctx, aa); CGAffineTransform oldTextMatrix = CGContextGetTextMatrix(ctx); CGAffineTransform cgMatrix = CGAffineTransformMake(1, 0, 0, 1, 0, 0); @@ -760,8 +764,8 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition CGContextSetFont(ctx, cgFont); - qreal pos_x = -br.x.toReal() + subPixelPosition.toReal(); - qreal pos_y = im.height() + br.y.toReal() - 1; + qreal pos_x = -br.x.toReal() + subPixelPosition.toReal() + margin; + qreal pos_y = im.height() + br.y.toReal() - margin; CGContextSetTextPosition(ctx, pos_x, pos_y); CGSize advance; diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index f514942..39abbd6 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -795,7 +795,7 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags, if (set && set->outline_drawing) load_flags = FT_LOAD_NO_BITMAP; - if (default_hint_style == HintNone || (flags & HB_ShaperFlag_UseDesignMetrics)) + if (default_hint_style == HintNone || (flags & HB_ShaperFlag_UseDesignMetrics) || set->outline_drawing) load_flags |= FT_LOAD_NO_HINTING; else load_flags |= load_target; @@ -1751,7 +1751,6 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe } else { glyphSet = &defaultGlyphSet; } - bool needsDelete = false; Glyph * g = glyphSet->getGlyph(glyph); if (!g || g->format != format) { face = lockFace(); @@ -1759,7 +1758,6 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe FT_Matrix_Multiply(&glyphSet->transformationMatrix, &m); freetype->matrix = m; g = loadGlyph(glyphSet, glyph, subPixelPosition, format); - needsDelete = true; } if (g) { @@ -1768,8 +1766,6 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe overall.width = g->width; overall.height = g->height; overall.xoff = g->advance; - if (needsDelete) - delete g; } else { int left = FLOOR(face->glyph->metrics.horiBearingX); int right = CEIL(face->glyph->metrics.horiBearingX + face->glyph->metrics.width); diff --git a/src/gui/text/qfontengine_x11.cpp b/src/gui/text/qfontengine_x11.cpp index 0997048..e3bfa5d 100644 --- a/src/gui/text/qfontengine_x11.cpp +++ b/src/gui/text/qfontengine_x11.cpp @@ -1205,7 +1205,9 @@ QFontEngine *QFontEngineX11FT::cloneWithSize(qreal pixelSize) const delete fe; return 0; } else { +#ifndef QT_NO_XRENDER fe->xglyph_format = xglyph_format; +#endif return fe; } } diff --git a/src/gui/text/qglyphrun.cpp b/src/gui/text/qglyphrun.cpp index 05e3b6b..2865d91 100644 --- a/src/gui/text/qglyphrun.cpp +++ b/src/gui/text/qglyphrun.cpp @@ -132,13 +132,27 @@ QGlyphRun &QGlyphRun::operator=(const QGlyphRun &other) */ bool QGlyphRun::operator==(const QGlyphRun &other) const { - return ((d == other.d) - || (d->glyphIndexes == other.d->glyphIndexes - && d->glyphPositions == other.d->glyphPositions - && d->overline == other.d->overline - && d->underline == other.d->underline - && d->strikeOut == other.d->strikeOut - && d->rawFont == other.d->rawFont)); + if (d == other.d) + return true; + + if ((d->glyphIndexDataSize != other.d->glyphIndexDataSize) + || (d->glyphPositionDataSize != other.d->glyphPositionDataSize)) { + return false; + } + + for (int i=0; i<qMax(d->glyphIndexDataSize, d->glyphPositionDataSize); ++i) { + if (i < d->glyphIndexDataSize && d->glyphIndexData[i] != other.d->glyphIndexData[i]) + return false; + + if (i < d->glyphPositionDataSize && d->glyphPositionData[i] != other.d->glyphPositionData[i]) + return false; + } + + + return (d->overline == other.d->overline + && d->underline == other.d->underline + && d->strikeOut == other.d->strikeOut + && d->rawFont == other.d->rawFont); } /*! @@ -151,36 +165,6 @@ bool QGlyphRun::operator!=(const QGlyphRun &other) const } /*! - \internal - - Adds together the lists of glyph indexes and positions in \a other and this QGlyphRun - object and returns the result. The font in the returned QGlyphRun will be the same as in - this QGlyphRun object. -*/ -QGlyphRun QGlyphRun::operator+(const QGlyphRun &other) const -{ - QGlyphRun ret(*this); - ret += other; - return ret; -} - -/*! - \internal - - Appends the glyph indexes and positions in \a other to this QGlyphRun object and returns - a reference to the current object. -*/ -QGlyphRun &QGlyphRun::operator+=(const QGlyphRun &other) -{ - detach(); - - d->glyphIndexes += other.d->glyphIndexes; - d->glyphPositions += other.d->glyphPositions; - - return *this; -} - -/*! Returns the font selected for this QGlyphRun object. \sa setRawFont() @@ -208,7 +192,13 @@ void QGlyphRun::setRawFont(const QRawFont &rawFont) */ QVector<quint32> QGlyphRun::glyphIndexes() const { - return d->glyphIndexes; + if (d->glyphIndexes.constData() == d->glyphIndexData) { + return d->glyphIndexes; + } else { + QVector<quint32> indexes(d->glyphIndexDataSize); + qMemCopy(indexes.data(), d->glyphIndexData, d->glyphIndexDataSize * sizeof(quint32)); + return indexes; + } } /*! @@ -218,7 +208,9 @@ QVector<quint32> QGlyphRun::glyphIndexes() const void QGlyphRun::setGlyphIndexes(const QVector<quint32> &glyphIndexes) { detach(); - d->glyphIndexes = glyphIndexes; + d->glyphIndexes = glyphIndexes; // Keep a reference to the QVector to avoid copying + d->glyphIndexData = glyphIndexes.constData(); + d->glyphIndexDataSize = glyphIndexes.size(); } /*! @@ -226,7 +218,14 @@ void QGlyphRun::setGlyphIndexes(const QVector<quint32> &glyphIndexes) */ QVector<QPointF> QGlyphRun::positions() const { - return d->glyphPositions; + if (d->glyphPositions.constData() == d->glyphPositionData) { + return d->glyphPositions; + } else { + QVector<QPointF> glyphPositions(d->glyphPositionDataSize); + qMemCopy(glyphPositions.data(), d->glyphPositionData, + d->glyphPositionDataSize * sizeof(QPointF)); + return glyphPositions; + } } /*! @@ -236,7 +235,9 @@ QVector<QPointF> QGlyphRun::positions() const void QGlyphRun::setPositions(const QVector<QPointF> &positions) { detach(); - d->glyphPositions = positions; + d->glyphPositions = positions; // Keep a reference to the vector to avoid copying + d->glyphPositionData = positions.constData(); + d->glyphPositionDataSize = positions.size(); } /*! @@ -245,12 +246,33 @@ void QGlyphRun::setPositions(const QVector<QPointF> &positions) void QGlyphRun::clear() { detach(); - d->glyphPositions = QVector<QPointF>(); - d->glyphIndexes = QVector<quint32>(); d->rawFont = QRawFont(); d->strikeOut = false; d->overline = false; d->underline = false; + + setPositions(QVector<QPointF>()); + setGlyphIndexes(QVector<quint32>()); +} + +/*! + Sets the glyph indexes and positions of this QGlyphRun to use the first \a size + elements in the arrays \a glyphIndexArray and \a glyphPositionArray. The data is + \e not copied. The caller must guarantee that the arrays are not deleted as long + as this QGlyphRun and any copies of it exists. + + \sa setGlyphIndexes(), setPositions() +*/ +void QGlyphRun::setRawData(const quint32 *glyphIndexArray, const QPointF *glyphPositionArray, + int size) +{ + detach(); + d->glyphIndexes.clear(); + d->glyphPositions.clear(); + + d->glyphIndexData = glyphIndexArray; + d->glyphPositionData = glyphPositionArray; + d->glyphIndexDataSize = d->glyphPositionDataSize = size; } /*! diff --git a/src/gui/text/qglyphrun.h b/src/gui/text/qglyphrun.h index e43f1ef..cf407a8 100644 --- a/src/gui/text/qglyphrun.h +++ b/src/gui/text/qglyphrun.h @@ -66,6 +66,10 @@ public: QRawFont rawFont() const; void setRawFont(const QRawFont &rawFont); + void setRawData(const quint32 *glyphIndexArray, + const QPointF *glyphPositionArray, + int size); + QVector<quint32> glyphIndexes() const; void setGlyphIndexes(const QVector<quint32> &glyphIndexes); diff --git a/src/gui/text/qglyphrun_p.h b/src/gui/text/qglyphrun_p.h index 533679d..a7745e6 100644 --- a/src/gui/text/qglyphrun_p.h +++ b/src/gui/text/qglyphrun_p.h @@ -71,6 +71,10 @@ public: : overline(false) , underline(false) , strikeOut(false) + , glyphIndexData(glyphIndexes.constData()) + , glyphIndexDataSize(0) + , glyphPositionData(glyphPositions.constData()) + , glyphPositionDataSize(0) { } @@ -82,6 +86,10 @@ public: , overline(other.overline) , underline(other.underline) , strikeOut(other.strikeOut) + , glyphIndexData(other.glyphIndexData) + , glyphIndexDataSize(other.glyphIndexDataSize) + , glyphPositionData(other.glyphPositionData) + , glyphPositionDataSize(other.glyphPositionDataSize) { } @@ -92,6 +100,17 @@ public: uint overline : 1; uint underline : 1; uint strikeOut : 1; + + const quint32 *glyphIndexData; + int glyphIndexDataSize; + + const QPointF *glyphPositionData; + int glyphPositionDataSize; + + static QGlyphRunPrivate *get(const QGlyphRun &glyphRun) + { + return glyphRun.d.data(); + } }; QT_END_NAMESPACE diff --git a/src/gui/text/qrawfont_ft.cpp b/src/gui/text/qrawfont_ft.cpp index e8c10a5..db60459 100644 --- a/src/gui/text/qrawfont_ft.cpp +++ b/src/gui/text/qrawfont_ft.cpp @@ -46,7 +46,7 @@ #include "qrawfont_p.h" #include "qfontengine_ft_p.h" -#if defined(Q_WS_X11) +#if defined(Q_WS_X11) && !defined(QT_NO_FONTCONFIG) # include "qfontengine_x11_p.h" #endif @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE class QFontEngineFTRawFont -#if defined(Q_WS_X11) +#if defined(Q_WS_X11) && !defined(QT_NO_FONTCONFIG) : public QFontEngineX11FT #else : public QFontEngineFT @@ -63,7 +63,7 @@ class QFontEngineFTRawFont { public: QFontEngineFTRawFont(const QFontDef &fontDef) -#if defined(Q_WS_X11) +#if defined(Q_WS_X11) && !defined(QT_NO_FONTCONFIG) : QFontEngineX11FT(fontDef) #else : QFontEngineFT(fontDef) diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index b43c8f4..e8e6c98 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -856,7 +856,7 @@ void QTextEngine::shapeLine(const QScriptLine &line) } } -#if !defined(QT_ENABLE_HARFBUZZ_FOR_MAC) +#if !defined(QT_ENABLE_HARFBUZZ_FOR_MAC) && defined(Q_WS_MAC) static bool enableHarfBuzz() { static enum { Yes, No, Unknown } status = Unknown; @@ -2825,6 +2825,75 @@ QFixed QTextEngine::offsetInLigature(const QScriptItem *si, int pos, int max, in return 0; } +// Scan in logClusters[from..to-1] for glyph_pos +int QTextEngine::getClusterLength(unsigned short *logClusters, + const HB_CharAttributes *attributes, + int from, int to, int glyph_pos, int *start) +{ + int clusterLength = 0; + for (int i = from; i < to; i++) { + if (logClusters[i] == glyph_pos && attributes[i].charStop) { + if (*start < 0) + *start = i; + clusterLength++; + } + else if (clusterLength) + break; + } + return clusterLength; +} + +int QTextEngine::positionInLigature(const QScriptItem *si, int end, + QFixed x, QFixed edge, int glyph_pos, + bool cursorOnCharacter) +{ + unsigned short *logClusters = this->logClusters(si); + int clusterStart = -1; + int clusterLength = 0; + + if (si->analysis.script != QUnicodeTables::Common && + si->analysis.script != QUnicodeTables::Greek) { + if (glyph_pos == -1) + return si->position + end; + else { + int i; + for (i = 0; i < end; i++) + if (logClusters[i] == glyph_pos) + break; + return si->position + i; + } + } + + if (glyph_pos == -1 && end > 0) + glyph_pos = logClusters[end - 1]; + else { + if (x <= edge) + glyph_pos--; + } + + const HB_CharAttributes *attrs = attributes(); + clusterLength = getClusterLength(logClusters, attrs, 0, end, glyph_pos, &clusterStart); + + if (clusterLength) { + const QGlyphLayout &glyphs = shapedGlyphs(si); + QFixed glyphWidth = glyphs.effectiveAdvance(glyph_pos); + // the approximate width of each individual element of the ligature + QFixed perItemWidth = glyphWidth / clusterLength; + QFixed left = x > edge ? edge : edge - glyphWidth; + int n = ((x - left) / perItemWidth).floor().toInt(); + QFixed dist = x - left - n * perItemWidth; + int closestItem = dist > (perItemWidth / 2) ? n + 1 : n; + if (cursorOnCharacter && closestItem > 0) + closestItem--; + int pos = si->position + clusterStart + closestItem; + // Jump to the next charStop + while (!attrs[pos].charStop && pos < end) + pos++; + return pos; + } + return si->position + end; +} + int QTextEngine::previousLogicalPosition(int oldPos) const { const HB_CharAttributes *attrs = attributes(); diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index ed24d59..055974a 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -620,6 +620,7 @@ public: QFixed leadingSpaceWidth(const QScriptLine &line); QFixed offsetInLigature(const QScriptItem *si, int pos, int max, int glyph_pos); + int positionInLigature(const QScriptItem *si, int end, QFixed x, QFixed edge, int glyph_pos, bool cursorOnCharacter); int previousLogicalPosition(int oldPos) const; int nextLogicalPosition(int oldPos) const; int lineNumberForTextPosition(int pos); @@ -642,6 +643,7 @@ private: void resolveAdditionalFormats() const; int endOfLine(int lineNum); int beginningOfLine(int lineNum); + int getClusterLength(unsigned short *logClusters, const HB_CharAttributes *attributes, int from, int to, int glyph_pos, int *start); }; class QStackTextEngine : public QTextEngine { diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 988ae93..203886b 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2233,10 +2233,20 @@ QList<QGlyphRun> QTextLine::glyphs(int from, int length) const glyphIndexes.setRawFont(font); QPair<QFontEngine *, int> key(fontEngine, int(flags)); - if (!glyphsHash.contains(key)) + if (!glyphsHash.contains(key)) { glyphsHash.insert(key, glyphIndexes); - else - glyphsHash[key] += glyphIndexes; + } else { + QGlyphRun &glyphRun = glyphsHash[key]; + + QVector<quint32> indexes = glyphRun.glyphIndexes(); + QVector<QPointF> positions = glyphRun.positions(); + + indexes += glyphIndexes.glyphIndexes(); + positions += glyphIndexes.positions(); + + glyphRun.setGlyphIndexes(indexes); + glyphRun.setPositions(positions); + } } } @@ -2559,8 +2569,8 @@ qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const } else { bool rtl = eng->isRightToLeft(); bool visual = eng->visualCursorMovement(); + int end = qMin(lineEnd, si->position + l) - si->position; if (reverse) { - int end = qMin(lineEnd, si->position + l) - si->position; int glyph_end = end == l ? si->num_glyphs : logClusters[end]; int glyph_start = glyph_pos; if (visual && !rtl && !(lastLine && itm == (visualOrder[nItems - 1] + firstItem))) @@ -2576,7 +2586,7 @@ qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const for (int i = glyph_start; i <= glyph_end; i++) x += glyphs.effectiveAdvance(i); } - x += eng->offsetInLigature(si, pos, line.length, glyph_pos); + x += eng->offsetInLigature(si, pos, end, glyph_pos); } *cursorPos = pos + si->position; @@ -2691,6 +2701,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const } int glyph_pos = -1; + QFixed edge; // has to be inside run if (cpos == QTextLine::CursorOnCharacter) { if (si.analysis.bidiLevel % 2) { @@ -2701,6 +2712,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const if (pos < x) break; glyph_pos = gs; + edge = pos; break; } pos -= glyphs.effectiveAdvance(gs); @@ -2713,6 +2725,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const if (pos > x) break; glyph_pos = gs; + edge = pos; } pos += glyphs.effectiveAdvance(gs); ++gs; @@ -2726,6 +2739,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const while (gs <= ge) { if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { glyph_pos = gs; + edge = pos; dist = qAbs(x-pos); } pos -= glyphs.effectiveAdvance(gs); @@ -2735,6 +2749,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const while (ge >= gs) { if (glyphs.attributes[ge].clusterStart && qAbs(x-pos) < dist) { glyph_pos = ge; + edge = pos; dist = qAbs(x-pos); } pos += glyphs.effectiveAdvance(ge); @@ -2746,6 +2761,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const while (gs <= ge) { if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { glyph_pos = gs; + edge = pos; dist = qAbs(x-pos); } pos += glyphs.effectiveAdvance(gs); @@ -2757,6 +2773,7 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const pos += glyphs.effectiveAdvance(gs); if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { glyph_pos = gs; + edge = pos; dist = qAbs(x-pos); } ++gs; @@ -2773,16 +2790,13 @@ int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const if (rtl && nchars > 0) return insertionPoints[lastLine ? nchars : nchars - 1]; } - return si.position + end; + return eng->positionInLigature(&si, end, x, pos, -1, + cpos == QTextLine::CursorOnCharacter); } } Q_ASSERT(glyph_pos != -1); - int j; - for (j = 0; j < eng->length(item); ++j) - if (logClusters[j] == glyph_pos) - break; -// qDebug("at pos %d (in run: %d)", si.position + j, j); - return si.position + j; + return eng->positionInLigature(&si, end, x, edge, glyph_pos, + cpos == QTextLine::CursorOnCharacter); } } // right of last item diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp index 97d1226..8c243ed 100644 --- a/src/gui/util/qdesktopservices_s60.cpp +++ b/src/gui/util/qdesktopservices_s60.cpp @@ -70,6 +70,10 @@ #include <schemehandler.h> #endif +#ifdef Q_WS_S60 +#include <CDirectoryLocalizer.h> // CDirectoryLocalizer +#endif + QT_BEGIN_NAMESPACE _LIT(KCacheSubDir, "Cache\\"); @@ -444,18 +448,31 @@ static QString defaultLocalizedDirectoryName(QString&) QString QDesktopServices::displayName(StandardLocation type) { - static LocalizerFunc ptrLocalizerFunc = NULL; - - if (!ptrLocalizerFunc) { - ptrLocalizerFunc = reinterpret_cast<LocalizerFunc> - (qt_resolveS60PluginFunc(S60Plugin_LocalizedDirectoryName)); - if (!ptrLocalizerFunc) - ptrLocalizerFunc = &defaultLocalizedDirectoryName; - } + QString ret; +#ifdef Q_WS_S60 QString rawPath = storageLocation(type); - return ptrLocalizerFunc(rawPath); -} + TRAPD(err, + QT_TRYCATCH_LEAVING( + CDirectoryLocalizer* localizer = CDirectoryLocalizer::NewL(); + CleanupStack::PushL(localizer); + localizer->SetFullPath(qt_QString2TPtrC(QDir::toNativeSeparators(rawPath))); + if (localizer->IsLocalized()) { + TPtrC locName(localizer->LocalizedName()); + ret = qt_TDesC2QString(locName); + } + CleanupStack::PopAndDestroy(localizer); + ) + ) + + if (err != KErrNone) + ret = QString(); +#else + qWarning("QDesktopServices::displayName() not implemented for this platform version"); +#endif + + return ret; +} QT_END_NAMESPACE diff --git a/src/gui/util/util.pri b/src/gui/util/util.pri index f125f82..7395604 100644 --- a/src/gui/util/util.pri +++ b/src/gui/util/util.pri @@ -56,4 +56,10 @@ symbian { } else { DEFINES += USE_SCHEMEHANDLER } + + contains(CONFIG, is_using_gnupoc) { + LIBS += -ldirectorylocalizer + } else { + LIBS += -lDirectoryLocalizer + } } diff --git a/src/imports/imports.pro b/src/imports/imports.pro index 5e50b08..c1298e2 100644 --- a/src/imports/imports.pro +++ b/src/imports/imports.pro @@ -1,4 +1,5 @@ TEMPLATE = subdirs SUBDIRS += folderlistmodel particles gestures +contains(QT_CONFIG, opengl): SUBDIRS += shaders diff --git a/src/imports/shaders/glfunctions.h b/src/imports/shaders/glfunctions.h new file mode 100755 index 0000000..8529519 --- /dev/null +++ b/src/imports/shaders/glfunctions.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GLFUNCTIONS_H +#define GLFUNCTIONS_H + +#ifndef QT_OPENGL_ES + +#ifndef Q_WS_MAC +# ifndef APIENTRYP +# ifdef APIENTRY +# define APIENTRYP APIENTRY * +# else +# define APIENTRY +# define APIENTRYP * +# endif +# endif +#else +# define APIENTRY +# define APIENTRYP * +#endif + +#define GL_TEXTURE0 0x84C0 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_BGRA 0x80E1 + +typedef void (APIENTRYP type_glActiveTexture)(GLenum texture); +typedef void (APIENTRYP type_glGenerateMipmap)(GLenum target); +typedef void (APIENTRYP type_glVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); + +#define glActiveTexture ((type_glActiveTexture)QGLContext::currentContext()->getProcAddress(QLatin1String("glActiveTexture"))) +#define glGenerateMipmap ((type_glGenerateMipmap)QGLContext::currentContext()->getProcAddress(QLatin1String("glGenerateMipmap"))) +#define glVertexAttribPointer ((type_glVertexAttribPointer)QGLContext::currentContext()->getProcAddress(QLatin1String("glVertexAttribPointer"))) + +#endif + +#endif // GLFUNCTIONS_H diff --git a/src/imports/shaders/qmldir b/src/imports/shaders/qmldir new file mode 100644 index 0000000..b2a9de21 --- /dev/null +++ b/src/imports/shaders/qmldir @@ -0,0 +1,2 @@ +plugin qmlshadersplugin + diff --git a/src/imports/shaders/qmlshadersplugin_plugin.cpp b/src/imports/shaders/qmlshadersplugin_plugin.cpp new file mode 100644 index 0000000..c03ef2c --- /dev/null +++ b/src/imports/shaders/qmlshadersplugin_plugin.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qmlshadersplugin_plugin.h" +#include "shadereffectitem.h" +#include "shadereffectsource.h" + +#include <QtDeclarative/qdeclarative.h> + +void qmlshaderspluginPlugin::registerTypes(const char *uri) +{ + qmlRegisterType<ShaderEffectItem>(uri, 1, 0, "ShaderEffectItem"); + qmlRegisterType<ShaderEffectSource>(uri, 1, 0, "ShaderEffectSource"); +} + +Q_EXPORT_PLUGIN2(qmlshadersplugin, qmlshaderspluginPlugin) + diff --git a/src/imports/shaders/qmlshadersplugin_plugin.h b/src/imports/shaders/qmlshadersplugin_plugin.h new file mode 100644 index 0000000..2614a44 --- /dev/null +++ b/src/imports/shaders/qmlshadersplugin_plugin.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLSHADERSPLUGIN_PLUGIN_H +#define QMLSHADERSPLUGIN_PLUGIN_H + +#include <QtDeclarative/QDeclarativeExtensionPlugin> + +class qmlshaderspluginPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT + +public: + void registerTypes(const char *uri); +}; + +#endif // QMLSHADERSPLUGIN_PLUGIN_H + diff --git a/src/imports/shaders/scenegraph/qsggeometry.cpp b/src/imports/shaders/scenegraph/qsggeometry.cpp new file mode 100644 index 0000000..05c111a --- /dev/null +++ b/src/imports/shaders/scenegraph/qsggeometry.cpp @@ -0,0 +1,310 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsggeometry.h" + +QT_BEGIN_NAMESPACE + + +/*! + Convenience function which returns attributes to be used for 2D solid + color drawing. + */ + +const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_Point2D() +{ + static Attribute data[] = { + { 0, 2, GL_FLOAT } + }; + static AttributeSet attrs = { 1, sizeof(float) * 2, data }; + return attrs; +} + +/*! + Convenience function which returns attributes to be used for textured 2D drawing. + */ + +const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_TexturedPoint2D() +{ + static Attribute data[] = { + { 0, 2, GL_FLOAT }, + { 1, 2, GL_FLOAT } + }; + static AttributeSet attrs = { 2, sizeof(float) * 4, data }; + return attrs; +} + +/*! + Convenience function which returns attributes to be used for per vertex colored 2D drawing. + */ + +const QSGGeometry::AttributeSet &QSGGeometry::defaultAttributes_ColoredPoint2D() +{ + static Attribute data[] = { + { 0, 2, GL_FLOAT }, + { 1, 4, GL_UNSIGNED_BYTE } + }; + static AttributeSet attrs = { 2, 2 * sizeof(float) + 4 * sizeof(char), data }; + return attrs; +} + + +/*! + \class QSGGeometry + \brief The QSGGeometry class provides low-level storage for graphics primitives + in the QML Scene Graph. + + The QSGGeometry class provides a few convenience attributes and attribute accessors + by default. The defaultAttributes_Point2D() function returns attributes to be used + in normal solid color rectangles, while the defaultAttributes_TexturedPoint2D function + returns attributes to be used for the common pixmap usecase. + */ + + +/*! + Constructs a geometry object based on \a attributes. + + The object allocate space for \a vertexCount vertices based on the accumulated + size in \a attributes and for \a indexCount. + + Geometry objects are constructed with GL_TRIANGLE_STRIP as default drawing mode. + + The attribute structure is assumed to be POD and the geometry object + assumes this will not go away. There is no memory management involved. + */ + +QSGGeometry::QSGGeometry(const QSGGeometry::AttributeSet &attributes, + int vertexCount, + int indexCount, + int indexType) + : m_drawing_mode(GL_TRIANGLE_STRIP) + , m_vertex_count(0) + , m_index_count(0) + , m_index_type(indexType) + , m_attributes(attributes) + , m_data(0) + , m_index_data_offset(-1) + , m_owns_data(false) +{ + Q_ASSERT(m_attributes.count > 0); + Q_ASSERT(m_attributes.stride > 0); + + // Because allocate reads m_vertex_count, m_index_count and m_owns_data, these + // need to be set before calling allocate... + allocate(vertexCount, indexCount); +} + +QSGGeometry::~QSGGeometry() +{ + if (m_owns_data) + qFree(m_data); +} + +/*! + \fn int QSGGeometry::vertexCount() const + + Returns the number of vertices in this geometry object. + */ + +/*! + \fn int QSGGeometry::indexCount() const + + Returns the number of indices in this geometry object. + */ + + + +/*! + \fn void *QSGGeometry::vertexData() + + Returns a pointer to the raw vertex data of this geometry object. + + \sa vertexDataAsPoint2D(), vertexDataAsTexturedPoint2D + */ + +/*! + \fn const void *QSGGeometry::vertexData() const + + Returns a pointer to the raw vertex data of this geometry object. + + \sa vertexDataAsPoint2D(), vertexDataAsTexturedPoint2D + */ + +/*! + Returns a pointer to the raw index data of this geometry object. + + \sa indexDataAsUShort(), indexDataAsUInt() + */ +void *QSGGeometry::indexData() +{ + return m_index_data_offset < 0 + ? 0 + : ((char *) m_data + m_index_data_offset); +} + +/*! + Returns a pointer to the raw index data of this geometry object. + + \sa indexDataAsUShort(), indexDataAsUInt() + */ +const void *QSGGeometry::indexData() const +{ + return m_index_data_offset < 0 + ? 0 + : ((char *) m_data + m_index_data_offset); +} + +/*! + Sets the drawing mode to be used for this geometry. + + The default value is GL_TRIANGLE_STRIP. + */ +void QSGGeometry::setDrawingMode(GLenum mode) +{ + m_drawing_mode = mode; +} + +/*! + \fn int QSGGeometry::drawingMode() const + + Returns the drawing mode of this geometry. + + The default value is GL_TRIANGLE_STRIP. + */ + +/*! + \fn int QSGGeometry::indexType() const + + Returns the primitive type used for indices in this + geometry object. + */ + + +/*! + Resizes the vertex and index data of this geometry object to fit \a vertexCount + vertices and \a indexCount indices. + + Vertex and index data will be invalidated after this call and the caller must + */ +void QSGGeometry::allocate(int vertexCount, int indexCount) +{ + if (vertexCount == m_vertex_count && indexCount == m_index_count) + return; + + m_vertex_count = vertexCount; + m_index_count = indexCount; + + bool canUsePrealloc = m_index_count <= 0; + int vertexByteSize = m_attributes.stride * m_vertex_count; + + if (m_owns_data) + qFree(m_data); + + if (canUsePrealloc && vertexByteSize <= (int) sizeof(m_prealloc)) { + m_data = (void *) &m_prealloc[0]; + m_index_data_offset = -1; + m_owns_data = false; + } else { + Q_ASSERT(m_index_type == GL_UNSIGNED_INT || m_index_type == GL_UNSIGNED_SHORT); + int indexByteSize = indexCount * (m_index_type == GL_UNSIGNED_SHORT ? sizeof(quint16) : sizeof(quint32)); + m_data = (void *) qMalloc(vertexByteSize + indexByteSize); + m_index_data_offset = vertexByteSize; + m_owns_data = true; + } + +} + +/*! + Updates the geometry \a g with the coordinates in \a rect. + + The function assumes the geometry object contains a single triangle strip + of QSGGeometry::Point2D vertices + */ +void QSGGeometry::updateRectGeometry(QSGGeometry *g, const QRectF &rect) +{ + Point2D *v = g->vertexDataAsPoint2D(); + v[0].x = rect.left(); + v[0].y = rect.top(); + + v[1].x = rect.right(); + v[1].y = rect.top(); + + v[2].x = rect.left(); + v[2].y = rect.bottom(); + + v[3].x = rect.right(); + v[3].y = rect.bottom(); +} + +/*! + Updates the geometry \a g with the coordinates in \a rect and texture + coordinates from \a textureRect. + + \a textureRect should be in normalized coordinates. + + \a g is assumed to be a triangle strip of four vertices of type + QSGGeometry::TexturedPoint2D. + */ +void QSGGeometry::updateTexturedRectGeometry(QSGGeometry *g, const QRectF &rect, const QRectF &textureRect) +{ + TexturedPoint2D *v = g->vertexDataAsTexturedPoint2D(); + v[0].x = rect.left(); + v[0].y = rect.top(); + v[0].tx = textureRect.left(); + v[0].ty = textureRect.top(); + + v[1].x = rect.right(); + v[1].y = rect.top(); + v[1].tx = textureRect.right(); + v[1].ty = textureRect.top(); + + v[2].x = rect.left(); + v[2].y = rect.bottom(); + v[2].tx = textureRect.left(); + v[2].ty = textureRect.bottom(); + + v[3].x = rect.right(); + v[3].y = rect.bottom(); + v[3].tx = textureRect.right(); + v[3].ty = textureRect.bottom(); +} + +QT_END_NAMESPACE diff --git a/src/imports/shaders/scenegraph/qsggeometry.h b/src/imports/shaders/scenegraph/qsggeometry.h new file mode 100644 index 0000000..b6663f8 --- /dev/null +++ b/src/imports/shaders/scenegraph/qsggeometry.h @@ -0,0 +1,234 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSGGEOMETRY_H +#define QSGGEOMETRY_H + +#include <QtOpenGL/qgl.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QSGGeometry +{ +public: + struct Attribute + { + int position; + int tupleSize; + int type; + }; + + struct AttributeSet { + int count; + int stride; + const Attribute *attributes; + }; + + struct Point2D { float x, y; }; + struct TexturedPoint2D { float x, y; float tx, ty; }; + struct ColoredPoint2D { float x, y; unsigned char r, g, b, a; }; + + static const AttributeSet &defaultAttributes_Point2D(); + static const AttributeSet &defaultAttributes_TexturedPoint2D(); + static const AttributeSet &defaultAttributes_ColoredPoint2D(); + + QSGGeometry(const QSGGeometry::AttributeSet &attribs, + int vertexCount, + int indexCount = 0, + int indexType = GL_UNSIGNED_SHORT); + ~QSGGeometry(); + + void setDrawingMode(GLenum mode); + inline GLenum drawingMode() const { return m_drawing_mode; } + + void allocate(int vertexCount, int indexCount = 0); + + int vertexCount() const { return m_vertex_count; } + + void *vertexData() { return m_data; } + inline Point2D *vertexDataAsPoint2D(); + inline TexturedPoint2D *vertexDataAsTexturedPoint2D(); + inline ColoredPoint2D *vertexDataAsColoredPoint2D(); + + inline const void *vertexData() const { return m_data; } + inline const Point2D *vertexDataAsPoint2D() const; + inline const TexturedPoint2D *vertexDataAsTexturedPoint2D() const; + inline const ColoredPoint2D *vertexDataAsColoredPoint2D() const; + + inline int indexType() const { return m_index_type; } + + int indexCount() const { return m_index_count; } + + void *indexData(); + inline uint *indexDataAsUInt(); + inline quint16 *indexDataAsUShort(); + + const void *indexData() const; + inline const uint *indexDataAsUInt() const; + inline const quint16 *indexDataAsUShort() const; + + inline int attributeCount() const { return m_attributes.count; } + inline const Attribute *attributes() const { return m_attributes.attributes; } + inline int stride() const { return m_attributes.stride; } + + static void updateRectGeometry(QSGGeometry *g, const QRectF &rect); + static void updateTexturedRectGeometry(QSGGeometry *g, const QRectF &rect, const QRectF &sourceRect); + +private: + int m_drawing_mode; + int m_vertex_count; + int m_index_count; + int m_index_type; + const AttributeSet &m_attributes; + void *m_data; + int m_index_data_offset; + + void *m_reserved_pointer; + + uint m_owns_data : 1; + uint m_reserved_bits : 31; + + float m_prealloc[16]; +}; + +inline uint *QSGGeometry::indexDataAsUInt() +{ + Q_ASSERT(m_index_type == GL_UNSIGNED_INT); + return (uint *) indexData(); +} + +inline quint16 *QSGGeometry::indexDataAsUShort() +{ + Q_ASSERT(m_index_type == GL_UNSIGNED_SHORT); + return (quint16 *) indexData(); +} + +inline const uint *QSGGeometry::indexDataAsUInt() const +{ + Q_ASSERT(m_index_type == GL_UNSIGNED_INT); + return (uint *) indexData(); +} + +inline const quint16 *QSGGeometry::indexDataAsUShort() const +{ + Q_ASSERT(m_index_type == GL_UNSIGNED_SHORT); + return (quint16 *) indexData(); +} + +inline QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D() +{ + Q_ASSERT(m_attributes.count == 1); + Q_ASSERT(m_attributes.stride == 2 * sizeof(float)); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[0].position == 0); + return (Point2D *) m_data; +} + +inline QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D() +{ + Q_ASSERT(m_attributes.count == 2); + Q_ASSERT(m_attributes.stride == 4 * sizeof(float)); + Q_ASSERT(m_attributes.attributes[0].position == 0); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[1].position == 1); + Q_ASSERT(m_attributes.attributes[1].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[1].type == GL_FLOAT); + return (TexturedPoint2D *) m_data; +} + +inline QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D() +{ + Q_ASSERT(m_attributes.count == 2); + Q_ASSERT(m_attributes.stride == 2 * sizeof(float) + 4 * sizeof(char)); + Q_ASSERT(m_attributes.attributes[0].position == 0); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[1].position == 1); + Q_ASSERT(m_attributes.attributes[1].tupleSize == 4); + Q_ASSERT(m_attributes.attributes[1].type == GL_UNSIGNED_BYTE); + return (ColoredPoint2D *) m_data; +} + +inline const QSGGeometry::Point2D *QSGGeometry::vertexDataAsPoint2D() const +{ + Q_ASSERT(m_attributes.count == 1); + Q_ASSERT(m_attributes.stride == 2 * sizeof(float)); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[0].position == 0); + return (const Point2D *) m_data; +} + +inline const QSGGeometry::TexturedPoint2D *QSGGeometry::vertexDataAsTexturedPoint2D() const +{ + Q_ASSERT(m_attributes.count == 2); + Q_ASSERT(m_attributes.stride == 4 * sizeof(float)); + Q_ASSERT(m_attributes.attributes[0].position == 0); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[1].position == 1); + Q_ASSERT(m_attributes.attributes[1].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[1].type == GL_FLOAT); + return (const TexturedPoint2D *) m_data; +} + +inline const QSGGeometry::ColoredPoint2D *QSGGeometry::vertexDataAsColoredPoint2D() const +{ + Q_ASSERT(m_attributes.count == 2); + Q_ASSERT(m_attributes.stride == 2 * sizeof(float) + 4 * sizeof(char)); + Q_ASSERT(m_attributes.attributes[0].position == 0); + Q_ASSERT(m_attributes.attributes[0].tupleSize == 2); + Q_ASSERT(m_attributes.attributes[0].type == GL_FLOAT); + Q_ASSERT(m_attributes.attributes[1].position == 1); + Q_ASSERT(m_attributes.attributes[1].tupleSize == 4); + Q_ASSERT(m_attributes.attributes[1].type == GL_UNSIGNED_BYTE); + return (const ColoredPoint2D *) m_data; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QSGGEOMETRY_H diff --git a/src/imports/shaders/shadereffect.cpp b/src/imports/shaders/shadereffect.cpp new file mode 100644 index 0000000..bbea43c --- /dev/null +++ b/src/imports/shaders/shadereffect.cpp @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "shadereffect.h" +#include "shadereffectbuffer.h" +#include "shadereffectsource.h" + +#include <QDeclarativeItem> +#include <QPainter> +#include <QtOpenGL> + +static QTransform savedWorldTransform; + +ShaderEffect::ShaderEffect(QObject *parent) + : QGraphicsEffect(parent) + , m_changed(true) +{ +} + +ShaderEffect::~ShaderEffect() +{ +} + +void ShaderEffect::prepareBufferedDraw(QPainter *painter) +{ + // This workaround needed because QGraphicsEffect seems to always utilize default painters worldtransform + // instead of the active painters worldtransform. + const ShaderEffectBuffer *effectBuffer = dynamic_cast<ShaderEffectBuffer*> (painter->device()); + if (effectBuffer) { + savedWorldTransform = painter->worldTransform() * savedWorldTransform; + painter->setWorldTransform(savedWorldTransform); + } else { + savedWorldTransform = painter->worldTransform(); + } +} + +void ShaderEffect::draw (QPainter *painter) +{ + const QGLContext *context = QGLContext::currentContext(); + + prepareBufferedDraw(painter); + + if (context) { + updateRenderTargets(); + } + + if (!context || m_renderTargets.count() == 0 || !hideOriginal()) + drawSource(painter); +} + +void ShaderEffect::updateRenderTargets() +{ + if (!m_changed) + return; + + m_changed = false; + + int count = m_renderTargets.count(); + for (int i = 0; i < count; i++) { + if (m_renderTargets[i]->isLive() || m_renderTargets[i]->isDirtyTexture()) { + m_renderTargets[i]->updateBackbuffer(); + ShaderEffectBuffer* target = m_renderTargets[i]->fbo(); + if (target && target->isValid() && target->width() > 0 && target->height() > 0) { + QPainter p(target); + p.setCompositionMode(QPainter::CompositionMode_Clear); + p.fillRect(QRect(QPoint(0, 0), target->size()), Qt::transparent); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + + QRectF sourceRect = m_renderTargets[i]->sourceRect(); + QSize textureSize = m_renderTargets[i]->textureSize(); + + qreal yflip = m_renderTargets[i]->isMirrored() ? -1.0 : 1.0; // flip y to match scenegraph, it also flips texturecoordinates + qreal xscale = 1.0; + qreal yscale = 1.0 * yflip; + + qreal leftMargin = 0.0; + qreal rightMargin = 0.0; + qreal topMargin = 0.0; + qreal bottomMargin = 0.0; + + qreal width = m_renderTargets[i]->sourceItem()->width(); + qreal height = m_renderTargets[i]->sourceItem()->height(); + + if (!sourceRect.isEmpty()) { + leftMargin = -sourceRect.left(); + rightMargin = sourceRect.right() - width; + topMargin = -sourceRect.top(); + bottomMargin = sourceRect.bottom() - height; + } + + if ((width + leftMargin + rightMargin) > 0 && (height + topMargin + bottomMargin) > 0) { + if (!textureSize.isEmpty()) { + qreal textureWidth = textureSize.width(); + qreal textureHeight = textureSize.height(); + + xscale = width / (width + leftMargin + rightMargin); + yscale = height / (height + topMargin + bottomMargin); + + p.translate(textureWidth / 2, textureHeight / 2); + p.scale(xscale, yscale * yflip); + p.translate(-textureWidth / 2, -textureHeight / 2); + p.scale(textureWidth / width, textureHeight / height); + } else { + xscale = width / (width + leftMargin + rightMargin); + yscale = height / (height + topMargin + bottomMargin); + + p.translate(width / 2, height / 2); + p.scale(xscale, yscale * yflip); + p.translate(-width / 2, -height / 2); + } + } + + drawSource(&p); + p.end(); + m_renderTargets[i]->markSceneGraphDirty(); + } + } + } +} + +void ShaderEffect::sourceChanged (ChangeFlags flags) +{ + Q_UNUSED(flags); + m_changed = true; +} + +void ShaderEffect::addRenderTarget(ShaderEffectSource *target) +{ + if (!m_renderTargets.contains(target)) + m_renderTargets.append(target); +} + +void ShaderEffect::removeRenderTarget(ShaderEffectSource *target) +{ + int index = m_renderTargets.indexOf(target); + if (index >= 0) + m_renderTargets.remove(index); + else + qWarning() << "ShaderEffect::removeRenderTarget - did not find target."; +} + +bool ShaderEffect::hideOriginal() const +{ + if (m_renderTargets.count() == 0) + return false; + + // Just like scenegraph version, if there is even one source that says "hide original" we hide it. + int count = m_renderTargets.count(); + for (int i = 0; i < count; i++) { + if (m_renderTargets[i]->hideSource()) + return true; + } + return false; +} diff --git a/src/imports/shaders/shadereffect.h b/src/imports/shaders/shadereffect.h new file mode 100644 index 0000000..35a697b --- /dev/null +++ b/src/imports/shaders/shadereffect.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SHADEREFFECT_H +#define SHADEREFFECT_H + +#include <QGraphicsEffect> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class ShaderEffectSource; + +class ShaderEffect : public QGraphicsEffect +{ + Q_OBJECT + +public: + ShaderEffect(QObject *parent = 0); + ~ShaderEffect(); + void addRenderTarget(ShaderEffectSource *target); + void removeRenderTarget(ShaderEffectSource *target); + +protected: + virtual void draw (QPainter *painter); + virtual void sourceChanged (ChangeFlags flags); + +private: + void prepareBufferedDraw(QPainter *painter); + void updateRenderTargets(); + bool hideOriginal() const; + +public: + QVector<ShaderEffectSource*> m_renderTargets; + bool m_changed : 1; +}; + +QT_END_HEADER + +QT_END_NAMESPACE + +#endif // SHADEREFFECT_H diff --git a/src/imports/shaders/shadereffectbuffer.cpp b/src/imports/shaders/shadereffectbuffer.cpp new file mode 100644 index 0000000..4c76ada --- /dev/null +++ b/src/imports/shaders/shadereffectbuffer.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "shadereffectbuffer.h" + +ShaderEffectBuffer::ShaderEffectBuffer(const QSize & size, const QGLFramebufferObjectFormat & format) + : QGLFramebufferObject(size, format) +{ +} + +ShaderEffectBuffer::~ShaderEffectBuffer() +{ +} + diff --git a/src/imports/shaders/shadereffectbuffer.h b/src/imports/shaders/shadereffectbuffer.h new file mode 100644 index 0000000..dcab6ec --- /dev/null +++ b/src/imports/shaders/shadereffectbuffer.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SHADEREFFECTBUFFER_H +#define SHADEREFFECTBUFFER_H + +#include <QtOpenGL> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class ShaderEffectBuffer : public QGLFramebufferObject +{ +public: + ShaderEffectBuffer(const QSize &size, const QGLFramebufferObjectFormat &format); + ~ShaderEffectBuffer(); +}; + +QT_END_HEADER + +QT_END_NAMESPACE + +#endif // SHADEREFFECTBUFFER_H diff --git a/src/imports/shaders/shadereffectitem.cpp b/src/imports/shaders/shadereffectitem.cpp new file mode 100644 index 0000000..5bb906c --- /dev/null +++ b/src/imports/shaders/shadereffectitem.cpp @@ -0,0 +1,915 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "shadereffectitem.h" +#include "shadereffect.h" +#include "glfunctions.h" + +#include <QPainter> +#include <QtOpenGL> + +static const char qt_default_vertex_code[] = + "uniform highp mat4 qt_ModelViewProjectionMatrix;\n" + "attribute highp vec4 qt_Vertex;\n" + "attribute highp vec2 qt_MultiTexCoord0;\n" + "varying highp vec2 qt_TexCoord0;\n" + "void main(void)\n" + "{\n" + "qt_TexCoord0 = qt_MultiTexCoord0;\n" + "gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex;\n" + "}\n"; + +static const char qt_default_fragment_code[] = + "varying highp vec2 qt_TexCoord0;\n" + "uniform lowp sampler2D source;\n" + "void main(void)\n" + "{\n" + "gl_FragColor = texture2D(source, qt_TexCoord0.st);\n" + "}\n"; + +static const char qt_postion_attribute_name[] = "qt_Vertex"; +static const char qt_texcoord_attribute_name[] = "qt_MultiTexCoord0"; +static const char qt_emptyAttributeName[] = ""; + + +/*! + \qmlclass ShaderEffectItem ShaderEffectItem + \ingroup qmlshadersplugin + \brief The ShaderEffectItem object alters the output of given item with OpenGL shaders. + \inherits Item + + ShaderEffectItem is available in the \bold{Qt.labs.shaders 1.0} module. + \e {Elements in the Qt.labs module are not guaranteed to remain compatible + in future versions.} + + This element provides preliminary support for embedding OpenGL shader code into QML, + and may be heavily changed or removed in later versions. + + Requirement for the use of shaders is that the application is either using + Qt OpenGL graphicssystem or is forced to use OpenGL by setting QGLWidget as the viewport to QDeclarativeView (recommened way). + + ShaderEffectItem internal behaviour is such that during the paint event it first renders its + ShaderEffectSource items into a OpenGL framebuffer object which can be used as a texture. If the ShaderEffectSource is defined to be an image, + it is directly uploaded as a texture. The texture(s) containing the source pixelcontent are then bound to graphics + pipeline texture units. Finally a textured mesh is passed to the vertex- and fragmentshaders which + then produce the final output for the ShaderEffectItem. It is possible to alter the mesh structure by defining + the amount vertices it contains, but currently it is not possible to import complex 3D-models to be used as the mesh. + + It is possible to define one or more ShaderEffectItems to be a ShaderEffectSource for other ShaderEffectItems, but ShaderEffectItem + should never be declared as a child element of its source item(s) because it would cause circular loop in the painting. + + A standard set of vertex attributes are provided for the shaders: + + \list + \o qt_Vertex - The primary position of the vertex. + \o qt_MultiTexCoord0 - The texture co-ordinate at each vertex for texture unit 0. + \endlist + + Additionally following uniforms are available for shaders: + + \list + \o qt_Opacity - Effective opacity of the item. + \o qt_ModelViewProjectionMatrix - current 4x4 transformation matrix of the item. + \endlist + + Furthermore, it is possible to utilize automatic QML propertybinding into vertex- and fragment shader + uniforms. Conversions are done according to the table below: + + \table + \header + \o QML property + \o GLSL uniform + \row + \o property double foo: 1.0 + \o uniform highp float foo + \row + \o property real foo: 1.0 + \o uniform highp float foo + \row + \o property bool foo: true + \o uniform bool foo + \row + \o property int foo: 1 + \o uniform int foo + \row + \o property variant foo: Qt.point(1,1) + \o uniform highp vec2 foo + \row + \o property variant foo: Qt.size(1, 1) + \o uniform highp vec2 foo + \row + \o property variant foo: Qt.rect(1, 1, 2, 2) + \o uniform highp vec4 foo + \row + \o property color foo: "#00000000" + \o uniform lowp vec4 foo + \row + \o property variant foo: Qt.vector3d(1.0, 2.0, 0.0) + \o uniform highp vec3 foo + \row + \o property variant foo: ShaderEffectSource { SourceItem: bar } + \o uniform lowp sampler2D foo + \endtable + \note + The uniform precision definitions in the above table are not strict, it is possible to choose the uniform + precision based on what is the most suitable for the shader code for that particular uniform. + + + The below example uses fragment shader to create simple wiggly effect to a text label. + Automatic property binding takes care of binding the properties to the uniforms if their + names are identical. ShaderEffectSource referring to textLabel is bound to sampler2D uniform inside the fragment + shader code. + + \qml +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + width: 300 + height: 300 + color: "black" + + Text { + id: textLabel + text: "Hello World" + anchors.centerIn: parent + font.pixelSize: 32 + color: "white" + + } + + ShaderEffectItem { + property variant source: ShaderEffectSource { sourceItem: textLabel; hideSource: true } + property real wiggleAmount: 0.005 + anchors.fill: textLabel + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + uniform highp float wiggleAmount; + void main(void) + { + highp vec2 wiggledTexCoord = qt_TexCoord0; + wiggledTexCoord.s += sin(4.0 * 3.141592653589 * wiggledTexCoord.t) * wiggleAmount; + gl_FragColor = texture2D(source, wiggledTexCoord.st); + } + " + } +} + \endqml + \image Example1.png + +*/ + +ShaderEffectItem::ShaderEffectItem(QDeclarativeItem *parent) + : QDeclarativeItem(parent) + , m_meshResolution(1, 1) + , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) + , m_blending(true) + , m_program_dirty(true) + , m_active(true) + , m_respectsMatrix(false) + , m_respectsOpacity(false) + , m_checkedViewportUpdateMode(false) + , m_checkedOpenGL(false) + , m_checkedShaderPrograms(false) + , m_hasShaderPrograms(false) + , m_mirrored(false) + , m_defaultVertexShader(true) +{ + setFlag(QGraphicsItem::ItemHasNoContents, false); + connect(this, SIGNAL(visibleChanged()), this, SLOT(handleVisibilityChange())); + m_active = isVisible(); +} + +ShaderEffectItem::~ShaderEffectItem() +{ + reset(); +} + + +/*! + \qmlproperty string ShaderEffectItem::fragmentShader + This property holds the OpenGL fragment shader code. + + The default fragment shader is following: + + \code + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + void main(void) + { + gl_FragColor = texture2D(source, qt_TexCoord0.st); + } + \endcode + +*/ + +/*! + \property ShaderEffectItem::fragmentShader + \brief the OpenGL fragment shader code. +*/ + +void ShaderEffectItem::setFragmentShader(const QString &code) +{ + if (m_fragment_code.constData() == code.constData()) + return; + + m_fragment_code = code; + if (isComponentComplete()) { + reset(); + updateProperties(); + } + emit fragmentShaderChanged(); +} + +/*! + \qmlproperty string ShaderEffectItem::vertexShader + This property holds the OpenGL vertex shader code. + + The default vertex shader is following: + + \code + uniform highp mat4 qt_ModelViewProjectionMatrix; + attribute highp vec4 qt_Vertex; + attribute highp vec2 qt_MultiTexCoord0; + varying highp vec2 qt_TexCoord0; + void main(void) + { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex; + } + \endcode + +*/ + +/*! + \property ShaderEffectItem::vertexShader + \brief the OpenGL vertex shader code. +*/ + +void ShaderEffectItem::setVertexShader(const QString &code) +{ + if (m_vertex_code.constData() == code.constData()) + return; + + m_vertex_code = code; + m_defaultVertexShader = false; + if (isComponentComplete()) { + reset(); + updateProperties(); + } + emit vertexShaderChanged(); +} + +/*! + \qmlproperty bool ShaderEffectItem::blending + This property defines whether item is drawn using blending. + + If true, the RGBA pixel output from the fragment shader is blended with + the pixel RGBA-values already in the framebuffer. + + If false, fragment shader output is written to framebuffer as such. + + Usually drawing without blending is slightly faster, thus disabling blending + might be a good choice when item is used as a background element. + + \note + By default the pixel data in textures is stored in 32-bit premultiplied alpha format. + This should be taken into account when blending or reading the pixel values + in the fragment shader code. + + The default value is true. +*/ + +/*! + \property ShaderEffectItem::blending + \brief the drawing is done using blending. +*/ + +void ShaderEffectItem::setBlending(bool enable) +{ + if (m_blending == enable) + return; + + m_blending = enable; + m_changed = true; + emit blendingChanged(); +} + + +/*! + \qmlproperty QSize ShaderEffectItem::meshResolution + This property defines to how many triangles the item is divided into before its + vertices are passed to the vertex shader. + + Triangles are defined as triangle strips and the amount of triangles can be controlled + separately for x and y-axis. + + The default value is QSize(1,1). +*/ + +/*! + \property ShaderEffectItem::meshResolution + \brief the amount of triangles in the mesh for both x and y-axis. +*/ + +void ShaderEffectItem::setMeshResolution(const QSize &size) +{ + if (size == m_meshResolution) + return; + + m_meshResolution = size; + emit meshResolutionChanged(); + updateGeometry(); +} + +void ShaderEffectItem::componentComplete() +{ + updateProperties(); + QDeclarativeItem::componentComplete(); +} + +void ShaderEffectItem::checkViewportUpdateMode() +{ + if (!m_checkedViewportUpdateMode) { + QGraphicsScene *s = scene(); + if (s){ + QList<QGraphicsView*> views = s->views(); + for (int i = 0; i < views.count(); i++) { + if (views[i]->viewportUpdateMode() != QGraphicsView::FullViewportUpdate) { + qWarning() << "ShaderEffectItem::checkViewportUpdateMode - consider setting QGraphicsView::FullViewportUpdate mode with OpenGL!"; + } + } + } + m_checkedViewportUpdateMode = true; + } +} + +void ShaderEffectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + if (!m_active) return; + + const QGLContext *context = QGLContext::currentContext(); + + if (context) { + if (!m_checkedShaderPrograms) { + m_hasShaderPrograms = QGLShaderProgram::hasOpenGLShaderPrograms(context); + m_checkedShaderPrograms = true; + + if (!m_hasShaderPrograms) + qWarning() << "ShaderEffectItem::paint - Shader programs are not supported"; + } + + if ( !m_hasShaderPrograms ) + return; + + checkViewportUpdateMode(); + painter->save(); + painter->beginNativePainting(); + QMatrix4x4 combinedMatrix = QMatrix4x4(painter->transform()); + renderEffect(painter, combinedMatrix); + painter->endNativePainting(); + painter->restore(); + } else { + if (!m_checkedOpenGL) { + qWarning() << "ShaderEffectItem::paint - OpenGL not available"; + m_checkedOpenGL = true; + } + } +} + +void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix) +{ + if (!painter || !painter->device()) + return; + + if (!m_program.isLinked() || m_program_dirty) + updateShaderProgram(); + + m_program.bind(); + + QMatrix4x4 combinedMatrix; + combinedMatrix.scale(2.0 / painter->device()->width(), -2.0 / painter->device()->height(), 1.0); + combinedMatrix.translate(-painter->device()->width() / 2.0, -painter->device()->height() / 2.0 ); + combinedMatrix *= matrix; + updateEffectState(combinedMatrix); + + for (int i = 0; i < m_attributeNames.size(); ++i) { + m_program.enableAttributeArray(m_geometry.attributes()[i].position); + } + + bindGeometry(); + + // Optimization, disable depth test when we know we don't need it. + if (m_defaultVertexShader) { + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + } else { + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_GREATER); + glDepthMask(true); +#if defined(QT_OPENGL_ES) + glClearDepthf(0); +#else + glClearDepth(0); +#endif + glClearColor(0, 0, 0, 0); + glClear(GL_DEPTH_BUFFER_BIT); + } + + if (m_blending){ + glEnable(GL_BLEND); + glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } else { + glDisable(GL_BLEND); + } + + if (m_geometry.indexCount()) + glDrawElements(m_geometry.drawingMode(), m_geometry.indexCount(), m_geometry.indexType(), m_geometry.indexData()); + else + glDrawArrays(m_geometry.drawingMode(), 0, m_geometry.vertexCount()); + + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + for (int i = 0; i < m_attributeNames.size(); ++i) + m_program.disableAttributeArray(m_geometry.attributes()[i].position); +} + +void ShaderEffectItem::updateEffectState(const QMatrix4x4 &matrix) +{ + for (int i = m_sources.size() - 1; i >= 0; --i) { + const ShaderEffectItem::SourceData &source = m_sources.at(i); + if (!source.source) + continue; + + glActiveTexture(GL_TEXTURE0 + i); + source.source->bind(); + } + + if (m_respectsOpacity) + m_program.setUniformValue("qt_Opacity", static_cast<float> (effectiveOpacity())); + + if (m_respectsMatrix){ + m_program.setUniformValue("qt_ModelViewProjectionMatrix", matrix); + } + + QSet<QByteArray>::const_iterator it; + for (it = m_uniformNames.begin(); it != m_uniformNames.end(); ++it) { + const QByteArray &name = *it; + QVariant v = property(name.constData()); + + switch (v.type()) { + case QVariant::Color: + m_program.setUniformValue(name.constData(), qvariant_cast<QColor>(v)); + break; + case QVariant::Double: + m_program.setUniformValue(name.constData(), (float) qvariant_cast<double>(v)); + break; + case QVariant::Transform: + m_program.setUniformValue(name.constData(), qvariant_cast<QTransform>(v)); + break; + case QVariant::Int: + m_program.setUniformValue(name.constData(), v.toInt()); + break; + case QVariant::Bool: + m_program.setUniformValue(name.constData(), GLint(v.toBool())); + break; + case QVariant::Size: + case QVariant::SizeF: + m_program.setUniformValue(name.constData(), v.toSizeF()); + break; + case QVariant::Point: + case QVariant::PointF: + m_program.setUniformValue(name.constData(), v.toPointF()); + break; + case QVariant::Rect: + case QVariant::RectF: + { + QRectF r = v.toRectF(); + m_program.setUniformValue(name.constData(), r.x(), r.y(), r.width(), r.height()); + } + break; + case QVariant::Vector3D: + m_program.setUniformValue(name.constData(), qvariant_cast<QVector3D>(v)); + break; + default: + break; + } + } +} + +static inline int size_of_type(GLenum type) +{ + static int sizes[] = { + sizeof(char), + sizeof(unsigned char), + sizeof(short), + sizeof(unsigned short), + sizeof(int), + sizeof(unsigned int), + sizeof(float), + 2, + 3, + 4, + sizeof(double) + }; + return sizes[type - GL_BYTE]; +} + +void ShaderEffectItem::bindGeometry() +{ + char const *const *attrNames = m_attributeNames.constData(); + int offset = 0; + for (int j = 0; j < m_attributeNames.size(); ++j) { + if (!*attrNames[j]) + continue; + Q_ASSERT_X(j < m_geometry.attributeCount(), "ShaderEffectItem::bindGeometry()", "Geometry lacks attribute required by material"); + const QSGGeometry::Attribute &a = m_geometry.attributes()[j]; + Q_ASSERT_X(j == a.position, "ShaderEffectItem::bindGeometry()", "Geometry does not have continuous attribute positions"); +#if defined(QT_OPENGL_ES_2) + GLboolean normalize = a.type != GL_FLOAT; +#else + GLboolean normalize = a.type != GL_FLOAT && a.type != GL_DOUBLE; +#endif + if (normalize) + qWarning() << "ShaderEffectItem::bindGeometry() - non supported attribute type!"; + + m_program.setAttributeArray(a.position, (GLfloat*) (((char*) m_geometry.vertexData()) + offset), a.tupleSize, m_geometry.stride()); + //glVertexAttribPointer(a.position, a.tupleSize, a.type, normalize, m_geometry.stride(), (char *) m_geometry.vertexData() + offset); + offset += a.tupleSize * size_of_type(a.type); + } +} + +void ShaderEffectItem::updateGeometry() +{ + QRectF srcRect(0, 1, 1, -1); + + if (m_mirrored) + srcRect = QRectF(0, 0, 1, 1); + + QRectF dstRect = QRectF(0,0, width(), height()); + + int vmesh = m_meshResolution.height(); + int hmesh = m_meshResolution.width(); + + QSGGeometry *g = &m_geometry; + if (vmesh == 1 && hmesh == 1) { + if (g->vertexCount() != 4) + g->allocate(4); + QSGGeometry::updateTexturedRectGeometry(g, dstRect, srcRect); + return; + } + + g->allocate((vmesh + 1) * (hmesh + 1), vmesh * 2 * (hmesh + 2)); + + QSGGeometry::TexturedPoint2D *vdata = g->vertexDataAsTexturedPoint2D(); + + for (int iy = 0; iy <= vmesh; ++iy) { + float fy = iy / float(vmesh); + float y = float(dstRect.top()) + fy * float(dstRect.height()); + float ty = float(srcRect.top()) + fy * float(srcRect.height()); + for (int ix = 0; ix <= hmesh; ++ix) { + float fx = ix / float(hmesh); + vdata->x = float(dstRect.left()) + fx * float(dstRect.width()); + vdata->y = y; + vdata->tx = float(srcRect.left()) + fx * float(srcRect.width()); + vdata->ty = ty; + ++vdata; + } + } + + quint16 *indices = (quint16 *)g->indexDataAsUShort(); + int i = 0; + for (int iy = 0; iy < vmesh; ++iy) { + *(indices++) = i + hmesh + 1; + for (int ix = 0; ix <= hmesh; ++ix, ++i) { + *(indices++) = i + hmesh + 1; + *(indices++) = i; + } + *(indices++) = i - 1; + } +} + +void ShaderEffectItem::setActive(bool enable) +{ + if (m_active == enable) + return; + + if (m_active) { + for (int i = 0; i < m_sources.size(); ++i) { + ShaderEffectSource *source = m_sources.at(i).source; + if (!source) + continue; + disconnect(source, SIGNAL(repaintRequired()), this, SLOT(markDirty())); + source->derefFromEffectItem(); + } + } + + m_active = enable; + + if (m_active) { + for (int i = 0; i < m_sources.size(); ++i) { + ShaderEffectSource *source = m_sources.at(i).source; + if (!source) + continue; + source->refFromEffectItem(); + connect(source, SIGNAL(repaintRequired()), this, SLOT(markDirty())); + } + } + + emit activeChanged(); + markDirty(); +} + +void ShaderEffectItem::preprocess() +{ + for (int i = 0; i < m_sources.size(); ++i) { + ShaderEffectSource *source = m_sources.at(i).source; + if (source) + source->updateBackbuffer(); + } +} + +void ShaderEffectItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + if (newGeometry.size() != oldGeometry.size()) + updateGeometry(); + QDeclarativeItem::geometryChanged(newGeometry, oldGeometry); +} + +void ShaderEffectItem::changeSource(int index) +{ + Q_ASSERT(index >= 0 && index < m_sources.size()); + QVariant v = property(m_sources.at(index).name.constData()); + setSource(v, index); +} + +void ShaderEffectItem::markDirty() { + update(); +} + +void ShaderEffectItem::setSource(const QVariant &var, int index) +{ + Q_ASSERT(index >= 0 && index < m_sources.size()); + + SourceData &source = m_sources[index]; + + source.source = 0; + source.item = 0; + if (var.isNull()) { + return; + } else if (!qVariantCanConvert<QObject *>(var)) { + qWarning("Could not assign source of type '%s' to property '%s'.", var.typeName(), source.name.constData()); + return; + } + + QObject *obj = qVariantValue<QObject *>(var); + + source.source = qobject_cast<ShaderEffectSource *>(obj); + source.item = qobject_cast<QDeclarativeItem *>(obj); + + if (!source.item) + qWarning("Could not assign property '%s', did not implement QDeclarativeItem.", source.name.constData()); + + if (!source.source) + qWarning("Could not assign property '%s', did not implement ShaderEffectSource.", source.name.constData()); + + // TODO: Find better solution. + // 'source.item' needs a canvas to get a scenegraph node. + // The easiest way to make sure it gets a canvas is to + // make it a part of the same item tree as 'this'. + if (source.item && source.item->parentItem() == 0) { + source.item->setParentItem(this); + // Unlike in scenegraph, we cannot set item invisible here because qgraphicsview would optimize it away. + } + + // Unlike in scenegraph, ref counting is used to optimize memory consumption. Sources themself may free fbos when not referenced. + if (m_active && source.source) { + source.source->refFromEffectItem(); + connect(source.source, SIGNAL(repaintRequired()), this, SLOT(markDirty())); + } +} + +void ShaderEffectItem::disconnectPropertySignals() +{ + disconnect(this, 0, this, SLOT(markDirty())); + for (int i = 0; i < m_sources.size(); ++i) { + SourceData &source = m_sources[i]; + disconnect(this, 0, source.mapper, 0); + disconnect(source.mapper, 0, this, 0); + } +} + +void ShaderEffectItem::connectPropertySignals() +{ + QSet<QByteArray>::const_iterator it; + for (it = m_uniformNames.begin(); it != m_uniformNames.end(); ++it) { + int pi = metaObject()->indexOfProperty(it->constData()); + if (pi >= 0) { + QMetaProperty mp = metaObject()->property(pi); + if (!mp.hasNotifySignal()) + qWarning("ShaderEffectItem: property '%s' does not have notification method!", it->constData()); + QByteArray signalName("2"); + signalName.append(mp.notifySignal().signature()); + connect(this, signalName, this, SLOT(markDirty())); + } else { + qWarning("ShaderEffectItem: '%s' does not have a matching property!", it->constData()); + } + } + for (int i = 0; i < m_sources.size(); ++i) { + SourceData &source = m_sources[i]; + int pi = metaObject()->indexOfProperty(source.name.constData()); + if (pi >= 0) { + QMetaProperty mp = metaObject()->property(pi); + QByteArray signalName("2"); + signalName.append(mp.notifySignal().signature()); + connect(this, signalName, source.mapper, SLOT(map())); + source.mapper->setMapping(this, i); + connect(source.mapper, SIGNAL(mapped(int)), this, SLOT(changeSource(int))); + } else { + qWarning("ShaderEffectItem: '%s' does not have a matching source!", source.name.constData()); + } + } +} + +void ShaderEffectItem::reset() +{ + disconnectPropertySignals(); + + m_program.removeAllShaders(); + m_attributeNames.clear(); + m_uniformNames.clear(); + for (int i = 0; i < m_sources.size(); ++i) { + const SourceData &source = m_sources.at(i); + if (m_active && source.source) + source.source->derefFromEffectItem(); + delete source.mapper; + } + + m_sources.clear(); + m_program_dirty = true; +} + +void ShaderEffectItem::updateProperties() +{ + QString vertexCode = m_vertex_code; + QString fragmentCode = m_fragment_code; + + if (vertexCode.isEmpty()) + vertexCode = qt_default_vertex_code; + + if (fragmentCode.isEmpty()) + fragmentCode = qt_default_fragment_code; + + lookThroughShaderCode(vertexCode); + lookThroughShaderCode(fragmentCode); + + if (!m_attributeNames.contains(qt_postion_attribute_name)) + qWarning("ShaderEffectItem: Missing reference to \'%s\'.", qt_postion_attribute_name); + if (!m_attributeNames.contains(qt_texcoord_attribute_name)) + qWarning("ShaderEffectItem: Missing reference to \'%s\'.", qt_texcoord_attribute_name); + if (!m_respectsMatrix) + qWarning("ShaderEffectItem: Missing reference to \'qt_ModelViewProjectionMatrix\'."); + + for (int i = 0; i < m_sources.size(); ++i) { + QVariant v = property(m_sources.at(i).name); + setSource(v, i); // Property exists. + } + + connectPropertySignals(); +} + +void ShaderEffectItem::updateShaderProgram() +{ + QString vertexCode = m_vertex_code; + QString fragmentCode = m_fragment_code; + + if (vertexCode.isEmpty()) + vertexCode = QString::fromLatin1(qt_default_vertex_code); + + if (fragmentCode.isEmpty()) + fragmentCode = QString::fromLatin1(qt_default_fragment_code); + + m_program.addShaderFromSourceCode(QGLShader::Vertex, vertexCode); + m_program.addShaderFromSourceCode(QGLShader::Fragment, fragmentCode); + + for (int i = 0; i < m_attributeNames.size(); ++i) { + m_program.bindAttributeLocation(m_attributeNames.at(i), m_geometry.attributes()[i].position); + } + + if (!m_program.link()) { + qWarning("ShaderEffectItem: Shader compilation failed:"); + qWarning() << m_program.log(); + } + + if (!m_attributeNames.contains(qt_postion_attribute_name)) + qWarning("ShaderEffectItem: Missing reference to \'qt_Vertex\'."); + if (!m_attributeNames.contains(qt_texcoord_attribute_name)) + qWarning("ShaderEffectItem: Missing reference to \'qt_MultiTexCoord0\'."); + if (!m_respectsMatrix) + qWarning("ShaderEffectItem: Missing reference to \'qt_ModelViewProjectionMatrix\'."); + + if (m_program.isLinked()) { + m_program.bind(); + for (int i = 0; i < m_sources.size(); ++i) + m_program.setUniformValue(m_sources.at(i).name.constData(), i); + } + + m_program_dirty = false; +} + +void ShaderEffectItem::lookThroughShaderCode(const QString &code) +{ + // Regexp for matching attributes and uniforms. + // In human readable form: attribute|uniform [lowp|mediump|highp] <type> <name> + static QRegExp re(QLatin1String("\\b(attribute|uniform)\\b\\s*\\b(?:lowp|mediump|highp)?\\b\\s*\\b(\\w+)\\b\\s*\\b(\\w+)")); + Q_ASSERT(re.isValid()); + + int pos = -1; + + //QString wideCode = QString::fromLatin1(code.constData(), code.size()); + QString wideCode = code; + + while ((pos = re.indexIn(wideCode, pos + 1)) != -1) { + QByteArray decl = re.cap(1).toLatin1(); // uniform or attribute + QByteArray type = re.cap(2).toLatin1(); // type + QByteArray name = re.cap(3).toLatin1(); // variable name + + if (decl == "attribute") { + if (name == qt_postion_attribute_name) { + m_attributeNames.insert(0, qt_postion_attribute_name); + } else if (name == "qt_MultiTexCoord0") { + if (m_attributeNames.at(0) == 0) { + m_attributeNames.insert(0, qt_emptyAttributeName); + } + m_attributeNames.insert(1, qt_texcoord_attribute_name); + } else { + // TODO: Support user defined attributes. + qWarning("ShaderEffectItem: Attribute \'%s\' not recognized.", name.constData()); + } + } else { + Q_ASSERT(decl == "uniform"); + + if (name == "qt_ModelViewProjectionMatrix") { + m_respectsMatrix = true; + } else if (name == "qt_Opacity") { + m_respectsOpacity = true; + } else { + m_uniformNames.insert(name); + if (type == "sampler2D") { + SourceData d; + d.mapper = new QSignalMapper; + d.source = 0; + d.name = name; + d.item = 0; + m_sources.append(d); + } + } + } + } +} + +void ShaderEffectItem::handleVisibilityChange() +{ + setActive(isVisible()); +} diff --git a/src/imports/shaders/shadereffectitem.h b/src/imports/shaders/shadereffectitem.h new file mode 100644 index 0000000..1d27543 --- /dev/null +++ b/src/imports/shaders/shadereffectitem.h @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SHADEREFFECTITEM_H +#define SHADEREFFECTITEM_H + +#include <QDeclarativeItem> +#include <QtOpenGL> +#include "shadereffectsource.h" +#include "scenegraph/qsggeometry.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class ShaderEffectItem : public QDeclarativeItem +{ + Q_OBJECT + Q_INTERFACES(QDeclarativeParserStatus) + Q_PROPERTY(QString fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged) + Q_PROPERTY(QString vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged) + Q_PROPERTY(bool blending READ blending WRITE setBlending NOTIFY blendingChanged) + Q_PROPERTY(QSize meshResolution READ meshResolution WRITE setMeshResolution NOTIFY meshResolutionChanged) + +public: + ShaderEffectItem(QDeclarativeItem* parent = 0); + ~ShaderEffectItem(); + + virtual void componentComplete(); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); + + QString fragmentShader() const { return m_fragment_code; } + void setFragmentShader(const QString &code); + + QString vertexShader() const { return m_vertex_code; } + void setVertexShader(const QString &code); + + bool blending() const { return m_blending; } + void setBlending(bool enable); + + QSize meshResolution() const { return m_meshResolution; } + void setMeshResolution(const QSize &size); + + void preprocess(); + +Q_SIGNALS: + void fragmentShaderChanged(); + void vertexShaderChanged(); + void blendingChanged(); + void activeChanged(); + void meshResolutionChanged(); + +protected: + virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); + +private Q_SLOTS: + void changeSource(int index); + void handleVisibilityChange(); + void markDirty(); + +private: + void checkViewportUpdateMode(); + void renderEffect(QPainter *painter, const QMatrix4x4 &matrix); + void updateEffectState(const QMatrix4x4 &matrix); + void updateGeometry(); + void bindGeometry(); + void setSource(const QVariant &var, int index); + void disconnectPropertySignals(); + void connectPropertySignals(); + void reset(); + void updateProperties(); + void updateShaderProgram(); + void lookThroughShaderCode(const QString &code); + bool active() const { return m_active; } + void setActive(bool enable); + +private: + QString m_fragment_code; + QString m_vertex_code; + QGLShaderProgram m_program; + QVector<const char *> m_attributeNames; + QSet<QByteArray> m_uniformNames; + QSize m_meshResolution; + QSGGeometry m_geometry; + + struct SourceData + { + QSignalMapper *mapper; + QPointer<ShaderEffectSource> source; + QPointer<QDeclarativeItem> item; + QByteArray name; + }; + + QVector<SourceData> m_sources; + + bool m_changed : 1; + bool m_blending : 1; + bool m_program_dirty : 1; + bool m_active : 1; + bool m_respectsMatrix : 1; + bool m_respectsOpacity : 1; + bool m_checkedViewportUpdateMode : 1; + bool m_checkedOpenGL : 1; + bool m_checkedShaderPrograms : 1; + bool m_hasShaderPrograms : 1; + bool m_mirrored : 1; + bool m_defaultVertexShader : 1; +}; + +QT_END_HEADER + +QT_END_NAMESPACE + +#endif // SHADEREFFECTITEM_H diff --git a/src/imports/shaders/shadereffectsource.cpp b/src/imports/shaders/shadereffectsource.cpp new file mode 100644 index 0000000..dec3bb0 --- /dev/null +++ b/src/imports/shaders/shadereffectsource.cpp @@ -0,0 +1,472 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "shadereffectsource.h" +#include "shadereffectbuffer.h" +#include "shadereffect.h" +#include "glfunctions.h" + +#include <QtOpenGL> + +/*! + \qmlclass ShaderEffectSource ShaderEffectSource + \ingroup qmlshadersplugin + \brief The ShaderEffectSource object encapsulates the source content for the ShaderEffectItem. + + ShaderEffectSource is available in the \bold{Qt.labs.shaders 1.0} module. + \e {Elements in the Qt.labs module are not guaranteed to remain compatible + in future versions.} + + This element provides preliminary support for OpenGL shaders in QML, + and may be heavily changed or removed in later versions. + + Requirement for the ability to use of shaders is that the application is either using + opengl graphicssystem or has set QGLWidget as the viewport to QDeclarativeView (recommended way). + + ShaderEffectSource object encapsulates the source content so that it can be utilized in ShaderEffectItem. + Source content can be a live QML object tree, or a snapshot of QML object tree. + +*/ + +ShaderEffectSource::ShaderEffectSource(QDeclarativeItem *parent) + : QDeclarativeItem(parent) + , m_sourceItem(0) + , m_wrapMode(ClampToEdge) + , m_sourceRect(0, 0, 0, 0) + , m_textureSize(0, 0) + , m_format(RGBA) + , m_size(0, 0) + , m_fbo(0) + , m_multisampledFbo(0) + , m_refs(0) + , m_dirtyTexture(true) + , m_dirtySceneGraph(true) + , m_multisamplingSupported(false) + , m_checkedForMultisamplingSupport(false) + , m_live(true) + , m_hideSource(false) + , m_mirrored(false) +{ +} + +ShaderEffectSource::~ShaderEffectSource() +{ + if (m_refs && m_sourceItem) + detachSourceItem(); + + delete m_fbo; + delete m_multisampledFbo; +} + +/*! + \qmlproperty Item ShaderEffectSource::sourceItem + This property holds the Item which is used as the source for the shader effect. + If the item has children, those are included as well. + + \note When source item content is passed to the ShaderEffectItem(s), it is always clipped to the boundingrect of the + sourceItem regardless of its clipping property. +*/ + +/*! + \property ShaderEffectSource::sourceItem + \brief the Item which is the source for the effect. +*/ + +void ShaderEffectSource::setSourceItem(QDeclarativeItem *item) +{ + if (item == m_sourceItem) + return; + + if (m_sourceItem) { + disconnect(m_sourceItem, SIGNAL(widthChanged()), this, SLOT(markSourceSizeDirty())); + disconnect(m_sourceItem, SIGNAL(heightChanged()), this, SLOT(markSourceSizeDirty())); + + if (m_refs) + detachSourceItem(); + } + + m_sourceItem = item; + + if (m_sourceItem) { + + // Must have some item as parent + if (m_sourceItem->parentItem() == 0) + m_sourceItem->setParentItem(this); + + if (m_refs) + attachSourceItem(); + + connect(m_sourceItem, SIGNAL(widthChanged()), this, SLOT(markSourceSizeDirty())); + connect(m_sourceItem, SIGNAL(heightChanged()), this, SLOT(markSourceSizeDirty())); + } + + updateSizeAndTexture(); + emit sourceItemChanged(); + emit repaintRequired(); +} + +/*! + \qmlproperty QRectF ShaderEffectSource::sourceRect + This property can be used to specify margins for the source content. + + If other value than Qt.rect(0,0,0,0) is assigned to this property, it is interpreted as + specifying a relative source rectangle for the source content. + + For example, setting Qt.rect(-10.0, -10.0, 120.0, 120.0) for a source that has width and height + of 100 pixels would produce 10 pixels margins to each side of the source. + + Margins are useful when the original content is wanted to be spread outside the original source area, + like when creating a dropshadow with the shader or in other similar effects. + + The default value is Qt.rect(0,0,0,0). +*/ + +/*! + \property ShaderEffectSource::sourceRect + \brief the relative sourceRect for the source. +*/ + +void ShaderEffectSource::setSourceRect(const QRectF &rect) +{ + if (rect == m_sourceRect) + return; + m_sourceRect = rect; + updateSizeAndTexture(); + updateBackbuffer(); + emit sourceRectChanged(); + emit repaintRequired(); + + if (m_sourceItem) { + ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); + if (effect) + effect->m_changed = true; + } +} + +/*! + \qmlproperty QSize ShaderEffectSource::textureSize + This property holds the size for the texture containing the source content. + + If value QSize(0,0) is assigned to this property, texture is resized + according to the source size. Otherwise source content is scaled to + the given size. + + The default value is QSize(0,0). +*/ + +/*! + \property ShaderEffectSource::textureSize + \brief the texture size for the source. +*/ + +void ShaderEffectSource::setTextureSize(const QSize &size) +{ + if (size == m_textureSize) + return; + + m_textureSize = size; + updateSizeAndTexture(); + emit textureSizeChanged(); + emit repaintRequired(); + + if (m_sourceItem) { + ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); + if (effect) + effect->m_changed = true; + } +} + +/*! + \qmlproperty bool ShaderEffectSource::live + This property holds the optimization flag to define whether the source item content is changing or + static. + + If value true is assigned to this property, source item content is re-rendered into a + texture for every frame. Setting the value to false improves the performance as it skips + rendering the source item (and its chidleren) and instead immediately passes the previously + rendered and cached texture to the shaders. + + The default value is true. +*/ + +/*! + \property ShaderEffectSource::live + \brief the flag tells whether source item content is changing between frames. +*/ + +void ShaderEffectSource::setLive(bool s) +{ + if (s == m_live) + return; + + m_live = s; + + emit liveChanged(); + emit repaintRequired(); +} + +/*! + \qmlproperty bool ShaderEffectSource::hideSource + This property holds the flag to define whether the original source item is + hidden when the effect item is drawn. + + The default value is false. +*/ + +/*! + \property ShaderEffectSource::hideSource + \brief the flag tells whether original source item content should be hidden. +*/ + +void ShaderEffectSource::setHideSource(bool hide) +{ + if (hide == m_hideSource) + return; + + m_hideSource = hide; + + emit hideSourceChanged(); + emit repaintRequired(); +} + +/*! + \qmlproperty enumeration ShaderEffectSource::wrapMode + + This property defines the wrap parameter for the source after it has been mapped as a texture. + + \list + \o WrapMode.ClampToEdge - Causes texturecoordinates to be clamped to the range [ 1/2*N , 1 - 1/2*N ], where N is the texture width. + \o WrapMode.RepeatHorizontally - Causes the integer part of the horizontal texturecoordinate to be ignored; the GL uses only the fractional part, thereby creating a horizontal repeating pattern. + \o WrapMode.RepeatVertically - Causes the integer part of the vertical texturecoordinate to be ignored; the GL uses only the fractional part, thereby creating a vertical repeating pattern. + \o WrapMode.Repeat - Causes the integer part of both the horizontal and vertical texturecoordinates to be ignored; the GL uses only the fractional part, thereby creating a repeating pattern. + \endlist + + The default value is ClampToEdge. + +*/ + +/*! + \property ShaderEffectSource::wrapMode + \brief the wrap parameter for the source after it has been mapped as a texture. +*/ + +void ShaderEffectSource::setWrapMode(WrapMode mode) +{ + if (mode == m_wrapMode) + return; + + m_wrapMode = mode; + updateBackbuffer(); + emit wrapModeChanged(); +} + +/*! + \qmlmethod ShaderEffectSource::grab() + + Repaints the source item content into the texture. + + This method is useful when ShaderEffectSource::live has been set to false and + the changes in the source item content is desired to be made visible for the shaders. + +*/ + +void ShaderEffectSource::grab() +{ + m_dirtyTexture = true; + emit repaintRequired(); +} + +void ShaderEffectSource::bind() const +{ + GLint filtering = smooth() ? GL_LINEAR : GL_NEAREST; + GLuint hwrap = (m_wrapMode == Repeat || m_wrapMode == RepeatHorizontally) ? GL_REPEAT : GL_CLAMP_TO_EDGE; + GLuint vwrap = (m_wrapMode == Repeat || m_wrapMode == RepeatVertically) ? GL_REPEAT : GL_CLAMP_TO_EDGE; + +#if !defined(QT_OPENGL_ES_2) + glEnable(GL_TEXTURE_2D); +#endif + if (m_fbo) { + glBindTexture(GL_TEXTURE_2D, m_fbo->texture()); + } else { + glBindTexture(GL_TEXTURE_2D, 0); + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, smooth() ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, hwrap); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, vwrap); +} + +void ShaderEffectSource::refFromEffectItem() +{ + if (m_refs++ == 0) { + attachSourceItem(); + emit activeChanged(); + } +} + +void ShaderEffectSource::derefFromEffectItem() +{ + if (--m_refs == 0) { + detachSourceItem(); + emit activeChanged(); + } + Q_ASSERT(m_refs >= 0); +} + +void ShaderEffectSource::updateBackbuffer() +{ + if (!m_sourceItem) + return; + + // Multisampling is not (for now) supported. + QSize size = QSize(m_sourceItem->width(), m_sourceItem->height()); + if (!m_textureSize.isEmpty()) + size = m_textureSize; + + if (size.height() > 0 && size.width() > 0) { + QGLFramebufferObjectFormat format; + format.setAttachment(QGLFramebufferObject::CombinedDepthStencil); + format.setInternalTextureFormat(m_format); + + if (!m_fbo) { + m_fbo = new ShaderEffectBuffer(size, format); + } else { + if (m_fbo->size() != size || m_fbo->format().internalTextureFormat() != GLenum(m_format)) { + delete m_fbo; + m_fbo = 0; + m_fbo = new ShaderEffectBuffer(size, format); + } + } + } + + // Note that real update for the source content happens in shadereffect.cpp + m_dirtyTexture = false; +} + +void ShaderEffectSource::markSceneGraphDirty() +{ + m_dirtySceneGraph = true; + emit repaintRequired(); +} + +void ShaderEffectSource::markSourceSizeDirty() +{ + Q_ASSERT(m_sourceItem); + if (m_textureSize.isEmpty()) + updateSizeAndTexture(); + if (m_refs) + emit repaintRequired(); +} + +void ShaderEffectSource::updateSizeAndTexture() +{ + if (m_sourceItem) { + QSize size = m_textureSize; + if (size.isEmpty()) + size = QSize(m_sourceItem->width(), m_sourceItem->height()); + if (size.width() < 1) + size.setWidth(1); + if (size.height() < 1) + size.setHeight(1); + if (m_fbo && m_fbo->size() != size) { + delete m_fbo; + m_fbo = 0; + delete m_multisampledFbo; + m_fbo = m_multisampledFbo = 0; + } + if (m_size.width() != size.width()) { + m_size.setWidth(size.width()); + emit widthChanged(); + } + if (m_size.height() != size.height()) { + m_size.setHeight(size.height()); + emit heightChanged(); + } + m_dirtyTexture = true; + } else { + if (m_size.width() != 0) { + m_size.setWidth(0); + emit widthChanged(); + } + if (m_size.height() != 0) { + m_size.setHeight(0); + emit heightChanged(); + } + } +} + +void ShaderEffectSource::attachSourceItem() +{ + if (!m_sourceItem) + return; + + ShaderEffect *effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); + + if (!effect) { + effect = new ShaderEffect(); + m_sourceItem->setGraphicsEffect(effect); + } + + if (effect) + effect->addRenderTarget(this); + + m_sourceItem->update(); +} + +void ShaderEffectSource::detachSourceItem() +{ + if (!m_sourceItem) + return; + + ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); + + if (effect) + effect->removeRenderTarget(this); + + delete m_fbo; + m_fbo = 0; + + delete m_multisampledFbo; + m_multisampledFbo = 0; + + m_dirtyTexture = true; +} diff --git a/src/imports/shaders/shadereffectsource.h b/src/imports/shaders/shadereffectsource.h new file mode 100644 index 0000000..275e5b2 --- /dev/null +++ b/src/imports/shaders/shadereffectsource.h @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SHADEREFFECTSOURCE_H +#define SHADEREFFECTSOURCE_H + +#include <QDeclarativeItem> +#include <QtOpenGL> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class ShaderEffectBuffer; + +class ShaderEffectSource : public QDeclarativeItem +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged) + Q_PROPERTY(QRectF sourceRect READ sourceRect WRITE setSourceRect NOTIFY sourceRectChanged) + Q_PROPERTY(QSize textureSize READ textureSize WRITE setTextureSize NOTIFY textureSizeChanged) + Q_PROPERTY(bool live READ isLive WRITE setLive NOTIFY liveChanged) + Q_PROPERTY(bool hideSource READ hideSource WRITE setHideSource NOTIFY hideSourceChanged) + Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged) + Q_ENUMS(WrapMode) + Q_ENUMS(Format) + +public: + enum WrapMode { + ClampToEdge, + RepeatHorizontally, + RepeatVertically, + Repeat + }; + + enum Format { + Alpha = GL_ALPHA, + RGB = GL_RGB, + RGBA = GL_RGBA + }; + + ShaderEffectSource(QDeclarativeItem *parent = 0); + virtual ~ShaderEffectSource(); + + QDeclarativeItem *sourceItem() const { return m_sourceItem.data(); } + void setSourceItem(QDeclarativeItem *item); + + QRectF sourceRect() const { return m_sourceRect; }; + void setSourceRect(const QRectF &rect); + + QSize textureSize() const { return m_textureSize; } + void setTextureSize(const QSize &size); + + bool isLive() const { return m_live; } + void setLive(bool s); + + bool hideSource() const { return m_hideSource; } + void setHideSource(bool hide); + + WrapMode wrapMode() const { return m_wrapMode; }; + void setWrapMode(WrapMode mode); + + bool isActive() const { return m_refs; } + void bind() const; + void refFromEffectItem(); + void derefFromEffectItem(); + void updateBackbuffer(); + + ShaderEffectBuffer* fbo() { return m_fbo; } + bool isDirtyTexture() { return m_dirtyTexture; } + bool isMirrored() { return m_mirrored; } + + Q_INVOKABLE void grab(); + +Q_SIGNALS: + void sourceItemChanged(); + void sourceRectChanged(); + void textureSizeChanged(); + void formatChanged(); + void liveChanged(); + void hideSourceChanged(); + void activeChanged(); + void repaintRequired(); + void wrapModeChanged(); + +public Q_SLOTS: + void markSceneGraphDirty(); + void markSourceSizeDirty(); + +private: + void updateSizeAndTexture(); + void attachSourceItem(); + void detachSourceItem(); + +private: + QPointer<QDeclarativeItem> m_sourceItem; + WrapMode m_wrapMode; + QRectF m_sourceRect; + QSize m_textureSize; + Format m_format; + QSize m_size; + + ShaderEffectBuffer *m_fbo; + ShaderEffectBuffer *m_multisampledFbo; + int m_refs; + bool m_dirtyTexture : 1; + bool m_dirtySceneGraph : 1; + bool m_multisamplingSupported : 1; + bool m_checkedForMultisamplingSupport : 1; + bool m_live : 1; + bool m_hideSource : 1; + bool m_mirrored : 1; +}; + +QT_END_HEADER + +QT_END_NAMESPACE + + +#endif // SHADEREFFECTSOURCE_H diff --git a/src/imports/shaders/shaders.pro b/src/imports/shaders/shaders.pro new file mode 100644 index 0000000..d7a6275 --- /dev/null +++ b/src/imports/shaders/shaders.pro @@ -0,0 +1,38 @@ +TARGET = qmlshadersplugin +TARGETPATH = Qt/labs/shaders +include(../qimportbase.pri) + +QT += declarative opengl + +SOURCES += \ + qmlshadersplugin_plugin.cpp \ + shadereffect.cpp \ + shadereffectitem.cpp \ + shadereffectsource.cpp \ + scenegraph/qsggeometry.cpp \ + shadereffectbuffer.cpp + +HEADERS += \ + qmlshadersplugin_plugin.h \ + glfunctions.h \ + shadereffect.h \ + shadereffectitem.h \ + shadereffectsource.h \ + scenegraph/qsggeometry.h \ + shadereffectbuffer.h + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/imports/$$TARGETPATH +target.path = $$[QT_INSTALL_IMPORTS]/$$TARGETPATH + +qmldir.files += $$PWD/qmldir +qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH + +symbian:{ + TARGET.UID3 = 0x20034907 + isEmpty(DESTDIR):importFiles.sources = qmlparticlesplugin$${QT_LIBINFIX}.dll qmldir + else:importFiles.sources = $$DESTDIR/qmlparticlesplugin$${QT_LIBINFIX}.dll qmldir + importFiles.path = $$QT_IMPORTS_BASE_DIR/$$TARGETPATH + DEPLOYMENT = importFiles +} + +INSTALLS += target qmldir diff --git a/src/network/access/access.pri b/src/network/access/access.pri index 5ead3ad..99e861e 100644 --- a/src/network/access/access.pri +++ b/src/network/access/access.pri @@ -22,7 +22,6 @@ HEADERS += \ access/qnetworkcookie_p.h \ access/qnetworkcookiejar.h \ access/qnetworkcookiejar_p.h \ - access/qnetworkcookiejartlds_p.h \ access/qnetworkrequest.h \ access/qnetworkrequest_p.h \ access/qnetworkreply.h \ diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 33124fd..6101eea 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -261,7 +261,17 @@ void QHttpNetworkConnectionPrivate::prepareRequest(HttpMessagePair &messagePair) // set the host value = request.headerField("host"); if (value.isEmpty()) { - QByteArray host = QUrl::toAce(hostName); + QHostAddress add; + QByteArray host; + if(add.setAddress(hostName)) { + if(add.protocol() == QAbstractSocket::IPv6Protocol) { + host = "[" + hostName.toAscii() + "]";//format the ipv6 in the standard way + } else { + host = QUrl::toAce(hostName); + } + } else { + host = QUrl::toAce(hostName); + } int port = request.url().port(); if (port != -1) { diff --git a/src/network/access/qnetworkcookiejar.cpp b/src/network/access/qnetworkcookiejar.cpp index 291bdec..a2fa689 100644 --- a/src/network/access/qnetworkcookiejar.cpp +++ b/src/network/access/qnetworkcookiejar.cpp @@ -40,12 +40,12 @@ ****************************************************************************/ #include "qnetworkcookiejar.h" -#include "qnetworkcookiejartlds_p.h" #include "qnetworkcookiejar_p.h" #include "QtNetwork/qnetworkcookie.h" #include "QtCore/qurl.h" #include "QtCore/qdatetime.h" +#include "private/qtldurl_p.h" QT_BEGIN_NAMESPACE @@ -216,7 +216,7 @@ bool QNetworkCookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieLis // the check for effective TLDs makes the "embedded dot" rule from RFC 2109 section 4.3.2 // redundant; the "leading dot" rule has been relaxed anyway, see above // we remove the leading dot for this check - if (QNetworkCookieJarPrivate::isEffectiveTLD(domain.remove(0, 1))) + if (qIsEffectiveTLD(domain.remove(0, 1))) continue; // not accepted } @@ -304,43 +304,4 @@ QList<QNetworkCookie> QNetworkCookieJar::cookiesForUrl(const QUrl &url) const return result; } -bool QNetworkCookieJarPrivate::isEffectiveTLD(const QString &domain) -{ - // for domain 'foo.bar.com': - // 1. return if TLD table contains 'foo.bar.com' - if (containsTLDEntry(domain)) - return true; - - if (domain.contains(QLatin1Char('.'))) { - int count = domain.size() - domain.indexOf(QLatin1Char('.')); - QString wildCardDomain; - wildCardDomain.reserve(count + 1); - wildCardDomain.append(QLatin1Char('*')); - wildCardDomain.append(domain.right(count)); - // 2. if table contains '*.bar.com', - // test if table contains '!foo.bar.com' - if (containsTLDEntry(wildCardDomain)) { - QString exceptionDomain; - exceptionDomain.reserve(domain.size() + 1); - exceptionDomain.append(QLatin1Char('!')); - exceptionDomain.append(domain); - return (! containsTLDEntry(exceptionDomain)); - } - } - return false; -} - -bool QNetworkCookieJarPrivate::containsTLDEntry(const QString &entry) -{ - int index = qHash(entry) % tldCount; - int currentDomainIndex = tldIndices[index]; - while (currentDomainIndex < tldIndices[index+1]) { - QString currentEntry = QString::fromUtf8(tldData + currentDomainIndex); - if (currentEntry == entry) - return true; - currentDomainIndex += qstrlen(tldData + currentDomainIndex) + 1; // +1 for the ending \0 - } - return false; -} - QT_END_NAMESPACE diff --git a/src/network/access/qnetworkcookiejar_p.h b/src/network/access/qnetworkcookiejar_p.h index 912847b..34858d9 100644 --- a/src/network/access/qnetworkcookiejar_p.h +++ b/src/network/access/qnetworkcookiejar_p.h @@ -63,9 +63,6 @@ class QNetworkCookieJarPrivate: public QObjectPrivate public: QList<QNetworkCookie> allCookies; - static bool Q_AUTOTEST_EXPORT isEffectiveTLD(const QString &domain); - static bool containsTLDEntry(const QString &entry); - Q_DECLARE_PUBLIC(QNetworkCookieJar) }; diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp index 54cd898..d468bc4 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.cpp +++ b/src/network/bearer/qnetworkconfigmanager_p.cpp @@ -385,6 +385,8 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() this, SLOT(configurationRemoved(QNetworkConfigurationPrivatePointer))); connect(engine, SIGNAL(configurationChanged(QNetworkConfigurationPrivatePointer)), this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer))); + + QMetaObject::invokeMethod(engine, "initialize"); } } @@ -408,19 +410,8 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() startPolling(); } - if (firstUpdate) { + if (firstUpdate) firstUpdate = false; - QList<QBearerEngine*> enginesToInitialize = sessionEngines; //shallow copy the list in case it is modified when we unlock mutex - Qt::ConnectionType connectionType; - if (QCoreApplicationPrivate::mainThread() == QThread::currentThread()) - connectionType = Qt::DirectConnection; - else - connectionType = Qt::BlockingQueuedConnection; - locker.unlock(); - foreach (QBearerEngine* engine, enginesToInitialize) { - QMetaObject::invokeMethod(engine, "initialize", connectionType); - } - } } void QNetworkConfigurationManagerPrivate::performAsyncConfigurationUpdate() diff --git a/src/network/kernel/qhostaddress_p.h b/src/network/kernel/qhostaddress_p.h index 255d706..0349ff3 100644 --- a/src/network/kernel/qhostaddress_p.h +++ b/src/network/kernel/qhostaddress_p.h @@ -71,6 +71,11 @@ public: void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len); }; +#ifdef Q_OS_SYMBIAN +class TInetAddr; +QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr); +#endif + QT_END_NAMESPACE #endif diff --git a/src/network/kernel/qhostinfo_symbian.cpp b/src/network/kernel/qhostinfo_symbian.cpp index 042899d..86c157c 100644 --- a/src/network/kernel/qhostinfo_symbian.cpp +++ b/src/network/kernel/qhostinfo_symbian.cpp @@ -52,6 +52,7 @@ #include <private/qcore_symbian_p.h> #include <private/qsystemerror_p.h> #include <private/qnetworksession_p.h> +#include <private/qhostaddress_p.h> // Header does not exist in the S60 5.0 SDK //#include <networking/dnd_err.h> @@ -152,23 +153,17 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName, QSharedPointer<QNetw QList<QHostAddress> hostAddresses; TInetAddr hostAdd = nameResult().iAddr; - // 39 is the maximum length of an IPv6 address. - TBuf<39> ipAddr; - // Fill ipAddr with the IP address from hostAdd - hostAdd.Output(ipAddr); - if (ipAddr.Length() > 0) - hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); + if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) + hostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); // Check if there's more than one IP address linkd to this name while (hostResolver.Next(nameResult) == KErrNone) { hostAdd = nameResult().iAddr; - hostAdd.Output(ipAddr); // Ensure that record is valid (not an alias and with length greater than 0) - if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) { - hostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); - } + if (!(nameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) + hostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); } hostResolver.Close(); @@ -414,14 +409,10 @@ void QSymbianHostResolver::processNameResult() { if (iStatus.Int() == KErrNone) { TInetAddr hostAdd = iNameResult().iAddr; - // 39 is the maximum length of an IPv6 address. - TBuf<39> ipAddr; - - hostAdd.Output(ipAddr); // Ensure that record is valid (not an alias and with length greater than 0) if (!(iNameResult().iFlags & TNameRecord::EAlias) && !(hostAdd.IsUnspecified())) { - iHostAddresses.append(QHostAddress(qt_TDesC2QString(ipAddr))); + iHostAddresses.append(qt_QHostAddressFromTInetAddr(hostAdd)); } iState = EGetByName; diff --git a/src/network/kernel/qnetworkinterface_symbian.cpp b/src/network/kernel/qnetworkinterface_symbian.cpp index e7d3ca9..dca6cf4 100644 --- a/src/network/kernel/qnetworkinterface_symbian.cpp +++ b/src/network/kernel/qnetworkinterface_symbian.cpp @@ -67,10 +67,8 @@ static QNetworkInterface::InterfaceFlags convertFlags(const TSoInetInterfaceInfo return flags; } -//TODO: share this, at least QHostInfo needs to do the same thing -static QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr) +QHostAddress qt_QHostAddressFromTInetAddr(const TInetAddr& addr) { - //TODO: do we want to call v4 mapped addresses v4 or v6 outside of this file? if (addr.IsV4Mapped() || addr.Family() == KAfInet) { //convert v4 host address return QHostAddress(addr.Address()); diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp index 5f5db17..5c672ec 100644 --- a/src/network/socket/qhttpsocketengine.cpp +++ b/src/network/socket/qhttpsocketengine.cpp @@ -149,6 +149,8 @@ bool QHttpSocketEngine::connectInternal() // Handshake isn't done. If unconnected, start connecting. if (d->state == None && d->socket->state() == QAbstractSocket::UnconnectedState) { setState(QAbstractSocket::ConnectingState); + //limit buffer in internal socket, data is buffered in the external socket under application control + d->socket->setReadBufferSize(65536); d->socket->connectToHost(d->proxy.hostName(), d->proxy.port()); } diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp index 575c0bc..ab75798 100644 --- a/src/network/socket/qsocks5socketengine.cpp +++ b/src/network/socket/qsocks5socketengine.cpp @@ -1126,6 +1126,8 @@ bool QSocks5SocketEngine::connectInternal() if (d->socks5State == QSocks5SocketEnginePrivate::Uninitialized && d->socketState != QAbstractSocket::ConnectingState) { setState(QAbstractSocket::ConnectingState); + //limit buffer in internal socket, data is buffered in the external socket under application control + d->data->controlSocket->setReadBufferSize(65536); d->data->controlSocket->connectToHost(d->proxyInfo.hostName(), d->proxyInfo.port()); return false; } diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index 328c5c2..76b7d41 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -127,7 +127,7 @@ QT_BEGIN_NAMESPACE // forward declaration -static QMap<QString, QString> _q_mapFromOnelineName(char *name); +static QMap<QString, QString> _q_mapFromX509Name(X509_NAME *name); /*! Constructs a QSslCertificate by reading \a format encoded data @@ -324,7 +324,7 @@ QString QSslCertificate::issuerInfo(SubjectInfo info) const // lazy init if (d->issuerInfo.isEmpty() && d->x509) d->issuerInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_issuer_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_issuer_name(d->x509)); return d->issuerInfo.value(_q_SubjectInfoToString(info)); } @@ -341,7 +341,7 @@ QString QSslCertificate::issuerInfo(const QByteArray &tag) const // lazy init if (d->issuerInfo.isEmpty() && d->x509) d->issuerInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_issuer_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_issuer_name(d->x509)); return d->issuerInfo.value(QString::fromLatin1(tag)); } @@ -360,7 +360,7 @@ QString QSslCertificate::subjectInfo(SubjectInfo info) const // lazy init if (d->subjectInfo.isEmpty() && d->x509) d->subjectInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_subject_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_subject_name(d->x509)); return d->subjectInfo.value(_q_SubjectInfoToString(info)); } @@ -376,7 +376,7 @@ QString QSslCertificate::subjectInfo(const QByteArray &tag) const // lazy init if (d->subjectInfo.isEmpty() && d->x509) d->subjectInfo = - _q_mapFromOnelineName(q_X509_NAME_oneline(q_X509_get_subject_name(d->x509), 0, 0)); + _q_mapFromX509Name(q_X509_get_subject_name(d->x509)); return d->subjectInfo.value(QString::fromLatin1(tag)); } @@ -666,37 +666,17 @@ QByteArray QSslCertificatePrivate::QByteArray_from_X509(X509 *x509, QSsl::Encodi return BEGINCERTSTRING "\n" + tmp + ENDCERTSTRING "\n"; } -static QMap<QString, QString> _q_mapFromOnelineName(char *name) +static QMap<QString, QString> _q_mapFromX509Name(X509_NAME *name) { QMap<QString, QString> info; - QString infoStr = QString::fromLocal8Bit(name); - q_CRYPTO_free(name); - - // ### The right-hand encoding seems to allow hex (Regulierungsbeh\xC8orde) - //entry.replace(QLatin1String("\\x"), QLatin1String("%")); - //entry = QUrl::fromPercentEncoding(entry.toLatin1()); - // ### See RFC-4630 for more details! - - QRegExp rx(QLatin1String("/([A-Za-z]+)=(.+)")); - - int pos = 0; - while ((pos = rx.indexIn(infoStr, pos)) != -1) { - const QString name = rx.cap(1); - - QString value = rx.cap(2); - const int valuePos = rx.pos(2); - - const int next = rx.indexIn(value); - if (next == -1) { - info.insert(name, value); - break; - } - - value = value.left(next); - info.insert(name, value); - pos = valuePos + value.length(); + for (int i = 0; i < q_X509_NAME_entry_count(name); ++i) { + X509_NAME_ENTRY *e = q_X509_NAME_get_entry(name, i); + const char *obj = q_OBJ_nid2sn(q_OBJ_obj2nid(q_X509_NAME_ENTRY_get_object(e))); + unsigned char *data = 0; + int size = q_ASN1_STRING_to_UTF8(&data, q_X509_NAME_ENTRY_get_data(e)); + info[QString::fromUtf8(obj)] = QString::fromUtf8((char*)data, size); + q_CRYPTO_free(data); } - return info; } diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index fb41b7c..599c3f6 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -1338,9 +1338,9 @@ bool QSslSocketBackendPrivate::startHandshake() sslErrors.clear(); } - // if we have a max read buffer size, reset the plain socket's to 1k + // if we have a max read buffer size, reset the plain socket's to 16k if (readBufferMaxSize) - plainSocket->setReadBufferSize(1024); + plainSocket->setReadBufferSize(16384); connectionEncrypted = true; emit q->encrypted(); diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index a730eb2..a4cc3c4 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -101,6 +101,7 @@ DEFINEFUNC3(void *, ASN1_dup, i2d_of_void *a, a, d2i_of_void *b, b, char *c, c, DEFINEFUNC(long, ASN1_INTEGER_get, ASN1_INTEGER *a, a, return 0, return) DEFINEFUNC(unsigned char *, ASN1_STRING_data, ASN1_STRING *a, a, return 0, return) DEFINEFUNC(int, ASN1_STRING_length, ASN1_STRING *a, a, return 0, return) +DEFINEFUNC2(int, ASN1_STRING_to_UTF8, unsigned char **a, a, ASN1_STRING *b, b, return 0, return); DEFINEFUNC4(long, BIO_ctrl, BIO *a, a, int b, b, long c, c, void *d, d, return -1, return) DEFINEFUNC(int, BIO_free, BIO *a, a, return 0, return) DEFINEFUNC(BIO *, BIO_new, BIO_METHOD *a, a, return 0, return) @@ -248,7 +249,10 @@ DEFINEFUNC4(void *, X509_get_ext_d2i, X509 *a, a, int b, b, int *c, c, int *d, d DEFINEFUNC(X509_NAME *, X509_get_issuer_name, X509 *a, a, return 0, return) DEFINEFUNC(X509_NAME *, X509_get_subject_name, X509 *a, a, return 0, return) DEFINEFUNC(int, X509_verify_cert, X509_STORE_CTX *a, a, return -1, return) -DEFINEFUNC3(char *, X509_NAME_oneline, X509_NAME *a, a, char *b, b, int c, c, return 0, return) +DEFINEFUNC(int, X509_NAME_entry_count, X509_NAME *a, a, return 0, return) +DEFINEFUNC2(X509_NAME_ENTRY *, X509_NAME_get_entry, X509_NAME *a, a, int b, b, return 0, return) +DEFINEFUNC(ASN1_STRING *, X509_NAME_ENTRY_get_data, X509_NAME_ENTRY *a, a, return 0, return) +DEFINEFUNC(ASN1_OBJECT *, X509_NAME_ENTRY_get_object, X509_NAME_ENTRY *a, a, return 0, return) DEFINEFUNC(EVP_PKEY *, X509_PUBKEY_get, X509_PUBKEY *a, a, return 0, return) DEFINEFUNC(void, X509_STORE_free, X509_STORE *a, a, return, DUMMYARG) DEFINEFUNC(X509_STORE *, X509_STORE_new, DUMMYARG, DUMMYARG, return 0, return) @@ -518,6 +522,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(ASN1_INTEGER_get, 48, libs.second ) RESOLVEFUNC(ASN1_STRING_data, 71, libs.second ) RESOLVEFUNC(ASN1_STRING_length, 76, libs.second ) + RESOLVEFUNC(ASN1_STRING_to_UTF8, 86, libs.second ) RESOLVEFUNC(BIO_ctrl, 184, libs.second ) RESOLVEFUNC(BIO_free, 209, libs.second ) RESOLVEFUNC(BIO_new, 222, libs.second ) @@ -608,7 +613,10 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(SSLv23_server_method, 191, libs.first ) RESOLVEFUNC(TLSv1_server_method, 200, libs.first ) RESOLVEFUNC(SSL_CTX_load_verify_locations, 34, libs.first ) - RESOLVEFUNC(X509_NAME_oneline, 1830, libs.second ) + RESOLVEFUNC(X509_NAME_entry_count, 1821, libs.second ) + RESOLVEFUNC(X509_NAME_get_entry, 1823, libs.second ) + RESOLVEFUNC(X509_NAME_ENTRY_get_data, 1808, libs.second ) + RESOLVEFUNC(X509_NAME_ENTRY_get_object, 1809, libs.second ) RESOLVEFUNC(X509_PUBKEY_get, 1844, libs.second ) RESOLVEFUNC(X509_STORE_free, 1939, libs.second ) RESOLVEFUNC(X509_STORE_new, 1942, libs.second ) @@ -647,6 +655,7 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(ASN1_INTEGER_get) RESOLVEFUNC(ASN1_STRING_data) RESOLVEFUNC(ASN1_STRING_length) + RESOLVEFUNC(ASN1_STRING_to_UTF8) RESOLVEFUNC(BIO_ctrl) RESOLVEFUNC(BIO_free) RESOLVEFUNC(BIO_new) @@ -736,7 +745,10 @@ bool q_resolveOpenSslSymbols() RESOLVEFUNC(SSLv3_server_method) RESOLVEFUNC(SSLv23_server_method) RESOLVEFUNC(TLSv1_server_method) - RESOLVEFUNC(X509_NAME_oneline) + RESOLVEFUNC(X509_NAME_entry_count) + RESOLVEFUNC(X509_NAME_get_entry) + RESOLVEFUNC(X509_NAME_ENTRY_get_data) + RESOLVEFUNC(X509_NAME_ENTRY_get_object) RESOLVEFUNC(X509_PUBKEY_get) RESOLVEFUNC(X509_STORE_free) RESOLVEFUNC(X509_STORE_new) diff --git a/src/network/ssl/qsslsocket_openssl_symbols_p.h b/src/network/ssl/qsslsocket_openssl_symbols_p.h index e20deb8..c0a3b4d 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols_p.h +++ b/src/network/ssl/qsslsocket_openssl_symbols_p.h @@ -204,6 +204,7 @@ bool q_resolveOpenSslSymbols(); long q_ASN1_INTEGER_get(ASN1_INTEGER *a); unsigned char * q_ASN1_STRING_data(ASN1_STRING *a); int q_ASN1_STRING_length(ASN1_STRING *a); +int q_ASN1_STRING_to_UTF8(unsigned char **a, ASN1_STRING *b); long q_BIO_ctrl(BIO *a, int b, long c, void *d); int q_BIO_free(BIO *a); BIO *q_BIO_new(BIO_METHOD *a); @@ -360,7 +361,10 @@ void *q_X509_get_ext_d2i(X509 *a, int b, int *c, int *d); X509_NAME *q_X509_get_issuer_name(X509 *a); X509_NAME *q_X509_get_subject_name(X509 *a); int q_X509_verify_cert(X509_STORE_CTX *ctx); -char *q_X509_NAME_oneline(X509_NAME *a, char *b, int c); +int q_X509_NAME_entry_count(X509_NAME *a); +X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b); +ASN1_STRING *q_X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *a); +ASN1_OBJECT *q_X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *a); EVP_PKEY *q_X509_PUBKEY_get(X509_PUBKEY *a); void q_X509_STORE_free(X509_STORE *store); X509_STORE *q_X509_STORE_new(); diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index e62af62..3ac759c 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -1436,19 +1436,30 @@ void QGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem) ensureActive(); - QFontEngineGlyphCache::Type glyphType = textItem->fontEngine()->glyphFormat >= 0 - ? QFontEngineGlyphCache::Type(textItem->fontEngine()->glyphFormat) - : d->glyphCacheType; - if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) { - if (d->device->alphaRequested() || state()->matrix.type() > QTransform::TxTranslate - || (state()->composition_mode != QPainter::CompositionMode_Source - && state()->composition_mode != QPainter::CompositionMode_SourceOver)) - { - glyphType = QFontEngineGlyphCache::Raster_A8; + QPainterState *s = state(); + float det = s->matrix.determinant(); + + // don't try to cache huge fonts or vastly transformed fonts + QFontEngine *fontEngine = textItem->fontEngine(); + const qreal pixelSize = fontEngine->fontDef.pixelSize; + if (pixelSize * pixelSize * qAbs(det) < QT_MAX_CACHED_GLYPH_SIZE * QT_MAX_CACHED_GLYPH_SIZE || + det < 0.25f || det > 4.f) { + QFontEngineGlyphCache::Type glyphType = fontEngine->glyphFormat >= 0 + ? QFontEngineGlyphCache::Type(textItem->fontEngine()->glyphFormat) + : d->glyphCacheType; + if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) { + if (d->device->alphaRequested() || s->matrix.type() > QTransform::TxTranslate + || (s->composition_mode != QPainter::CompositionMode_Source + && s->composition_mode != QPainter::CompositionMode_SourceOver)) + { + glyphType = QFontEngineGlyphCache::Raster_A8; + } } - } - d->drawCachedGlyphs(glyphType, textItem); + d->drawCachedGlyphs(glyphType, textItem); + } else { + QPaintEngineEx::drawStaticTextItem(textItem); + } } bool QGL2PaintEngineEx::drawTexture(const QRectF &dest, GLuint textureId, const QSize &size, const QRectF &src) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h index 7ba92e4..2895d5a 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h @@ -158,6 +158,7 @@ public: void setRenderTextActive(bool); bool isNativePaintingActive() const; + bool supportsTransformations(qreal, const QTransform &) const { return true; } private: Q_DISABLE_COPY(QGL2PaintEngineEx) }; diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp index e7fc560..f8f3974 100644 --- a/src/opengl/qgl_qpa.cpp +++ b/src/opengl/qgl_qpa.cpp @@ -150,6 +150,8 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) if (shareContext) { winFormat.setSharedContext(shareContext->d_func()->platformContext); } + if (widget->testAttribute(Qt::WA_TranslucentBackground)) + winFormat.setAlpha(true); winFormat.setWindowApi(QPlatformWindowFormat::OpenGL); winFormat.setWindowSurface(false); widget->setPlatformWindowFormat(winFormat); diff --git a/src/opengl/qgl_symbian.cpp b/src/opengl/qgl_symbian.cpp index 91904d0..86176c9 100644 --- a/src/opengl/qgl_symbian.cpp +++ b/src/opengl/qgl_symbian.cpp @@ -183,9 +183,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // almost same as d->ownsEglContext = true; d->eglContext->setApi(QEgl::OpenGL); - QGraphicsSystemEx *ex = QApplicationPrivate::graphicsSystem()->platformExtension(); - QSymbianGraphicsSystemEx *symex = static_cast<QSymbianGraphicsSystemEx*>(ex); - if (symex && !symex->hasBCM2727()) { + if (!QSymbianGraphicsSystemEx::hasBCM2727()) { // Most likely we have hw support for multisampling // so let's enable it. d->glFormat.setSampleBuffers(1); diff --git a/src/opengl/qpaintengine_opengl_p.h b/src/opengl/qpaintengine_opengl_p.h index 5d5f5ce..8d0ea83 100644 --- a/src/opengl/qpaintengine_opengl_p.h +++ b/src/opengl/qpaintengine_opengl_p.h @@ -143,6 +143,7 @@ public: Qt::HANDLE handle() const; #endif inline Type type() const { return QPaintEngine::OpenGL; } + bool supportsTransformations(qreal, const QTransform &) const { return true; } private: void drawPolyInternal(const QPolygonF &pa, bool close = true); diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index 7f63aea..ff55142 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -542,19 +542,27 @@ void QGLWindowSurface::beginPaint(const QRegion &) d_ptr->did_paint = true; updateGeometry(); - if (!context()) - return; - int clearFlags = 0; - if (context()->d_func()->workaround_needsFullClearOnEveryFrame) + QGLContext *ctx = reinterpret_cast<QGLContext *>(window()->d_func()->extraData()->glContext); + + if (!ctx) + return; + + if (ctx->d_func()->workaround_needsFullClearOnEveryFrame) clearFlags = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; - else if (context()->format().alpha()) + else if (ctx->format().alpha()) clearFlags = GL_COLOR_BUFFER_BIT; if (clearFlags) { + if (d_ptr->fbo) + d_ptr->fbo->bind(); + glClearColor(0.0, 0.0, 0.0, 0.0); glClear(clearFlags); + + if (d_ptr->fbo) + d_ptr->fbo->release(); } } diff --git a/src/openvg/qpaintengine_vg_p.h b/src/openvg/qpaintengine_vg_p.h index f1ef0fb..267ecd4 100644 --- a/src/openvg/qpaintengine_vg_p.h +++ b/src/openvg/qpaintengine_vg_p.h @@ -159,6 +159,7 @@ public: QVGPaintEnginePrivate *vgPrivate() { Q_D(QVGPaintEngine); return d; } void fillRegion(const QRegion& region, const QColor& color, const QSize& surfaceSize); + bool supportsTransformations(qreal, const QTransform &) const { return true; } protected: QVGPaintEngine(QVGPaintEnginePrivate &data); diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 34f5be9..c62624b 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -1316,11 +1316,112 @@ void QAccessibleTextEdit::addSelection(int startOffset, int endOffset) QString QAccessibleTextEdit::attributes(int offset, int *startOffset, int *endOffset) { - // TODO - wait for a definition of attributes - Q_UNUSED(offset); - Q_UNUSED(startOffset); - Q_UNUSED(endOffset); - return QString(); + /* The list of attributes can be found at: + http://linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2/textattributes + */ + + if (offset >= characterCount()) { + *startOffset = -1; + *endOffset = -1; + return QString(); + } + + QMap<QString, QString> attrs; + + QTextCursor cursor = textEdit()->textCursor(); + + //cursor.charFormat returns the format of the previous character + cursor.setPosition(offset + 1); + QTextCharFormat charFormat = cursor.charFormat(); + + cursor.setPosition(offset); + QTextBlockFormat blockFormat = cursor.blockFormat(); + + QTextCharFormat charFormatComp; + QTextBlockFormat blockFormatComp; + + *startOffset = offset; + cursor.setPosition(*startOffset); + while (*startOffset > 0) { + charFormatComp = cursor.charFormat(); + cursor.setPosition(*startOffset - 1); + blockFormatComp = cursor.blockFormat(); + if ((charFormat == charFormatComp) && (blockFormat == blockFormatComp)) + (*startOffset)--; + else + break; + } + + int limit = characterCount() + 1; + *endOffset = offset + 1; + cursor.setPosition(*endOffset); + while (*endOffset < limit) { + blockFormatComp = cursor.blockFormat(); + cursor.setPosition(*endOffset + 1); + charFormatComp = cursor.charFormat(); + if ((charFormat == charFormatComp) && (cursor.blockFormat() == blockFormatComp)) + (*endOffset)++; + else + break; + } + + QString family = charFormat.fontFamily(); + if (!family.isEmpty()) { + family = family.replace('\\',"\\\\"); + family = family.replace(':',"\\:"); + family = family.replace(',',"\\,"); + family = family.replace('=',"\\="); + family = family.replace(';',"\\;"); + family = family.replace('\"',"\\\""); + attrs["font-family"] = '"'+family+'"'; + } + + int fontSize = int(charFormat.fontPointSize()); + if (fontSize) + attrs["font-size"] = QString::number(fontSize).append("pt"); + + //Different weight values are not handled + attrs["font-weight"] = (charFormat.fontWeight() > QFont::Normal) ? "bold" : "normal"; + + QFont::Style style = charFormat.font().style(); + attrs["font-style"] = (style == QFont::StyleItalic) ? "italic" : ((style == QFont::StyleOblique) ? "oblique": "normal"); + + attrs["text-underline-style"] = charFormat.font().underline() ? "solid" : "none"; + + QTextCharFormat::VerticalAlignment alignment = charFormat.verticalAlignment(); + attrs["text-position"] = (alignment == QTextCharFormat::AlignSubScript) ? "sub" : ((alignment == QTextCharFormat::AlignSuperScript) ? "super" : "baseline" ); + + QBrush background = charFormat.background(); + if (background.style() == Qt::SolidPattern) { + attrs["background-color"] = QString("rgb(%1,%2,%3)").arg(background.color().red()).arg(background.color().green()).arg(background.color().blue()); + } + + QBrush foreground = charFormat.foreground(); + if (foreground.style() == Qt::SolidPattern) { + attrs["color"] = QString("rgb(%1,%2,%3)").arg(foreground.color().red()).arg(foreground.color().green()).arg(foreground.color().blue()); + } + + switch (blockFormat.alignment() & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter | Qt::AlignJustify)) { + case Qt::AlignLeft: + attrs["text-align"] = "left"; + break; + case Qt::AlignRight: + attrs["text-align"] = "right"; + break; + case Qt::AlignHCenter: + attrs["text-align"] = "center"; + break; + case Qt::AlignJustify: + attrs["text-align"] = "left"; + break; + } + + QString result; + foreach (const QString &attributeName, attrs.keys()) { + result.append(attributeName).append(':').append(attrs[attributeName]).append(';'); + } + + return result; } int QAccessibleTextEdit::cursorPosition() @@ -1435,9 +1536,9 @@ QString QAccessibleTextEdit::textAtOffset(int offset, BoundaryType boundaryType, if (offset >= characterCount()) return QString(); + cursor.setPosition(offset); switch (boundaryType) { case CharBoundary: - cursor.setPosition(offset); *startOffset = cursor.position(); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); *endOffset = cursor.position(); diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index 1b10a7b..ad56cbd 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -703,7 +703,14 @@ void QAccessibleLineEdit::setText(Text t, int control, const QString &text) QAccessibleWidgetEx::setText(t, control, text); return; } - lineEdit()->setText(text); + + QString newText = text; + if (lineEdit()->validator()) { + int pos = 0; + if (lineEdit()->validator()->validate(newText, pos) != QValidator::Acceptable) + return; + } + lineEdit()->setText(newText); } /*! \reimp */ @@ -801,6 +808,10 @@ QString QAccessibleLineEdit::text(int startOffset, int endOffset) { if (startOffset > endOffset) return QString(); + + if (lineEdit()->echoMode() != QLineEdit::Normal) + return QString(); + return lineEdit()->text().mid(startOffset, endOffset - startOffset); } diff --git a/src/plugins/bearer/icd/qicdengine.cpp b/src/plugins/bearer/icd/qicdengine.cpp index c793e52..79be2ce 100644 --- a/src/plugins/bearer/icd/qicdengine.cpp +++ b/src/plugins/bearer/icd/qicdengine.cpp @@ -929,6 +929,7 @@ void QIcdEngine::connectionStateSignalsSlot(QDBusMessage msg) configLocker.unlock(); locker.unlock(); + emit iapStateChanged(iapid, icd_connection_state); emit configurationChanged(ptr); locker.relock(); diff --git a/src/plugins/bearer/icd/qnetworksession_impl.cpp b/src/plugins/bearer/icd/qnetworksession_impl.cpp index f08d8bf..a99c0a7 100644 --- a/src/plugins/bearer/icd/qnetworksession_impl.cpp +++ b/src/plugins/bearer/icd/qnetworksession_impl.cpp @@ -183,6 +183,12 @@ void QNetworkSessionPrivateImpl::updateState(QNetworkSession::State newState) icdConfig->mutex.lock(); icdConfig->state = QNetworkConfiguration::Defined; icdConfig->mutex.unlock(); + + // Reset the state of the default configuration to Discovered + icdConfig = toIcdConfig(privateConfiguration(publicConfig)); + icdConfig->mutex.lock(); + icdConfig->state = QNetworkConfiguration::Discovered; + icdConfig->mutex.unlock(); } else { if (!activeConfig.isValid()) { // Active configuration (IAP) was removed from system diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 18861cf..d90c8ca 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -63,27 +63,26 @@ class QDirectFBPaintEnginePrivate : public QRasterPaintEnginePrivate { public: enum TransformationTypeFlags { - Matrix_NegativeScale = 0x100, + Matrix_NegativeScaleX = 0x100, + Matrix_NegativeScaleY = 0x200, Matrix_RectsUnsupported = (QTransform::TxRotate|QTransform::TxShear|QTransform::TxProject), - Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported) +#if (Q_DIRECTFB_VERSION >= 0x010403) + Matrix_BlitsUnsupported = (Matrix_RectsUnsupported) +#else + Matrix_BlitsUnsupported = (Matrix_RectsUnsupported|Matrix_NegativeScaleX|Matrix_NegativeScaleY) +#endif }; inline static uint getTransformationType(const QTransform &transform) { int ret = transform.type(); - if (qMin(transform.m11(), transform.m22()) < 0) { - ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale; - } + if (transform.m11() < 0) + ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScaleX; + if (transform.m22() < 0) + ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScaleY; return ret; } - enum CompositionModeStatus { - PorterDuff_None = 0x0, - PorterDuff_Supported = 0x1, - PorterDuff_PremultiplyColors = 0x2, - PorterDuff_AlwaysBlend = 0x4 - }; - enum ClipType { ClipUnset, NoClip, @@ -95,25 +94,24 @@ public: QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p); ~QDirectFBPaintEnginePrivate(); - inline void setTransform(const QTransform &transforma); - inline void setPen(const QPen &pen); - inline void setCompositionMode(QPainter::CompositionMode mode); - inline void setRenderHints(QPainter::RenderHints hints); + void setBrush(const QBrush &brush); + void setCompositionMode(QPainter::CompositionMode mode); + void setPen(const QPen &pen); + void setTransform(const QTransform &transforma); + void setRenderHints(QPainter::RenderHints hints); - inline void setDFBColor(const QColor &color); + bool prepareForDraw(const QColor &color); - inline void lock(); - inline void unlock(); + void lock(); + void unlock(); static inline void unlock(QDirectFBPaintDevice *device); - inline bool isSimpleBrush(const QBrush &brush) const; - void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos, const QTransform &pixmapTransform); void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src); - inline bool supportsStretchBlit() const; + bool supportsStretchBlit() const; - inline void updateClip(); + void updateClip(); virtual void systemStateChanged(); static IDirectFBSurface *getSurface(const QImage &img, bool *release); @@ -131,7 +129,8 @@ public: IDirectFBSurface *surface; bool antialiased; - bool simplePen; + bool supportedBrush; + bool supportedPen; uint transformationType; // this is QTransform::type() + Matrix_NegativeScale if qMin(transform.m11(), transform.m22()) < 0 @@ -141,13 +140,13 @@ public: ClipType clipType; QDirectFBPaintDevice *dfbDevice; - uint compositionModeStatus; + bool supportedComposition; bool isPremultiplied; bool inClip; QRect currentClip; - QDirectFBPaintEngine *q; + QDirectFBPaintEngine *engine; }; class SurfaceCache @@ -183,14 +182,27 @@ static QCache<qint64, CachedImage> imageCache(4*1024*1024); // 4 MB #define VOID_ARG() static_cast<bool>(false) enum PaintOperation { - DRAW_RECTS = 0x0001, DRAW_LINES = 0x0002, DRAW_IMAGE = 0x0004, - DRAW_PIXMAP = 0x0008, DRAW_TILED_PIXMAP = 0x0010, STROKE_PATH = 0x0020, - DRAW_PATH = 0x0040, DRAW_POINTS = 0x0080, DRAW_ELLIPSE = 0x0100, - DRAW_POLYGON = 0x0200, DRAW_TEXT = 0x0400, FILL_PATH = 0x0800, - FILL_RECT = 0x1000, DRAW_COLORSPANS = 0x2000, DRAW_ROUNDED_RECT = 0x4000, - DRAW_STATICTEXT = 0x8000, ALL = 0xffff + DRAW_RECTS = 0x0001, + DRAW_LINES = 0x0002, + DRAW_IMAGE = 0x0004, + DRAW_PIXMAP = 0x0008, + DRAW_TILED_PIXMAP = 0x0010, + STROKE_PATH = 0x0020, + DRAW_PATH = 0x0040, + DRAW_POINTS = 0x0080, + DRAW_ELLIPSE = 0x0100, + DRAW_POLYGON = 0x0200, + DRAW_TEXT = 0x0400, + FILL_PATH = 0x0800, + FILL_RECT = 0x1000, + DRAW_COLORSPANS = 0x2000, + DRAW_ROUNDED_RECT = 0x4000, + DRAW_STATICTEXT = 0x8000, + ALL = 0xffff }; +//#define QT_DIRECTFB_WARN_ON_RASTERFALLBACKS ALL + enum { RasterWarn = 1, RasterDisable = 2 }; static inline uint rasterFallbacksMask(PaintOperation op) { @@ -268,8 +280,7 @@ static inline uint rasterFallbacksMask(PaintOperation op) template <typename device, typename T1, typename T2, typename T3> static void rasterFallbackWarn(const char *msg, const char *func, const device *dev, - uint transformationType, bool simplePen, - uint clipType, uint compositionModeStatus, + QDirectFBPaintEnginePrivate *priv, const char *nameOne, const T1 &one, const char *nameTwo, const T2 &two, const char *nameThree, const T3 &three); @@ -283,20 +294,14 @@ static void rasterFallbackWarn(const char *msg, const char *func, const device * rasterFallbackWarn("Falling back to raster engine for", \ __FUNCTION__, \ state()->painter->device(), \ - d_func()->transformationType, \ - d_func()->simplePen, \ - d_func()->clipType, \ - d_func()->compositionModeStatus, \ + d_func(), \ #one, one, #two, two, #three, three); \ break; \ case RasterDisable|RasterWarn: \ rasterFallbackWarn("Disabled raster engine operation", \ __FUNCTION__, \ state()->painter->device(), \ - d_func()->transformationType, \ - d_func()->simplePen, \ - d_func()->clipType, \ - d_func()->compositionModeStatus, \ + d_func(), \ #one, one, #two, two, #three, three); \ case RasterDisable: \ return; \ @@ -304,6 +309,8 @@ static void rasterFallbackWarn(const char *msg, const char *func, const device * } template <class T> +static inline void drawPoints(const T *points, int n, const QTransform &transform, IDirectFBSurface *surface); +template <class T> static inline void drawLines(const T *lines, int n, const QTransform &transform, IDirectFBSurface *surface); template <class T> static inline void fillRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface); @@ -400,6 +407,14 @@ void QDirectFBPaintEngine::clipEnabledChanged() d->updateClip(); } +void QDirectFBPaintEngine::brushChanged() +{ + Q_D(QDirectFBPaintEngine); + d->setBrush(state()->brush); + + QRasterPaintEngine::brushChanged(); +} + void QDirectFBPaintEngine::penChanged() { Q_D(QDirectFBPaintEngine); @@ -494,23 +509,21 @@ void QDirectFBPaintEngine::drawRects(const QRect *rects, int rectCount) return; if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) - || !d->simplePen + || !d->supportedPen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !d->isSimpleBrush(brush) - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedBrush + || !d->supportedComposition) { RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawRects(rects, rectCount); return; } - if (brush.style() != Qt::NoBrush) { - d->setDFBColor(brush.color()); + if (brush.style() != Qt::NoBrush && d->prepareForDraw(brush.color())) { CLIPPED_PAINT(QT_PREPEND_NAMESPACE(fillRects<QRect>)(rects, rectCount, state()->matrix, d->surface)); } - if (pen.style() != Qt::NoPen) { - d->setDFBColor(pen.color()); + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawRects<QRect>)(rects, rectCount, state()->matrix, d->surface)); } } @@ -524,23 +537,21 @@ void QDirectFBPaintEngine::drawRects(const QRectF *rects, int rectCount) return; if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) - || !d->simplePen + || !d->supportedPen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !d->isSimpleBrush(brush) - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedBrush + || !d->supportedComposition) { RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawRects(rects, rectCount); return; } - if (brush.style() != Qt::NoBrush) { - d->setDFBColor(brush.color()); + if (brush.style() != Qt::NoBrush && d->prepareForDraw(brush.color())) { CLIPPED_PAINT(fillRects<QRectF>(rects, rectCount, state()->matrix, d->surface)); } - if (pen.style() != Qt::NoPen) { - d->setDFBColor(pen.color()); + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawRects<QRectF>)(rects, rectCount, state()->matrix, d->surface)); } } @@ -550,17 +561,16 @@ void QDirectFBPaintEngine::drawLines(const QLine *lines, int lineCount) Q_D(QDirectFBPaintEngine); const QPen &pen = state()->pen; - if (!d->simplePen + if (!d->supportedPen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedComposition) { RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawLines(lines, lineCount); return; } - if (pen.style() != Qt::NoPen) { - d->setDFBColor(pen.color()); + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawLines<QLine>)(lines, lineCount, state()->matrix, d->surface)); } } @@ -570,17 +580,16 @@ void QDirectFBPaintEngine::drawLines(const QLineF *lines, int lineCount) Q_D(QDirectFBPaintEngine); const QPen &pen = state()->pen; - if (!d->simplePen + if (!d->supportedPen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedComposition) { RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawLines(lines, lineCount); return; } - if (pen.style() != Qt::NoPen) { - d->setDFBColor(pen.color()); + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawLines<QLineF>)(lines, lineCount, state()->matrix, d->surface)); } } @@ -610,7 +619,7 @@ void QDirectFBPaintEngine::drawImage(const QRectF &r, const QImage &image, */ #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) + if (!d->supportedComposition || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size()) @@ -664,7 +673,7 @@ void QDirectFBPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap, QPixmapData *data = pixmap.pixmapData(); Q_ASSERT(data->classId() == QPixmapData::DirectFBClass); QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data); - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) + if (!d->supportedComposition || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size())) { @@ -701,7 +710,7 @@ void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r, RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); d->lock(); QRasterPaintEngine::drawTiledPixmap(r, pixmap, offset); - } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) + } else if (!d->supportedComposition || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.isScaling())) { @@ -740,18 +749,40 @@ void QDirectFBPaintEngine::drawPath(const QPainterPath &path) void QDirectFBPaintEngine::drawPoints(const QPointF *points, int pointCount) { - RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG()); Q_D(QDirectFBPaintEngine); - d->lock(); - QRasterPaintEngine::drawPoints(points, pointCount); + + const QPen &pen = state()->pen; + if (!d->supportedPen + || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip + || !d->supportedComposition) { + RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG()); + d->lock(); + QRasterPaintEngine::drawPoints(points, pointCount); + return; + } + + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { + CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawPoints<QPointF>)(points, pointCount, state()->matrix, d->surface)); + } } void QDirectFBPaintEngine::drawPoints(const QPoint *points, int pointCount) { - RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG()); Q_D(QDirectFBPaintEngine); - d->lock(); - QRasterPaintEngine::drawPoints(points, pointCount); + + const QPen &pen = state()->pen; + if (!d->supportedPen + || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip + || !d->supportedComposition) { + RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG()); + d->lock(); + QRasterPaintEngine::drawPoints(points, pointCount); + return; + } + + if (pen.style() != Qt::NoPen && d->prepareForDraw(pen.color())) { + CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawPoints<QPoint>)(points, pointCount, state()->matrix, d->surface)); + } } void QDirectFBPaintEngine::drawEllipse(const QRectF &rect) @@ -793,6 +824,29 @@ void QDirectFBPaintEngine::fill(const QVectorPath &path, const QBrush &brush) { if (brush.style() == Qt::NoBrush) return; + + const QPainterPath::ElementType *elements = path.elements(); + const qreal *points = path.points(); + + if (path.elementCount() == 5) { + if (elements[0] == QPainterPath::MoveToElement + && elements[1] == QPainterPath::LineToElement + && elements[2] == QPainterPath::LineToElement + && elements[3] == QPainterPath::LineToElement + && elements[4] == QPainterPath::LineToElement) { + + if (points[1] == points[3] + && points[2] == points[4] + && points[5] == points[7] + && points[6] == points[0]) { + QRectF rect( points[0], points[1], points[4], points[5] ); + + fillRect( rect, brush ); + return; + } + } + } + RASTERFALLBACK(FILL_PATH, path, brush, VOID_ARG()); Q_D(QDirectFBPaintEngine); d->lock(); @@ -828,12 +882,13 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) return; if (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedComposition) { break; } - d->setDFBColor(color); - const QRect r = state()->matrix.mapRect(rect).toRect(); - CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height())); + if (d->prepareForDraw(color)) { + const QRect r = state()->matrix.mapRect(rect).toRect(); + CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height())); + } return; } case Qt::TexturePattern: { @@ -842,7 +897,7 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) QTransform transform(stateTransform); transform.translate(brushOrigin.x(), brushOrigin.y()); transform = brush.transform() * transform; - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) + if (!d->supportedComposition || (QDirectFBPaintEnginePrivate::getTransformationType(transform) & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (!d->supportsStretchBlit() && transform.isScaling())) { break; @@ -870,12 +925,11 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QColor &color) Q_D(QDirectFBPaintEngine); if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) - || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + || !d->supportedComposition) { RASTERFALLBACK(FILL_RECT, rect, color, VOID_ARG()); d->lock(); QRasterPaintEngine::fillRect(rect, color); - } else { - d->setDFBColor(color); + } else if (d->prepareForDraw(color)) { const QRect r = state()->matrix.mapRect(rect).toRect(); CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height())); } @@ -909,12 +963,11 @@ void QDirectFBPaintEngine::initImageCache(int size) // ---- QDirectFBPaintEnginePrivate ---- - QDirectFBPaintEnginePrivate::QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p) - : surface(0), antialiased(false), simplePen(false), + : surface(0), antialiased(false), supportedBrush(false), supportedPen(false), transformationType(0), opacity(255), clipType(ClipUnset), dfbDevice(0), - compositionModeStatus(0), isPremultiplied(false), inClip(false), q(p) + supportedComposition(false), isPremultiplied(false), inClip(false), engine(p) { fb = QDirectFBScreen::instance()->dfb(); surfaceCache = new SurfaceCache; @@ -925,11 +978,6 @@ QDirectFBPaintEnginePrivate::~QDirectFBPaintEnginePrivate() delete surfaceCache; } -bool QDirectFBPaintEnginePrivate::isSimpleBrush(const QBrush &brush) const -{ - return (brush.style() == Qt::NoBrush) || (brush.style() == Qt::SolidPattern && !antialiased); -} - void QDirectFBPaintEnginePrivate::lock() { // We will potentially get a new pointer to the buffer after a @@ -961,25 +1009,9 @@ void QDirectFBPaintEnginePrivate::unlock(QDirectFBPaintDevice *device) #endif } -void QDirectFBPaintEnginePrivate::setTransform(const QTransform &transform) +void QDirectFBPaintEnginePrivate::setBrush(const QBrush &brush) { - transformationType = getTransformationType(transform); - setPen(q->state()->pen); -} - -void QDirectFBPaintEnginePrivate::setPen(const QPen &pen) -{ - if (pen.style() == Qt::NoPen) { - simplePen = true; - } else if (pen.style() == Qt::SolidLine - && !antialiased - && pen.brush().style() == Qt::SolidPattern - && pen.widthF() <= 1.0 - && (transformationType < QTransform::TxScale || pen.isCosmetic())) { - simplePen = true; - } else { - simplePen = false; - } + supportedBrush = (brush.style() == Qt::NoBrush) || (brush.style() == Qt::SolidPattern && !antialiased); } void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode mode) @@ -989,23 +1021,19 @@ void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode m static const bool forceRasterFallBack = qgetenv("QT_DIRECTFB_FORCE_RASTER").toInt() > 0; if (forceRasterFallBack) { - compositionModeStatus = PorterDuff_None; + supportedComposition = false; return; } - compositionModeStatus = PorterDuff_Supported|PorterDuff_PremultiplyColors|PorterDuff_AlwaysBlend; + supportedComposition = true; switch (mode) { case QPainter::CompositionMode_Clear: surface->SetPorterDuff(surface, DSPD_CLEAR); break; case QPainter::CompositionMode_Source: surface->SetPorterDuff(surface, DSPD_SRC); - compositionModeStatus &= ~PorterDuff_AlwaysBlend; - if (!isPremultiplied) - compositionModeStatus &= ~PorterDuff_PremultiplyColors; break; case QPainter::CompositionMode_SourceOver: - compositionModeStatus &= ~PorterDuff_AlwaysBlend; surface->SetPorterDuff(surface, DSPD_SRC_OVER); break; case QPainter::CompositionMode_DestinationOver: @@ -1013,8 +1041,6 @@ void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode m break; case QPainter::CompositionMode_SourceIn: surface->SetPorterDuff(surface, DSPD_SRC_IN); - if (!isPremultiplied) - compositionModeStatus &= ~PorterDuff_PremultiplyColors; break; case QPainter::CompositionMode_DestinationIn: surface->SetPorterDuff(surface, DSPD_DST_IN); @@ -1044,32 +1070,69 @@ void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode m break; #endif default: - compositionModeStatus = PorterDuff_None; + supportedComposition = false; break; } } +void QDirectFBPaintEnginePrivate::setPen(const QPen &pen) +{ + if (pen.style() == Qt::NoPen) { + supportedPen = true; + } else if (pen.style() == Qt::SolidLine + && !antialiased + && pen.brush().style() == Qt::SolidPattern + && pen.widthF() <= 1.0 + && (transformationType < QTransform::TxScale || pen.isCosmetic())) { + supportedPen = true; + } else { + supportedPen = false; + } +} + +void QDirectFBPaintEnginePrivate::setTransform(const QTransform &transform) +{ + transformationType = getTransformationType(transform); + setPen(engine->state()->pen); +} + void QDirectFBPaintEnginePrivate::setRenderHints(QPainter::RenderHints hints) { const bool old = antialiased; antialiased = bool(hints & QPainter::Antialiasing); if (old != antialiased) { - setPen(q->state()->pen); + setPen(engine->state()->pen); } } void QDirectFBPaintEnginePrivate::prepareForBlit(uint flags) { DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX; - if (flags & Premultiplied) - blittingFlags |= DSBLIT_SRC_PREMULTIPLY; + +#if (Q_DIRECTFB_VERSION >= 0x010403) + if (transformationType & Matrix_NegativeScaleX) + blittingFlags |= DSBLIT_FLIP_HORIZONTAL; + + if (transformationType & Matrix_NegativeScaleY) + blittingFlags |= DSBLIT_FLIP_VERTICAL; +#endif + if (flags & HasAlpha) blittingFlags |= DSBLIT_BLEND_ALPHACHANNEL; + if (opacity != 255) { blittingFlags |= DSBLIT_BLEND_COLORALPHA; surface->SetColor(surface, 0xff, 0xff, 0xff, opacity); } + if (flags & Premultiplied) { + if (blittingFlags & DSBLIT_BLEND_COLORALPHA) + blittingFlags |= DSBLIT_SRC_PREMULTCOLOR; + } else { + if (blittingFlags & (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA)) + blittingFlags |= DSBLIT_SRC_PREMULTIPLY; + } + surface->SetBlittingFlags(surface, blittingFlags); } @@ -1080,14 +1143,14 @@ static inline uint ALPHA_MUL(uint x, uint a) return t; } -void QDirectFBPaintEnginePrivate::setDFBColor(const QColor &color) +bool QDirectFBPaintEnginePrivate::prepareForDraw(const QColor &color) { Q_ASSERT(surface); - Q_ASSERT(compositionModeStatus & PorterDuff_Supported); + Q_ASSERT(supportedComposition); const quint8 alpha = (opacity == 255 ? color.alpha() : ALPHA_MUL(color.alpha(), opacity)); QColor col; - if (compositionModeStatus & PorterDuff_PremultiplyColors) { + if (isPremultiplied) { col = QColor(ALPHA_MUL(color.red(), alpha), ALPHA_MUL(color.green(), alpha), ALPHA_MUL(color.blue(), alpha), @@ -1096,7 +1159,28 @@ void QDirectFBPaintEnginePrivate::setDFBColor(const QColor &color) col = QColor(color.red(), color.green(), color.blue(), alpha); } surface->SetColor(surface, col.red(), col.green(), col.blue(), col.alpha()); - surface->SetDrawingFlags(surface, alpha == 255 && !(compositionModeStatus & PorterDuff_AlwaysBlend) ? DSDRAW_NOFX : DSDRAW_BLEND); + + bool blend = false; + + switch (engine->state()->composition_mode) { + case QPainter::CompositionMode_Clear: + case QPainter::CompositionMode_Source: + break; + case QPainter::CompositionMode_SourceOver: + if (alpha == 0) + return false; + + if (alpha != 255) + blend = true; + break; + default: + blend = true; + break; + } + + surface->SetDrawingFlags(surface, blend ? DSDRAW_BLEND : DSDRAW_NOFX); + + return true; } IDirectFBSurface *QDirectFBPaintEnginePrivate::getSurface(const QImage &img, bool *release) @@ -1137,7 +1221,7 @@ IDirectFBSurface *QDirectFBPaintEnginePrivate::getSurface(const QImage &img, boo void QDirectFBPaintEnginePrivate::blit(const QRectF &dest, IDirectFBSurface *s, const QRectF &src) { const QRect sr = src.toRect(); - const QRect dr = q->state()->matrix.mapRect(dest).toRect(); + const QRect dr = engine->state()->matrix.mapRect(dest).toRect(); if (dr.isEmpty()) return; const DFBRectangle sRect = { sr.x(), sr.y(), sr.width(), sr.height() }; @@ -1167,10 +1251,10 @@ static inline qreal fixCoord(qreal rect_pos, qreal pixmapSize, qreal offset) void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &off, const QTransform &pixmapTransform) { - const QTransform &transform = q->state()->matrix; + const QTransform &transform = engine->state()->matrix; Q_ASSERT(!(getTransformationType(transform) & Matrix_BlitsUnsupported) && !(getTransformationType(pixmapTransform) & Matrix_BlitsUnsupported)); - const QRect destinationRect = transform.mapRect(dest).toRect().normalized(); + const QRect destinationRect = dest.toRect(); QRect newClip = destinationRect; if (!currentClip.isEmpty()) newClip &= currentClip; @@ -1186,7 +1270,7 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix }; surface->SetClip(surface, &clip); - QPointF offset = pixmapTransform.inverted().map(off); + QPointF offset = off; Q_ASSERT(transform.type() <= QTransform::TxScale); QPixmapData *data = pixmap.pixmapData(); Q_ASSERT(data->classId() == QPixmapData::DirectFBClass); @@ -1293,7 +1377,12 @@ void QDirectFBPaintEnginePrivate::updateClip() bool QDirectFBPaintEnginePrivate::supportsStretchBlit() const { #ifdef QT_DIRECTFB_STRETCHBLIT - return !(q->state()->renderHints & QPainter::SmoothPixmapTransform); + DFBGraphicsDeviceDescription desc; + + fb->GetDeviceDescription(fb, &desc); + + return !(engine->state()->renderHints & QPainter::SmoothPixmapTransform) + || (desc.acceleration_mask & DFXL_STRETCHBLIT); #else return false; #endif @@ -1334,10 +1423,32 @@ void SurfaceCache::clear() } -static inline QRect mapRect(const QTransform &transform, const QRect &rect) { return transform.mapRect(rect); } -static inline QRect mapRect(const QTransform &transform, const QRectF &rect) { return transform.mapRect(rect).toRect(); } +static inline QRect map(const QTransform &transform, const QRect &rect) { return transform.mapRect(rect); } +static inline QRect map(const QTransform &transform, const QRectF &rect) { return transform.mapRect(rect).toRect(); } static inline QLine map(const QTransform &transform, const QLine &line) { return transform.map(line); } static inline QLine map(const QTransform &transform, const QLineF &line) { return transform.map(line).toLine(); } +static inline QPoint map(const QTransform &transform, const QPoint &point) { return transform.map(point); } +static inline QPoint map(const QTransform &transform, const QPointF &point) { return transform.map(point).toPoint(); } + +template <class T> +static inline void drawPoints(const T *points, int n, const QTransform &transform, IDirectFBSurface *surface) +{ + if (n == 1) { + const QPoint p = map(transform, points[0]); + surface->FillRectangle(surface, p.x(), p.y(), 1, 1); + } else { + QVarLengthArray<DFBRectangle, 32> rectArray(n); + for (int i=0; i<n; ++i) { + const QPoint p = map(transform, points[i]); + rectArray[i].x = p.x(); + rectArray[i].y = p.y(); + rectArray[i].w = 1; + rectArray[i].h = 1; + } + surface->FillRectangles(surface, rectArray.constData(), n); + } +} + template <class T> static inline void drawLines(const T *lines, int n, const QTransform &transform, IDirectFBSurface *surface) { @@ -1361,12 +1472,12 @@ template <class T> static inline void fillRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface) { if (n == 1) { - const QRect r = mapRect(transform, rects[0]); + const QRect r = map(transform, rects[0]); surface->FillRectangle(surface, r.x(), r.y(), r.width(), r.height()); } else { QVarLengthArray<DFBRectangle, 32> rectArray(n); for (int i=0; i<n; ++i) { - const QRect r = mapRect(transform, rects[i]); + const QRect r = map(transform, rects[i]); rectArray[i].x = r.x(); rectArray[i].y = r.y(); rectArray[i].w = r.width(); @@ -1380,7 +1491,7 @@ template <class T> static inline void drawRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface) { for (int i=0; i<n; ++i) { - const QRect r = mapRect(transform, rects[i]); + const QRect r = map(transform, rects[i]); surface->DrawRectangle(surface, r.x(), r.y(), r.width(), r.height()); } } @@ -1389,14 +1500,18 @@ template <typename T> inline const T *ptr(const T &t) { return &t; } template <> inline const bool* ptr<bool>(const bool &) { return 0; } template <typename device, typename T1, typename T2, typename T3> static void rasterFallbackWarn(const char *msg, const char *func, const device *dev, - uint transformationType, bool simplePen, - uint clipType, uint compositionModeStatus, + QDirectFBPaintEnginePrivate *priv, const char *nameOne, const T1 &one, const char *nameTwo, const T2 &two, const char *nameThree, const T3 &three) { QString out; QDebug dbg(&out); + + + dbg << "***"; + + dbg << msg << (QByteArray(func) + "()") << "painting on"; if (dev->devType() == QInternal::Widget) { dbg << static_cast<const QWidget*>(dev); @@ -1404,10 +1519,55 @@ static void rasterFallbackWarn(const char *msg, const char *func, const device * dbg << dev << "of type" << dev->devType(); } - dbg << QString::fromLatin1("transformationType 0x%1").arg(transformationType, 3, 16, QLatin1Char('0')) - << "simplePen" << simplePen - << "clipType" << clipType - << "compositionModeStatus" << compositionModeStatus; + dbg << "\n\t"; + + + dbg << ((priv->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) ? "*" : "") << QString::fromLatin1("transformationType 0x%1").arg(priv->transformationType, 3, 16, QLatin1Char('0')); + + dbg << priv->engine->state()->matrix; + + dbg << "\n\t"; + + + + dbg << (priv->supportedBrush ? "" : "*") << "supportedBrush" << priv->supportedBrush; + + dbg << priv->engine->state()->brush; + + dbg << "\n\t"; + + const QGradient *gradient = priv->engine->state()->brush.gradient(); + if (gradient) { + const QGradientStops &stops = gradient->stops(); + + dbg << "gradient: " << *gradient; + dbg << "stops: " << stops.count(); + dbg << "\n\t"; + + for (int i=0; i<stops.count(); i++) { + dbg << stops[i].first << stops[i].second; + } + dbg << "\n\t"; + } + + + dbg << (priv->supportedPen ? "" : "*") << "supportedPen" << priv->supportedPen; + + dbg << priv->engine->state()->pen; + + dbg << "\n\t"; + + + + dbg << (priv->clipType == QDirectFBPaintEnginePrivate::ComplexClip ? "*" : "") << "clipType" << priv->clipType; + + dbg << "\n\t"; + + + dbg << (priv->supportedComposition ? "" : "*") << "supportedComposition" << priv->supportedComposition; + + dbg << "\n\t"; + const T1 *t1 = ptr(one); const T2 *t2 = ptr(two); @@ -1428,3 +1588,4 @@ static void rasterFallbackWarn(const char *msg, const char *func, const device * QT_END_NAMESPACE #endif // QT_NO_QWS_DIRECTFB + diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h index a3217d0..b71671d 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h @@ -97,6 +97,7 @@ public: virtual void drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode); virtual void clipEnabledChanged(); + virtual void brushChanged(); virtual void penChanged(); virtual void opacityChanged(); virtual void compositionModeChanged(); diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro index 7c7c1d7..a84c5ac 100644 --- a/src/plugins/phonon/mmf/mmf.pro +++ b/src/plugins/phonon/mmf/mmf.pro @@ -103,7 +103,11 @@ symbian { exists($${EPOCROOT}epoc32/include/mw/downloadmgrclient.h) { HEADERS += $$PHONON_MMF_DIR/download.h SOURCES += $$PHONON_MMF_DIR/download.cpp - LIBS += -lDownloadMgr + contains(CONFIG, is_using_gnupoc) { + LIBS += -ldownloadmgr + } else { + LIBS += -lDownloadMgr + } DEFINES += PHONON_MMF_PROGRESSIVE_DOWNLOAD } } diff --git a/src/plugins/platforms/glxconvenience/glxconvenience.pri b/src/plugins/platforms/glxconvenience/glxconvenience.pri index d6c9922..b4d43a3 100644 --- a/src/plugins/platforms/glxconvenience/glxconvenience.pri +++ b/src/plugins/platforms/glxconvenience/glxconvenience.pri @@ -5,3 +5,11 @@ HEADERS += \ SOURCES += \ $$PWD/qglxconvenience.cpp + +CONFIG += xrender + +xrender { + LIBS += -lXrender +} else { + DEFINES += QT_NO_XRENDER +} diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp index c776f5b..34633d9 100644 --- a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp +++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp @@ -43,6 +43,10 @@ #include <QtCore/QVector> +#ifndef QT_NO_XRENDER +#include <X11/extensions/Xrender.h> +#endif + enum { XFocusOut = FocusOut, XFocusIn = FocusIn, @@ -84,14 +88,15 @@ QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format, int drawableBit spec[i++] = GLX_ALPHA_SIZE; spec[i++] = (format.alphaBufferSize() == -1) ? 1 : format.alphaBufferSize(); } - spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); - spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); - spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); + if (format.accum()) { + spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); + spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); + spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); - if (format.alpha()) { - spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); + if (format.alpha()) { + spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize(); + } } - } else { spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_COLOR_INDEX_BIT; //I'm really not sure if this works.... spec[i++] = GLX_BUFFER_SIZE; spec[i++] = 8; @@ -136,8 +141,17 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindow if (reducedFormat.alpha()) { int alphaSize; glXGetFBConfigAttrib(display,configs[i],GLX_ALPHA_SIZE,&alphaSize); - if (alphaSize > 0) - break; + if (alphaSize > 0) { + XVisualInfo *visual = glXGetVisualFromFBConfig(display, chosenConfig); +#if !defined(QT_NO_XRENDER) + XRenderPictFormat *pictFormat = XRenderFindVisualFormat(display, visual->visual); + if (pictFormat->direct.alphaMask > 0) + break; +#else + if (visual->depth == 32) + break; +#endif + } } else { break; // Just choose the first in the list if there's no alpha requested } diff --git a/src/plugins/platforms/minimal/qminimalintegration.cpp b/src/plugins/platforms/minimal/qminimalintegration.cpp index 50c3626..b9ab528 100644 --- a/src/plugins/platforms/minimal/qminimalintegration.cpp +++ b/src/plugins/platforms/minimal/qminimalintegration.cpp @@ -50,8 +50,8 @@ QMinimalIntegration::QMinimalIntegration() QMinimalScreen *mPrimaryScreen = new QMinimalScreen(); mPrimaryScreen->mGeometry = QRect(0, 0, 240, 320); - mPrimaryScreen->mDepth = 16; - mPrimaryScreen->mFormat = QImage::Format_RGB16; + mPrimaryScreen->mDepth = 32; + mPrimaryScreen->mFormat = QImage::Format_ARGB32_Premultiplied; mScreens.append(mPrimaryScreen); } diff --git a/src/plugins/platforms/minimal/qminimalintegration.h b/src/plugins/platforms/minimal/qminimalintegration.h index df4a9da..d1fcc42 100644 --- a/src/plugins/platforms/minimal/qminimalintegration.h +++ b/src/plugins/platforms/minimal/qminimalintegration.h @@ -51,7 +51,7 @@ class QMinimalScreen : public QPlatformScreen { public: QMinimalScreen() - : mDepth(16), mFormat(QImage::Format_RGB16) {} + : mDepth(32), mFormat(QImage::Format_ARGB32_Premultiplied) {} QRect geometry() const { return mGeometry; } int depth() const { return mDepth; } diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp index 72ad5a8..0f27501 100644 --- a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp +++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp @@ -115,8 +115,15 @@ void *QWaylandGLContext::getProcAddress(const QString &string) void QWaylandGLContext::setEglSurface(EGLSurface surface) { - doneCurrent(); + bool wasCurrent = false; + if (QPlatformGLContext::currentContext() == this) { + wasCurrent = true; + doneCurrent(); + } mSurface = surface; + if (wasCurrent) { + makeCurrent(); + } } EGLConfig QWaylandGLContext::eglConfig() const diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp index e53381e..dff6ffa 100644 --- a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp +++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp @@ -132,10 +132,12 @@ void QWaylandXCompositeGLXContext::geometryChanged() Colormap cmap = XCreateColormap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),visualInfo->visual,AllocNone); XSetWindowAttributes a; + a.background_pixel = WhitePixel(mGlxIntegration->xDisplay(), mGlxIntegration->screen()); + a.border_pixel = BlackPixel(mGlxIntegration->xDisplay(), mGlxIntegration->screen()); a.colormap = cmap; mXWindow = XCreateWindow(mGlxIntegration->xDisplay(), mGlxIntegration->rootWindow(),0, 0, size.width(), size.height(), 0, visualInfo->depth, InputOutput, visualInfo->visual, - CWColormap, &a); + CWBackPixel|CWBorderPixel|CWColormap, &a); XCompositeRedirectWindow(mGlxIntegration->xDisplay(), mXWindow, CompositeRedirectManual); XMapWindow(mGlxIntegration->xDisplay(), mXWindow); diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.cpp b/src/plugins/platforms/wayland/qwaylandclipboard.cpp index f2e6ccf..b7f6ae5 100644 --- a/src/plugins/platforms/wayland/qwaylandclipboard.cpp +++ b/src/plugins/platforms/wayland/qwaylandclipboard.cpp @@ -48,16 +48,54 @@ #include <QtCore/QStringList> #include <QtCore/QFile> #include <QtCore/QtDebug> +#include <QtGui/private/qdnd_p.h> static QWaylandClipboard *clipboard; +class QWaylandMimeData : public QInternalMimeData +{ +public: + void clearAll(); + void setFormats(const QStringList &formatList); + bool hasFormat_sys(const QString &mimeType) const; + QStringList formats_sys() const; + QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const; +private: + QStringList mFormatList; +}; + +void QWaylandMimeData::clearAll() +{ + clear(); + mFormatList.clear(); +} + +void QWaylandMimeData::setFormats(const QStringList &formatList) +{ + mFormatList = formatList; +} + +bool QWaylandMimeData::hasFormat_sys(const QString &mimeType) const +{ + return formats().contains(mimeType); +} + +QStringList QWaylandMimeData::formats_sys() const +{ + return mFormatList; +} + +QVariant QWaylandMimeData::retrieveData_sys(const QString &mimeType, QVariant::Type type) const +{ + return clipboard->retrieveData(mimeType, type); +} + class QWaylandSelection { public: QWaylandSelection(QWaylandDisplay *display, QMimeData *data); ~QWaylandSelection(); -private: static uint32_t getTime(); static void send(void *data, struct wl_selection *selection, const char *mime_type, int fd); static void cancelled(void *data, struct wl_selection *selection); @@ -125,7 +163,7 @@ void QWaylandSelection::cancelled(void *data, struct wl_selection *selection) } QWaylandClipboard::QWaylandClipboard(QWaylandDisplay *display) - : mDisplay(display), mSelection(0), mMimeDataIn(0), mOffer(0) + : mDisplay(display), mMimeDataIn(0), mOffer(0) { clipboard = this; } @@ -157,32 +195,39 @@ void QWaylandClipboard::forceRoundtrip(struct wl_display *display) wl_display_iterate(display, WL_DISPLAY_READABLE); } -const QMimeData *QWaylandClipboard::mimeData(QClipboard::Mode mode) const +QVariant QWaylandClipboard::retrieveData(const QString &mimeType, QVariant::Type type) const +{ + Q_UNUSED(type); + if (mOfferedMimeTypes.isEmpty() || !mOffer) + return QVariant(); + int pipefd[2]; + if (pipe(pipefd) == -1) { + qWarning("QWaylandClipboard: pipe() failed"); + return QVariant(); + } + QByteArray mimeTypeBa = mimeType.toLatin1(); + wl_selection_offer_receive(mOffer, mimeTypeBa.constData(), pipefd[1]); + QByteArray content; + forceRoundtrip(mDisplay->wl_display()); + char buf[256]; + int n; + close(pipefd[1]); + while ((n = read(pipefd[0], &buf, sizeof buf)) > 0) + content.append(buf, n); + close(pipefd[0]); + return content; +} + +QMimeData *QWaylandClipboard::mimeData(QClipboard::Mode mode) { Q_ASSERT(mode == QClipboard::Clipboard); + if (!mSelections.isEmpty()) + return mSelections.last()->mMimeData; if (!mMimeDataIn) - mMimeDataIn = new QMimeData; - mMimeDataIn->clear(); - if (!mOfferedMimeTypes.isEmpty() && mOffer) { - foreach (const QString &mimeType, mOfferedMimeTypes) { - int pipefd[2]; - if (pipe(pipefd) == -1) { - qWarning("QWaylandClipboard::mimedata: pipe() failed"); - break; - } - QByteArray mimeTypeBa = mimeType.toLatin1(); - wl_selection_offer_receive(mOffer, mimeTypeBa.constData(), pipefd[1]); - QByteArray content; - forceRoundtrip(mDisplay->wl_display()); - char buf[256]; - int n; - close(pipefd[1]); - while ((n = read(pipefd[0], &buf, sizeof buf)) > 0) - content.append(buf, n); - close(pipefd[0]); - mMimeDataIn->setData(mimeType, content); - } - } + mMimeDataIn = new QWaylandMimeData; + mMimeDataIn->clearAll(); + if (!mOfferedMimeTypes.isEmpty() && mOffer) + mMimeDataIn->setFormats(mOfferedMimeTypes); return mMimeDataIn; } @@ -192,7 +237,7 @@ void QWaylandClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) if (!mDisplay->inputDevices().isEmpty()) { if (!data) data = new QMimeData; - mSelection = new QWaylandSelection(mDisplay, data); + mSelections.append(new QWaylandSelection(mDisplay, data)); } else { qWarning("QWaylandClipboard::setMimeData: No input devices"); } @@ -222,21 +267,27 @@ void QWaylandClipboard::offer(void *data, struct wl_selection_offer *selection_offer, const char *type) { + Q_UNUSED(data); Q_UNUSED(selection_offer); - QWaylandClipboard *self = static_cast<QWaylandClipboard *>(data); - self->mOfferedMimeTypes.append(QString::fromLatin1(type)); + clipboard->mOfferedMimeTypes.append(QString::fromLatin1(type)); } void QWaylandClipboard::keyboardFocus(void *data, struct wl_selection_offer *selection_offer, wl_input_device *input_device) { - QWaylandClipboard *self = static_cast<QWaylandClipboard *>(data); + Q_UNUSED(data); if (!input_device) { wl_selection_offer_destroy(selection_offer); - self->mOffer = 0; + clipboard->mOffer = 0; return; } - self->mOffer = selection_offer; - self->emitChanged(QClipboard::Clipboard); + clipboard->mOffer = selection_offer; + if (clipboard->mSelections.isEmpty()) + QMetaObject::invokeMethod(&clipboard->mEmitter, "emitChanged", Qt::QueuedConnection); +} + +void QWaylandClipboardSignalEmitter::emitChanged() +{ + clipboard->emitChanged(QClipboard::Clipboard); } diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.h b/src/plugins/platforms/wayland/qwaylandclipboard.h index dc51854..f45fb8d 100644 --- a/src/plugins/platforms/wayland/qwaylandclipboard.h +++ b/src/plugins/platforms/wayland/qwaylandclipboard.h @@ -44,18 +44,27 @@ #include <QtGui/QPlatformClipboard> #include <QtCore/QStringList> +#include <QtCore/QVariant> class QWaylandDisplay; class QWaylandSelection; +class QWaylandMimeData; struct wl_selection_offer; +class QWaylandClipboardSignalEmitter : public QObject +{ + Q_OBJECT +public slots: + void emitChanged(); +}; + class QWaylandClipboard : public QPlatformClipboard { public: QWaylandClipboard(QWaylandDisplay *display); ~QWaylandClipboard(); - const QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) const; + QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard); void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard); bool supportsMode(QClipboard::Mode mode) const; @@ -63,6 +72,8 @@ public: void createSelectionOffer(uint32_t id); + QVariant retrieveData(const QString &mimeType, QVariant::Type type) const; + private: static void offer(void *data, struct wl_selection_offer *selection_offer, @@ -76,11 +87,11 @@ private: static void forceRoundtrip(struct wl_display *display); QWaylandDisplay *mDisplay; - QWaylandSelection *mSelection; - mutable QMimeData *mMimeDataIn; + QWaylandMimeData *mMimeDataIn; QList<QWaylandSelection *> mSelections; QStringList mOfferedMimeTypes; struct wl_selection_offer *mOffer; + QWaylandClipboardSignalEmitter mEmitter; }; #endif // QWAYLANDCLIPBOARD_H diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 14a8dcf..83516e9 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -51,6 +51,10 @@ #include "gl_integration/qwaylandglintegration.h" #endif +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT +#include "windowmanager_integration/qwaylandwindowmanagerintegration.h" +#endif + #include <QtCore/QAbstractEventDispatcher> #include <QtGui/QApplication> #include <QtGui/private/qapplication_p.h> @@ -77,17 +81,17 @@ struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd, struct wl_visual *QWaylandDisplay::rgbVisual() { - return wl_display_get_rgb_visual(mDisplay); + return rgb_visual; } struct wl_visual *QWaylandDisplay::argbVisual() { - return wl_display_get_argb_visual(mDisplay); + return argb_visual; } struct wl_visual *QWaylandDisplay::argbPremultipliedVisual() { - return wl_display_get_premultiplied_argb_visual(mDisplay); + return premultiplied_argb_visual; } #ifdef QT_WAYLAND_GL_SUPPORT @@ -97,6 +101,13 @@ QWaylandGLIntegration * QWaylandDisplay::eglIntegration() } #endif +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT +QWaylandWindowManagerIntegration *QWaylandDisplay::windowManagerIntegration() +{ + return mWindowManagerIntegration; +} +#endif + void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell, uint32_t time, uint32_t edges, struct wl_surface *surface, @@ -116,6 +127,7 @@ const struct wl_shell_listener QWaylandDisplay::shellListener = { }; QWaylandDisplay::QWaylandDisplay(void) + : argb_visual(0), premultiplied_argb_visual(0), rgb_visual(0) { mDisplay = wl_display_connect(NULL); if (mDisplay == NULL) { @@ -128,6 +140,11 @@ QWaylandDisplay::QWaylandDisplay(void) #ifdef QT_WAYLAND_GL_SUPPORT mEglIntegration = QWaylandGLIntegration::createGLIntegration(this); #endif + +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT + mWindowManagerIntegration = QWaylandWindowManagerIntegration::createIntegration(this); +#endif + blockingReadEvents(); qRegisterMetaType<uint32_t>("uint32_t"); @@ -228,6 +245,11 @@ const struct wl_output_listener QWaylandDisplay::outputListener = { QWaylandDisplay::outputHandleGeometry }; +const struct wl_compositor_listener QWaylandDisplay::compositorListener = { + QWaylandDisplay::handleVisual, +}; + + void QWaylandDisplay::waitForScreens() { flushRequests(); @@ -256,6 +278,8 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id, wl_output_add_listener(output, &outputListener, this); } else if (interface == "wl_compositor") { mCompositor = wl_compositor_create(mDisplay, id, 1); + wl_compositor_add_listener(mCompositor, + &compositorListener, this); } else if (interface == "wl_shm") { mShm = wl_shm_create(mDisplay, id, 1); } else if (interface == "wl_shell"){ @@ -271,3 +295,23 @@ void QWaylandDisplay::displayHandleGlobal(uint32_t id, clipboard->createSelectionOffer(id); } } + +void QWaylandDisplay::handleVisual(void *data, + struct wl_compositor *compositor, + uint32_t id, uint32_t token) +{ + QWaylandDisplay *self = static_cast<QWaylandDisplay *>(data); + + switch (token) { + case WL_COMPOSITOR_VISUAL_ARGB32: + self->argb_visual = wl_visual_create(self->mDisplay, id, 1); + break; + case WL_COMPOSITOR_VISUAL_PREMULTIPLIED_ARGB32: + self->premultiplied_argb_visual = + wl_visual_create(self->mDisplay, id, 1); + break; + case WL_COMPOSITOR_VISUAL_XRGB32: + self->rgb_visual = wl_visual_create(self->mDisplay, id, 1); + break; + } +} diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h index 7cb2df1..765be62 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay.h @@ -55,6 +55,8 @@ class QWaylandBuffer; class QPlatformScreen; class QWaylandScreen; class QWaylandGLIntegration; +class QWaylandWindowManagerIntegration; + class QWaylandDisplay : public QObject { Q_OBJECT @@ -74,6 +76,11 @@ public: #ifdef QT_WAYLAND_GL_SUPPORT QWaylandGLIntegration *eglIntegration(); #endif + +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT + QWaylandWindowManagerIntegration *windowManagerIntegration(); +#endif + void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); void syncCallback(wl_display_sync_func_t func, void *data); @@ -109,7 +116,10 @@ private: uint32_t mSocketMask; + struct wl_visual *argb_visual, *premultiplied_argb_visual, *rgb_visual; + static const struct wl_output_listener outputListener; + static const struct wl_compositor_listener compositorListener; static int sourceUpdate(uint32_t mask, void *data); static void displayHandleGlobal(struct wl_display *display, uint32_t id, @@ -120,10 +130,17 @@ private: int32_t x, int32_t y, int32_t width, int32_t height); + static void handleVisual(void *data, + struct wl_compositor *compositor, + uint32_t id, uint32_t token); #ifdef QT_WAYLAND_GL_SUPPORT QWaylandGLIntegration *mEglIntegration; #endif +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT + QWaylandWindowManagerIntegration *mWindowManagerIntegration; +#endif + static void shellHandleConfigure(void *data, struct wl_shell *shell, uint32_t time, uint32_t edges, struct wl_surface *surface, diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index 734591f..333a953 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -46,6 +46,11 @@ #include "qwaylandinputdevice.h" #include "qwaylandscreen.h" +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT +#include "windowmanager_integration/qwaylandwindowmanagerintegration.h" +#endif + +#include <QCoreApplication> #include <QtGui/QWidget> #include <QtGui/QWindowSystemInterface> @@ -60,6 +65,11 @@ QWaylandWindow::QWaylandWindow(QWidget *window) static WId id = 1; mWindowId = id++; +#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT + mDisplay->windowManagerIntegration()->mapClientToProcess(qApp->applicationPid()); + mDisplay->windowManagerIntegration()->authenticateWithToken(); +#endif + mSurface = mDisplay->createSurface(this); } @@ -120,7 +130,6 @@ void QWaylandWindow::attach(QWaylandBuffer *buffer) } } - void QWaylandWindow::damage(const QRegion ®ion) { //We have to do sync stuff before calling damage, or we might diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro index 76f8be5..dca72fd 100644 --- a/src/plugins/platforms/wayland/wayland.pro +++ b/src/plugins/platforms/wayland/wayland.pro @@ -40,8 +40,10 @@ QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_WAYLAND INCLUDEPATH += $$PWD include ($$PWD/gl_integration/gl_integration.pri) +include ($$PWD/windowmanager_integration/windowmanager_integration.pri) include (../fontdatabases/genericunix/genericunix.pri) target.path += $$[QT_INSTALL_PLUGINS]/platforms INSTALLS += target + diff --git a/src/plugins/platforms/wayland/wayland_sha1.txt b/src/plugins/platforms/wayland/wayland_sha1.txt new file mode 100644 index 0000000..d262437 --- /dev/null +++ b/src/plugins/platforms/wayland/wayland_sha1.txt @@ -0,0 +1,3 @@ +This version of the Qt Wayland plugin is checked against the following sha1 +from the Wayland repository: +eff7fc0d99be2e51eaa351785030c8d374ac71de diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp new file mode 100644 index 0000000..e4a6218 --- /dev/null +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandwindowmanagerintegration.h" +#include "qwaylandwindowmanager-client-protocol.h" + +#include <stdint.h> + +QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegration(QWaylandDisplay *waylandDisplay) +{ + return new QWaylandWindowManagerIntegration(waylandDisplay); +} + +QWaylandWindowManagerIntegration::QWaylandWindowManagerIntegration(QWaylandDisplay *waylandDisplay) + : mWaylandDisplay(waylandDisplay) + , mWaylandWindowManager(0) +{ + wl_display_add_global_listener(mWaylandDisplay->wl_display(), + QWaylandWindowManagerIntegration::wlHandleListenerGlobal, + this); +} + +QWaylandWindowManagerIntegration::~QWaylandWindowManagerIntegration() +{ + +} + +struct wl_windowmanager *QWaylandWindowManagerIntegration::windowManager() const +{ + return mWaylandWindowManager; +} + +void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) +{ + if (strcmp(interface, "wl_windowmanager") == 0) { + QWaylandWindowManagerIntegration *integration = static_cast<QWaylandWindowManagerIntegration *>(data); + integration->mWaylandWindowManager = wl_windowmanager_create(display, id); + } +} + +void QWaylandWindowManagerIntegration::mapClientToProcess(long long processId) +{ + if (mWaylandWindowManager) + wl_windowmanager_map_client_to_process(mWaylandWindowManager, (uint32_t) processId); +} + +void QWaylandWindowManagerIntegration::authenticateWithToken(const QByteArray &token) +{ + QByteArray authToken = token; + if (authToken.isEmpty()) + authToken = qgetenv("WL_AUTHENTICATION_TOKEN"); + if (mWaylandWindowManager) + wl_windowmanager_authenticate_with_token(mWaylandWindowManager, authToken.constData()); +} diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h new file mode 100644 index 0000000..a79f205 --- /dev/null +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDWINDOWMANAGERINTEGRATION_H +#define QWAYLANDWINDOWMANAGERINTEGRATION_H + +#include <QObject> +#include "wayland-client.h" +#include "qwaylanddisplay.h" + +class QWaylandWindowManagerIntegration +{ +public: + explicit QWaylandWindowManagerIntegration(QWaylandDisplay *waylandDisplay); + virtual ~QWaylandWindowManagerIntegration(); + static QWaylandWindowManagerIntegration *createIntegration(QWaylandDisplay *waylandDisplay); + struct wl_windowmanager *windowManager() const; + + void mapSurfaceToProcess(struct wl_surface *surface, long long processId); + void mapClientToProcess(long long processId); + void authenticateWithToken(const QByteArray &token = QByteArray()); + +private: + static void wlHandleListenerGlobal(wl_display *display, uint32_t id, + const char *interface, uint32_t version, void *data); + +private: + QWaylandDisplay *mWaylandDisplay; + struct wl_windowmanager *mWaylandWindowManager; +}; + +#endif // QWAYLANDWINDOWMANAGERINTEGRATION_H diff --git a/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri b/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri new file mode 100644 index 0000000..664389a --- /dev/null +++ b/src/plugins/platforms/wayland/windowmanager_integration/windowmanager_integration.pri @@ -0,0 +1,16 @@ +DEFINES += QT_WAYLAND_WINDOWMANAGER_SUPPORT + +contains(DEFINES, QT_WAYLAND_WINDOWMANAGER_SUPPORT) { + + HEADERS += \ + $$PWD/qwaylandwindowmanagerintegration.h + + SOURCES += \ + $$PWD/qwaylandwindowmanagerintegration.cpp + + INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/wayland + HEADERS += \ + $$QT_SOURCE_TREE/src/3rdparty/wayland/qwaylandwindowmanager-client-protocol.h + SOURCES += \ + $$QT_SOURCE_TREE/src/3rdparty/wayland/wayland-windowmanager-protocol.c +} diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index c687e4c..0a02c7e 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -113,7 +113,8 @@ QXcbWindow::QXcbWindow(QWidget *tlw) #if defined(XCB_USE_GLX) || defined(XCB_USE_EGL) if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL - && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) + && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL) + || tlw->platformWindowFormat().alpha()) { #if defined(XCB_USE_GLX) XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat()); @@ -131,13 +132,17 @@ QXcbWindow::QXcbWindow(QWidget *tlw) visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount); #endif //XCB_USE_GLX if (visualInfo) { + m_depth = visualInfo->depth; + m_format = (m_depth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), m_screen->root(), visualInfo->visual, AllocNone); XSetWindowAttributes a; + a.background_pixel = WhitePixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber()); + a.border_pixel = BlackPixel(DISPLAY_FROM_XCB(this), m_screen->screenNumber()); a.colormap = cmap; m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), tlw->x(), tlw->y(), tlw->width(), tlw->height(), 0, visualInfo->depth, InputOutput, visualInfo->visual, - CWColormap, &a); + CWBackPixel|CWBorderPixel|CWColormap, &a); printf("created GL window: %d\n", m_window); } else { @@ -147,6 +152,8 @@ QXcbWindow::QXcbWindow(QWidget *tlw) #endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL) { m_window = xcb_generate_id(xcb_connection()); + m_depth = m_screen->screen()->root_depth; + m_format = (m_depth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; Q_XCB_CALL(xcb_create_window(xcb_connection(), XCB_COPY_FROM_PARENT, // depth -- same as root diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 3f4d2d2..69d0bc2 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -44,6 +44,7 @@ #include <QtGui/QPlatformWindow> #include <QtGui/QPlatformWindowFormat> +#include <QtGui/QImage> #include <xcb/xcb.h> #include <xcb/sync.h> @@ -74,6 +75,8 @@ public: QPlatformGLContext *glContext() const; xcb_window_t window() const { return m_window; } + uint depth() const { return m_depth; } + QImage::Format format() const { return m_format; } void handleExposeEvent(const xcb_expose_event_t *event); void handleClientMessageEvent(const xcb_client_message_event_t *event); @@ -99,6 +102,9 @@ private: xcb_window_t m_window; QPlatformGLContext *m_context; + uint m_depth; + QImage::Format m_format; + xcb_sync_int64_t m_syncValue; xcb_sync_counter_t m_syncCounter; diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp index 827a899..4fcd207 100644 --- a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp +++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp @@ -54,11 +54,12 @@ #include <stdio.h> #include <qdebug.h> +#include <qpainter.h> class QXcbShmImage : public QXcbObject { public: - QXcbShmImage(QXcbScreen *connection, const QSize &size); + QXcbShmImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format); ~QXcbShmImage() { destroy(); } QImage *image() { return &m_qimage; } @@ -81,7 +82,7 @@ private: QRegion m_dirty; }; -QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size) +QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format) : QXcbObject(screen->connection()) , m_gc(0) , m_gc_window(0) @@ -91,7 +92,7 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size) size.width(), size.height(), XCB_IMAGE_FORMAT_Z_PIXMAP, - screen->depth(), + depth, 0, ~0, 0); @@ -111,7 +112,7 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size) if (shmctl(m_shm_info.shmid, IPC_RMID, 0) == -1) qWarning() << "QXcbWindowSurface: Error while marking the shared memory segment to be destroyed"; - m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, screen->format()); + m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format); } void QXcbShmImage::destroy() @@ -189,6 +190,16 @@ QPaintDevice *QXcbWindowSurface::paintDevice() void QXcbWindowSurface::beginPaint(const QRegion ®ion) { m_image->preparePaint(region); + + if (m_image->image()->hasAlphaChannel()) { + QPainter p(m_image->image()); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QVector<QRect> rects = region.rects(); + const QColor blank = Qt::transparent; + for (QVector<QRect>::const_iterator it = rects.begin(); it != rects.end(); ++it) { + p.fillRect(*it, blank); + } + } } void QXcbWindowSurface::endPaint(const QRegion &) @@ -232,9 +243,10 @@ void QXcbWindowSurface::resize(const QSize &size) QWindowSurface::resize(size); QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window())); + QXcbWindow* win = static_cast<QXcbWindow *>(window()->platformWindow()); delete m_image; - m_image = new QXcbShmImage(screen, size); + m_image = new QXcbShmImage(screen, size, win->depth(), win->format()); Q_XCB_NOOP(connection()); m_syncingResize = true; diff --git a/src/plugins/platforms/xlib/qxlibclipboard.cpp b/src/plugins/platforms/xlib/qxlibclipboard.cpp index dbe81e0..2c1d91b 100644 --- a/src/plugins/platforms/xlib/qxlibclipboard.cpp +++ b/src/plugins/platforms/xlib/qxlibclipboard.cpp @@ -161,12 +161,11 @@ QXlibClipboard::QXlibClipboard(QXlibScreen *screen) { } -const QMimeData * QXlibClipboard::mimeData(QClipboard::Mode mode) const +QMimeData * QXlibClipboard::mimeData(QClipboard::Mode mode) { if (mode == QClipboard::Clipboard) { if (!m_xClipboard) { - QXlibClipboard *that = const_cast<QXlibClipboard *>(this); - that->m_xClipboard = new QXlibClipboardMime(mode,that); + m_xClipboard = new QXlibClipboardMime(mode, this); } Window clipboardOwner = XGetSelectionOwner(screen()->display()->nativeDisplay(),QXlibStatic::atom(QXlibStatic::CLIPBOARD)); if (clipboardOwner == owner()) { @@ -176,8 +175,7 @@ const QMimeData * QXlibClipboard::mimeData(QClipboard::Mode mode) const } } else if (mode == QClipboard::Selection) { if (!m_xSelection) { - QXlibClipboard *that = const_cast<QXlibClipboard *>(this); - that->m_xSelection = new QXlibClipboardMime(mode,that); + m_xSelection = new QXlibClipboardMime(mode, this); } Window clipboardOwner = XGetSelectionOwner(screen()->display()->nativeDisplay(),XA_PRIMARY); if (clipboardOwner == owner()) { diff --git a/src/plugins/platforms/xlib/qxlibclipboard.h b/src/plugins/platforms/xlib/qxlibclipboard.h index 5d78a7f..8fdc18b 100644 --- a/src/plugins/platforms/xlib/qxlibclipboard.h +++ b/src/plugins/platforms/xlib/qxlibclipboard.h @@ -51,7 +51,7 @@ class QXlibClipboard : public QPlatformClipboard public: QXlibClipboard(QXlibScreen *screen); - const QMimeData *mimeData(QClipboard::Mode mode) const; + QMimeData *mimeData(QClipboard::Mode mode); void setMimeData(QMimeData *data, QClipboard::Mode mode); bool supportsMode(QClipboard::Mode mode) const; diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp index 90ef066..02104d9 100644 --- a/src/plugins/platforms/xlib/qxlibintegration.cpp +++ b/src/plugins/platforms/xlib/qxlibintegration.cpp @@ -150,7 +150,7 @@ bool QXlibIntegration::hasOpenGL() const { #if !defined(QT_NO_OPENGL) #if !defined(QT_OPENGL_ES_2) - QXlibScreen *screen = static_cast<const QXlibScreen *>(mScreens.at(0)); + QXlibScreen *screen = static_cast<QXlibScreen *>(mScreens.at(0)); return glXQueryExtension(screen->display()->nativeDisplay(), 0, 0) != 0; #else static bool eglHasbeenInitialized = false; diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp index 8f21ec3..b069985 100644 --- a/src/plugins/platforms/xlib/qxlibscreen.cpp +++ b/src/plugins/platforms/xlib/qxlibscreen.cpp @@ -41,6 +41,8 @@ #include "qxlibscreen.h" +#include <X11/extensions/Xfixes.h> + #include "qxlibcursor.h" #include "qxlibwindow.h" #include "qxlibkeyboard.h" diff --git a/src/plugins/platforms/xlib/qxlibstatic.h b/src/plugins/platforms/xlib/qxlibstatic.h index b46b28d..9caa2fa 100644 --- a/src/plugins/platforms/xlib/qxlibstatic.h +++ b/src/plugins/platforms/xlib/qxlibstatic.h @@ -136,6 +136,7 @@ typedef char *XPointer; #endif #ifndef QT_NO_XFIXES +#include <X11/extensions/Xfixes.h> typedef Bool (*PtrXFixesQueryExtension)(Display *, int *, int *); typedef Status (*PtrXFixesQueryVersion)(Display *, int *, int *); typedef void (*PtrXFixesSetCursorName)(Display *dpy, Cursor cursor, const char *name); diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp index 1666b1c..823fae9 100644 --- a/src/plugins/platforms/xlib/qxlibwindow.cpp +++ b/src/plugins/platforms/xlib/qxlibwindow.cpp @@ -47,14 +47,6 @@ #include "qxlibstatic.h" #include "qxlibdisplay.h" -#include <QtGui/QWindowSystemInterface> -#include <QSocketNotifier> -#include <QApplication> -#include <QDebug> - -#include <QtGui/private/qwindowsurface_p.h> -#include <QtGui/private/qapplication_p.h> - #if !defined(QT_NO_OPENGL) #if !defined(QT_OPENGL_ES_2) #include "qglxintegration.h" @@ -66,6 +58,15 @@ #endif //QT_OPENGL_ES_2 #endif //QT_NO_OPENGL + +#include <QtGui/QWindowSystemInterface> +#include <QSocketNotifier> +#include <QApplication> +#include <QDebug> + +#include <QtGui/private/qwindowsurface_p.h> +#include <QtGui/private/qapplication_p.h> + //#define MYX11_DEBUG QT_BEGIN_NAMESPACE @@ -80,9 +81,10 @@ QXlibWindow::QXlibWindow(QWidget *window) int w = window->width(); int h = window->height(); - if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL - && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL) ) { #if !defined(QT_NO_OPENGL) + if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL + && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL) + || window->platformWindowFormat().alpha()) { #if !defined(QT_OPENGL_ES_2) XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(),mScreen->xScreenNumber(),window->platformWindowFormat()); #else @@ -101,18 +103,28 @@ QXlibWindow::QXlibWindow(QWidget *window) visualInfo = XGetVisualInfo(mScreen->display()->nativeDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount); #endif //!defined(QT_OPENGL_ES_2) if (visualInfo) { - Colormap cmap = XCreateColormap(mScreen->display()->nativeDisplay(),mScreen->rootWindow(),visualInfo->visual,AllocNone); + mDepth = visualInfo->depth; + mFormat = (mDepth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; + mVisual = visualInfo->visual; + Colormap cmap = XCreateColormap(mScreen->display()->nativeDisplay(), mScreen->rootWindow(), visualInfo->visual, AllocNone); XSetWindowAttributes a; + a.background_pixel = WhitePixel(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber()); + a.border_pixel = BlackPixel(mScreen->display()->nativeDisplay(), mScreen->xScreenNumber()); a.colormap = cmap; x_window = XCreateWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(),x, y, w, h, 0, visualInfo->depth, InputOutput, visualInfo->visual, - CWColormap, &a); + CWBackPixel|CWBorderPixel|CWColormap, &a); } else { qFatal("no window!"); } + } else #endif //!defined(QT_NO_OPENGL) - } else { + { + mDepth = mScreen->depth(); + mFormat = (mDepth == 32) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; + mVisual = mScreen->defaultVisual(); + x_window = XCreateSimpleWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(), x, y, w, h, 0 /*border_width*/, mScreen->blackPixel(), mScreen->whitePixel()); diff --git a/src/plugins/platforms/xlib/qxlibwindow.h b/src/plugins/platforms/xlib/qxlibwindow.h index adc2f85..da29efb 100644 --- a/src/plugins/platforms/xlib/qxlibwindow.h +++ b/src/plugins/platforms/xlib/qxlibwindow.h @@ -122,6 +122,10 @@ public: Window xWindow() const; GC graphicsContext() const; + inline uint depth() const { return mDepth; } + QImage::Format format() const { return mFormat; } + Visual* visual() const { return mVisual; } + protected: QVector<Atom> getNetWmState() const; void setMWMHints(const QXlibMWMHints &mwmhints); @@ -135,6 +139,10 @@ private: Window x_window; GC gc; + uint mDepth; + QImage::Format mFormat; + Visual* mVisual; + GC createGC(); QPlatformGLContext *mGLContext; diff --git a/src/plugins/platforms/xlib/qxlibwindowsurface.cpp b/src/plugins/platforms/xlib/qxlibwindowsurface.cpp index add21ac..e0c272d 100644 --- a/src/plugins/platforms/xlib/qxlibwindowsurface.cpp +++ b/src/plugins/platforms/xlib/qxlibwindowsurface.cpp @@ -49,6 +49,8 @@ #include "qxlibscreen.h" #include "qxlibdisplay.h" +#include "qpainter.h" + # include <sys/ipc.h> # include <sys/shm.h> # include <X11/extensions/XShm.h> @@ -80,20 +82,19 @@ void QXlibShmImageInfo::destroy() void QXlibWindowSurface::resizeShmImage(int width, int height) { + QXlibScreen *screen = QXlibScreen::testLiteScreenForWidget(window()); + QXlibWindow *win = static_cast<QXlibWindow*>(window()->platformWindow()); #ifdef DONT_USE_MIT_SHM - shm_img = QImage(width, height, QImage::Format_RGB32); + shm_img = QImage(width, height, win->format()); #else - QXlibScreen *screen = QXlibScreen::testLiteScreenForWidget(window()); if (image_info) image_info->destroy(); else image_info = new QXlibShmImageInfo(screen->display()->nativeDisplay()); - Visual *visual = screen->defaultVisual(); - - XImage *image = XShmCreateImage (screen->display()->nativeDisplay(), visual, 24, ZPixmap, 0, + XImage *image = XShmCreateImage (screen->display()->nativeDisplay(), win->visual(), win->depth(), ZPixmap, 0, &image_info->shminfo, width, height); @@ -109,7 +110,7 @@ void QXlibWindowSurface::resizeShmImage(int width, int height) Q_ASSERT(shm_attach_status == True); - shm_img = QImage( (uchar*) image->data, image->width, image->height, image->bytes_per_line, QImage::Format_RGB32 ); + shm_img = QImage( (uchar*) image->data, image->width, image->height, image->bytes_per_line, win->format() ); #endif painted = false; } @@ -160,11 +161,11 @@ void QXlibWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPo #ifdef DONT_USE_MIT_SHM // just convert the image every time... if (!shm_img.isNull()) { - Visual *visual = DefaultVisual(screen->display(), screen->xScreenNumber()); + QXlibWindow *win = static_cast<QXlibWindow*>(window()->platformWindow()); QImage image = shm_img; //img.convertToFormat( - XImage *xi = XCreateImage(screen->display(), visual, 24, ZPixmap, + XImage *xi = XCreateImage(screen->display(), win->visual(), win->depth(), ZPixmap, 0, (char *) image.scanLine(0), image.width(), image.height(), 32, image.bytesPerLine()); @@ -214,6 +215,16 @@ void QXlibWindowSurface::beginPaint(const QRegion ®ion) { Q_UNUSED(region); resizeBuffer(size()); + + if (shm_img.hasAlphaChannel()) { + QPainter p(&shm_img); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QVector<QRect> rects = region.rects(); + const QColor blank = Qt::transparent; + for (QVector<QRect>::const_iterator it = rects.begin(); it != rects.end(); ++it) { + p.fillRect(*it, blank); + } + } } void QXlibWindowSurface::endPaint(const QRegion ®ion) diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 2d0c201..94ce675 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -11,7 +11,6 @@ unix:!symbian { embedded:SUBDIRS *= gfxdrivers decorations mousedrivers kbddrivers !win32:!embedded:!mac:!symbian:!contains(QT_CONFIG, no-gui):SUBDIRS *= inputmethods !symbian:!contains(QT_CONFIG, no-gui):SUBDIRS += accessible -symbian:SUBDIRS += s60 contains(QT_CONFIG, phonon): SUBDIRS *= phonon qpa:SUBDIRS += platforms contains(QT_CONFIG, declarative): SUBDIRS *= qmltooling diff --git a/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool.cpp b/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool.cpp deleted file mode 100644 index c3790e4..0000000 --- a/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 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 "subcomponenteditortool_p.h" -#include "subcomponentmasklayeritem_p.h" -#include "livelayeritem_p.h" - -#include "../qdeclarativeviewobserver_p_p.h" - -#include <QtGui/QGraphicsItem> -#include <QtGui/QGraphicsObject> -#include <QtGui/QMouseEvent> -#include <QtGui/QKeyEvent> - -#include <QtCore/QTimer> -#include <QtCore/QDebug> - -QT_BEGIN_NAMESPACE - -const qreal MaxOpacity = 0.5f; - -SubcomponentEditorTool::SubcomponentEditorTool(QDeclarativeViewObserver *view) - : AbstractLiveEditTool(view), - m_animIncrement(0.05f), - m_animTimer(new QTimer(this)) -{ - QDeclarativeViewObserverPrivate *observerPrivate = - QDeclarativeViewObserverPrivate::get(view); - m_mask = new SubcomponentMaskLayerItem(view, observerPrivate->manipulatorLayer); - connect(m_animTimer, SIGNAL(timeout()), SLOT(animate())); - m_animTimer->setInterval(20); -} - -SubcomponentEditorTool::~SubcomponentEditorTool() -{ - -} - -void SubcomponentEditorTool::mousePressEvent(QMouseEvent * /*event*/) -{ - -} - -void SubcomponentEditorTool::mouseMoveEvent(QMouseEvent * /*event*/) -{ - -} - -bool SubcomponentEditorTool::containsCursor(const QPoint &mousePos) const -{ - if (!m_currentContext.size()) - return false; - - QPointF scenePos = view()->mapToScene(mousePos); - QRectF itemRect = m_currentContext.top()->boundingRect() - | m_currentContext.top()->childrenBoundingRect(); - QRectF polyRect = m_currentContext.top()->mapToScene(itemRect).boundingRect(); - - return polyRect.contains(scenePos); -} - -void SubcomponentEditorTool::mouseReleaseEvent(QMouseEvent * /*event*/) -{ - -} - -void SubcomponentEditorTool::mouseDoubleClickEvent(QMouseEvent *event) -{ - if (event->buttons() & Qt::LeftButton - && !containsCursor(event->pos()) - && m_currentContext.size() > 1) - { - aboutToPopContext(); - } -} - -void SubcomponentEditorTool::hoverMoveEvent(QMouseEvent *event) -{ - if (!containsCursor(event->pos()) && m_currentContext.size() > 1) { - QDeclarativeViewObserverPrivate::get(observer())->clearHighlight(); - } -} - -void SubcomponentEditorTool::wheelEvent(QWheelEvent * /*event*/) -{ - -} - -void SubcomponentEditorTool::keyPressEvent(QKeyEvent * /*event*/) -{ - -} - -void SubcomponentEditorTool::keyReleaseEvent(QKeyEvent * /*keyEvent*/) -{ - -} - -void SubcomponentEditorTool::itemsAboutToRemoved(const QList<QGraphicsItem*> &/*itemList*/) -{ - -} - -void SubcomponentEditorTool::animate() -{ - if (m_animIncrement > 0) { - if (m_mask->opacity() + m_animIncrement < MaxOpacity) { - m_mask->setOpacity(m_mask->opacity() + m_animIncrement); - } else { - m_animTimer->stop(); - m_mask->setOpacity(MaxOpacity); - } - } else { - if (m_mask->opacity() + m_animIncrement > 0) { - m_mask->setOpacity(m_mask->opacity() + m_animIncrement); - } else { - m_animTimer->stop(); - m_mask->setOpacity(0); - popContext(); - emit contextPathChanged(m_path); - } - } - -} - -void SubcomponentEditorTool::clear() -{ - m_currentContext.clear(); - m_mask->setCurrentItem(0); - m_animTimer->stop(); - m_mask->hide(); - m_path.clear(); - - emit contextPathChanged(m_path); - emit cleared(); -} - -void SubcomponentEditorTool::selectedItemsChanged(const QList<QGraphicsItem*> &/*itemList*/) -{ - -} - -void SubcomponentEditorTool::setCurrentItem(QGraphicsItem* contextItem) -{ - if (!contextItem) - return; - - QGraphicsObject *gfxObject = contextItem->toGraphicsObject(); - if (!gfxObject) - return; - - //QString parentClassName = gfxObject->metaObject()->className(); - //if (parentClassName.contains(QRegExp("_QMLTYPE_\\d+"))) - - bool containsSelectableItems = false; - foreach (QGraphicsItem *item, gfxObject->childItems()) { - if (item->type() == Constants::EditorItemType - || item->type() == Constants::ResizeHandleItemType) - { - continue; - } - containsSelectableItems = true; - break; - } - - if (containsSelectableItems) { - m_mask->setCurrentItem(gfxObject); - m_mask->setOpacity(0); - m_mask->show(); - m_animIncrement = 0.05f; - m_animTimer->start(); - - QDeclarativeViewObserverPrivate::get(observer())->clearHighlight(); - observer()->setSelectedItems(QList<QGraphicsItem*>()); - - pushContext(gfxObject); - } -} - -QGraphicsItem *SubcomponentEditorTool::firstChildOfContext(QGraphicsItem *item) const -{ - if (!item) - return 0; - - if (isDirectChildOfContext(item)) - return item; - - QGraphicsItem *parent = item->parentItem(); - while (parent) { - if (isDirectChildOfContext(parent)) - return parent; - parent = parent->parentItem(); - } - - return 0; -} - -bool SubcomponentEditorTool::isChildOfContext(QGraphicsItem *item) const -{ - return (firstChildOfContext(item) != 0); -} - -bool SubcomponentEditorTool::isDirectChildOfContext(QGraphicsItem *item) const -{ - return (item->parentItem() == m_currentContext.top()); -} - -bool SubcomponentEditorTool::itemIsChildOfQmlSubComponent(QGraphicsItem *item) const -{ - if (item->parentItem() && item->parentItem() != m_currentContext.top()) { - QGraphicsObject *parent = item->parentItem()->toGraphicsObject(); - QString parentClassName = QLatin1String(parent->metaObject()->className()); - - if (parentClassName.contains(QRegExp(QLatin1String("_QMLTYPE_\\d+")))) { - return true; - } else { - return itemIsChildOfQmlSubComponent(parent); - } - } - - return false; -} - -void SubcomponentEditorTool::pushContext(QGraphicsObject *contextItem) -{ - connect(contextItem, SIGNAL(destroyed(QObject*)), this, SLOT(contextDestroyed(QObject*))); - connect(contextItem, SIGNAL(xChanged()), this, SLOT(resizeMask())); - connect(contextItem, SIGNAL(yChanged()), this, SLOT(resizeMask())); - connect(contextItem, SIGNAL(widthChanged()), this, SLOT(resizeMask())); - connect(contextItem, SIGNAL(heightChanged()), this, SLOT(resizeMask())); - connect(contextItem, SIGNAL(rotationChanged()), this, SLOT(resizeMask())); - - m_currentContext.push(contextItem); - QString title = titleForItem(contextItem); - emit contextPushed(title); - - m_path << title; - emit contextPathChanged(m_path); -} - -void SubcomponentEditorTool::aboutToPopContext() -{ - if (m_currentContext.size() > 2) { - popContext(); - emit contextPathChanged(m_path); - } else { - m_animIncrement = -0.05f; - m_animTimer->start(); - } -} - -QGraphicsObject *SubcomponentEditorTool::popContext() -{ - QGraphicsObject *popped = m_currentContext.pop(); - m_path.removeLast(); - - emit contextPopped(); - - disconnect(popped, SIGNAL(xChanged()), this, SLOT(resizeMask())); - disconnect(popped, SIGNAL(yChanged()), this, SLOT(resizeMask())); - disconnect(popped, SIGNAL(scaleChanged()), this, SLOT(resizeMask())); - disconnect(popped, SIGNAL(widthChanged()), this, SLOT(resizeMask())); - disconnect(popped, SIGNAL(heightChanged()), this, SLOT(resizeMask())); - - if (m_currentContext.size() > 1) { - QGraphicsObject *item = m_currentContext.top(); - m_mask->setCurrentItem(item); - m_mask->setOpacity(MaxOpacity); - m_mask->setVisible(true); - } else { - m_mask->setVisible(false); - } - - return popped; -} - -void SubcomponentEditorTool::resizeMask() -{ - QGraphicsObject *item = m_currentContext.top(); - m_mask->setCurrentItem(item); -} - -QGraphicsObject *SubcomponentEditorTool::currentRootItem() const -{ - return m_currentContext.top(); -} - -void SubcomponentEditorTool::contextDestroyed(QObject *contextToDestroy) -{ - disconnect(contextToDestroy, SIGNAL(destroyed(QObject*)), - this, SLOT(contextDestroyed(QObject*))); - - // pop out the whole context - it might not be safe anymore. - while (m_currentContext.size() > 1) { - m_currentContext.pop(); - m_path.removeLast(); - emit contextPopped(); - } - m_mask->setVisible(false); - - emit contextPathChanged(m_path); -} - -QGraphicsObject *SubcomponentEditorTool::setContext(int contextIndex) -{ - Q_ASSERT(contextIndex >= 0); - - // sometimes we have to delete the context while user was still clicking around, - // so just bail out. - if (contextIndex >= m_currentContext.size() -1) - return 0; - - while (m_currentContext.size() - 1 > contextIndex) { - popContext(); - } - emit contextPathChanged(m_path); - - return m_currentContext.top(); -} - -int SubcomponentEditorTool::contextIndex() const -{ - return m_currentContext.size() - 1; -} - -QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool_p.h b/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool_p.h deleted file mode 100644 index 29b2956..0000000 --- a/src/plugins/qmltooling/declarativeobserver/editor/subcomponenteditortool_p.h +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 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 SUBCOMPONENTEDITORTOOL_H -#define SUBCOMPONENTEDITORTOOL_H - -#include "abstractliveedittool_p.h" - -#include <QtCore/QStack> -#include <QtCore/QStringList> - -QT_FORWARD_DECLARE_CLASS(QGraphicsObject) -QT_FORWARD_DECLARE_CLASS(QPoint) -QT_FORWARD_DECLARE_CLASS(QTimer) - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class SubcomponentMaskLayerItem; - -class SubcomponentEditorTool : public AbstractLiveEditTool -{ - Q_OBJECT - -public: - SubcomponentEditorTool(QDeclarativeViewObserver *view); - ~SubcomponentEditorTool(); - - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - - void hoverMoveEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *keyEvent); - void itemsAboutToRemoved(const QList<QGraphicsItem*> &itemList); - - void clear(); - - bool containsCursor(const QPoint &mousePos) const; - bool itemIsChildOfQmlSubComponent(QGraphicsItem *item) const; - - bool isChildOfContext(QGraphicsItem *item) const; - bool isDirectChildOfContext(QGraphicsItem *item) const; - QGraphicsItem *firstChildOfContext(QGraphicsItem *item) const; - - void setCurrentItem(QGraphicsItem *contextObject); - - void pushContext(QGraphicsObject *contextItem); - - QGraphicsObject *currentRootItem() const; - QGraphicsObject *setContext(int contextIndex); - int contextIndex() const; - -signals: - void exitContextRequested(); - void cleared(); - void contextPushed(const QString &contextTitle); - void contextPopped(); - void contextPathChanged(const QStringList &path); - -protected: - void selectedItemsChanged(const QList<QGraphicsItem*> &itemList); - -private slots: - void animate(); - void contextDestroyed(QObject *context); - void resizeMask(); - -private: - QGraphicsObject *popContext(); - void aboutToPopContext(); - -private: - QStack<QGraphicsObject *> m_currentContext; - QStringList m_path; - - qreal m_animIncrement; - SubcomponentMaskLayerItem *m_mask; - QTimer *m_animTimer; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // SUBCOMPONENTEDITORTOOL_H diff --git a/src/plugins/qmltooling/declarativeobserver/editor/abstractliveedittool.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/abstractliveedittool.cpp index c2ea17c..36e6ba0 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/abstractliveedittool.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/abstractliveedittool.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include "abstractliveedittool_p.h" -#include "../qdeclarativeviewobserver_p_p.h" +#include "../qdeclarativeviewinspector_p_p.h" #include <QDeclarativeEngine> @@ -50,8 +50,8 @@ QT_BEGIN_NAMESPACE -AbstractLiveEditTool::AbstractLiveEditTool(QDeclarativeViewObserver *editorView) - : QObject(editorView), m_observer(editorView) +AbstractLiveEditTool::AbstractLiveEditTool(QDeclarativeViewInspector *editorView) + : QObject(editorView), m_inspector(editorView) { } @@ -60,14 +60,14 @@ AbstractLiveEditTool::~AbstractLiveEditTool() { } -QDeclarativeViewObserver *AbstractLiveEditTool::observer() const +QDeclarativeViewInspector *AbstractLiveEditTool::inspector() const { - return m_observer; + return m_inspector; } QDeclarativeView *AbstractLiveEditTool::view() const { - return m_observer->declarativeView(); + return m_inspector->declarativeView(); } QGraphicsScene* AbstractLiveEditTool::scene() const @@ -82,12 +82,7 @@ void AbstractLiveEditTool::updateSelectedItems() QList<QGraphicsItem*> AbstractLiveEditTool::items() const { - return observer()->selectedItems(); -} - -void AbstractLiveEditTool::enterContext(QGraphicsItem *itemToEnter) -{ - observer()->data->enterContext(itemToEnter); + return inspector()->selectedItems(); } bool AbstractLiveEditTool::topItemIsMovable(const QList<QGraphicsItem*> & itemList) @@ -104,7 +99,7 @@ bool AbstractLiveEditTool::topItemIsMovable(const QList<QGraphicsItem*> & itemLi bool AbstractLiveEditTool::topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList) { - QList<QGraphicsItem*> selectedItems = observer()->selectedItems(); + QList<QGraphicsItem*> selectedItems = inspector()->selectedItems(); foreach (QGraphicsItem *item, itemList) { QDeclarativeItem *declarativeItem = toQDeclarativeItem(item); @@ -180,7 +175,7 @@ QString AbstractLiveEditTool::titleForItem(QGraphicsItem *item) QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem*>(gfxObject); if (declarativeItem) { - objectStringId = m_observer->idStringForObject(declarativeItem); + objectStringId = m_inspector->idStringForObject(declarativeItem); } if (!objectStringId.isEmpty()) { diff --git a/src/plugins/qmltooling/declarativeobserver/editor/abstractliveedittool_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/abstractliveedittool_p.h index 7d46db6..17eb6ea 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/abstractliveedittool_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/abstractliveedittool_p.h @@ -62,13 +62,13 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class AbstractLiveEditTool : public QObject { Q_OBJECT public: - AbstractLiveEditTool(QDeclarativeViewObserver *observer); + AbstractLiveEditTool(QDeclarativeViewInspector *inspector); virtual ~AbstractLiveEditTool(); @@ -89,8 +89,6 @@ public: void updateSelectedItems(); QList<QGraphicsItem*> items() const; - void enterContext(QGraphicsItem *itemToEnter); - bool topItemIsMovable(const QList<QGraphicsItem*> &itemList); bool topItemIsResizeHandle(const QList<QGraphicsItem*> &itemList); bool topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList); @@ -105,12 +103,12 @@ public: protected: virtual void selectedItemsChanged(const QList<QGraphicsItem*> &objectList) = 0; - QDeclarativeViewObserver *observer() const; + QDeclarativeViewInspector *inspector() const; QDeclarativeView *view() const; QGraphicsScene *scene() const; private: - QDeclarativeViewObserver *m_observer; + QDeclarativeViewInspector *m_inspector; QList<QGraphicsItem*> m_itemList; }; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/boundingrecthighlighter.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/boundingrecthighlighter.cpp index 068f6de..3f95005 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/boundingrecthighlighter.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/boundingrecthighlighter.cpp @@ -41,8 +41,8 @@ #include "boundingrecthighlighter_p.h" -#include "../qdeclarativeviewobserver_p.h" -#include "../qmlobserverconstants_p.h" +#include "../qdeclarativeviewinspector_p.h" +#include "../qmlinspectorconstants_p.h" #include <QtGui/QGraphicsPolygonItem> @@ -52,10 +52,6 @@ QT_BEGIN_NAMESPACE -const qreal AnimDelta = 0.025f; -const int AnimInterval = 30; -const int AnimFrames = 10; - BoundingBox::BoundingBox(QGraphicsObject *itemToHighlight, QGraphicsItem *parentItem, QObject *parent) : QObject(parent), @@ -91,14 +87,10 @@ int BoundingBoxPolygonItem::type() const return Constants::EditorItemType; } -BoundingRectHighlighter::BoundingRectHighlighter(QDeclarativeViewObserver *view) : +BoundingRectHighlighter::BoundingRectHighlighter(QDeclarativeViewInspector *view) : LiveLayerItem(view->declarativeView()->scene()), - m_view(view), - m_animFrame(0) + m_view(view) { - m_animTimer = new QTimer(this); - m_animTimer->setInterval(AnimInterval); - connect(m_animTimer, SIGNAL(timeout()), SLOT(animTimeout())); } BoundingRectHighlighter::~BoundingRectHighlighter() @@ -106,37 +98,17 @@ BoundingRectHighlighter::~BoundingRectHighlighter() } -void BoundingRectHighlighter::animTimeout() -{ - ++m_animFrame; - if (m_animFrame == AnimFrames) { - m_animTimer->stop(); - } - - qreal alpha = m_animFrame / float(AnimFrames); - - foreach (BoundingBox *box, m_boxes) { - box->highlightPolygonEdge->setOpacity(alpha); - } -} - void BoundingRectHighlighter::clear() { - if (m_boxes.length()) { - m_animTimer->stop(); - - foreach (BoundingBox *box, m_boxes) { - freeBoundingBox(box); - } - } + foreach (BoundingBox *box, m_boxes) + freeBoundingBox(box); } BoundingBox *BoundingRectHighlighter::boxFor(QGraphicsObject *item) const { foreach (BoundingBox *box, m_boxes) { - if (box->highlightedObject.data() == item) { + if (box->highlightedObject.data() == item) return box; - } } return 0; } @@ -146,15 +118,11 @@ void BoundingRectHighlighter::highlight(QList<QGraphicsObject*> items) if (items.isEmpty()) return; - bool animate = false; - QList<BoundingBox *> newBoxes; foreach (QGraphicsObject *itemToHighlight, items) { BoundingBox *box = boxFor(itemToHighlight); - if (!box) { + if (!box) box = createBoundingBox(itemToHighlight); - animate = true; - } newBoxes << box; } @@ -165,7 +133,7 @@ void BoundingRectHighlighter::highlight(QList<QGraphicsObject*> items) m_boxes << newBoxes; } - highlightAll(animate); + highlightAll(); } void BoundingRectHighlighter::highlight(QGraphicsObject* itemToHighlight) @@ -173,17 +141,14 @@ void BoundingRectHighlighter::highlight(QGraphicsObject* itemToHighlight) if (!itemToHighlight) return; - bool animate = false; - BoundingBox *box = boxFor(itemToHighlight); if (!box) { box = createBoundingBox(itemToHighlight); m_boxes << box; - animate = true; qSort(m_boxes); } - highlightAll(animate); + highlightAll(); } BoundingBox *BoundingRectHighlighter::createBoundingBox(QGraphicsObject *itemToHighlight) @@ -244,7 +209,7 @@ void BoundingRectHighlighter::itemDestroyed(QObject *obj) } } -void BoundingRectHighlighter::highlightAll(bool animate) +void BoundingRectHighlighter::highlightAll() { foreach (BoundingBox *box, m_boxes) { if (box && box->highlightedObject.isNull()) { @@ -253,32 +218,22 @@ void BoundingRectHighlighter::highlightAll(bool animate) return; } QGraphicsObject *item = box->highlightedObject.data(); - QRectF itemAndChildRect = item->boundingRect() | item->childrenBoundingRect(); - QPolygonF boundingRectInSceneSpace(item->mapToScene(itemAndChildRect)); - QPolygonF boundingRectInLayerItemSpace = mapFromScene(boundingRectInSceneSpace); - QRectF bboxRect - = m_view->adjustToScreenBoundaries(boundingRectInLayerItemSpace.boundingRect()); + QRectF boundingRectInSceneSpace(item->mapToScene(item->boundingRect()).boundingRect()); + QRectF boundingRectInLayerItemSpace = mapRectFromScene(boundingRectInSceneSpace); + QRectF bboxRect = m_view->adjustToScreenBoundaries(boundingRectInLayerItemSpace); QRectF edgeRect = bboxRect; edgeRect.adjust(-1, -1, 1, 1); box->highlightPolygon->setPolygon(QPolygonF(bboxRect)); box->highlightPolygonEdge->setPolygon(QPolygonF(edgeRect)); - - if (animate) - box->highlightPolygonEdge->setOpacity(0); - } - - if (animate) { - m_animFrame = 0; - m_animTimer->start(); } } void BoundingRectHighlighter::refresh() { if (!m_boxes.isEmpty()) - highlightAll(true); + highlightAll(); } QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/declarativeobserver/editor/boundingrecthighlighter_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/boundingrecthighlighter_p.h index ab7e595..e2928f7 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/boundingrecthighlighter_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/boundingrecthighlighter_p.h @@ -59,14 +59,14 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class BoundingBox; class BoundingRectHighlighter : public LiveLayerItem { Q_OBJECT public: - explicit BoundingRectHighlighter(QDeclarativeViewObserver *view); + explicit BoundingRectHighlighter(QDeclarativeViewInspector *view); ~BoundingRectHighlighter(); void clear(); void highlight(QList<QGraphicsObject*> items); @@ -74,12 +74,11 @@ public: private slots: void refresh(); - void animTimeout(); void itemDestroyed(QObject *); private: BoundingBox *boxFor(QGraphicsObject *item) const; - void highlightAll(bool animate); + void highlightAll(); BoundingBox *createBoundingBox(QGraphicsObject *itemToHighlight); void removeBoundingBox(BoundingBox *box); void freeBoundingBox(BoundingBox *box); @@ -87,13 +86,9 @@ private: private: Q_DISABLE_COPY(BoundingRectHighlighter) - QDeclarativeViewObserver *m_view; + QDeclarativeViewInspector *m_view; QList<BoundingBox* > m_boxes; QList<BoundingBox* > m_freeBoxes; - QTimer *m_animTimer; - qreal m_animScale; - int m_animFrame; - }; class BoundingBox : public QObject diff --git a/src/plugins/qmltooling/declarativeobserver/editor/colorpickertool.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/colorpickertool.cpp index 50d724e..bdae3d8 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/colorpickertool.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/colorpickertool.cpp @@ -41,7 +41,7 @@ #include "colorpickertool_p.h" -#include "../qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewinspector_p.h" #include <QtGui/QMouseEvent> #include <QtGui/QKeyEvent> @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE -ColorPickerTool::ColorPickerTool(QDeclarativeViewObserver *view) : +ColorPickerTool::ColorPickerTool(QDeclarativeViewInspector *view) : AbstractLiveEditTool(view) { m_selectedColor.setRgb(0,0,0); diff --git a/src/plugins/qmltooling/declarativeobserver/editor/colorpickertool_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/colorpickertool_p.h index b955eee..580c175 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/colorpickertool_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/colorpickertool_p.h @@ -58,7 +58,7 @@ class ColorPickerTool : public AbstractLiveEditTool { Q_OBJECT public: - explicit ColorPickerTool(QDeclarativeViewObserver *view); + explicit ColorPickerTool(QDeclarativeViewInspector *view); virtual ~ColorPickerTool(); diff --git a/src/plugins/qmltooling/declarativeobserver/editor/editor.qrc b/src/plugins/qmltooling/qmldbg_inspector/editor/editor.qrc index 77744d5..fb2393c 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/editor.qrc +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/editor.qrc @@ -18,7 +18,7 @@ <file>images/zoom-24.png</file> <file>images/select-24.png</file> <file>images/select-marquee-24.png</file> - <file>images/observermode.png</file> - <file>images/observermode-24.png</file> + <file>images/inspectormode.png</file> + <file>images/inspectormode-24.png</file> </qresource> </RCC> diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker-24.png Binary files differindex cff4721..cff4721 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker-hicontrast.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker-hicontrast.png Binary files differindex b953d08..b953d08 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker-hicontrast.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker-hicontrast.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker.png Binary files differindex 026c31b..026c31b 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/color-picker.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/color-picker.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/from-qml-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/from-qml-24.png Binary files differindex 0ad21f3..0ad21f3 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/from-qml-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/from-qml-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/from-qml.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/from-qml.png Binary files differindex 666382c..666382c 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/from-qml.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/from-qml.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/observermode-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/inspectormode-24.png Binary files differindex 5e74d86..5e74d86 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/observermode-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/inspectormode-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/observermode.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/inspectormode.png Binary files differindex daed21c..daed21c 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/observermode.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/inspectormode.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/pause-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/pause-24.png Binary files differindex d9a2f6f..d9a2f6f 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/pause-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/pause-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/pause.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/pause.png Binary files differindex 114d89b..114d89b 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/pause.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/pause.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/play-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/play-24.png Binary files differindex e2b9fbc..e2b9fbc 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/play-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/play-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/play.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/play.png Binary files differindex 011598a..011598a 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/play.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/play.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/reload.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/reload.png Binary files differindex 7042bec..7042bec 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/reload.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/reload.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/resize_handle.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/resize_handle.png Binary files differindex 2934f25..2934f25 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/resize_handle.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/resize_handle.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/select-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-24.png Binary files differindex 5388a9d..5388a9d 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/select-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/select-marquee-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-marquee-24.png Binary files differindex 0111dda..0111dda 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/select-marquee-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-marquee-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/select-marquee.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-marquee.png Binary files differindex 92fe40d..92fe40d 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/select-marquee.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select-marquee.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/select.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select.png Binary files differindex 6722855..6722855 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/select.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/select.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/to-qml-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/to-qml-24.png Binary files differindex b72450d..b72450d 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/to-qml-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/to-qml-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/to-qml.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/to-qml.png Binary files differindex 2ab951f..2ab951f 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/to-qml.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/to-qml.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/zoom-24.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/zoom-24.png Binary files differindex 0346200..0346200 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/zoom-24.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/zoom-24.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/images/zoom.png b/src/plugins/qmltooling/qmldbg_inspector/editor/images/zoom.png Binary files differindex 17f0da6..17f0da6 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/images/zoom.png +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/images/zoom.png diff --git a/src/plugins/qmltooling/declarativeobserver/editor/livelayeritem.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/livelayeritem.cpp index 73cc5a0..c28893e 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/livelayeritem.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/livelayeritem.cpp @@ -41,7 +41,7 @@ #include "livelayeritem_p.h" -#include "../qmlobserverconstants_p.h" +#include "../qmlinspectorconstants_p.h" #include <QGraphicsScene> diff --git a/src/plugins/qmltooling/declarativeobserver/editor/livelayeritem_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/livelayeritem_p.h index da622e1..da622e1 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/livelayeritem_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/livelayeritem_p.h diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liverubberbandselectionmanipulator.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/liverubberbandselectionmanipulator.cpp index 18341de..d32847d 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liverubberbandselectionmanipulator.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liverubberbandselectionmanipulator.cpp @@ -41,7 +41,7 @@ #include "liverubberbandselectionmanipulator_p.h" -#include "../qdeclarativeviewobserver_p_p.h" +#include "../qdeclarativeviewinspector_p_p.h" #include <QtGui/QGraphicsItem> @@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE LiveRubberBandSelectionManipulator::LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem, - QDeclarativeViewObserver *editorView) + QDeclarativeViewInspector *editorView) : m_selectionRectangleElement(layerItem), m_editorView(editorView), m_beginFormEditorItem(0), @@ -83,9 +83,9 @@ void LiveRubberBandSelectionManipulator::begin(const QPointF &beginPoint) m_selectionRectangleElement.setRect(m_beginPoint, m_beginPoint); m_selectionRectangleElement.show(); m_isActive = true; - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(m_editorView); - m_beginFormEditorItem = topFormEditorItem(observerPrivate->selectableItems(beginPoint)); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(m_editorView); + m_beginFormEditorItem = topFormEditorItem(inspectorPrivate->selectableItems(beginPoint)); m_oldSelectionList = m_editorView->selectedItems(); } @@ -103,10 +103,10 @@ void LiveRubberBandSelectionManipulator::end() void LiveRubberBandSelectionManipulator::select(SelectionType selectionType) { - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(m_editorView); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(m_editorView); QList<QGraphicsItem*> itemList - = observerPrivate->selectableItems(m_selectionRectangleElement.rect(), + = inspectorPrivate->selectableItems(m_selectionRectangleElement.rect(), Qt::IntersectsItemShape); QList<QGraphicsItem*> newSelectionList; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liverubberbandselectionmanipulator_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/liverubberbandselectionmanipulator_p.h index a71caa2..9abcb2b 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liverubberbandselectionmanipulator_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liverubberbandselectionmanipulator_p.h @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class LiveRubberBandSelectionManipulator { @@ -66,7 +66,7 @@ public: }; LiveRubberBandSelectionManipulator(QGraphicsObject *layerItem, - QDeclarativeViewObserver *editorView); + QDeclarativeViewInspector *editorView); void setItems(const QList<QGraphicsItem*> &itemList); @@ -90,7 +90,7 @@ private: QList<QGraphicsItem*> m_oldSelectionList; LiveSelectionRectangle m_selectionRectangleElement; QPointF m_beginPoint; - QDeclarativeViewObserver *m_editorView; + QDeclarativeViewInspector *m_editorView; QGraphicsItem *m_beginFormEditorItem; bool m_isActive; }; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionindicator.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionindicator.cpp index 2752957..4450fc5 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionindicator.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionindicator.cpp @@ -41,8 +41,8 @@ #include "liveselectionindicator_p.h" -#include "../qdeclarativeviewobserver_p_p.h" -#include "../qmlobserverconstants_p.h" +#include "../qdeclarativeviewinspector_p_p.h" +#include "../qmlinspectorconstants_p.h" #include <QtGui/QGraphicsRectItem> #include <QtGui/QGraphicsObject> @@ -51,10 +51,10 @@ QT_BEGIN_NAMESPACE -LiveSelectionIndicator::LiveSelectionIndicator(QDeclarativeViewObserver *viewObserver, +LiveSelectionIndicator::LiveSelectionIndicator(QDeclarativeViewInspector *viewInspector, QGraphicsObject *layerItem) : m_layerItem(layerItem) - , m_view(viewObserver) + , m_view(viewInspector) { } diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionindicator_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionindicator_p.h index efd2c5f..fa6eb30 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionindicator_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionindicator_p.h @@ -58,12 +58,12 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class LiveSelectionIndicator { public: - LiveSelectionIndicator(QDeclarativeViewObserver *viewObserver, QGraphicsObject *layerItem); + LiveSelectionIndicator(QDeclarativeViewInspector *viewInspector, QGraphicsObject *layerItem); ~LiveSelectionIndicator(); void show(); @@ -76,7 +76,7 @@ public: private: QHash<QGraphicsItem*, QGraphicsRectItem *> m_indicatorShapeHash; QWeakPointer<QGraphicsObject> m_layerItem; - QDeclarativeViewObserver *m_view; + QDeclarativeViewInspector *m_view; }; QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionrectangle.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionrectangle.cpp index 6da1d6f..267079a 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionrectangle.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionrectangle.cpp @@ -41,7 +41,7 @@ #include "liveselectionrectangle_p.h" -#include "../qmlobserverconstants_p.h" +#include "../qmlinspectorconstants_p.h" #include <QtGui/QPen> #include <QtGui/QGraphicsRectItem> diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionrectangle_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionrectangle_p.h index 5da9fb8..5da9fb8 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectionrectangle_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectionrectangle_p.h diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectiontool.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectiontool.cpp index 62b6e01..c55cba3 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectiontool.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectiontool.cpp @@ -42,7 +42,7 @@ #include "liveselectiontool_p.h" #include "livelayeritem_p.h" -#include "../qdeclarativeviewobserver_p_p.h" +#include "../qdeclarativeviewinspector_p_p.h" #include <QtGui/QApplication> #include <QtGui/QWheelEvent> @@ -59,14 +59,14 @@ QT_BEGIN_NAMESPACE -LiveSelectionTool::LiveSelectionTool(QDeclarativeViewObserver *editorView) : +LiveSelectionTool::LiveSelectionTool(QDeclarativeViewInspector *editorView) : AbstractLiveEditTool(editorView), m_rubberbandSelectionMode(false), m_rubberbandSelectionManipulator( - QDeclarativeViewObserverPrivate::get(editorView)->manipulatorLayer, editorView), + QDeclarativeViewInspectorPrivate::get(editorView)->manipulatorLayer, editorView), m_singleSelectionManipulator(editorView), m_selectionIndicator(editorView, - QDeclarativeViewObserverPrivate::get(editorView)->manipulatorLayer), + QDeclarativeViewInspectorPrivate::get(editorView)->manipulatorLayer), //m_resizeIndicator(editorView->manipulatorLayer()), m_selectOnlyContentItems(true) { @@ -97,9 +97,9 @@ LiveSingleSelectionManipulator::SelectionType LiveSelectionTool::getSelectionTyp bool LiveSelectionTool::alreadySelected(const QList<QGraphicsItem*> &itemList) const { - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(observer()); - const QList<QGraphicsItem*> selectedItems = observerPrivate->selectedItems(); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(inspector()); + const QList<QGraphicsItem*> selectedItems = inspectorPrivate->selectedItems(); if (selectedItems.isEmpty()) return false; @@ -113,9 +113,9 @@ bool LiveSelectionTool::alreadySelected(const QList<QGraphicsItem*> &itemList) c void LiveSelectionTool::mousePressEvent(QMouseEvent *event) { - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(observer()); - QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(event->pos()); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(inspector()); + QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(event->pos()); LiveSingleSelectionManipulator::SelectionType selectionType = getSelectionType(event->modifiers()); if (event->buttons() & Qt::LeftButton) { @@ -134,9 +134,6 @@ void LiveSelectionTool::mousePressEvent(QMouseEvent *event) void LiveSelectionTool::createContextMenu(QList<QGraphicsItem*> itemList, QPoint globalPos) { - if (!QDeclarativeViewObserverPrivate::get(observer())->mouseInsideContextItem()) - return; - QMenu contextMenu; connect(&contextMenu, SIGNAL(hovered(QAction*)), this, SLOT(contextMenuElementHovered(QAction*))); @@ -154,7 +151,7 @@ void LiveSelectionTool::createContextMenu(QList<QGraphicsItem*> itemList, QPoint QAction *elementAction = contextMenu.addAction(itemTitle, this, SLOT(contextMenuElementSelected())); - if (observer()->selectedItems().contains(item)) { + if (inspector()->selectedItems().contains(item)) { QFont boldFont = elementAction->font(); boldFont.setBold(true); elementAction->setFont(boldFont); @@ -192,7 +189,6 @@ void LiveSelectionTool::contextMenuElementSelected() QList<QGraphicsItem*>() << item, false); m_singleSelectionManipulator.end(updatePt); - enterContext(item); } } @@ -201,7 +197,7 @@ void LiveSelectionTool::contextMenuElementHovered(QAction *action) int itemListIndex = action->data().toInt(); if (itemListIndex >= 0 && itemListIndex < m_contextMenuItemList.length()) { QGraphicsObject *item = m_contextMenuItemList.at(itemListIndex)->toGraphicsObject(); - QDeclarativeViewObserverPrivate::get(observer())->highlight(item); + QDeclarativeViewInspectorPrivate::get(inspector())->highlight(item); } } @@ -254,19 +250,19 @@ void LiveSelectionTool::hoverMoveEvent(QMouseEvent * event) // if (topSelectedItemIsMovable(itemList)) // view()->changeTool(Constants::MoveToolMode); // } - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(observer()); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(inspector()); - QList<QGraphicsItem*> selectableItemList = observerPrivate->selectableItems(event->pos()); + QList<QGraphicsItem*> selectableItemList = inspectorPrivate->selectableItems(event->pos()); if (!selectableItemList.isEmpty()) { QGraphicsObject *item = selectableItemList.first()->toGraphicsObject(); if (item) - QDeclarativeViewObserverPrivate::get(observer())->highlight(item); + QDeclarativeViewInspectorPrivate::get(inspector())->highlight(item); return; } - QDeclarativeViewObserverPrivate::get(observer())->clearHighlight(); + QDeclarativeViewInspectorPrivate::get(inspector())->clearHighlight(); } void LiveSelectionTool::mouseReleaseEvent(QMouseEvent *event) @@ -337,16 +333,16 @@ void LiveSelectionTool::wheelEvent(QWheelEvent *event) if (event->orientation() == Qt::Horizontal || m_rubberbandSelectionMode) return; - QDeclarativeViewObserverPrivate *observerPrivate - = QDeclarativeViewObserverPrivate::get(observer()); - QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(event->pos()); + QDeclarativeViewInspectorPrivate *inspectorPrivate + = QDeclarativeViewInspectorPrivate::get(inspector()); + QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(event->pos()); if (itemList.isEmpty()) return; int selectedIdx = 0; - if (!observer()->selectedItems().isEmpty()) { - selectedIdx = itemList.indexOf(observer()->selectedItems().first()); + if (!inspector()->selectedItems().isEmpty()) { + selectedIdx = itemList.indexOf(inspector()->selectedItems().first()); if (selectedIdx >= 0) { if (event->delta() > 0) { selectedIdx++; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/liveselectiontool_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectiontool_p.h index 4ecf9f6..7562f3e 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/liveselectiontool_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/liveselectiontool_p.h @@ -66,7 +66,7 @@ class LiveSelectionTool : public AbstractLiveEditTool Q_OBJECT public: - LiveSelectionTool(QDeclarativeViewObserver* editorView); + LiveSelectionTool(QDeclarativeViewInspector* editorView); ~LiveSelectionTool(); void mousePressEvent(QMouseEvent *event); diff --git a/src/plugins/qmltooling/declarativeobserver/editor/livesingleselectionmanipulator.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/livesingleselectionmanipulator.cpp index 1ffd7a9..ee9843b 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/livesingleselectionmanipulator.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/livesingleselectionmanipulator.cpp @@ -41,13 +41,13 @@ #include "livesingleselectionmanipulator_p.h" -#include "../qdeclarativeviewobserver_p_p.h" +#include "../qdeclarativeviewinspector_p_p.h" #include <QtDebug> QT_BEGIN_NAMESPACE -LiveSingleSelectionManipulator::LiveSingleSelectionManipulator(QDeclarativeViewObserver *editorView) +LiveSingleSelectionManipulator::LiveSingleSelectionManipulator(QDeclarativeViewInspector *editorView) : m_editorView(editorView), m_isActive(false) { @@ -58,7 +58,7 @@ void LiveSingleSelectionManipulator::begin(const QPointF &beginPoint) { m_beginPoint = beginPoint; m_isActive = true; - m_oldSelectionList = QDeclarativeViewObserverPrivate::get(m_editorView)->selectedItems(); + m_oldSelectionList = QDeclarativeViewInspectorPrivate::get(m_editorView)->selectedItems(); } void LiveSingleSelectionManipulator::update(const QPointF &/*updatePoint*/) @@ -131,9 +131,9 @@ void LiveSingleSelectionManipulator::select(SelectionType selectionType, void LiveSingleSelectionManipulator::select(SelectionType selectionType, bool selectOnlyContentItems) { - QDeclarativeViewObserverPrivate *observerPrivate = - QDeclarativeViewObserverPrivate::get(m_editorView); - QList<QGraphicsItem*> itemList = observerPrivate->selectableItems(m_beginPoint); + QDeclarativeViewInspectorPrivate *inspectorPrivate = + QDeclarativeViewInspectorPrivate::get(m_editorView); + QList<QGraphicsItem*> itemList = inspectorPrivate->selectableItems(m_beginPoint); select(selectionType, itemList, selectOnlyContentItems); } diff --git a/src/plugins/qmltooling/declarativeobserver/editor/livesingleselectionmanipulator_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/livesingleselectionmanipulator_p.h index ea0406b..40b5fc0 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/livesingleselectionmanipulator_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/livesingleselectionmanipulator_p.h @@ -53,12 +53,12 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class LiveSingleSelectionManipulator { public: - LiveSingleSelectionManipulator(QDeclarativeViewObserver *editorView); + LiveSingleSelectionManipulator(QDeclarativeViewInspector *editorView); enum SelectionType { ReplaceSelection, @@ -84,7 +84,7 @@ public: private: QList<QGraphicsItem*> m_oldSelectionList; QPointF m_beginPoint; - QDeclarativeViewObserver *m_editorView; + QDeclarativeViewInspector *m_editorView; bool m_isActive; }; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/qmltoolbar.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/qmltoolbar.cpp index 9ad5b24..0a72674 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/qmltoolbar.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/qmltoolbar.cpp @@ -61,8 +61,8 @@ QmlToolBar::QmlToolBar(QWidget *parent) ui->playIcon = QIcon(QLatin1String(":/qml/images/play-24.png")); ui->pauseIcon = QIcon(QLatin1String(":/qml/images/pause-24.png")); - ui->designmode = new QAction(QIcon(QLatin1String(":/qml/images/observermode-24.png")), - tr("Observer Mode"), this); + ui->designmode = new QAction(QIcon(QLatin1String(":/qml/images/inspectormode-24.png")), + tr("Inspector Mode"), this); ui->play = new QAction(ui->pauseIcon, tr("Play/Pause Animations"), this); ui->select = new QAction(QIcon(QLatin1String(":/qml/images/select-24.png")), tr("Select"), this); ui->selectMarquee = new QAction(QIcon(QLatin1String(":/qml/images/select-marquee-24.png")), diff --git a/src/plugins/qmltooling/declarativeobserver/editor/qmltoolbar_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/qmltoolbar_p.h index a3da1f7..0401804 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/qmltoolbar_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/qmltoolbar_p.h @@ -45,7 +45,7 @@ #include <QtGui/QToolBar> #include <QtGui/QIcon> -#include "../qmlobserverconstants_p.h" +#include "../qmlinspectorconstants_p.h" QT_FORWARD_DECLARE_CLASS(QActionGroup) diff --git a/src/plugins/qmltooling/declarativeobserver/editor/subcomponentmasklayeritem.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/subcomponentmasklayeritem.cpp index 27e2079..2ed3179 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/subcomponentmasklayeritem.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/subcomponentmasklayeritem.cpp @@ -41,17 +41,17 @@ #include "subcomponentmasklayeritem_p.h" -#include "../qmlobserverconstants_p.h" -#include "../qdeclarativeviewobserver_p.h" +#include "../qmlinspectorconstants_p.h" +#include "../qdeclarativeviewinspector_p.h" #include <QtGui/QPolygonF> QT_BEGIN_NAMESPACE -SubcomponentMaskLayerItem::SubcomponentMaskLayerItem(QDeclarativeViewObserver *observer, +SubcomponentMaskLayerItem::SubcomponentMaskLayerItem(QDeclarativeViewInspector *inspector, QGraphicsItem *parentItem) : QGraphicsPolygonItem(parentItem), - m_observer(observer), + m_inspector(inspector), m_currentItem(0), m_borderRect(new QGraphicsRectItem(this)) { @@ -102,8 +102,8 @@ void SubcomponentMaskLayerItem::setCurrentItem(QGraphicsItem *item) if (!m_currentItem) return; - QRect viewRect = m_observer->declarativeView()->rect(); - viewRect = m_observer->declarativeView()->mapToScene(viewRect).boundingRect().toRect(); + QRect viewRect = m_inspector->declarativeView()->rect(); + viewRect = m_inspector->declarativeView()->mapToScene(viewRect).boundingRect().toRect(); QRectF itemRect = item->boundingRect() | item->childrenBoundingRect(); itemRect = item->mapRectToScene(itemRect); diff --git a/src/plugins/qmltooling/declarativeobserver/editor/subcomponentmasklayeritem_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/subcomponentmasklayeritem_p.h index 7a77253..07ce881 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/subcomponentmasklayeritem_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/subcomponentmasklayeritem_p.h @@ -50,12 +50,12 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class SubcomponentMaskLayerItem : public QGraphicsPolygonItem { public: - explicit SubcomponentMaskLayerItem(QDeclarativeViewObserver *observer, + explicit SubcomponentMaskLayerItem(QDeclarativeViewInspector *inspector, QGraphicsItem *parentItem = 0); int type() const; void setCurrentItem(QGraphicsItem *item); @@ -64,7 +64,7 @@ public: QRectF itemRect() const; private: - QDeclarativeViewObserver *m_observer; + QDeclarativeViewInspector *m_inspector; QGraphicsItem *m_currentItem; QGraphicsRectItem *m_borderRect; QRectF m_itemPolyRect; diff --git a/src/plugins/qmltooling/declarativeobserver/editor/toolbarcolorbox.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/toolbarcolorbox.cpp index d3a5a37..154ddf2 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/toolbarcolorbox.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/toolbarcolorbox.cpp @@ -41,7 +41,7 @@ #include "toolbarcolorbox_p.h" -#include "../qmlobserverconstants_p.h" +#include "../qmlinspectorconstants_p.h" #include <QtGui/QPixmap> #include <QtGui/QPainter> diff --git a/src/plugins/qmltooling/declarativeobserver/editor/toolbarcolorbox_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/toolbarcolorbox_p.h index c3e064c..c3e064c 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/toolbarcolorbox_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/toolbarcolorbox_p.h diff --git a/src/plugins/qmltooling/declarativeobserver/editor/zoomtool.cpp b/src/plugins/qmltooling/qmldbg_inspector/editor/zoomtool.cpp index 68d67cc..969c9d5 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/zoomtool.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/zoomtool.cpp @@ -41,7 +41,7 @@ #include "zoomtool_p.h" -#include "../qdeclarativeviewobserver_p_p.h" +#include "../qdeclarativeviewinspector_p_p.h" #include <QtGui/QMouseEvent> #include <QtGui/QWheelEvent> @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE -ZoomTool::ZoomTool(QDeclarativeViewObserver *view) : +ZoomTool::ZoomTool(QDeclarativeViewInspector *view) : AbstractLiveEditTool(view), m_rubberbandManipulator(), m_smoothZoomMultiplier(0.05f), @@ -67,7 +67,7 @@ ZoomTool::ZoomTool(QDeclarativeViewObserver *view) : m_zoomOutAction->setShortcut(QKeySequence(Qt::Key_Minus)); - LiveLayerItem *layerItem = QDeclarativeViewObserverPrivate::get(view)->manipulatorLayer; + LiveLayerItem *layerItem = QDeclarativeViewInspectorPrivate::get(view)->manipulatorLayer; QGraphicsObject *layerObject = reinterpret_cast<QGraphicsObject *>(layerItem); m_rubberbandManipulator = new LiveRubberBandSelectionManipulator(layerObject, view); diff --git a/src/plugins/qmltooling/declarativeobserver/editor/zoomtool_p.h b/src/plugins/qmltooling/qmldbg_inspector/editor/zoomtool_p.h index ef5c2e6..14fa4d5 100644 --- a/src/plugins/qmltooling/declarativeobserver/editor/zoomtool_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/editor/zoomtool_p.h @@ -63,7 +63,7 @@ public: ZoomOut }; - explicit ZoomTool(QDeclarativeViewObserver *view); + explicit ZoomTool(QDeclarativeViewInspector *view); virtual ~ZoomTool(); diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverplugin.cpp b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorplugin.cpp index a00bc6f..a266eb9 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverplugin.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorplugin.cpp @@ -39,43 +39,43 @@ ** ****************************************************************************/ -#include "qdeclarativeobserverplugin.h" +#include "qdeclarativeinspectorplugin.h" -#include "qdeclarativeviewobserver_p.h" +#include "qdeclarativeviewinspector_p.h" #include <QtCore/qplugin.h> -#include <QtDeclarative/private/qdeclarativeobserverservice_p.h> +#include <QtDeclarative/private/qdeclarativeinspectorservice_p.h> QT_BEGIN_NAMESPACE -QDeclarativeObserverPlugin::QDeclarativeObserverPlugin() : - m_observer(0) +QDeclarativeInspectorPlugin::QDeclarativeInspectorPlugin() : + m_inspector(0) { } -QDeclarativeObserverPlugin::~QDeclarativeObserverPlugin() +QDeclarativeInspectorPlugin::~QDeclarativeInspectorPlugin() { - delete m_observer; + delete m_inspector; } -void QDeclarativeObserverPlugin::activate() +void QDeclarativeInspectorPlugin::activate() { - QDeclarativeObserverService *service = QDeclarativeObserverService::instance(); + QDeclarativeInspectorService *service = QDeclarativeInspectorService::instance(); QList<QDeclarativeView*> views = service->views(); if (views.isEmpty()) return; // TODO: Support multiple views QDeclarativeView *view = service->views().at(0); - m_observer = new QDeclarativeViewObserver(view, view); + m_inspector = new QDeclarativeViewInspector(view, view); } -void QDeclarativeObserverPlugin::deactivate() +void QDeclarativeInspectorPlugin::deactivate() { - delete m_observer; + delete m_inspector; } -Q_EXPORT_PLUGIN2(declarativeobserver, QDeclarativeObserverPlugin) +Q_EXPORT_PLUGIN2(declarativeinspector, QDeclarativeInspectorPlugin) QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverplugin.h b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorplugin.h index 7bc7626..3e28643 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverplugin.h +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorplugin.h @@ -39,33 +39,33 @@ ** ****************************************************************************/ -#ifndef QDECLARATIVEOBSERVERPLUGIN_H -#define QDECLARATIVEOBSERVERPLUGIN_H +#ifndef QDECLARATIVEINSPECTORPLUGIN_H +#define QDECLARATIVEINSPECTORPLUGIN_H #include <QtCore/QPointer> -#include <QtDeclarative/private/qdeclarativeobserverinterface_p.h> +#include <QtDeclarative/private/qdeclarativeinspectorinterface_p.h> QT_BEGIN_NAMESPACE -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; -class QDeclarativeObserverPlugin : public QObject, public QDeclarativeObserverInterface +class QDeclarativeInspectorPlugin : public QObject, public QDeclarativeInspectorInterface { Q_OBJECT - Q_DISABLE_COPY(QDeclarativeObserverPlugin) - Q_INTERFACES(QDeclarativeObserverInterface) + Q_DISABLE_COPY(QDeclarativeInspectorPlugin) + Q_INTERFACES(QDeclarativeInspectorInterface) public: - QDeclarativeObserverPlugin(); - ~QDeclarativeObserverPlugin(); + QDeclarativeInspectorPlugin(); + ~QDeclarativeInspectorPlugin(); void activate(); void deactivate(); private: - QPointer<QDeclarativeViewObserver> m_observer; + QPointer<QDeclarativeViewInspector> m_inspector; }; QT_END_NAMESPACE -#endif // QDECLARATIVEOBSERVERPLUGIN_H +#endif // QDECLARATIVEINSPECTORPLUGIN_H diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverprotocol.h b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorprotocol.h index 836163e..2878bc1 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeobserverprotocol.h +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeinspectorprotocol.h @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QDECLARATIVEOBSERVERPROTOCOL_H -#define QDECLARATIVEOBSERVERPROTOCOL_H +#ifndef QDECLARATIVEINSPECTORPROTOCOL_H +#define QDECLARATIVEINSPECTORPROTOCOL_H #include <QtCore/QDebug> #include <QtCore/QMetaType> @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class ObserverProtocol : public QObject +class InspectorProtocol : public QObject { Q_OBJECT Q_ENUMS(Message Tool) @@ -65,7 +65,6 @@ public: ChangeTool = 1, ClearComponentCache = 2, ColorChanged = 3, - ContextPathUpdated = 4, CreateObject = 5, CurrentObjectsChanged = 6, DestroyObject = 7, @@ -75,7 +74,6 @@ public: Reloaded = 11, SetAnimationSpeed = 12, SetAnimationPaused = 18, - SetContextPathIdx = 13, SetCurrentObjects = 14, SetDesignMode = 15, ShowAppOnTop = 16, @@ -100,41 +98,41 @@ public: } }; -inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Message message) +inline QDataStream & operator<< (QDataStream &stream, InspectorProtocol::Message message) { return stream << static_cast<quint32>(message); } -inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Message &message) +inline QDataStream & operator>> (QDataStream &stream, InspectorProtocol::Message &message) { quint32 i; stream >> i; - message = static_cast<ObserverProtocol::Message>(i); + message = static_cast<InspectorProtocol::Message>(i); return stream; } -inline QDebug operator<< (QDebug dbg, ObserverProtocol::Message message) +inline QDebug operator<< (QDebug dbg, InspectorProtocol::Message message) { - dbg << ObserverProtocol::toString(message); + dbg << InspectorProtocol::toString(message); return dbg; } -inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Tool tool) +inline QDataStream & operator<< (QDataStream &stream, InspectorProtocol::Tool tool) { return stream << static_cast<quint32>(tool); } -inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Tool &tool) +inline QDataStream & operator>> (QDataStream &stream, InspectorProtocol::Tool &tool) { quint32 i; stream >> i; - tool = static_cast<ObserverProtocol::Tool>(i); + tool = static_cast<InspectorProtocol::Tool>(i); return stream; } -inline QDebug operator<< (QDebug dbg, ObserverProtocol::Tool tool) +inline QDebug operator<< (QDebug dbg, InspectorProtocol::Tool tool) { - dbg << ObserverProtocol::toString(tool); + dbg << InspectorProtocol::toString(tool); return dbg; } @@ -142,4 +140,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif // QDECLARATIVEOBSERVERPROTOCOL_H +#endif // QDECLARATIVEINSPECTORPROTOCOL_H diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver.cpp b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector.cpp index 5d2ab09..19bfdaa 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector.cpp @@ -39,19 +39,18 @@ ** ****************************************************************************/ -#include "QtDeclarative/private/qdeclarativeobserverservice_p.h" +#include "QtDeclarative/private/qdeclarativeinspectorservice_p.h" #include "QtDeclarative/private/qdeclarativedebughelper_p.h" -#include "qdeclarativeviewobserver_p.h" -#include "qdeclarativeviewobserver_p_p.h" -#include "qdeclarativeobserverprotocol.h" +#include "qdeclarativeviewinspector_p.h" +#include "qdeclarativeviewinspector_p_p.h" +#include "qdeclarativeinspectorprotocol.h" #include "editor/liveselectiontool_p.h" #include "editor/zoomtool_p.h" #include "editor/colorpickertool_p.h" #include "editor/livelayeritem_p.h" #include "editor/boundingrecthighlighter_p.h" -#include "editor/subcomponenteditortool_p.h" #include "editor/qmltoolbar_p.h" #include <QtDeclarative/QDeclarativeItem> @@ -91,7 +90,7 @@ private: ToolBox::ToolBox(QWidget *parent) : QWidget(parent, Qt::Tool) - , m_settings(QLatin1String("Nokia"), QLatin1String("QmlObserver"), this) + , m_settings(QLatin1String("Nokia"), QLatin1String("QmlInspector"), this) , m_toolBar(new QmlToolBar) { setWindowFlags((windowFlags() & ~Qt::WindowCloseButtonHint) | Qt::CustomizeWindowHint); @@ -111,7 +110,7 @@ ToolBox::~ToolBox() } -QDeclarativeViewObserverPrivate::QDeclarativeViewObserverPrivate(QDeclarativeViewObserver *q) : +QDeclarativeViewInspectorPrivate::QDeclarativeViewInspectorPrivate(QDeclarativeViewInspector *q) : q(q), designModeBehavior(false), showAppOnTop(false), @@ -121,14 +120,14 @@ QDeclarativeViewObserverPrivate::QDeclarativeViewObserverPrivate(QDeclarativeVie { } -QDeclarativeViewObserverPrivate::~QDeclarativeViewObserverPrivate() +QDeclarativeViewInspectorPrivate::~QDeclarativeViewInspectorPrivate() { } -QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, +QDeclarativeViewInspector::QDeclarativeViewInspector(QDeclarativeView *view, QObject *parent) : QObject(parent), - data(new QDeclarativeViewObserverPrivate(this)) + data(new QDeclarativeViewInspectorPrivate(this)) { initEditorResource(); @@ -138,7 +137,6 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, data->zoomTool = new ZoomTool(this); data->colorPickerTool = new ColorPickerTool(this); data->boundingRectHighlighter = new BoundingRectHighlighter(this); - data->subcomponentEditorTool = new SubcomponentEditorTool(this); data->currentTool = data->selectionTool; // to capture ChildRemoved event when viewport changes @@ -146,7 +144,7 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, data->setViewport(data->view->viewport()); - data->debugService = QDeclarativeObserverService::instance(); + data->debugService = QDeclarativeInspectorService::instance(); connect(data->debugService, SIGNAL(gotMessage(QByteArray)), this, SLOT(handleMessage(QByteArray))); @@ -158,31 +156,14 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, connect(data->colorPickerTool, SIGNAL(selectedColorChanged(QColor)), this, SLOT(sendColorChanged(QColor))); - connect(data->subcomponentEditorTool, SIGNAL(cleared()), SIGNAL(inspectorContextCleared())); - connect(data->subcomponentEditorTool, SIGNAL(contextPushed(QString)), - SIGNAL(inspectorContextPushed(QString))); - connect(data->subcomponentEditorTool, SIGNAL(contextPopped()), - SIGNAL(inspectorContextPopped())); - connect(data->subcomponentEditorTool, SIGNAL(contextPathChanged(QStringList)), - this, SLOT(sendContextPathUpdated(QStringList))); - data->_q_changeToSingleSelectTool(); } -QDeclarativeViewObserver::~QDeclarativeViewObserver() -{ -} - -void QDeclarativeViewObserver::setObserverContext(int contextIndex) +QDeclarativeViewInspector::~QDeclarativeViewInspector() { - if (data->subcomponentEditorTool->contextIndex() != contextIndex) { - QGraphicsObject *object = data->subcomponentEditorTool->setContext(contextIndex); - if (object) - setSelectedItems(QList<QGraphicsItem*>() << object); - } } -void QDeclarativeViewObserverPrivate::_q_setToolBoxVisible(bool visible) +void QDeclarativeViewInspectorPrivate::_q_setToolBoxVisible(bool visible) { #if !defined(Q_OS_SYMBIAN) && !defined(Q_WS_MAEMO_5) && !defined(Q_WS_SIMULATOR) if (!toolBox && visible) @@ -194,14 +175,13 @@ void QDeclarativeViewObserverPrivate::_q_setToolBoxVisible(bool visible) #endif } -void QDeclarativeViewObserverPrivate::_q_reloadView() +void QDeclarativeViewInspectorPrivate::_q_reloadView() { - subcomponentEditorTool->clear(); clearHighlight(); emit q->reloadRequested(); } -void QDeclarativeViewObserverPrivate::setViewport(QWidget *widget) +void QDeclarativeViewInspectorPrivate::setViewport(QWidget *widget) { if (viewport.data() == widget) return; @@ -217,13 +197,13 @@ void QDeclarativeViewObserverPrivate::setViewport(QWidget *widget) } } -void QDeclarativeViewObserverPrivate::clearEditorItems() +void QDeclarativeViewInspectorPrivate::clearEditorItems() { clearHighlight(); setSelectedItems(QList<QGraphicsItem*>()); } -bool QDeclarativeViewObserver::eventFilter(QObject *obj, QEvent *event) +bool QDeclarativeViewInspector::eventFilter(QObject *obj, QEvent *event) { if (obj == data->view) { // Event from view @@ -286,7 +266,7 @@ bool QDeclarativeViewObserver::eventFilter(QObject *obj, QEvent *event) return QObject::eventFilter(obj, event); } -bool QDeclarativeViewObserver::leaveEvent(QEvent * /*event*/) +bool QDeclarativeViewInspector::leaveEvent(QEvent * /*event*/) { if (!data->designModeBehavior) return false; @@ -294,7 +274,7 @@ bool QDeclarativeViewObserver::leaveEvent(QEvent * /*event*/) return true; } -bool QDeclarativeViewObserver::mousePressEvent(QMouseEvent *event) +bool QDeclarativeViewInspector::mousePressEvent(QMouseEvent *event) { if (!data->designModeBehavior) return false; @@ -303,7 +283,7 @@ bool QDeclarativeViewObserver::mousePressEvent(QMouseEvent *event) return true; } -bool QDeclarativeViewObserver::mouseMoveEvent(QMouseEvent *event) +bool QDeclarativeViewInspector::mouseMoveEvent(QMouseEvent *event) { if (!data->designModeBehavior) { data->clearEditorItems(); @@ -318,27 +298,24 @@ bool QDeclarativeViewObserver::mouseMoveEvent(QMouseEvent *event) declarativeView()->setToolTip(QString()); } if (event->buttons()) { - data->subcomponentEditorTool->mouseMoveEvent(event); data->currentTool->mouseMoveEvent(event); } else { - data->subcomponentEditorTool->hoverMoveEvent(event); data->currentTool->hoverMoveEvent(event); } return true; } -bool QDeclarativeViewObserver::mouseReleaseEvent(QMouseEvent *event) +bool QDeclarativeViewInspector::mouseReleaseEvent(QMouseEvent *event) { if (!data->designModeBehavior) return false; - data->subcomponentEditorTool->mouseReleaseEvent(event); data->cursorPos = event->pos(); data->currentTool->mouseReleaseEvent(event); return true; } -bool QDeclarativeViewObserver::keyPressEvent(QKeyEvent *event) +bool QDeclarativeViewInspector::keyPressEvent(QKeyEvent *event) { if (!data->designModeBehavior) return false; @@ -347,7 +324,7 @@ bool QDeclarativeViewObserver::keyPressEvent(QKeyEvent *event) return true; } -bool QDeclarativeViewObserver::keyReleaseEvent(QKeyEvent *event) +bool QDeclarativeViewInspector::keyReleaseEvent(QKeyEvent *event) { if (!data->designModeBehavior) return false; @@ -366,11 +343,6 @@ bool QDeclarativeViewObserver::keyReleaseEvent(QKeyEvent *event) case Qt::Key_Z: data->_q_changeToZoomTool(); break; - case Qt::Key_Enter: - case Qt::Key_Return: - if (!data->selectedItems().isEmpty()) - data->subcomponentEditorTool->setCurrentItem(data->selectedItems().first()); - break; case Qt::Key_Space: setAnimationPaused(!data->animationPaused); break; @@ -382,7 +354,7 @@ bool QDeclarativeViewObserver::keyReleaseEvent(QKeyEvent *event) return true; } -void QDeclarativeViewObserverPrivate::_q_createQmlObject(const QString &qml, QObject *parent, +void QDeclarativeViewInspectorPrivate::_q_createQmlObject(const QString &qml, QObject *parent, const QStringList &importList, const QString &filename) { @@ -410,7 +382,7 @@ void QDeclarativeViewObserverPrivate::_q_createQmlObject(const QString &qml, QOb } } -void QDeclarativeViewObserverPrivate::_q_reparentQmlObject(QObject *object, QObject *newParent) +void QDeclarativeViewInspectorPrivate::_q_reparentQmlObject(QObject *object, QObject *newParent) { if (!newParent) return; @@ -422,12 +394,12 @@ void QDeclarativeViewObserverPrivate::_q_reparentQmlObject(QObject *object, QObj item->setParentItem(newParentItem); } -void QDeclarativeViewObserverPrivate::_q_clearComponentCache() +void QDeclarativeViewInspectorPrivate::_q_clearComponentCache() { view->engine()->clearComponentCache(); } -void QDeclarativeViewObserverPrivate::_q_removeFromSelection(QObject *obj) +void QDeclarativeViewInspectorPrivate::_q_removeFromSelection(QObject *obj) { QList<QGraphicsItem*> items = selectedItems(); if (QGraphicsItem *item = qobject_cast<QGraphicsObject*>(obj)) @@ -435,45 +407,15 @@ void QDeclarativeViewObserverPrivate::_q_removeFromSelection(QObject *obj) setSelectedItems(items); } -QGraphicsItem *QDeclarativeViewObserverPrivate::currentRootItem() const -{ - return subcomponentEditorTool->currentRootItem(); -} - -bool QDeclarativeViewObserver::mouseDoubleClickEvent(QMouseEvent *event) +bool QDeclarativeViewInspector::mouseDoubleClickEvent(QMouseEvent * /*event*/) { if (!data->designModeBehavior) return false; - if (data->currentToolMode != Constants::SelectionToolMode - && data->currentToolMode != Constants::MarqueeSelectionToolMode) - return true; - - QGraphicsItem *itemToEnter = 0; - QList<QGraphicsItem*> itemList = data->view->items(event->pos()); - data->filterForSelection(itemList); - - if (data->selectedItems().isEmpty() && !itemList.isEmpty()) { - itemToEnter = itemList.first(); - } else if (!data->selectedItems().isEmpty() && !itemList.isEmpty()) { - itemToEnter = itemList.first(); - } - - if (itemToEnter) - itemToEnter = data->subcomponentEditorTool->firstChildOfContext(itemToEnter); - - data->subcomponentEditorTool->setCurrentItem(itemToEnter); - data->subcomponentEditorTool->mouseDoubleClickEvent(event); - - if ((event->buttons() & Qt::LeftButton) && itemToEnter) { - if (QGraphicsObject *objectToEnter = itemToEnter->toGraphicsObject()) - setSelectedItems(QList<QGraphicsItem*>() << objectToEnter); - } - return true; } -bool QDeclarativeViewObserver::wheelEvent(QWheelEvent *event) +bool QDeclarativeViewInspector::wheelEvent(QWheelEvent *event) { if (!data->designModeBehavior) return false; @@ -481,17 +423,7 @@ bool QDeclarativeViewObserver::wheelEvent(QWheelEvent *event) return true; } -void QDeclarativeViewObserverPrivate::enterContext(QGraphicsItem *itemToEnter) -{ - QGraphicsItem *itemUnderCurrentContext = itemToEnter; - if (itemUnderCurrentContext) - itemUnderCurrentContext = subcomponentEditorTool->firstChildOfContext(itemToEnter); - - if (itemUnderCurrentContext) - subcomponentEditorTool->setCurrentItem(itemToEnter); -} - -void QDeclarativeViewObserver::setDesignModeBehavior(bool value) +void QDeclarativeViewInspector::setDesignModeBehavior(bool value) { emit designModeBehaviorChanged(value); @@ -500,30 +432,22 @@ void QDeclarativeViewObserver::setDesignModeBehavior(bool value) sendDesignModeBehavior(value); data->designModeBehavior = value; - if (data->subcomponentEditorTool) { - data->subcomponentEditorTool->clear(); - data->clearHighlight(); - data->setSelectedItems(QList<QGraphicsItem*>()); - - if (data->view->rootObject()) - data->subcomponentEditorTool->pushContext(data->view->rootObject()); - } if (!data->designModeBehavior) data->clearEditorItems(); } -bool QDeclarativeViewObserver::designModeBehavior() +bool QDeclarativeViewInspector::designModeBehavior() { return data->designModeBehavior; } -bool QDeclarativeViewObserver::showAppOnTop() const +bool QDeclarativeViewInspector::showAppOnTop() const { return data->showAppOnTop; } -void QDeclarativeViewObserver::setShowAppOnTop(bool appOnTop) +void QDeclarativeViewInspector::setShowAppOnTop(bool appOnTop) { if (data->view) { QWidget *window = data->view->window(); @@ -543,7 +467,7 @@ void QDeclarativeViewObserver::setShowAppOnTop(bool appOnTop) emit showAppOnTopChanged(appOnTop); } -void QDeclarativeViewObserverPrivate::changeTool(Constants::DesignTool tool, +void QDeclarativeViewInspectorPrivate::changeTool(Constants::DesignTool tool, Constants::ToolFlags /*flags*/) { switch (tool) { @@ -557,7 +481,7 @@ void QDeclarativeViewObserverPrivate::changeTool(Constants::DesignTool tool, } } -void QDeclarativeViewObserverPrivate::setSelectedItemsForTools(const QList<QGraphicsItem *> &items) +void QDeclarativeViewInspectorPrivate::setSelectedItemsForTools(const QList<QGraphicsItem *> &items) { foreach (const QWeakPointer<QGraphicsObject> &obj, currentSelection) { if (QGraphicsItem *item = obj.data()) { @@ -570,8 +494,8 @@ void QDeclarativeViewObserverPrivate::setSelectedItemsForTools(const QList<QGrap } foreach (QGraphicsItem *item, items) { - if (item) { - if (QGraphicsObject *obj = item->toGraphicsObject()) { + if (QGraphicsObject *obj = item->toGraphicsObject()) { + if (!currentSelection.contains(obj)) { QObject::connect(obj, SIGNAL(destroyed(QObject*)), this, SLOT(_q_removeFromSelection(QObject*))); currentSelection.append(obj); @@ -582,7 +506,7 @@ void QDeclarativeViewObserverPrivate::setSelectedItemsForTools(const QList<QGrap currentTool->updateSelectedItems(); } -void QDeclarativeViewObserverPrivate::setSelectedItems(const QList<QGraphicsItem *> &items) +void QDeclarativeViewInspectorPrivate::setSelectedItems(const QList<QGraphicsItem *> &items) { QList<QWeakPointer<QGraphicsObject> > oldList = currentSelection; setSelectedItemsForTools(items); @@ -597,7 +521,7 @@ void QDeclarativeViewObserverPrivate::setSelectedItems(const QList<QGraphicsItem } } -QList<QGraphicsItem *> QDeclarativeViewObserverPrivate::selectedItems() const +QList<QGraphicsItem *> QDeclarativeViewInspectorPrivate::selectedItems() const { QList<QGraphicsItem *> selection; foreach (const QWeakPointer<QGraphicsObject> &selectedObject, currentSelection) { @@ -608,33 +532,27 @@ QList<QGraphicsItem *> QDeclarativeViewObserverPrivate::selectedItems() const return selection; } -void QDeclarativeViewObserver::setSelectedItems(QList<QGraphicsItem *> items) +void QDeclarativeViewInspector::setSelectedItems(QList<QGraphicsItem *> items) { data->setSelectedItems(items); } -QList<QGraphicsItem *> QDeclarativeViewObserver::selectedItems() const +QList<QGraphicsItem *> QDeclarativeViewInspector::selectedItems() const { return data->selectedItems(); } -QDeclarativeView *QDeclarativeViewObserver::declarativeView() +QDeclarativeView *QDeclarativeViewInspector::declarativeView() { return data->view; } -void QDeclarativeViewObserverPrivate::clearHighlight() +void QDeclarativeViewInspectorPrivate::clearHighlight() { boundingRectHighlighter->clear(); } -void QDeclarativeViewObserverPrivate::highlight(QGraphicsObject * item, ContextFlags flags) -{ - highlight(QList<QGraphicsObject*>() << item, flags); -} - -void QDeclarativeViewObserverPrivate::highlight(const QList<QGraphicsObject *> &items, - ContextFlags flags) +void QDeclarativeViewInspectorPrivate::highlight(const QList<QGraphicsObject *> &items) { if (items.isEmpty()) return; @@ -642,8 +560,6 @@ void QDeclarativeViewObserverPrivate::highlight(const QList<QGraphicsObject *> & QList<QGraphicsObject*> objectList; foreach (QGraphicsItem *item, items) { QGraphicsItem *child = item; - if (flags & ContextSensitive) - child = subcomponentEditorTool->firstChildOfContext(item); if (child) { QGraphicsObject *childObject = child->toGraphicsObject(); @@ -655,33 +571,27 @@ void QDeclarativeViewObserverPrivate::highlight(const QList<QGraphicsObject *> & boundingRectHighlighter->highlight(objectList); } -bool QDeclarativeViewObserverPrivate::mouseInsideContextItem() const -{ - return subcomponentEditorTool->containsCursor(cursorPos.toPoint()); -} - -QList<QGraphicsItem*> QDeclarativeViewObserverPrivate::selectableItems( +QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems( const QPointF &scenePos) const { QList<QGraphicsItem*> itemlist = view->scene()->items(scenePos); - return filterForCurrentContext(itemlist); + return filterForSelection(itemlist); } -QList<QGraphicsItem*> QDeclarativeViewObserverPrivate::selectableItems(const QPoint &pos) const +QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems(const QPoint &pos) const { QList<QGraphicsItem*> itemlist = view->items(pos); - return filterForCurrentContext(itemlist); + return filterForSelection(itemlist); } -QList<QGraphicsItem*> QDeclarativeViewObserverPrivate::selectableItems( +QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::selectableItems( const QRectF &sceneRect, Qt::ItemSelectionMode selectionMode) const { QList<QGraphicsItem*> itemlist = view->scene()->items(sceneRect, selectionMode); - - return filterForCurrentContext(itemlist); + return filterForSelection(itemlist); } -void QDeclarativeViewObserverPrivate::_q_changeToSingleSelectTool() +void QDeclarativeViewInspectorPrivate::_q_changeToSingleSelectTool() { currentToolMode = Constants::SelectionToolMode; selectionTool->setRubberbandSelectionMode(false); @@ -692,7 +602,7 @@ void QDeclarativeViewObserverPrivate::_q_changeToSingleSelectTool() q->sendCurrentTool(Constants::SelectionToolMode); } -void QDeclarativeViewObserverPrivate::changeToSelectTool() +void QDeclarativeViewInspectorPrivate::changeToSelectTool() { if (currentTool == selectionTool) return; @@ -703,7 +613,7 @@ void QDeclarativeViewObserverPrivate::changeToSelectTool() currentTool->updateSelectedItems(); } -void QDeclarativeViewObserverPrivate::_q_changeToMarqueeSelectTool() +void QDeclarativeViewInspectorPrivate::_q_changeToMarqueeSelectTool() { changeToSelectTool(); currentToolMode = Constants::MarqueeSelectionToolMode; @@ -713,7 +623,7 @@ void QDeclarativeViewObserverPrivate::_q_changeToMarqueeSelectTool() q->sendCurrentTool(Constants::MarqueeSelectionToolMode); } -void QDeclarativeViewObserverPrivate::_q_changeToZoomTool() +void QDeclarativeViewInspectorPrivate::_q_changeToZoomTool() { currentToolMode = Constants::ZoomMode; currentTool->clear(); @@ -724,7 +634,7 @@ void QDeclarativeViewObserverPrivate::_q_changeToZoomTool() q->sendCurrentTool(Constants::ZoomMode); } -void QDeclarativeViewObserverPrivate::_q_changeToColorPickerTool() +void QDeclarativeViewInspectorPrivate::_q_changeToColorPickerTool() { if (currentTool == colorPickerTool) return; @@ -738,12 +648,7 @@ void QDeclarativeViewObserverPrivate::_q_changeToColorPickerTool() q->sendCurrentTool(Constants::ColorPickerMode); } -void QDeclarativeViewObserverPrivate::_q_changeContextPathIndex(int index) -{ - subcomponentEditorTool->setContext(index); -} - -void QDeclarativeViewObserver::setAnimationSpeed(qreal slowDownFactor) +void QDeclarativeViewInspector::setAnimationSpeed(qreal slowDownFactor) { Q_ASSERT(slowDownFactor > 0); if (data->slowDownFactor == slowDownFactor) @@ -753,7 +658,7 @@ void QDeclarativeViewObserver::setAnimationSpeed(qreal slowDownFactor) sendAnimationSpeed(slowDownFactor); } -void QDeclarativeViewObserver::setAnimationPaused(bool paused) +void QDeclarativeViewInspector::setAnimationPaused(bool paused) { if (data->animationPaused == paused) return; @@ -762,7 +667,7 @@ void QDeclarativeViewObserver::setAnimationPaused(bool paused) sendAnimationPaused(paused); } -void QDeclarativeViewObserver::animationSpeedChangeRequested(qreal factor) +void QDeclarativeViewInspector::animationSpeedChangeRequested(qreal factor) { if (data->slowDownFactor != factor) { data->slowDownFactor = factor; @@ -773,7 +678,7 @@ void QDeclarativeViewObserver::animationSpeedChangeRequested(qreal factor) QDeclarativeDebugHelper::setAnimationSlowDownFactor(effectiveFactor); } -void QDeclarativeViewObserver::animationPausedChangeRequested(bool paused) +void QDeclarativeViewInspector::animationPausedChangeRequested(bool paused) { if (data->animationPaused != paused) { data->animationPaused = paused; @@ -785,87 +690,54 @@ void QDeclarativeViewObserver::animationPausedChangeRequested(bool paused) } -void QDeclarativeViewObserverPrivate::_q_applyChangesFromClient() +void QDeclarativeViewInspectorPrivate::_q_applyChangesFromClient() { } -QList<QGraphicsItem*> QDeclarativeViewObserverPrivate::filterForSelection( +QList<QGraphicsItem*> QDeclarativeViewInspectorPrivate::filterForSelection( QList<QGraphicsItem*> &itemlist) const { foreach (QGraphicsItem *item, itemlist) { - if (isEditorItem(item) || !subcomponentEditorTool->isChildOfContext(item)) + if (isEditorItem(item)) itemlist.removeOne(item); } return itemlist; } -QList<QGraphicsItem*> QDeclarativeViewObserverPrivate::filterForCurrentContext( - QList<QGraphicsItem*> &itemlist) const -{ - foreach (QGraphicsItem *item, itemlist) { - - if (isEditorItem(item) || !subcomponentEditorTool->isDirectChildOfContext(item)) { - - // if we're a child, but not directly, replace with the parent that is directly in context. - if (QGraphicsItem *contextParent = subcomponentEditorTool->firstChildOfContext(item)) { - if (contextParent != item) { - if (itemlist.contains(contextParent)) { - itemlist.removeOne(item); - } else { - itemlist.replace(itemlist.indexOf(item), contextParent); - } - } - } else { - itemlist.removeOne(item); - } - } - } - - return itemlist; -} - -bool QDeclarativeViewObserverPrivate::isEditorItem(QGraphicsItem *item) const +bool QDeclarativeViewInspectorPrivate::isEditorItem(QGraphicsItem *item) const { return (item->type() == Constants::EditorItemType || item->type() == Constants::ResizeHandleItemType || item->data(Constants::EditorItemDataKey).toBool()); } -void QDeclarativeViewObserverPrivate::_q_onStatusChanged(QDeclarativeView::Status status) +void QDeclarativeViewInspectorPrivate::_q_onStatusChanged(QDeclarativeView::Status status) { - if (status == QDeclarativeView::Ready) { - if (view->rootObject()) { - if (subcomponentEditorTool->contextIndex() != -1) - subcomponentEditorTool->clear(); - subcomponentEditorTool->pushContext(view->rootObject()); - } + if (status == QDeclarativeView::Ready) q->sendReloaded(); - } } -void QDeclarativeViewObserverPrivate::_q_onCurrentObjectsChanged(QList<QObject*> objects) +void QDeclarativeViewInspectorPrivate::_q_onCurrentObjectsChanged(QList<QObject*> objects) { QList<QGraphicsItem*> items; QList<QGraphicsObject*> gfxObjects; foreach (QObject *obj, objects) { - QDeclarativeItem* declarativeItem = qobject_cast<QDeclarativeItem*>(obj); - if (declarativeItem) { + if (QDeclarativeItem *declarativeItem = qobject_cast<QDeclarativeItem*>(obj)) { items << declarativeItem; - if (QGraphicsObject *gfxObj = declarativeItem->toGraphicsObject()) - gfxObjects << gfxObj; + gfxObjects << declarativeItem; } } if (designModeBehavior) { setSelectedItemsForTools(items); clearHighlight(); - highlight(gfxObjects, QDeclarativeViewObserverPrivate::IgnoreContext); + highlight(gfxObjects); } } // adjusts bounding boxes on edges of screen to be visible -QRectF QDeclarativeViewObserver::adjustToScreenBoundaries(const QRectF &boundingRectInSceneSpace) +QRectF QDeclarativeViewInspector::adjustToScreenBoundaries(const QRectF &boundingRectInSceneSpace) { int marginFromEdge = 1; QRectF boundingRect(boundingRectInSceneSpace); @@ -886,7 +758,7 @@ QRectF QDeclarativeViewObserver::adjustToScreenBoundaries(const QRectF &bounding return boundingRect; } -void QDeclarativeViewObserverPrivate::createToolBox() +void QDeclarativeViewInspectorPrivate::createToolBox() { toolBox = new ToolBox(q->declarativeView()); @@ -927,15 +799,15 @@ void QDeclarativeViewObserverPrivate::createToolBox() toolBar, SLOT(activateMarqueeSelectTool())); } -void QDeclarativeViewObserver::handleMessage(const QByteArray &message) +void QDeclarativeViewInspector::handleMessage(const QByteArray &message) { QDataStream ds(message); - ObserverProtocol::Message type; + InspectorProtocol::Message type; ds >> type; switch (type) { - case ObserverProtocol::SetCurrentObjects: { + case InspectorProtocol::SetCurrentObjects: { int itemCount = 0; ds >> itemCount; @@ -943,45 +815,43 @@ void QDeclarativeViewObserver::handleMessage(const QByteArray &message) for (int i = 0; i < itemCount; ++i) { int debugId = -1; ds >> debugId; - QObject *obj = QDeclarativeDebugService::objectForId(debugId); - - if (obj) + if (QObject *obj = QDeclarativeDebugService::objectForId(debugId)) selectedObjects << obj; } data->_q_onCurrentObjectsChanged(selectedObjects); break; } - case ObserverProtocol::Reload: { + case InspectorProtocol::Reload: { data->_q_reloadView(); break; } - case ObserverProtocol::SetAnimationSpeed: { + case InspectorProtocol::SetAnimationSpeed: { qreal speed; ds >> speed; animationSpeedChangeRequested(speed); break; } - case ObserverProtocol::SetAnimationPaused: { + case InspectorProtocol::SetAnimationPaused: { bool paused; ds >> paused; animationPausedChangeRequested(paused); break; } - case ObserverProtocol::ChangeTool: { - ObserverProtocol::Tool tool; + case InspectorProtocol::ChangeTool: { + InspectorProtocol::Tool tool; ds >> tool; switch (tool) { - case ObserverProtocol::ColorPickerTool: + case InspectorProtocol::ColorPickerTool: data->_q_changeToColorPickerTool(); break; - case ObserverProtocol::SelectTool: + case InspectorProtocol::SelectTool: data->_q_changeToSingleSelectTool(); break; - case ObserverProtocol::SelectMarqueeTool: + case InspectorProtocol::SelectMarqueeTool: data->_q_changeToMarqueeSelectTool(); break; - case ObserverProtocol::ZoomTool: + case InspectorProtocol::ZoomTool: data->_q_changeToZoomTool(); break; default: @@ -989,19 +859,19 @@ void QDeclarativeViewObserver::handleMessage(const QByteArray &message) } break; } - case ObserverProtocol::SetDesignMode: { + case InspectorProtocol::SetDesignMode: { bool inDesignMode; ds >> inDesignMode; setDesignModeBehavior(inDesignMode); break; } - case ObserverProtocol::ShowAppOnTop: { + case InspectorProtocol::ShowAppOnTop: { bool showOnTop; ds >> showOnTop; setShowAppOnTop(showOnTop); break; } - case ObserverProtocol::CreateObject: { + case InspectorProtocol::CreateObject: { QString qml; int parentId; QString filename; @@ -1011,21 +881,21 @@ void QDeclarativeViewObserver::handleMessage(const QByteArray &message) imports, filename); break; } - case ObserverProtocol::DestroyObject: { + case InspectorProtocol::DestroyObject: { int debugId; ds >> debugId; if (QObject* obj = QDeclarativeDebugService::objectForId(debugId)) obj->deleteLater(); break; } - case ObserverProtocol::MoveObject: { + case InspectorProtocol::MoveObject: { int debugId, newParent; ds >> debugId >> newParent; data->_q_reparentQmlObject(QDeclarativeDebugService::objectForId(debugId), QDeclarativeDebugService::objectForId(newParent)); break; } - case ObserverProtocol::ObjectIdList: { + case InspectorProtocol::ObjectIdList: { int itemCount; ds >> itemCount; data->stringIdForObjectId.clear(); @@ -1039,13 +909,7 @@ void QDeclarativeViewObserver::handleMessage(const QByteArray &message) } break; } - case ObserverProtocol::SetContextPathIdx: { - int contextPathIndex; - ds >> contextPathIndex; - data->_q_changeContextPathIndex(contextPathIndex); - break; - } - case ObserverProtocol::ClearComponentCache: { + case InspectorProtocol::ClearComponentCache: { data->_q_clearComponentCache(); break; } @@ -1054,23 +918,23 @@ void QDeclarativeViewObserver::handleMessage(const QByteArray &message) } } -void QDeclarativeViewObserver::sendDesignModeBehavior(bool inDesignMode) +void QDeclarativeViewInspector::sendDesignModeBehavior(bool inDesignMode) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::SetDesignMode + ds << InspectorProtocol::SetDesignMode << inDesignMode; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendCurrentObjects(const QList<QObject*> &objects) +void QDeclarativeViewInspector::sendCurrentObjects(const QList<QObject*> &objects) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::CurrentObjectsChanged + ds << InspectorProtocol::CurrentObjectsChanged << objects.length(); foreach (QObject *object, objects) { @@ -1081,82 +945,71 @@ void QDeclarativeViewObserver::sendCurrentObjects(const QList<QObject*> &objects data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendCurrentTool(Constants::DesignTool toolId) +void QDeclarativeViewInspector::sendCurrentTool(Constants::DesignTool toolId) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::ToolChanged + ds << InspectorProtocol::ToolChanged << toolId; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendAnimationSpeed(qreal slowDownFactor) +void QDeclarativeViewInspector::sendAnimationSpeed(qreal slowDownFactor) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::AnimationSpeedChanged + ds << InspectorProtocol::AnimationSpeedChanged << slowDownFactor; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendAnimationPaused(bool paused) +void QDeclarativeViewInspector::sendAnimationPaused(bool paused) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::AnimationPausedChanged + ds << InspectorProtocol::AnimationPausedChanged << paused; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendReloaded() +void QDeclarativeViewInspector::sendReloaded() { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::Reloaded; + ds << InspectorProtocol::Reloaded; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendShowAppOnTop(bool showAppOnTop) +void QDeclarativeViewInspector::sendShowAppOnTop(bool showAppOnTop) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::ShowAppOnTop << showAppOnTop; + ds << InspectorProtocol::ShowAppOnTop << showAppOnTop; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendColorChanged(const QColor &color) +void QDeclarativeViewInspector::sendColorChanged(const QColor &color) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << ObserverProtocol::ColorChanged + ds << InspectorProtocol::ColorChanged << color; data->debugService->sendMessage(message); } -void QDeclarativeViewObserver::sendContextPathUpdated(const QStringList &contextPath) -{ - QByteArray message; - QDataStream ds(&message, QIODevice::WriteOnly); - - ds << ObserverProtocol::ContextPathUpdated - << contextPath; - - data->debugService->sendMessage(message); -} - -QString QDeclarativeViewObserver::idStringForObject(QObject *obj) const +QString QDeclarativeViewInspector::idStringForObject(QObject *obj) const { int id = QDeclarativeDebugService::idForObject(obj); QString idString = data->stringIdForObjectId.value(id, QString()); @@ -1165,4 +1018,4 @@ QString QDeclarativeViewObserver::idStringForObject(QObject *obj) const QT_END_NAMESPACE -#include "qdeclarativeviewobserver.moc" +#include "qdeclarativeviewinspector.moc" diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver_p.h b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector_p.h index 86d0d95..4efa093 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector_p.h @@ -39,11 +39,11 @@ ** ****************************************************************************/ -#ifndef QDECLARATIVEVIEWOBSERVER_P_H -#define QDECLARATIVEVIEWOBSERVER_P_H +#ifndef QDECLARATIVEVIEWINSPECTOR_P_H +#define QDECLARATIVEVIEWINSPECTOR_P_H #include <private/qdeclarativeglobal_p.h> -#include "qmlobserverconstants_p.h" +#include "qmlinspectorconstants_p.h" #include <QtCore/QScopedPointer> #include <QtDeclarative/QDeclarativeView> @@ -58,15 +58,15 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserverPrivate; +class QDeclarativeViewInspectorPrivate; -class QDeclarativeViewObserver : public QObject +class QDeclarativeViewInspector : public QObject { Q_OBJECT public: - explicit QDeclarativeViewObserver(QDeclarativeView *view, QObject *parent = 0); - ~QDeclarativeViewObserver(); + explicit QDeclarativeViewInspector(QDeclarativeView *view, QObject *parent = 0); + ~QDeclarativeViewInspector(); void setSelectedItems(QList<QGraphicsItem *> items); QList<QGraphicsItem *> selectedItems() const; @@ -89,7 +89,6 @@ public: public Q_SLOTS: void sendColorChanged(const QColor &color); - void sendContextPathUpdated(const QStringList &contextPath); void setDesignModeBehavior(bool value); bool designModeBehavior(); @@ -99,8 +98,6 @@ public Q_SLOTS: void setAnimationSpeed(qreal factor); void setAnimationPaused(bool paused); - void setObserverContext(int contextIndex); - Q_SIGNALS: void designModeBehaviorChanged(bool inDesignMode); void showAppOnTopChanged(bool showAppOnTop); @@ -114,10 +111,6 @@ Q_SIGNALS: void animationSpeedChanged(qreal factor); void animationPausedChanged(bool paused); - void inspectorContextCleared(); - void inspectorContextPushed(const QString &contextTitle); - void inspectorContextPopped(); - protected: bool eventFilter(QObject *obj, QEvent *event); @@ -139,11 +132,11 @@ private slots: void animationPausedChangeRequested(bool paused); private: - Q_DISABLE_COPY(QDeclarativeViewObserver) + Q_DISABLE_COPY(QDeclarativeViewInspector) - inline QDeclarativeViewObserverPrivate *d_func() { return data.data(); } - QScopedPointer<QDeclarativeViewObserverPrivate> data; - friend class QDeclarativeViewObserverPrivate; + inline QDeclarativeViewInspectorPrivate *d_func() { return data.data(); } + QScopedPointer<QDeclarativeViewInspectorPrivate> data; + friend class QDeclarativeViewInspectorPrivate; friend class AbstractLiveEditTool; }; @@ -151,4 +144,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif // QDECLARATIVEVIEWOBSERVER_P_H +#endif // QDECLARATIVEVIEWINSPECTOR_P_H diff --git a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver_p_p.h b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector_p_p.h index 8809591..11cbe0f 100644 --- a/src/plugins/qmltooling/declarativeobserver/qdeclarativeviewobserver_p_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/qdeclarativeviewinspector_p_p.h @@ -39,15 +39,15 @@ ** ****************************************************************************/ -#ifndef QDECLARATIVEVIEWOBSERVER_P_P_H -#define QDECLARATIVEVIEWOBSERVER_P_P_H +#ifndef QDECLARATIVEVIEWINSPECTOR_P_P_H +#define QDECLARATIVEVIEWINSPECTOR_P_P_H -#include "qdeclarativeviewobserver_p.h" +#include "qdeclarativeviewinspector_p.h" #include <QtCore/QWeakPointer> #include <QtCore/QPointF> -#include "QtDeclarative/private/qdeclarativeobserverservice_p.h" +#include "QtDeclarative/private/qdeclarativeinspectorservice_p.h" QT_BEGIN_HEADER @@ -55,31 +55,25 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QDeclarativeViewObserver; +class QDeclarativeViewInspector; class LiveSelectionTool; class ZoomTool; class ColorPickerTool; class LiveLayerItem; class BoundingRectHighlighter; -class SubcomponentEditorTool; class ToolBox; class AbstractLiveEditTool; -class QDeclarativeViewObserverPrivate : public QObject +class QDeclarativeViewInspectorPrivate : public QObject { Q_OBJECT public: - enum ContextFlags { - IgnoreContext, - ContextSensitive - }; - - QDeclarativeViewObserverPrivate(QDeclarativeViewObserver *); - ~QDeclarativeViewObserverPrivate(); + QDeclarativeViewInspectorPrivate(QDeclarativeViewInspector *); + ~QDeclarativeViewInspectorPrivate(); QDeclarativeView *view; - QDeclarativeViewObserver *q; - QDeclarativeObserverService *debugService; + QDeclarativeViewInspector *q; + QDeclarativeInspectorService *debugService; QWeakPointer<QWidget> viewport; QHash<int, QString> stringIdForObjectId; @@ -92,7 +86,6 @@ public: LiveSelectionTool *selectionTool; ZoomTool *zoomTool; ColorPickerTool *colorPickerTool; - SubcomponentEditorTool *subcomponentEditorTool; LiveLayerItem *manipulatorLayer; BoundingRectHighlighter *boundingRectHighlighter; @@ -110,7 +103,6 @@ public: void clearEditorItems(); void createToolBox(); void changeToSelectTool(); - QList<QGraphicsItem*> filterForCurrentContext(QList<QGraphicsItem*> &itemlist) const; QList<QGraphicsItem*> filterForSelection(QList<QGraphicsItem*> &itemlist) const; QList<QGraphicsItem*> selectableItems(const QPoint &pos) const; @@ -125,17 +117,12 @@ public: Constants::ToolFlags flags = Constants::NoToolFlags); void clearHighlight(); - void highlight(const QList<QGraphicsObject *> &item, - ContextFlags flags = ContextSensitive); - void highlight(QGraphicsObject *item, ContextFlags flags = ContextSensitive); + void highlight(const QList<QGraphicsObject *> &item); + inline void highlight(QGraphicsObject *item) + { highlight(QList<QGraphicsObject*>() << item); } - bool mouseInsideContextItem() const; bool isEditorItem(QGraphicsItem *item) const; - QGraphicsItem *currentRootItem() const; - - void enterContext(QGraphicsItem *itemToEnter); - public slots: void _q_setToolBoxVisible(bool visible); @@ -151,16 +138,15 @@ public slots: void _q_changeToMarqueeSelectTool(); void _q_changeToZoomTool(); void _q_changeToColorPickerTool(); - void _q_changeContextPathIndex(int index); void _q_clearComponentCache(); void _q_removeFromSelection(QObject *); public: - static QDeclarativeViewObserverPrivate *get(QDeclarativeViewObserver *v) { return v->d_func(); } + static QDeclarativeViewInspectorPrivate *get(QDeclarativeViewInspector *v) { return v->d_func(); } }; QT_END_NAMESPACE QT_END_HEADER -#endif // QDECLARATIVEVIEWOBSERVER_P_P_H +#endif // QDECLARATIVEVIEWINSPECTOR_P_P_H diff --git a/src/plugins/qmltooling/declarativeobserver/declarativeobserver.pro b/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro index bccabcb..f8d7ee8 100644 --- a/src/plugins/qmltooling/declarativeobserver/declarativeobserver.pro +++ b/src/plugins/qmltooling/qmldbg_inspector/qmldbg_inspector.pro @@ -1,4 +1,4 @@ -TARGET = declarativeobserver +TARGET = qmldbg_inspector QT += declarative include(../../qpluginbase.pri) @@ -7,8 +7,8 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/qmltooling QTDIR_build:REQUIRES += "contains(QT_CONFIG, declarative)" SOURCES += \ - qdeclarativeobserverplugin.cpp \ - qdeclarativeviewobserver.cpp \ + qdeclarativeinspectorplugin.cpp \ + qdeclarativeviewinspector.cpp \ editor/abstractliveedittool.cpp \ editor/liveselectiontool.cpp \ editor/livelayeritem.cpp \ @@ -17,7 +17,6 @@ SOURCES += \ editor/liveselectionrectangle.cpp \ editor/liveselectionindicator.cpp \ editor/boundingrecthighlighter.cpp \ - editor/subcomponenteditortool.cpp \ editor/subcomponentmasklayeritem.cpp \ editor/zoomtool.cpp \ editor/colorpickertool.cpp \ @@ -25,11 +24,11 @@ SOURCES += \ editor/toolbarcolorbox.cpp HEADERS += \ - qdeclarativeobserverplugin.h \ - qdeclarativeobserverprotocol.h \ - qdeclarativeviewobserver_p.h \ - qdeclarativeviewobserver_p_p.h \ - qmlobserverconstants_p.h \ + qdeclarativeinspectorplugin.h \ + qdeclarativeinspectorprotocol.h \ + qdeclarativeviewinspector_p.h \ + qdeclarativeviewinspector_p_p.h \ + qmlinspectorconstants_p.h \ editor/abstractliveedittool_p.h \ editor/liveselectiontool_p.h \ editor/livelayeritem_p.h \ @@ -38,7 +37,6 @@ HEADERS += \ editor/liveselectionrectangle_p.h \ editor/liveselectionindicator_p.h \ editor/boundingrecthighlighter_p.h \ - editor/subcomponenteditortool_p.h \ editor/subcomponentmasklayeritem_p.h \ editor/zoomtool_p.h \ editor/colorpickertool_p.h \ diff --git a/src/plugins/qmltooling/declarativeobserver/qmlobserverconstants_p.h b/src/plugins/qmltooling/qmldbg_inspector/qmlinspectorconstants_p.h index 6d0a263..40ec325 100644 --- a/src/plugins/qmltooling/declarativeobserver/qmlobserverconstants_p.h +++ b/src/plugins/qmltooling/qmldbg_inspector/qmlinspectorconstants_p.h @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QMLOBSERVERCONSTANTS_H -#define QMLOBSERVERCONSTANTS_H +#ifndef QMLINSPECTORCONSTANTS_H +#define QMLINSPECTORCONSTANTS_H #include <QtDeclarative/private/qdeclarativeglobal_p.h> @@ -87,4 +87,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif // QMLOBSERVERCONSTANTS_H +#endif // QMLINSPECTORCONSTANTS_H diff --git a/src/plugins/qmltooling/qmltooling.pro b/src/plugins/qmltooling/qmltooling.pro index 0d60eb1..8220109 100644 --- a/src/plugins/qmltooling/qmltooling.pro +++ b/src/plugins/qmltooling/qmltooling.pro @@ -1,4 +1,4 @@ TEMPLATE = subdirs -SUBDIRS = qmldbg_tcp declarativeobserver +SUBDIRS = qmldbg_tcp qmldbg_inspector symbian:SUBDIRS += qmldbg_ost diff --git a/src/plugins/s60/3_1/3_1.pro b/src/plugins/s60/3_1/3_1.pro deleted file mode 100644 index 9437f3d..0000000 --- a/src/plugins/s60/3_1/3_1.pro +++ /dev/null @@ -1,9 +0,0 @@ -include(../s60pluginbase.pri) - -TARGET = qts60plugin_3_1$${QT_LIBINFIX} - -SOURCES += ../src/qlocale_3_1.cpp \ - ../src/qdesktopservices_3_1.cpp \ - ../src/qcoreapplication_3_1.cpp - -TARGET.UID3=0x2001E620 diff --git a/src/plugins/s60/3_2/3_2.pro b/src/plugins/s60/3_2/3_2.pro deleted file mode 100644 index b104c05..0000000 --- a/src/plugins/s60/3_2/3_2.pro +++ /dev/null @@ -1,23 +0,0 @@ -include(../s60pluginbase.pri) - -TARGET = qts60plugin_3_2$${QT_LIBINFIX} - -contains(S60_VERSION, 3.1) { - SOURCES += ../src/qlocale_3_1.cpp \ - ../src/qdesktopservices_3_1.cpp \ - ../src/qcoreapplication_3_1.cpp -} else { - SOURCES += ../src/qlocale_3_2.cpp \ - ../src/qdesktopservices_3_2.cpp \ - ../src/qcoreapplication_3_2.cpp - contains(CONFIG, is_using_gnupoc) { - LIBS += -ldirectorylocalizer - } else { - LIBS += -lDirectoryLocalizer - } - LIBS += -lefsrv - LIBS += -lnumberconversion - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -} - -TARGET.UID3=0x2001E621 diff --git a/src/plugins/s60/5_0/5_0.pro b/src/plugins/s60/5_0/5_0.pro deleted file mode 100644 index b037215..0000000 --- a/src/plugins/s60/5_0/5_0.pro +++ /dev/null @@ -1,23 +0,0 @@ -include(../s60pluginbase.pri) - -TARGET = qts60plugin_5_0$${QT_LIBINFIX} - -contains(S60_VERSION, 3.1) { - SOURCES += ../src/qlocale_3_1.cpp \ - ../src/qdesktopservices_3_1.cpp \ - ../src/qcoreapplication_3_1.cpp -} else { - SOURCES += ../src/qlocale_3_2.cpp \ - ../src/qdesktopservices_3_2.cpp \ - ../src/qcoreapplication_3_2.cpp - contains(CONFIG, is_using_gnupoc) { - LIBS += -ldirectorylocalizer - } else { - LIBS += -lDirectoryLocalizer - } - LIBS += -lefsrv - LIBS += -lnumberconversion - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -} - -TARGET.UID3=0x2001E622 diff --git a/src/plugins/s60/bwins/qts60pluginu.def b/src/plugins/s60/bwins/qts60pluginu.def deleted file mode 100644 index b4110a9..0000000 --- a/src/plugins/s60/bwins/qts60pluginu.def +++ /dev/null @@ -1,8 +0,0 @@ -EXPORTS - ?defaultFormatL@@YAXAAVTTime@@AAVTDes16@@ABVTDesC16@@ABVTLocale@@@Z @ 1 NONAME ; void defaultFormatL(class TTime &, class TDes16 &, class TDesC16 const &, class TLocale const &) - ?defaultGetTimeFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 2 NONAME ; class TPtrC16 defaultGetTimeFormatSpec(class TExtendedLocale &) - ?defaultGetLongDateFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 3 NONAME ; class TPtrC16 defaultGetLongDateFormatSpec(class TExtendedLocale &) - ?defaultGetShortDateFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 4 NONAME ; class TPtrC16 defaultGetShortDateFormatSpec(class TExtendedLocale &) - ?localizedDirectoryName@@YA?AVQString@@AAV1@@Z @ 5 NONAME ; class QString localizedDirectoryName(class QString &) - ?systemDrive@@YA?AW4TDriveNumber@@AAVRFs@@@Z @ 6 NONAME ; enum TDriveNumber systemDrive(class RFs &) - diff --git a/src/plugins/s60/eabi/qts60pluginu.def b/src/plugins/s60/eabi/qts60pluginu.def deleted file mode 100644 index df7895c..0000000 --- a/src/plugins/s60/eabi/qts60pluginu.def +++ /dev/null @@ -1,8 +0,0 @@ -EXPORTS - _Z14defaultFormatLR5TTimeR6TDes16RK7TDesC16RK7TLocale @ 1 NONAME - _Z24defaultGetTimeFormatSpecR15TExtendedLocale @ 2 NONAME - _Z28defaultGetLongDateFormatSpecR15TExtendedLocale @ 3 NONAME - _Z29defaultGetShortDateFormatSpecR15TExtendedLocale @ 4 NONAME - _Z22localizedDirectoryNameR7QString @ 5 NONAME - _Z11systemDriveR3RFs @ 6 NONAME - diff --git a/src/plugins/s60/s60.pro b/src/plugins/s60/s60.pro deleted file mode 100644 index c999fff..0000000 --- a/src/plugins/s60/s60.pro +++ /dev/null @@ -1,11 +0,0 @@ -TEMPLATE = subdirs - - -symbian { - contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) { - SUBDIRS += 3_1 3_2 - } - - # 5.0 is used also for Symbian3 and later - SUBDIRS += 5_0 -}
\ No newline at end of file diff --git a/src/plugins/s60/s60pluginbase.pri b/src/plugins/s60/s60pluginbase.pri deleted file mode 100644 index 4e15102..0000000 --- a/src/plugins/s60/s60pluginbase.pri +++ /dev/null @@ -1,23 +0,0 @@ -# Note: These version based 'plugins' are not an actual Qt plugins, -# they are just regular runtime loaded libraries -include(../qpluginbase.pri) - -CONFIG -= plugin - -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/s60 - -MMP_RULES += NOEXPORTLIBRARY - -symbian-abld|symbian-sbsv2 { - defBlock = \ - "$${LITERAL_HASH}ifdef WINSCW" \ - "DEFFILE ../bwins/qts60plugin.def" \ - "$${LITERAL_HASH}else" \ - "DEFFILE ../eabi/qts60plugin.def" \ - "$${LITERAL_HASH}endif" -} else { - CONFIG *= def_files - DEF_FILE = ../eabi/qts60pluginu.def -} - -MMP_RULES += defBlock
\ No newline at end of file diff --git a/src/plugins/s60/src/qcoreapplication_3_1.cpp b/src/plugins/s60/src/qcoreapplication_3_1.cpp deleted file mode 100644 index 6f2e86a..0000000 --- a/src/plugins/s60/src/qcoreapplication_3_1.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the plugins 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 <qglobal.h> -#include <f32file.h> - -EXPORT_C TDriveNumber systemDrive(RFs&) -{ - return EDriveC; -} diff --git a/src/plugins/s60/src/qdesktopservices_3_2.cpp b/src/plugins/s60/src/qdesktopservices_3_2.cpp deleted file mode 100644 index e91ab6b..0000000 --- a/src/plugins/s60/src/qdesktopservices_3_2.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the plugins 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 <private/qcore_symbian_p.h> -#include <qstring.h> -#include <qdir.h> - -#ifdef Q_WS_S60 -#include <e32base.h> // CBase -> Required by cdirectorylocalizer.h -#include <CDirectoryLocalizer.h> // CDirectoryLocalizer - -EXPORT_C QString localizedDirectoryName(QString& rawPath) -{ - QString ret; - std::exception dummy; // voodoo fix for "Undefined symbol typeinfo for std::exception" in armv5 build - - TRAPD(err, - QT_TRYCATCH_LEAVING( - CDirectoryLocalizer* localizer = CDirectoryLocalizer::NewL(); - CleanupStack::PushL(localizer); - localizer->SetFullPath(qt_QString2TPtrC(QDir::toNativeSeparators(rawPath))); - if(localizer->IsLocalized()){ - TPtrC locName(localizer->LocalizedName()); - ret = qt_TDesC2QString(locName); - } - CleanupStack::PopAndDestroy(localizer); - ) - ) - - if (err != KErrNone) - ret = QString(); - - return ret; -} -#else - -EXPORT_C QString localizedDirectoryName(QString& /* rawPath */) -{ - qWarning("QDesktopServices::displayName() not implemented for this platform version"); - return QString(); -} -#endif diff --git a/src/plugins/s60/src/qlocale_3_1.cpp b/src/plugins/s60/src/qlocale_3_1.cpp deleted file mode 100644 index 5b97777..0000000 --- a/src/plugins/s60/src/qlocale_3_1.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the plugins 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 <e32std.h> -#include <e32const.h> -#include <e32debug.h> - -_LIT(KYear, "%Y"); -_LIT(KMonth, "%M"); -_LIT(KDay, "%D"); -_LIT(KLocaleIndependent, "%F"); -static TBuf<10> dateFormat; -static TBuf<10> timeFormat; - -static void initialiseDateFormat() -{ - if(dateFormat.Length()) - return; - - TLocale locale; - - //Separator 1 is used between 1st and 2nd components of the date - //Separator 2 is used between 2nd and 3rd components of the date - //Usually they are the same, but they are allowed to be different - TChar s1 = locale.DateSeparator(1); - TChar s2 = locale.DateSeparator(2); - dateFormat=KLocaleIndependent; - switch(locale.DateFormat()) { - case EDateAmerican: - dateFormat.Append(KMonth); - dateFormat.Append(s1); - dateFormat.Append(KDay); - dateFormat.Append(s2); - dateFormat.Append(KYear); - break; - case EDateEuropean: - dateFormat.Append(KDay); - dateFormat.Append(s1); - dateFormat.Append(KMonth); - dateFormat.Append(s2); - dateFormat.Append(KYear); - break; - case EDateJapanese: - default: //it's closest to ISO format - dateFormat.Append(KYear); - dateFormat.Append(s1); - dateFormat.Append(KMonth); - dateFormat.Append(s2); - dateFormat.Append(KDay); - break; - } -#ifdef _DEBUG - RDebug::Print(_L("Date Format \"%S\""), &dateFormat); -#endif -} - -static void initialiseTimeFormat() -{ - if(timeFormat.Length()) - return; - - TLocale locale; - //Separator 1 is used between 1st and 2nd components of the time - //Separator 2 is used between 2nd and 3rd components of the time - //Usually they are the same, but they are allowed to be different - TChar s1 = locale.TimeSeparator(1); - TChar s2 = locale.TimeSeparator(2); - switch(locale.TimeFormat()) { - case ETime12: - timeFormat.Append(_L("%I")); - break; - case ETime24: - default: - timeFormat.Append(_L("%H")); - break; - } - timeFormat.Append(s1); - timeFormat.Append(_L("%T")); - timeFormat.Append(s2); - timeFormat.Append(_L("%S")); - -#ifdef _DEBUG - RDebug::Print(_L("Time Format \"%S\""), &timeFormat); -#endif -} - -EXPORT_C void defaultFormatL(TTime& time, TDes& des, const TDesC& fmt, const TLocale&) -{ - //S60 3.1 does not support format for a specific locale, so use default locale - time.FormatL(des, fmt); -} - -//S60 3.1 doesn't support extended locale date&time formats, so use default locale -EXPORT_C TPtrC defaultGetTimeFormatSpec(TExtendedLocale&) -{ - initialiseTimeFormat(); - return TPtrC(timeFormat); -} - -EXPORT_C TPtrC defaultGetLongDateFormatSpec(TExtendedLocale&) -{ - initialiseDateFormat(); - return TPtrC(dateFormat); -} - -EXPORT_C TPtrC defaultGetShortDateFormatSpec(TExtendedLocale&) -{ - initialiseDateFormat(); - return TPtrC(dateFormat); -} diff --git a/src/plugins/s60/src/qlocale_3_2.cpp b/src/plugins/s60/src/qlocale_3_2.cpp deleted file mode 100644 index 5d24eec..0000000 --- a/src/plugins/s60/src/qlocale_3_2.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the plugins 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 <exception> -#include <e32std.h> -#include <e32base.h> -#include <numberconversion.h> - -EXPORT_C TPtrC defaultGetLongDateFormatSpec(TExtendedLocale& locale) -{ - return locale.GetLongDateFormatSpec(); -} - -EXPORT_C TPtrC defaultGetShortDateFormatSpec(TExtendedLocale& locale) -{ - return locale.GetShortDateFormatSpec(); -} - -EXPORT_C TPtrC defaultGetTimeFormatSpec(TExtendedLocale& locale) -{ - return locale.GetTimeFormatSpec(); -} - -EXPORT_C void defaultFormatL(TTime& time, TDes& des, const TDesC& format, const TLocale& locale) -{ - time.FormatL(des, format, locale); - NumberConversion::ConvertDigits(des, locale.DigitType()); -} diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def index e4f244c..f780cc9 100644 --- a/src/s60installs/bwins/QtCoreu.def +++ b/src/s60installs/bwins/QtCoreu.def @@ -1000,7 +1000,7 @@ EXPORTS ?addDays@QDate@@QBE?AV1@H@Z @ 999 NONAME ; class QDate QDate::addDays(int) const ?addDays@QDateTime@@QBE?AV1@H@Z @ 1000 NONAME ; class QDateTime QDateTime::addDays(int) const ?addDefaultAnimation@QStateMachine@@QAEXPAVQAbstractAnimation@@@Z @ 1001 NONAME ; void QStateMachine::addDefaultAnimation(class QAbstractAnimation *) - ?addDeferredActiveObject@QEventDispatcherSymbian@@QAEXPAVQActiveObject@@@Z @ 1002 NONAME ; void QEventDispatcherSymbian::addDeferredActiveObject(class QActiveObject *) + ?addDeferredActiveObject@QEventDispatcherSymbian@@QAEXPAVQActiveObject@@@Z @ 1002 NONAME ABSENT ; void QEventDispatcherSymbian::addDeferredActiveObject(class QActiveObject *) ?addEncodedQueryItem@QUrl@@QAEXABVQByteArray@@0@Z @ 1003 NONAME ; void QUrl::addEncodedQueryItem(class QByteArray const &, class QByteArray const &) ?addExtraNamespaceDeclaration@QXmlStreamReader@@QAEXABVQXmlStreamNamespaceDeclaration@@@Z @ 1004 NONAME ; void QXmlStreamReader::addExtraNamespaceDeclaration(class QXmlStreamNamespaceDeclaration const &) ?addExtraNamespaceDeclarations@QXmlStreamReader@@QAEXABV?$QVector@VQXmlStreamNamespaceDeclaration@@@@@Z @ 1005 NONAME ; void QXmlStreamReader::addExtraNamespaceDeclarations(class QVector<class QXmlStreamNamespaceDeclaration> const &) @@ -2940,7 +2940,7 @@ EXPORTS ?qt_qFindChildren_helper@@YAXPBVQObject@@ABVQString@@PBVQRegExp@@ABUQMetaObject@@PAV?$QList@PAX@@@Z @ 2939 NONAME ; void qt_qFindChildren_helper(class QObject const *, class QString const &, class QRegExp const *, struct QMetaObject const &, class QList<void *> *) ?qt_regexp_toCanonical@@YA?AVQString@@ABV1@W4PatternSyntax@QRegExp@@@Z @ 2940 NONAME ; class QString qt_regexp_toCanonical(class QString const &, enum QRegExp::PatternSyntax) ?qt_register_signal_spy_callbacks@@YAXABUQSignalSpyCallbackSet@@@Z @ 2941 NONAME ; void qt_register_signal_spy_callbacks(struct QSignalSpyCallbackSet const &) - ?qt_resolveS60PluginFunc@@YAP6AHXZH@Z @ 2942 NONAME ; int (*)(void) qt_resolveS60PluginFunc(int) + ?qt_resolveS60PluginFunc@@YAP6AHXZH@Z @ 2942 NONAME ABSENT ; int (*)(void) qt_resolveS60PluginFunc(int) ?qt_s60GetRFs@@YAAAVRFs@@XZ @ 2943 NONAME ; class RFs & qt_s60GetRFs(void) ?qt_safe_select@@YAHHPAUfd_set@@00PBUtimeval@@@Z @ 2944 NONAME ; int qt_safe_select(int, struct fd_set *, struct fd_set *, struct fd_set *, struct timeval const *) ?qt_symbianLocaleName@@YA?AVQByteArray@@H@Z @ 2945 NONAME ; class QByteArray qt_symbianLocaleName(int) @@ -3062,7 +3062,7 @@ EXPORTS ?removeColumn@QAbstractItemModel@@QAE_NHABVQModelIndex@@@Z @ 3061 NONAME ; bool QAbstractItemModel::removeColumn(int, class QModelIndex const &) ?removeColumns@QAbstractItemModel@@UAE_NHHABVQModelIndex@@@Z @ 3062 NONAME ; bool QAbstractItemModel::removeColumns(int, int, class QModelIndex const &) ?removeDefaultAnimation@QStateMachine@@QAEXPAVQAbstractAnimation@@@Z @ 3063 NONAME ; void QStateMachine::removeDefaultAnimation(class QAbstractAnimation *) - ?removeDeferredActiveObject@QEventDispatcherSymbian@@QAEXPAVQActiveObject@@@Z @ 3064 NONAME ; void QEventDispatcherSymbian::removeDeferredActiveObject(class QActiveObject *) + ?removeDeferredActiveObject@QEventDispatcherSymbian@@QAEXPAVQActiveObject@@@Z @ 3064 NONAME ABSENT ; void QEventDispatcherSymbian::removeDeferredActiveObject(class QActiveObject *) ?removeEncodedQueryItem@QUrl@@QAEXABVQByteArray@@@Z @ 3065 NONAME ; void QUrl::removeEncodedQueryItem(class QByteArray const &) ?removeEventFilter@QObject@@QAEXPAV1@@Z @ 3066 NONAME ; void QObject::removeEventFilter(class QObject *) ?removeFormat@QMimeData@@QAEXABVQString@@@Z @ 3067 NONAME ; void QMimeData::removeFormat(class QString const &) @@ -4484,8 +4484,8 @@ EXPORTS ?selectThread@QEventDispatcherSymbian@@AAEAAVQSelectThread@@XZ @ 4483 NONAME ; class QSelectThread & QEventDispatcherSymbian::selectThread(void) ?qt_symbian_SetupThreadHeap@@YAHHAAUSStdEpocThreadCreateInfo@@@Z @ 4484 NONAME ; int qt_symbian_SetupThreadHeap(int, struct SStdEpocThreadCreateInfo &) ?objectNameChanged@QAbstractDeclarativeData@@2P6AXPAV1@PAVQObject@@@ZA @ 4485 NONAME ; void (*QAbstractDeclarativeData::objectNameChanged)(class QAbstractDeclarativeData *, class QObject *) - ?queueDeferredActiveObjectsCompletion@QEventDispatcherSymbian@@QAEXXZ @ 4486 NONAME ; void QEventDispatcherSymbian::queueDeferredActiveObjectsCompletion(void) - ?reactivateDeferredActiveObjects@QEventDispatcherSymbian@@UAEXXZ @ 4487 NONAME ; void QEventDispatcherSymbian::reactivateDeferredActiveObjects(void) + ?queueDeferredActiveObjectsCompletion@QEventDispatcherSymbian@@QAEXXZ @ 4486 NONAME ABSENT ; void QEventDispatcherSymbian::queueDeferredActiveObjectsCompletion(void) + ?reactivateDeferredActiveObjects@QEventDispatcherSymbian@@UAEXXZ @ 4487 NONAME ABSENT ; void QEventDispatcherSymbian::reactivateDeferredActiveObjects(void) ?contains@QString@@QBE?AVQBool@@ABVQStringRef@@W4CaseSensitivity@Qt@@@Z @ 4488 NONAME ; class QBool QString::contains(class QStringRef const &, enum Qt::CaseSensitivity) const ?swap@QRegExp@@QAEXAAV1@@Z @ 4489 NONAME ; void QRegExp::swap(class QRegExp &) ?indexOf@QStringRef@@QBEHABVQString@@HW4CaseSensitivity@Qt@@@Z @ 4490 NONAME ; int QStringRef::indexOf(class QString const &, int, enum Qt::CaseSensitivity) const @@ -4612,17 +4612,17 @@ EXPORTS ?reactivateAndComplete@QActiveObject@@QAEXXZ @ 4611 NONAME ; void QActiveObject::reactivateAndComplete(void) ?defaultConnection@QSymbianSocketManager@@QBEPAVRConnection@@XZ @ 4612 NONAME ; class RConnection * QSymbianSocketManager::defaultConnection(void) const ?qt_symbianGetSocketServer@@YAAAVRSocketServ@@XZ @ 4613 NONAME ; class RSocketServ & qt_symbianGetSocketServer(void) - ?maybeQueueForLater@QActiveObject@@QAE_NXZ @ 4614 NONAME ; bool QActiveObject::maybeQueueForLater(void) + ?maybeQueueForLater@QActiveObject@@QAE_NXZ @ 4614 NONAME ABSENT ; bool QActiveObject::maybeQueueForLater(void) ??_EQActiveObject@@UAE@I@Z @ 4615 NONAME ; QActiveObject::~QActiveObject(unsigned int) ?lookupSocket@QSymbianSocketManager@@QBE_NHAAVRSocket@@@Z @ 4616 NONAME ; bool QSymbianSocketManager::lookupSocket(int, class RSocket &) const - ?wait@QActiveObject@@SA_NPAVCActive@@H@Z @ 4617 NONAME ; bool QActiveObject::wait(class CActive *, int) + ?wait@QActiveObject@@SA_NPAVCActive@@H@Z @ 4617 NONAME ABSENT ; bool QActiveObject::wait(class CActive *, int) ?instance@QSymbianSocketManager@@SAAAV1@XZ @ 4618 NONAME ; class QSymbianSocketManager & QSymbianSocketManager::instance(void) ??0QSymbianSocketManager@@QAE@XZ @ 4619 NONAME ; QSymbianSocketManager::QSymbianSocketManager(void) ?create@QNonContiguousByteDeviceFactory@@SAPAVQNonContiguousByteDevice@@V?$QSharedPointer@VQRingBuffer@@@@@Z @ 4620 NONAME ; class QNonContiguousByteDevice * QNonContiguousByteDeviceFactory::create(class QSharedPointer<class QRingBuffer>) ??1QSymbianSocketManager@@QAE@XZ @ 4621 NONAME ; QSymbianSocketManager::~QSymbianSocketManager(void) ?isResetDisabled@QNonContiguousByteDevice@@QAE_NXZ @ 4622 NONAME ; bool QNonContiguousByteDevice::isResetDisabled(void) ??1QActiveObject@@UAE@XZ @ 4623 NONAME ; QActiveObject::~QActiveObject(void) - ?wait@QActiveObject@@SA_NV?$QList@PAVCActive@@@@H@Z @ 4624 NONAME ; bool QActiveObject::wait(class QList<class CActive *>, int) + ?wait@QActiveObject@@SA_NV?$QList@PAVCActive@@@@H@Z @ 4624 NONAME ABSENT ; bool QActiveObject::wait(class QList<class CActive *>, int) ?maybeDeferSocketEvent@QActiveObject@@QAE_NXZ @ 4625 NONAME ; bool QActiveObject::maybeDeferSocketEvent(void) ?lookupSocket@QSymbianSocketManager@@QBEHABVRSocket@@@Z @ 4626 NONAME ; int QSymbianSocketManager::lookupSocket(class RSocket const &) const ?areSocketEventsBlocked@QEventDispatcherSymbian@@QBE_NXZ @ 4627 NONAME ; bool QEventDispatcherSymbian::areSocketEventsBlocked(void) const @@ -4844,172 +4844,4 @@ EXPORTS ?staticMetaObjectExtraData@QEventTransition@@0UQMetaObjectExtraData@@B @ 4843 NONAME ; struct QMetaObjectExtraData const QEventTransition::staticMetaObjectExtraData ?qt_static_metacall@QEventLoop@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 4844 NONAME ; void QEventLoop::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) ?keys@QProcessEnvironment@@QBE?AVQStringList@@XZ @ 4845 NONAME ; class QStringList QProcessEnvironment::keys(void) const - ?progressTextChanged@QFutureWatcherBase@@IAEXABVQString@@@Z @ 4846 NONAME ; void QFutureWatcherBase::progressTextChanged(class QString const &) - ?timeAfterUser@BlockSizeManager@QtConcurrent@@QAEXXZ @ 4847 NONAME ABSENT ; void QtConcurrent::BlockSizeManager::timeAfterUser(void) - ?hasThrown@ExceptionStore@internal@QtConcurrent@@QBE_NXZ @ 4848 NONAME ABSENT ; bool QtConcurrent::internal::ExceptionStore::hasThrown(void) const - ??1ExceptionStore@internal@QtConcurrent@@QAE@XZ @ 4849 NONAME ABSENT ; QtConcurrent::internal::ExceptionStore::~ExceptionStore(void) - ?isVector@ResultIteratorBase@QtConcurrent@@QBE_NXZ @ 4850 NONAME ABSENT ; bool QtConcurrent::ResultIteratorBase::isVector(void) const - ?queryState@QFutureInterfaceBase@@QBE_NW4State@1@@Z @ 4851 NONAME ABSENT ; bool QFutureInterfaceBase::queryState(enum QFutureInterfaceBase::State) const - ?end@ResultStoreBase@QtConcurrent@@QBE?AVResultIteratorBase@2@XZ @ 4852 NONAME ABSENT ; class QtConcurrent::ResultIteratorBase QtConcurrent::ResultStoreBase::end(void) const - ?run@ThreadEngineBase@QtConcurrent@@EAEXXZ @ 4853 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::run(void) - ?exception@ExceptionStore@internal@QtConcurrent@@QAE?AVExceptionHolder@23@XZ @ 4854 NONAME ABSENT ; class QtConcurrent::internal::ExceptionHolder QtConcurrent::internal::ExceptionStore::exception(void) - ?isStarted@QFutureWatcherBase@@QBE_NXZ @ 4855 NONAME ABSENT ; bool QFutureWatcherBase::isStarted(void) const - ?resultIndex@ResultIteratorBase@QtConcurrent@@QBEHXZ @ 4856 NONAME ABSENT ; int QtConcurrent::ResultIteratorBase::resultIndex(void) const - ?qt_metacast@QFutureWatcherBase@@UAEPAXPBD@Z @ 4857 NONAME ; void * QFutureWatcherBase::qt_metacast(char const *) - ??9QFutureInterfaceBase@@QBE_NABV0@@Z @ 4858 NONAME ABSENT ; bool QFutureInterfaceBase::operator!=(class QFutureInterfaceBase const &) const - ??0QFutureInterfaceBase@@QAE@W4State@0@@Z @ 4859 NONAME ABSENT ; QFutureInterfaceBase::QFutureInterfaceBase(enum QFutureInterfaceBase::State) - ?staticMetaObjectExtraData@QFutureWatcherBase@@0UQMetaObjectExtraData@@B @ 4860 NONAME ; struct QMetaObjectExtraData const QFutureWatcherBase::staticMetaObjectExtraData - ??0QFutureWatcherBase@@QAE@PAVQObject@@@Z @ 4861 NONAME ABSENT ; QFutureWatcherBase::QFutureWatcherBase(class QObject *) - ??1QFutureInterfaceBase@@UAE@XZ @ 4862 NONAME ABSENT ; QFutureInterfaceBase::~QFutureInterfaceBase(void) - ?resume@QFutureWatcherBase@@QAEXXZ @ 4863 NONAME ; void QFutureWatcherBase::resume(void) - ?startSingleThreaded@ThreadEngineBase@QtConcurrent@@QAEXXZ @ 4864 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::startSingleThreaded(void) - ?setPaused@QFutureWatcherBase@@QAEX_N@Z @ 4865 NONAME ; void QFutureWatcherBase::setPaused(bool) - ?waitForResume@QFutureInterfaceBase@@QAEXXZ @ 4866 NONAME ABSENT ; void QFutureInterfaceBase::waitForResume(void) - ?progressMinimum@QFutureInterfaceBase@@QBEHXZ @ 4867 NONAME ABSENT ; int QFutureInterfaceBase::progressMinimum(void) const - ?hasException@ExceptionStore@internal@QtConcurrent@@QBE_NXZ @ 4868 NONAME ABSENT ; bool QtConcurrent::internal::ExceptionStore::hasException(void) const - ?tr@QFutureWatcherBase@@SA?AVQString@@PBD0H@Z @ 4869 NONAME ; class QString QFutureWatcherBase::tr(char const *, char const *, int) - ?resultAt@ResultStoreBase@QtConcurrent@@QBE?AVResultIteratorBase@2@H@Z @ 4870 NONAME ABSENT ; class QtConcurrent::ResultIteratorBase QtConcurrent::ResultStoreBase::resultAt(int) const - ?connectOutputInterface@QFutureWatcherBase@@IAEXXZ @ 4871 NONAME ABSENT ; void QFutureWatcherBase::connectOutputInterface(void) - ?insertResultItem@ResultStoreBase@QtConcurrent@@IAEHHAAVResultItem@2@@Z @ 4872 NONAME ABSENT ; int QtConcurrent::ResultStoreBase::insertResultItem(int, class QtConcurrent::ResultItem &) - ?syncResultCount@ResultStoreBase@QtConcurrent@@IAEXXZ @ 4873 NONAME ABSENT ; void QtConcurrent::ResultStoreBase::syncResultCount(void) - ?setProgressRange@ThreadEngineBase@QtConcurrent@@QAEXHH@Z @ 4874 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::setProgressRange(int, int) - ??_EQFutureWatcherBase@@UAE@I@Z @ 4875 NONAME ABSENT ; QFutureWatcherBase::~QFutureWatcherBase(unsigned int) - ?progressValueChanged@QFutureWatcherBase@@IAEXH@Z @ 4876 NONAME ; void QFutureWatcherBase::progressValueChanged(int) - ?threadExit@ThreadEngineBase@QtConcurrent@@AAEXXZ @ 4877 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::threadExit(void) - ?mutex@QFutureInterfaceBase@@QBEPAVQMutex@@XZ @ 4878 NONAME ABSENT ; class QMutex * QFutureInterfaceBase::mutex(void) const - ?staticMetaObject@QFutureWatcherBase@@2UQMetaObject@@B @ 4879 NONAME ; struct QMetaObject const QFutureWatcherBase::staticMetaObject - ?setException@ExceptionStore@internal@QtConcurrent@@QAEXABVException@3@@Z @ 4880 NONAME ABSENT ; void QtConcurrent::internal::ExceptionStore::setException(class QtConcurrent::Exception const &) - ??0ResultIteratorBase@QtConcurrent@@QAE@XZ @ 4881 NONAME ABSENT ; QtConcurrent::ResultIteratorBase::ResultIteratorBase(void) - ?hasNextResult@ResultStoreBase@QtConcurrent@@QBE_NXZ @ 4882 NONAME ABSENT ; bool QtConcurrent::ResultStoreBase::hasNextResult(void) const - ??_EResultStoreBase@QtConcurrent@@UAE@I@Z @ 4883 NONAME ABSENT ; QtConcurrent::ResultStoreBase::~ResultStoreBase(unsigned int) - ?contains@ResultStoreBase@QtConcurrent@@QBE_NH@Z @ 4884 NONAME ABSENT ; bool QtConcurrent::ResultStoreBase::contains(int) const - ?updateInsertIndex@ResultStoreBase@QtConcurrent@@IAEHHH@Z @ 4885 NONAME ABSENT ; int QtConcurrent::ResultStoreBase::updateInsertIndex(int, int) - ??_EException@QtConcurrent@@UAE@I@Z @ 4886 NONAME ABSENT ; QtConcurrent::Exception::~Exception(unsigned int) - ?qt_metacall@QFutureWatcherBase@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 4887 NONAME ; int QFutureWatcherBase::qt_metacall(enum QMetaObject::Call, int, void * *) - ?isStarted@QFutureInterfaceBase@@QBE_NXZ @ 4888 NONAME ABSENT ; bool QFutureInterfaceBase::isStarted(void) const - ??0QFutureInterfaceBase@@QAE@ABV0@@Z @ 4889 NONAME ABSENT ; QFutureInterfaceBase::QFutureInterfaceBase(class QFutureInterfaceBase const &) - ??_EUnhandledException@QtConcurrent@@UAE@I@Z @ 4890 NONAME ABSENT ; QtConcurrent::UnhandledException::~UnhandledException(unsigned int) - ?progressValue@QFutureWatcherBase@@QBEHXZ @ 4891 NONAME ABSENT ; int QFutureWatcherBase::progressValue(void) const - ??8ResultIteratorBase@QtConcurrent@@QBE_NABV01@@Z @ 4892 NONAME ABSENT ; bool QtConcurrent::ResultIteratorBase::operator==(class QtConcurrent::ResultIteratorBase const &) const - ?tr@QFutureWatcherBase@@SA?AVQString@@PBD0@Z @ 4893 NONAME ; class QString QFutureWatcherBase::tr(char const *, char const *) - ?startBlocking@ThreadEngineBase@QtConcurrent@@QAEXXZ @ 4894 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::startBlocking(void) - ?threadThrottleExit@ThreadEngineBase@QtConcurrent@@AAE_NXZ @ 4895 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::threadThrottleExit(void) - ?isFinished@QFutureWatcherBase@@QBE_NXZ @ 4896 NONAME ABSENT ; bool QFutureWatcherBase::isFinished(void) const - ?resultsReadyAt@QFutureWatcherBase@@IAEXHH@Z @ 4897 NONAME ; void QFutureWatcherBase::resultsReadyAt(int, int) - ?start@ThreadEngineBase@QtConcurrent@@MAEXXZ @ 4898 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::start(void) - ?runningAnimationCount@QUnifiedTimer@@QAEHXZ @ 4899 NONAME ; int QUnifiedTimer::runningAnimationCount(void) - ??9ResultIteratorBase@QtConcurrent@@QBE_NABV01@@Z @ 4900 NONAME ABSENT ; bool QtConcurrent::ResultIteratorBase::operator!=(class QtConcurrent::ResultIteratorBase const &) const - ??1UnhandledException@QtConcurrent@@UAE@XZ @ 4901 NONAME ABSENT ; QtConcurrent::UnhandledException::~UnhandledException(void) - ?shouldStartThread@ThreadEngineBase@QtConcurrent@@MAE_NXZ @ 4902 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::shouldStartThread(void) - ?d_func@QFutureWatcherBase@@AAEPAVQFutureWatcherBasePrivate@@XZ @ 4903 NONAME ; class QFutureWatcherBasePrivate * QFutureWatcherBase::d_func(void) - ?startThread@ThreadEngineBase@QtConcurrent@@QAEXXZ @ 4904 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::startThread(void) - ?threadFunction@ThreadEngineBase@QtConcurrent@@MAE?AW4ThreadFunctionResult@2@XZ @ 4905 NONAME ABSENT ; enum QtConcurrent::ThreadFunctionResult QtConcurrent::ThreadEngineBase::threadFunction(void) - ?count@ResultStoreBase@QtConcurrent@@QBEHXZ @ 4906 NONAME ABSENT ; int QtConcurrent::ResultStoreBase::count(void) const - ?isThrottled@QFutureInterfaceBase@@QBE_NXZ @ 4907 NONAME ABSENT ; bool QFutureInterfaceBase::isThrottled(void) const - ?waitForResume@ThreadEngineBase@QtConcurrent@@QAEXXZ @ 4908 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::waitForResume(void) - ?progressMinimum@QFutureWatcherBase@@QBEHXZ @ 4909 NONAME ABSENT ; int QFutureWatcherBase::progressMinimum(void) const - ??1ThreadEngineBase@QtConcurrent@@UAE@XZ @ 4910 NONAME ABSENT ; QtConcurrent::ThreadEngineBase::~ThreadEngineBase(void) - ?finished@QFutureWatcherBase@@IAEXXZ @ 4911 NONAME ; void QFutureWatcherBase::finished(void) - ?progressMaximum@QFutureInterfaceBase@@QBEHXZ @ 4912 NONAME ABSENT ; int QFutureInterfaceBase::progressMaximum(void) const - ?pause@QFutureWatcherBase@@QAEXXZ @ 4913 NONAME ; void QFutureWatcherBase::pause(void) - ?isProgressReportingEnabled@ThreadEngineBase@QtConcurrent@@QAE_NXZ @ 4914 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::isProgressReportingEnabled(void) - ?blockSizeMaxed@BlockSizeManager@QtConcurrent@@AAE_NXZ @ 4915 NONAME ABSENT ; bool QtConcurrent::BlockSizeManager::blockSizeMaxed(void) - ?isCanceled@QFutureInterfaceBase@@QBE_NXZ @ 4916 NONAME ABSENT ; bool QFutureInterfaceBase::isCanceled(void) const - ?cancel@QFutureInterfaceBase@@QAEXXZ @ 4917 NONAME ABSENT ; void QFutureInterfaceBase::cancel(void) - ?setFilterMode@QFutureInterfaceBase@@QAEX_N@Z @ 4918 NONAME ABSENT ; void QFutureInterfaceBase::setFilterMode(bool) - ?setProgressValueAndText@QFutureInterfaceBase@@QAEXHABVQString@@@Z @ 4919 NONAME ABSENT ; void QFutureInterfaceBase::setProgressValueAndText(int, class QString const &) - ?setRunnable@QFutureInterfaceBase@@QAEXPAVQRunnable@@@Z @ 4920 NONAME ABSENT ; void QFutureInterfaceBase::setRunnable(class QRunnable *) - ?trUtf8@QFutureWatcherBase@@SA?AVQString@@PBD0H@Z @ 4921 NONAME ; class QString QFutureWatcherBase::trUtf8(char const *, char const *, int) - ?paused@QFutureWatcherBase@@IAEXXZ @ 4922 NONAME ; void QFutureWatcherBase::paused(void) - ?disconnectOutputInterface@QFutureWatcherBase@@IAEX_N@Z @ 4923 NONAME ABSENT ; void QFutureWatcherBase::disconnectOutputInterface(bool) - ?isCanceled@QFutureWatcherBase@@QBE_NXZ @ 4924 NONAME ABSENT ; bool QFutureWatcherBase::isCanceled(void) const - ?expectedResultCount@QFutureInterfaceBase@@QAEHXZ @ 4925 NONAME ABSENT ; int QFutureInterfaceBase::expectedResultCount(void) - ??_EQFutureInterfaceBase@@UAE@I@Z @ 4926 NONAME ABSENT ; QFutureInterfaceBase::~QFutureInterfaceBase(unsigned int) - ?waitForResult@QFutureInterfaceBase@@QAEXH@Z @ 4927 NONAME ABSENT ; void QFutureInterfaceBase::waitForResult(int) - ?d_func@QFutureWatcherBase@@ABEPBVQFutureWatcherBasePrivate@@XZ @ 4928 NONAME ; class QFutureWatcherBasePrivate const * QFutureWatcherBase::d_func(void) const - ?setPaused@QFutureInterfaceBase@@QAEX_N@Z @ 4929 NONAME ABSENT ; void QFutureInterfaceBase::setPaused(bool) - ??_EThreadEngineBase@QtConcurrent@@UAE@I@Z @ 4930 NONAME ABSENT ; QtConcurrent::ThreadEngineBase::~ThreadEngineBase(unsigned int) - ??0Exception@QtConcurrent@@QAE@ABV01@@Z @ 4931 NONAME ABSENT ; QtConcurrent::Exception::Exception(class QtConcurrent::Exception const &) - ?referenceCountIsOne@QFutureInterfaceBase@@IBE_NXZ @ 4932 NONAME ABSENT ; bool QFutureInterfaceBase::referenceCountIsOne(void) const - ?progressText@QFutureInterfaceBase@@QBE?AVQString@@XZ @ 4933 NONAME ABSENT ; class QString QFutureInterfaceBase::progressText(void) const - ?startThreadInternal@ThreadEngineBase@QtConcurrent@@AAE_NXZ @ 4934 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::startThreadInternal(void) - ?addResult@ResultStoreBase@QtConcurrent@@QAEHHPBX@Z @ 4935 NONAME ABSENT ; int QtConcurrent::ResultStoreBase::addResult(int, void const *) - ?waitForFinished@QFutureWatcherBase@@QAEXXZ @ 4936 NONAME ABSENT ; void QFutureWatcherBase::waitForFinished(void) - ?togglePaused@QFutureInterfaceBase@@QAEXXZ @ 4937 NONAME ABSENT ; void QFutureInterfaceBase::togglePaused(void) - ?isProgressUpdateNeeded@QFutureInterfaceBase@@QBE_NXZ @ 4938 NONAME ABSENT ; bool QFutureInterfaceBase::isProgressUpdateNeeded(void) const - ?resultReadyAt@QFutureWatcherBase@@IAEXH@Z @ 4939 NONAME ; void QFutureWatcherBase::resultReadyAt(int) - ?waitForNextResult@QFutureInterfaceBase@@QAE_NXZ @ 4940 NONAME ABSENT ; bool QFutureInterfaceBase::waitForNextResult(void) - ?raise@UnhandledException@QtConcurrent@@UBEXXZ @ 4941 NONAME ABSENT ; void QtConcurrent::UnhandledException::raise(void) const - ?setProgressValue@QFutureInterfaceBase@@QAEXH@Z @ 4942 NONAME ABSENT ; void QFutureInterfaceBase::setProgressValue(int) - ?startThreads@ThreadEngineBase@QtConcurrent@@AAEXXZ @ 4943 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::startThreads(void) - ?isPaused@QFutureInterfaceBase@@QBE_NXZ @ 4944 NONAME ABSENT ; bool QFutureInterfaceBase::isPaused(void) const - ?resultStoreBase@QFutureInterfaceBase@@QAEAAVResultStoreBase@QtConcurrent@@XZ @ 4945 NONAME ABSENT ; class QtConcurrent::ResultStoreBase & QFutureInterfaceBase::resultStoreBase(void) - ?isRunning@QFutureInterfaceBase@@QBE_NXZ @ 4946 NONAME ABSENT ; bool QFutureInterfaceBase::isRunning(void) const - ?begin@ResultStoreBase@QtConcurrent@@QBE?AVResultIteratorBase@2@XZ @ 4947 NONAME ABSENT ; class QtConcurrent::ResultIteratorBase QtConcurrent::ResultStoreBase::begin(void) const - ?resultStoreBase@QFutureInterfaceBase@@QBEABVResultStoreBase@QtConcurrent@@XZ @ 4948 NONAME ABSENT ; class QtConcurrent::ResultStoreBase const & QFutureInterfaceBase::resultStoreBase(void) const - ?setExpectedResultCount@QFutureInterfaceBase@@QAEXH@Z @ 4949 NONAME ABSENT ; void QFutureInterfaceBase::setExpectedResultCount(int) - ?progressMaximum@QFutureWatcherBase@@QBEHXZ @ 4950 NONAME ABSENT ; int QFutureWatcherBase::progressMaximum(void) const - ??0ResultStoreBase@QtConcurrent@@QAE@XZ @ 4951 NONAME ABSENT ; QtConcurrent::ResultStoreBase::ResultStoreBase(void) - ?setProgressRange@QFutureInterfaceBase@@QAEXHH@Z @ 4952 NONAME ABSENT ; void QFutureInterfaceBase::setProgressRange(int, int) - ?canIncrementVectorIndex@ResultIteratorBase@QtConcurrent@@QBE_NXZ @ 4953 NONAME ABSENT ; bool QtConcurrent::ResultIteratorBase::canIncrementVectorIndex(void) const - ?progressValue@QFutureInterfaceBase@@QBEHXZ @ 4954 NONAME ABSENT ; int QFutureInterfaceBase::progressValue(void) const - ?cancel@QFutureWatcherBase@@QAEXXZ @ 4955 NONAME ; void QFutureWatcherBase::cancel(void) - ?trolltechConf@QCoreApplicationPrivate@@SAPAVQSettings@@XZ @ 4956 NONAME ; class QSettings * QCoreApplicationPrivate::trolltechConf(void) - ?trUtf8@QFutureWatcherBase@@SA?AVQString@@PBD0@Z @ 4957 NONAME ; class QString QFutureWatcherBase::trUtf8(char const *, char const *) - ?getStaticMetaObject@QFutureWatcherBase@@SAABUQMetaObject@@XZ @ 4958 NONAME ; struct QMetaObject const & QFutureWatcherBase::getStaticMetaObject(void) - ?vectorIndex@ResultIteratorBase@QtConcurrent@@QBEHXZ @ 4959 NONAME ABSENT ; int QtConcurrent::ResultIteratorBase::vectorIndex(void) const - ?syncPendingResults@ResultStoreBase@QtConcurrent@@IAEXXZ @ 4960 NONAME ABSENT ; void QtConcurrent::ResultStoreBase::syncPendingResults(void) - ?progressText@QFutureWatcherBase@@QBE?AVQString@@XZ @ 4961 NONAME ABSENT ; class QString QFutureWatcherBase::progressText(void) const - ??1QFutureWatcherBase@@UAE@XZ @ 4962 NONAME ABSENT ; QFutureWatcherBase::~QFutureWatcherBase(void) - ?togglePaused@QFutureWatcherBase@@QAEXXZ @ 4963 NONAME ; void QFutureWatcherBase::togglePaused(void) - ?acquireBarrierSemaphore@ThreadEngineBase@QtConcurrent@@QAEXXZ @ 4964 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::acquireBarrierSemaphore(void) - ?setFilterMode@ResultStoreBase@QtConcurrent@@QAEX_N@Z @ 4965 NONAME ABSENT ; void QtConcurrent::ResultStoreBase::setFilterMode(bool) - ?disconnectNotify@QFutureWatcherBase@@MAEXPBD@Z @ 4966 NONAME ABSENT ; void QFutureWatcherBase::disconnectNotify(char const *) - ?handleException@ThreadEngineBase@QtConcurrent@@AAEXABVException@2@@Z @ 4967 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::handleException(class QtConcurrent::Exception const &) - ?setThrottled@QFutureInterfaceBase@@QAEX_N@Z @ 4968 NONAME ABSENT ; void QFutureInterfaceBase::setThrottled(bool) - ?setProgressValue@ThreadEngineBase@QtConcurrent@@QAEXH@Z @ 4969 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::setProgressValue(int) - ??4QFutureInterfaceBase@@QAEAAV0@ABV0@@Z @ 4970 NONAME ABSENT ; class QFutureInterfaceBase & QFutureInterfaceBase::operator=(class QFutureInterfaceBase const &) - ?isFinished@QFutureInterfaceBase@@QBE_NXZ @ 4971 NONAME ABSENT ; bool QFutureInterfaceBase::isFinished(void) const - ?progressRangeChanged@QFutureWatcherBase@@IAEXHH@Z @ 4972 NONAME ; void QFutureWatcherBase::progressRangeChanged(int, int) - ?finish@ThreadEngineBase@QtConcurrent@@MAEXXZ @ 4973 NONAME ABSENT ; void QtConcurrent::ThreadEngineBase::finish(void) - ?isRunning@QFutureWatcherBase@@QBE_NXZ @ 4974 NONAME ABSENT ; bool QFutureWatcherBase::isRunning(void) const - ?reportResultsReady@QFutureInterfaceBase@@QAEXHH@Z @ 4975 NONAME ABSENT ; void QFutureInterfaceBase::reportResultsReady(int, int) - ?qt_static_metacall@QFutureWatcherBase@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 4976 NONAME ; void QFutureWatcherBase::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?blockSize@BlockSizeManager@QtConcurrent@@QAEHXZ @ 4977 NONAME ABSENT ; int QtConcurrent::BlockSizeManager::blockSize(void) - ??0BlockSizeManager@QtConcurrent@@QAE@H@Z @ 4978 NONAME ABSENT ; QtConcurrent::BlockSizeManager::BlockSizeManager(int) - ?batchSize@ResultIteratorBase@QtConcurrent@@QBEHXZ @ 4979 NONAME ABSENT ; int QtConcurrent::ResultIteratorBase::batchSize(void) const - ?started@QFutureWatcherBase@@IAEXXZ @ 4980 NONAME ; void QFutureWatcherBase::started(void) - ?metaObject@QFutureWatcherBase@@UBEPBUQMetaObject@@XZ @ 4981 NONAME ; struct QMetaObject const * QFutureWatcherBase::metaObject(void) const - ?resumed@QFutureWatcherBase@@IAEXXZ @ 4982 NONAME ; void QFutureWatcherBase::resumed(void) - ??0UnhandledException@QtConcurrent@@QAE@ABV01@@Z @ 4983 NONAME ABSENT ; QtConcurrent::UnhandledException::UnhandledException(class QtConcurrent::UnhandledException const &) - ?timeBeforeUser@BlockSizeManager@QtConcurrent@@QAEXXZ @ 4984 NONAME ABSENT ; void QtConcurrent::BlockSizeManager::timeBeforeUser(void) - ??EResultIteratorBase@QtConcurrent@@QAE?AV01@XZ @ 4985 NONAME ABSENT ; class QtConcurrent::ResultIteratorBase QtConcurrent::ResultIteratorBase::operator++(void) - ?isResultReadyAt@QFutureInterfaceBase@@QBE_NH@Z @ 4986 NONAME ABSENT ; bool QFutureInterfaceBase::isResultReadyAt(int) const - ?throwPossibleException@ExceptionStore@internal@QtConcurrent@@QAEXXZ @ 4987 NONAME ABSENT ; void QtConcurrent::internal::ExceptionStore::throwPossibleException(void) - ?setPendingResultsLimit@QFutureWatcherBase@@QAEXH@Z @ 4988 NONAME ABSENT ; void QFutureWatcherBase::setPendingResultsLimit(int) - ?resultCount@QFutureInterfaceBase@@QBEHXZ @ 4989 NONAME ABSENT ; int QFutureInterfaceBase::resultCount(void) const - ?event@QFutureWatcherBase@@UAE_NPAVQEvent@@@Z @ 4990 NONAME ABSENT ; bool QFutureWatcherBase::event(class QEvent *) - ?isPaused@QFutureWatcherBase@@QBE_NXZ @ 4991 NONAME ABSENT ; bool QFutureWatcherBase::isPaused(void) const - ?clone@Exception@QtConcurrent@@UBEPAV12@XZ @ 4992 NONAME ABSENT ; class QtConcurrent::Exception * QtConcurrent::Exception::clone(void) const - ?insertResultItemIfValid@ResultStoreBase@QtConcurrent@@IAEXHAAVResultItem@2@@Z @ 4993 NONAME ABSENT ; void QtConcurrent::ResultStoreBase::insertResultItemIfValid(int, class QtConcurrent::ResultItem &) - ?reportException@QFutureInterfaceBase@@QAEXABVException@QtConcurrent@@@Z @ 4994 NONAME ABSENT ; void QFutureInterfaceBase::reportException(class QtConcurrent::Exception const &) - ?waitForFinished@QFutureInterfaceBase@@QAEXXZ @ 4995 NONAME ABSENT ; void QFutureInterfaceBase::waitForFinished(void) - ??0ResultIteratorBase@QtConcurrent@@QAE@Vconst_iterator@?$QMap@HVResultItem@QtConcurrent@@@@H@Z @ 4996 NONAME ABSENT ; QtConcurrent::ResultIteratorBase::ResultIteratorBase(class QMap<int, class QtConcurrent::ResultItem>::const_iterator, int) - ?reportStarted@QFutureInterfaceBase@@QAEXXZ @ 4997 NONAME ABSENT ; void QFutureInterfaceBase::reportStarted(void) - ??8QFutureInterfaceBase@@QBE_NABV0@@Z @ 4998 NONAME ABSENT ; bool QFutureInterfaceBase::operator==(class QFutureInterfaceBase const &) const - ?addResults@ResultStoreBase@QtConcurrent@@QAEHHPBXHH@Z @ 4999 NONAME ABSENT ; int QtConcurrent::ResultStoreBase::addResults(int, void const *, int, int) - ?shouldThrottleThread@ThreadEngineBase@QtConcurrent@@MAE_NXZ @ 5000 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::shouldThrottleThread(void) - ?reportFinished@QFutureInterfaceBase@@QAEXXZ @ 5001 NONAME ABSENT ; void QFutureInterfaceBase::reportFinished(void) - ??0ThreadEngineBase@QtConcurrent@@QAE@XZ @ 5002 NONAME ABSENT ; QtConcurrent::ThreadEngineBase::ThreadEngineBase(void) - ??1Exception@QtConcurrent@@UAE@XZ @ 5003 NONAME ABSENT ; QtConcurrent::Exception::~Exception(void) - ?filterMode@ResultStoreBase@QtConcurrent@@QBE_NXZ @ 5004 NONAME ABSENT ; bool QtConcurrent::ResultStoreBase::filterMode(void) const - ?raise@Exception@QtConcurrent@@UBEXXZ @ 5005 NONAME ABSENT ; void QtConcurrent::Exception::raise(void) const - ?batchedAdvance@ResultIteratorBase@QtConcurrent@@QAEXXZ @ 5006 NONAME ABSENT ; void QtConcurrent::ResultIteratorBase::batchedAdvance(void) - ?exceptionStore@QFutureInterfaceBase@@QAEAAVExceptionStore@internal@QtConcurrent@@XZ @ 5007 NONAME ABSENT ; class QtConcurrent::internal::ExceptionStore & QFutureInterfaceBase::exceptionStore(void) - ?reportCanceled@QFutureInterfaceBase@@QAEXXZ @ 5008 NONAME ABSENT ; void QFutureInterfaceBase::reportCanceled(void) - ?connectNotify@QFutureWatcherBase@@MAEXPBD@Z @ 5009 NONAME ABSENT ; void QFutureWatcherBase::connectNotify(char const *) - ??1ResultStoreBase@QtConcurrent@@UAE@XZ @ 5010 NONAME ABSENT ; QtConcurrent::ResultStoreBase::~ResultStoreBase(void) - ?isCanceled@ThreadEngineBase@QtConcurrent@@QAE_NXZ @ 5011 NONAME ABSENT ; bool QtConcurrent::ThreadEngineBase::isCanceled(void) - ?canceled@QFutureWatcherBase@@IAEXXZ @ 5012 NONAME ; void QFutureWatcherBase::canceled(void) - ?clone@UnhandledException@QtConcurrent@@UBEPAVException@2@XZ @ 5013 NONAME ABSENT ; class QtConcurrent::Exception * QtConcurrent::UnhandledException::clone(void) const diff --git a/src/s60installs/bwins/QtDeclarativeu.def b/src/s60installs/bwins/QtDeclarativeu.def index 18639fd..2cfdd22 100644 --- a/src/s60installs/bwins/QtDeclarativeu.def +++ b/src/s60installs/bwins/QtDeclarativeu.def @@ -1716,7 +1716,7 @@ EXPORTS ?inWorkerThread@QDeclarativeListModel@@ABE_NXZ @ 1715 NONAME ABSENT ; bool QDeclarativeListModel::inWorkerThread(void) const ?canMove@QDeclarativeListModel@@ABE_NHHH@Z @ 1716 NONAME ABSENT ; bool QDeclarativeListModel::canMove(int, int, int) const ?getScriptEngine@QDeclarativeDebugHelper@@SAPAVQScriptEngine@@PAVQDeclarativeEngine@@@Z @ 1717 NONAME ABSENT ; class QScriptEngine * QDeclarativeDebugHelper::getScriptEngine(class QDeclarativeEngine *) - ?setAnimationSlowDownFactor@QDeclarativeDebugHelper@@SAXM@Z @ 1718 NONAME ABSENT ; void QDeclarativeDebugHelper::setAnimationSlowDownFactor(float) + ?setAnimationSlowDownFactor@QDeclarativeDebugHelper@@SAXM@Z @ 1718 NONAME ; void QDeclarativeDebugHelper::setAnimationSlowDownFactor(float) ?add@QDeclarativeBasePositioner@@QBEPAVQDeclarativeTransition@@XZ @ 1719 NONAME ABSENT ; class QDeclarativeTransition * QDeclarativeBasePositioner::add(void) const ?setLoops@QDeclarativeAbstractAnimation@@QAEXH@Z @ 1720 NONAME ABSENT ; void QDeclarativeAbstractAnimation::setLoops(int) ?trUtf8@QDeclarativeAbstractAnimation@@SA?AVQString@@PBD0@Z @ 1721 NONAME ABSENT ; class QString QDeclarativeAbstractAnimation::trUtf8(char const *, char const *) @@ -1923,34 +1923,4 @@ EXPORTS ?staticMetaObjectExtraData@QDeclarativeStateGroup@@0UQMetaObjectExtraData@@B @ 1922 NONAME ; struct QMetaObjectExtraData const QDeclarativeStateGroup::staticMetaObjectExtraData ?staticMetaObjectExtraData@QDeclarativeView@@0UQMetaObjectExtraData@@B @ 1923 NONAME ; struct QMetaObjectExtraData const QDeclarativeView::staticMetaObjectExtraData ?qt_static_metacall@QDeclarativeEngine@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 1924 NONAME ; void QDeclarativeEngine::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QDeclarativeDebuggingEnabler@@QAE@XZ @ 1925 NONAME ; QDeclarativeDebuggingEnabler::QDeclarativeDebuggingEnabler(void) - ?removeView@QDeclarativeObserverService@@QAEXPAVQDeclarativeView@@@Z @ 1926 NONAME ; void QDeclarativeObserverService::removeView(class QDeclarativeView *) - ??_EQDeclarativeObserverService@@UAE@I@Z @ 1927 NONAME ; QDeclarativeObserverService::~QDeclarativeObserverService(unsigned int) - ?sendMessage@QDeclarativeObserverService@@QAEXABVQByteArray@@@Z @ 1928 NONAME ; void QDeclarativeObserverService::sendMessage(class QByteArray const &) - ?instance@QDeclarativeObserverService@@SAPAV1@XZ @ 1929 NONAME ; class QDeclarativeObserverService * QDeclarativeObserverService::instance(void) - ?trUtf8@QDeclarativeObserverService@@SA?AVQString@@PBD0@Z @ 1930 NONAME ; class QString QDeclarativeObserverService::trUtf8(char const *, char const *) - ?messageReceived@QDeclarativeObserverService@@MAEXABVQByteArray@@@Z @ 1931 NONAME ; void QDeclarativeObserverService::messageReceived(class QByteArray const &) - ?views@QDeclarativeObserverService@@QBE?AV?$QList@PAVQDeclarativeView@@@@XZ @ 1932 NONAME ; class QList<class QDeclarativeView *> QDeclarativeObserverService::views(void) const - ?waitForReadyRead@QPacketProtocol@@QAE_NH@Z @ 1933 NONAME ; bool QPacketProtocol::waitForReadyRead(int) - ?waitForMessage@QDeclarativeDebugService@@QAE_NXZ @ 1934 NONAME ; bool QDeclarativeDebugService::waitForMessage(void) - ?tr@QDeclarativeObserverService@@SA?AVQString@@PBD0@Z @ 1935 NONAME ; class QString QDeclarativeObserverService::tr(char const *, char const *) - ?tr@QDeclarativeObserverService@@SA?AVQString@@PBD0H@Z @ 1936 NONAME ; class QString QDeclarativeObserverService::tr(char const *, char const *, int) - ?qt_static_metacall@QDeclarativeObserverService@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 1937 NONAME ; void QDeclarativeObserverService::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDeclarativeObserverService@@0UQMetaObjectExtraData@@B @ 1938 NONAME ; struct QMetaObjectExtraData const QDeclarativeObserverService::staticMetaObjectExtraData - ?waitForMessage@QDeclarativeDebugServer@@QAE_NPAVQDeclarativeDebugService@@@Z @ 1939 NONAME ; bool QDeclarativeDebugServer::waitForMessage(class QDeclarativeDebugService *) - ??1QDeclarativeObserverService@@UAE@XZ @ 1940 NONAME ; QDeclarativeObserverService::~QDeclarativeObserverService(void) - ?qt_metacast@QDeclarativeObserverService@@UAEPAXPBD@Z @ 1941 NONAME ; void * QDeclarativeObserverService::qt_metacast(char const *) - ??_EQDeclarativeObserverInterface@@UAE@I@Z @ 1942 NONAME ; QDeclarativeObserverInterface::~QDeclarativeObserverInterface(unsigned int) - ?qt_metacall@QDeclarativeObserverService@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1943 NONAME ; int QDeclarativeObserverService::qt_metacall(enum QMetaObject::Call, int, void * *) - ?staticMetaObject@QDeclarativeObserverService@@2UQMetaObject@@B @ 1944 NONAME ; struct QMetaObject const QDeclarativeObserverService::staticMetaObject - ?addView@QDeclarativeObserverService@@QAEXPAVQDeclarativeView@@@Z @ 1945 NONAME ; void QDeclarativeObserverService::addView(class QDeclarativeView *) - ?trUtf8@QDeclarativeObserverService@@SA?AVQString@@PBD0H@Z @ 1946 NONAME ; class QString QDeclarativeObserverService::trUtf8(char const *, char const *, int) - ??0QDeclarativeObserverService@@QAE@XZ @ 1947 NONAME ; QDeclarativeObserverService::QDeclarativeObserverService(void) - ?loadObserverPlugin@QDeclarativeObserverService@@CAPAVQDeclarativeObserverInterface@@XZ @ 1948 NONAME ; class QDeclarativeObserverInterface * QDeclarativeObserverService::loadObserverPlugin(void) - ??1QDeclarativeObserverInterface@@UAE@XZ @ 1949 NONAME ; QDeclarativeObserverInterface::~QDeclarativeObserverInterface(void) - ?statusChanged@QDeclarativeObserverService@@MAEXW4Status@QDeclarativeDebugService@@@Z @ 1950 NONAME ; void QDeclarativeObserverService::statusChanged(enum QDeclarativeDebugService::Status) - ?getStaticMetaObject@QDeclarativeObserverService@@SAABUQMetaObject@@XZ @ 1951 NONAME ; struct QMetaObject const & QDeclarativeObserverService::getStaticMetaObject(void) - ??0QDeclarativeObserverInterface@@QAE@XZ @ 1952 NONAME ; QDeclarativeObserverInterface::QDeclarativeObserverInterface(void) - ?gotMessage@QDeclarativeObserverService@@IAEXABVQByteArray@@@Z @ 1953 NONAME ; void QDeclarativeObserverService::gotMessage(class QByteArray const &) - ?metaObject@QDeclarativeObserverService@@UBEPBUQMetaObject@@XZ @ 1954 NONAME ; struct QMetaObject const * QDeclarativeObserverService::metaObject(void) const diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def index 3c9c16d..f40790b 100644 --- a/src/s60installs/bwins/QtGuiu.def +++ b/src/s60installs/bwins/QtGuiu.def @@ -12855,7 +12855,7 @@ EXPORTS ?populate@QTextureGlyphCache@@QAEXPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12854 NONAME ABSENT ; void QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *) ?hasPartialUpdateSupport@QWindowSurface@@UBE_NXZ @ 12855 NONAME ABSENT ; bool QWindowSurface::hasPartialUpdateSupport(void) const ?scroll@QRuntimePixmapData@@UAE_NHHABVQRect@@@Z @ 12856 NONAME ; bool QRuntimePixmapData::scroll(int, int, class QRect const &) - ?qt_draw_glyphs@@YAXPAVQPainter@@PBIPBVQPointF@@H@Z @ 12857 NONAME ABSENT ; void qt_draw_glyphs(class QPainter *, unsigned int const *, class QPointF const *, int) + ?qt_draw_glyphs@@YAXPAVQPainter@@PBIPBVQPointF@@H@Z @ 12857 NONAME ; void qt_draw_glyphs(class QPainter *, unsigned int const *, class QPointF const *, int) ?nativeDisplay@QEgl@@YAHXZ @ 12858 NONAME ; int QEgl::nativeDisplay(void) ?PreDocConstructL@QS60MainApplication@@UAEXXZ @ 12859 NONAME ; void QS60MainApplication::PreDocConstructL(void) ?detach@QStaticText@@AAEXXZ @ 12860 NONAME ; void QStaticText::detach(void) @@ -12902,7 +12902,7 @@ EXPORTS ??0QStaticTextItem@@QAE@ABV0@@Z @ 12901 NONAME ; QStaticTextItem::QStaticTextItem(class QStaticTextItem const &) ??4QStaticTextItem@@QAEXABV0@@Z @ 12902 NONAME ; void QStaticTextItem::operator=(class QStaticTextItem const &) ?fontEngine@QStaticTextItem@@QBEPAVQFontEngine@@XZ @ 12903 NONAME ; class QFontEngine * QStaticTextItem::fontEngine(void) const - ?reactivateDeferredActiveObjects@QEventDispatcherS60@@UAEXXZ @ 12904 NONAME ; void QEventDispatcherS60::reactivateDeferredActiveObjects(void) + ?reactivateDeferredActiveObjects@QEventDispatcherS60@@UAEXXZ @ 12904 NONAME ABSENT ; void QEventDispatcherS60::reactivateDeferredActiveObjects(void) ?userData@QStaticTextItem@@QBEPAVQStaticTextUserData@@XZ @ 12905 NONAME ; class QStaticTextUserData * QStaticTextItem::userData(void) const ?populate@QTextureGlyphCache@@QAE_NPAVQFontEngine@@HPBIPBUQFixedPoint@@@Z @ 12906 NONAME ; bool QTextureGlyphCache::populate(class QFontEngine *, int, unsigned int const *, struct QFixedPoint const *) ?resetCursorBlinkTimer@QLineControl@@QAEXXZ @ 12907 NONAME ; void QLineControl::resetCursorBlinkTimer(void) @@ -12979,7 +12979,7 @@ EXPORTS ?byteCount@QVolatileImage@@QBEHXZ @ 12978 NONAME ; int QVolatileImage::byteCount(void) const ??0QVolatileImage@@QAE@ABV0@@Z @ 12979 NONAME ; QVolatileImage::QVolatileImage(class QVolatileImage const &) ?depth@QVolatileImage@@QBEHXZ @ 12980 NONAME ; int QVolatileImage::depth(void) const - ?releaseCachedResources@QGraphicsSystem@@UAEXXZ @ 12981 NONAME ; void QGraphicsSystem::releaseCachedResources(void) + ?releaseCachedResources@QGraphicsSystem@@UAEXXZ @ 12981 NONAME ABSENT ; void QGraphicsSystem::releaseCachedResources(void) ?qt_s60_setPartialScreenInputMode@@YAX_N@Z @ 12982 NONAME ; void qt_s60_setPartialScreenInputMode(bool) png_access_version_number @ 12983 NONAME png_benign_error @ 12984 NONAME @@ -13201,589 +13201,840 @@ EXPORTS png_write_sig @ 13200 NONAME ?clipEnabledChanged@QBlitterPaintEngine@@UAEXXZ @ 13201 NONAME ; void QBlitterPaintEngine::clipEnabledChanged(void) ?supportsSubPixelPositions@QFontEngine@@UBE_NXZ @ 13202 NONAME ; bool QFontEngine::supportsSubPixelPositions(void) const - ?qt_static_metacall@QEventDispatcherS60@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13203 NONAME ; void QEventDispatcherS60::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QStyledItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13204 NONAME ; void QStyledItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QPixmapDropShadowFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13205 NONAME ; void QPixmapDropShadowFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QS60Style@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13206 NONAME ; void QS60Style::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTableWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13207 NONAME ; void QTableWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTextBrowser@@0UQMetaObjectExtraData@@B @ 13208 NONAME ; struct QMetaObjectExtraData const QTextBrowser::staticMetaObjectExtraData - ?qt_static_metacall@QMenuBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13209 NONAME ; void QMenuBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?exists@QZipWriter@@QBE_NXZ @ 13210 NONAME ; bool QZipWriter::exists(void) const - ?heightForWidth@QTabWidget@@UBEHH@Z @ 13211 NONAME ; int QTabWidget::heightForWidth(int) const - ?staticMetaObjectExtraData@QSplashScreen@@0UQMetaObjectExtraData@@B @ 13212 NONAME ; struct QMetaObjectExtraData const QSplashScreen::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsItemAnimation@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13213 NONAME ; void QGraphicsItemAnimation::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QRasterWindowSurface@@QAE@PAVQWidget@@_N@Z @ 13214 NONAME ; QRasterWindowSurface::QRasterWindowSurface(class QWidget *, bool) - ?brushChanged@QBlitterPaintEngine@@UAEXXZ @ 13215 NONAME ; void QBlitterPaintEngine::brushChanged(void) - ?clip@QBlitterPaintEngine@@UAEXABVQRect@@W4ClipOperation@Qt@@@Z @ 13216 NONAME ; void QBlitterPaintEngine::clip(class QRect const &, enum Qt::ClipOperation) - ?staticMetaObjectExtraData@QGraphicsWidget@@0UQMetaObjectExtraData@@B @ 13217 NONAME ; struct QMetaObjectExtraData const QGraphicsWidget::staticMetaObjectExtraData - ?qt_static_metacall@QSessionManager@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13218 NONAME ; void QSessionManager::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTabWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13219 NONAME ; void QTabWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTapAndHoldGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13220 NONAME ; void QTapAndHoldGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QMainWindow@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13221 NONAME ; void QMainWindow::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QMovie@@0UQMetaObjectExtraData@@B @ 13222 NONAME ; struct QMetaObjectExtraData const QMovie::staticMetaObjectExtraData - ?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13223 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *) - ?staticMetaObjectExtraData@QPixmapConvolutionFilter@@0UQMetaObjectExtraData@@B @ 13224 NONAME ; struct QMetaObjectExtraData const QPixmapConvolutionFilter::staticMetaObjectExtraData - ?setHintingPreference@QFont@@QAEXW4HintingPreference@1@@Z @ 13225 NONAME ; void QFont::setHintingPreference(enum QFont::HintingPreference) - ?qt_static_metacall@QTextControl@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13226 NONAME ; void QTextControl::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QToolBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13227 NONAME ; void QToolBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QSplitter@@0UQMetaObjectExtraData@@B @ 13228 NONAME ; struct QMetaObjectExtraData const QSplitter::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsTextItem@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13229 NONAME ; void QGraphicsTextItem::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setCursorMoveStyle@QLineControl@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13230 NONAME ; void QLineControl::setCursorMoveStyle(enum QTextCursor::MoveStyle) - ?qt_static_metacall@QGraphicsView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13231 NONAME ; void QGraphicsView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGraphicsOpacityEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13232 NONAME ; void QGraphicsOpacityEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGraphicsBlurEffect@@0UQMetaObjectExtraData@@B @ 13233 NONAME ; struct QMetaObjectExtraData const QGraphicsBlurEffect::staticMetaObjectExtraData - ?capabilities@QBlittable@@QBE?AV?$QFlags@W4Capability@QBlittable@@@@XZ @ 13234 NONAME ; class QFlags<enum QBlittable::Capability> QBlittable::capabilities(void) const - ?qt_static_metacall@QDoubleSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13235 NONAME ; void QDoubleSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGraphicsObject@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13236 NONAME ; void QGraphicsObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QAbstractButton@@0UQMetaObjectExtraData@@B @ 13237 NONAME ; struct QMetaObjectExtraData const QAbstractButton::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsEffectSource@@0UQMetaObjectExtraData@@B @ 13238 NONAME ; struct QMetaObjectExtraData const QGraphicsEffectSource::staticMetaObjectExtraData - ?qt_static_metacall@QAbstractItemView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13239 NONAME ; void QAbstractItemView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QPaintBufferResource@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13240 NONAME ; void QPaintBufferResource::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QBrush@@QAEXAAV1@@Z @ 13241 NONAME ; void QBrush::swap(class QBrush &) - ?qt_static_metacall@QTextDocument@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13242 NONAME ; void QTextDocument::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?fontHintingPreference@QTextCharFormat@@QBE?AW4HintingPreference@QFont@@XZ @ 13243 NONAME ; enum QFont::HintingPreference QTextCharFormat::fontHintingPreference(void) const - ?swap@QPixmap@@QAEXAAV1@@Z @ 13244 NONAME ; void QPixmap::swap(class QPixmap &) - ??0QBlitterPaintEngine@@QAE@PAVQBlittablePixmapData@@@Z @ 13245 NONAME ; QBlitterPaintEngine::QBlitterPaintEngine(class QBlittablePixmapData *) - ?staticMetaObjectExtraData@QTableView@@0UQMetaObjectExtraData@@B @ 13246 NONAME ; struct QMetaObjectExtraData const QTableView::staticMetaObjectExtraData - ?qt_static_metacall@QAction@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13247 NONAME ; void QAction::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QPinchGesture@@0UQMetaObjectExtraData@@B @ 13248 NONAME ; struct QMetaObjectExtraData const QPinchGesture::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QIdentityProxyModel@@0UQMetaObjectExtraData@@B @ 13249 NONAME ; struct QMetaObjectExtraData const QIdentityProxyModel::staticMetaObjectExtraData - ?numberPrefix@QTextListFormat@@QBE?AVQString@@XZ @ 13250 NONAME ; class QString QTextListFormat::numberPrefix(void) const - ?qt_static_metacall@QPlainTextEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13251 NONAME ; void QPlainTextEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QListView@@0UQMetaObjectExtraData@@B @ 13252 NONAME ; struct QMetaObjectExtraData const QListView::staticMetaObjectExtraData - ?qt_static_metacall@QLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13253 NONAME ; void QLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QWindowsStyle@@0UQMetaObjectExtraData@@B @ 13254 NONAME ; struct QMetaObjectExtraData const QWindowsStyle::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QMdiSubWindow@@0UQMetaObjectExtraData@@B @ 13255 NONAME ; struct QMetaObjectExtraData const QMdiSubWindow::staticMetaObjectExtraData - ?qt_static_metacall@QClipboard@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13256 NONAME ; void QClipboard::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??MQItemSelectionRange@@QBE_NABV0@@Z @ 13257 NONAME ; bool QItemSelectionRange::operator<(class QItemSelectionRange const &) const - ?setWidthForHeight@QSizePolicy@@QAEX_N@Z @ 13258 NONAME ; void QSizePolicy::setWidthForHeight(bool) - ?qt_static_metacall@QGraphicsScene@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13259 NONAME ; void QGraphicsScene::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTextList@@0UQMetaObjectExtraData@@B @ 13260 NONAME ; struct QMetaObjectExtraData const QTextList::staticMetaObjectExtraData - ?qt_fontdata_from_index@@YA?AVQByteArray@@H@Z @ 13261 NONAME ; class QByteArray qt_fontdata_from_index(int) - ?defaultCursorMoveStyle@QTextDocument@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13262 NONAME ; enum QTextCursor::MoveStyle QTextDocument::defaultCursorMoveStyle(void) const - ?offsetInLigature@QTextEngine@@QAE?AUQFixed@@PBUQScriptItem@@HHH@Z @ 13263 NONAME ; struct QFixed QTextEngine::offsetInLigature(struct QScriptItem const *, int, int, int) - ?qt_static_metacall@QGraphicsAnchor@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13264 NONAME ; void QGraphicsAnchor::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QImage@@QAEXAAV1@@Z @ 13265 NONAME ; void QImage::swap(class QImage &) - ?staticMetaObjectExtraData@QDockWidget@@0UQMetaObjectExtraData@@B @ 13266 NONAME ; struct QMetaObjectExtraData const QDockWidget::staticMetaObjectExtraData - ?compositionModeChanged@QBlitterPaintEngine@@UAEXXZ @ 13267 NONAME ; void QBlitterPaintEngine::compositionModeChanged(void) - ?staticMetaObjectExtraData@QPictureFormatPlugin@@0UQMetaObjectExtraData@@B @ 13268 NONAME ; struct QMetaObjectExtraData const QPictureFormatPlugin::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QAbstractItemView@@0UQMetaObjectExtraData@@B @ 13269 NONAME ; struct QMetaObjectExtraData const QAbstractItemView::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QValidator@@0UQMetaObjectExtraData@@B @ 13270 NONAME ; struct QMetaObjectExtraData const QValidator::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsBlurEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13271 NONAME ; void QGraphicsBlurEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDialog@@0UQMetaObjectExtraData@@B @ 13272 NONAME ; struct QMetaObjectExtraData const QDialog::staticMetaObjectExtraData - ?qt_static_metacall@QSplitter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13273 NONAME ; void QSplitter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QLineControl@@0UQMetaObjectExtraData@@B @ 13274 NONAME ; struct QMetaObjectExtraData const QLineControl::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QProgressDialog@@0UQMetaObjectExtraData@@B @ 13275 NONAME ; struct QMetaObjectExtraData const QProgressDialog::staticMetaObjectExtraData - ?drawRects@QBlitterPaintEngine@@UAEXPBVQRectF@@H@Z @ 13276 NONAME ; void QBlitterPaintEngine::drawRects(class QRectF const *, int) - ?qt_static_metacall@QGridLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13277 NONAME ; void QGridLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QMenuBar@@0UQMetaObjectExtraData@@B @ 13278 NONAME ; struct QMetaObjectExtraData const QMenuBar::staticMetaObjectExtraData - ?qt_static_metacall@QStackedLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13279 NONAME ; void QStackedLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QLineEdit@@0UQMetaObjectExtraData@@B @ 13280 NONAME ; struct QMetaObjectExtraData const QLineEdit::staticMetaObjectExtraData - ?qt_metacall@QIdentityProxyModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13281 NONAME ; int QIdentityProxyModel::qt_metacall(enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QListWidget@@0UQMetaObjectExtraData@@B @ 13282 NONAME ; struct QMetaObjectExtraData const QListWidget::staticMetaObjectExtraData - ??1QBlitterPaintEngine@@UAE@XZ @ 13283 NONAME ; QBlitterPaintEngine::~QBlitterPaintEngine(void) - ?markRasterOverlay@QBlittablePixmapData@@QAEXPBVQRectF@@H@Z @ 13284 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRectF const *, int) - ?qt_static_metacall@QTableView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13285 NONAME ; void QTableView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?mapSelectionFromSource@QIdentityProxyModel@@UBE?AVQItemSelection@@ABV2@@Z @ 13286 NONAME ; class QItemSelection QIdentityProxyModel::mapSelectionFromSource(class QItemSelection const &) const - ?qt_static_metacall@QIdentityProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13287 NONAME ; void QIdentityProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QEventDispatcherS60@@0UQMetaObjectExtraData@@B @ 13288 NONAME ; struct QMetaObjectExtraData const QEventDispatcherS60::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QStylePlugin@@0UQMetaObjectExtraData@@B @ 13289 NONAME ; struct QMetaObjectExtraData const QStylePlugin::staticMetaObjectExtraData - ?drawTextItem@QBlitterPaintEngine@@UAEXABVQPointF@@ABVQTextItem@@@Z @ 13290 NONAME ; void QBlitterPaintEngine::drawTextItem(class QPointF const &, class QTextItem const &) - ?qt_static_metacall@QLabel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13291 NONAME ; void QLabel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QLayout@@0UQMetaObjectExtraData@@B @ 13292 NONAME ; struct QMetaObjectExtraData const QLayout::staticMetaObjectExtraData - ?retrieveData@QInternalMimeData@@MBE?AVQVariant@@ABVQString@@W4Type@2@@Z @ 13293 NONAME ; class QVariant QInternalMimeData::retrieveData(class QString const &, enum QVariant::Type) const - ?qt_static_metacall@QCheckBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13294 NONAME ; void QCheckBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDirModel@@0UQMetaObjectExtraData@@B @ 13295 NONAME ; struct QMetaObjectExtraData const QDirModel::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QFocusFrame@@0UQMetaObjectExtraData@@B @ 13296 NONAME ; struct QMetaObjectExtraData const QFocusFrame::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsScale@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13297 NONAME ; void QGraphicsScale::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13298 NONAME ; void QFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?drawImage@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQImage@@0V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 13299 NONAME ; void QBlitterPaintEngine::drawImage(class QRectF const &, class QImage const &, class QRectF const &, class QFlags<enum Qt::ImageConversionFlag>) - ?staticMetaObjectExtraData@QDateTimeEdit@@0UQMetaObjectExtraData@@B @ 13300 NONAME ; struct QMetaObjectExtraData const QDateTimeEdit::staticMetaObjectExtraData - ?mimeTypes@QAbstractProxyModel@@UBE?AVQStringList@@XZ @ 13301 NONAME ; class QStringList QAbstractProxyModel::mimeTypes(void) const - ?mapSelectionToSource@QIdentityProxyModel@@UBE?AVQItemSelection@@ABV2@@Z @ 13302 NONAME ; class QItemSelection QIdentityProxyModel::mapSelectionToSource(class QItemSelection const &) const - ?createState@QBlitterPaintEngine@@UBEPAVQPainterState@@PAV2@@Z @ 13303 NONAME ; class QPainterState * QBlitterPaintEngine::createState(class QPainterState *) const - ??1QIdentityProxyModel@@UAE@XZ @ 13304 NONAME ; QIdentityProxyModel::~QIdentityProxyModel(void) - ?qt_static_metacall@QDoubleValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13305 NONAME ; void QDoubleValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?removeItem@QGraphicsGridLayout@@QAEXPAVQGraphicsLayoutItem@@@Z @ 13306 NONAME ; void QGraphicsGridLayout::removeItem(class QGraphicsLayoutItem *) - ?qt_static_metacall@QHBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13307 NONAME ; void QHBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?clipBoundingRect@QPainter@@QBE?AVQRectF@@XZ @ 13308 NONAME ; class QRectF QPainter::clipBoundingRect(void) const - ?staticMetaObjectExtraData@QAbstractSlider@@0UQMetaObjectExtraData@@B @ 13309 NONAME ; struct QMetaObjectExtraData const QAbstractSlider::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QSlider@@0UQMetaObjectExtraData@@B @ 13310 NONAME ; struct QMetaObjectExtraData const QSlider::staticMetaObjectExtraData - ?formats@QInternalMimeData@@UBE?AVQStringList@@XZ @ 13311 NONAME ; class QStringList QInternalMimeData::formats(void) const - ?staticMetaObjectExtraData@QMainWindow@@0UQMetaObjectExtraData@@B @ 13312 NONAME ; struct QMetaObjectExtraData const QMainWindow::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QButtonGroup@@0UQMetaObjectExtraData@@B @ 13313 NONAME ; struct QMetaObjectExtraData const QButtonGroup::staticMetaObjectExtraData - ?qt_static_metacall@QAbstractSlider@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13314 NONAME ; void QAbstractSlider::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??_EQIdentityProxyModel@@UAE@I@Z @ 13315 NONAME ; QIdentityProxyModel::~QIdentityProxyModel(unsigned int) - ?qt_static_metacall@QPictureFormatPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13316 NONAME ; void QPictureFormatPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGuiPlatformPlugin@@0UQMetaObjectExtraData@@B @ 13317 NONAME ; struct QMetaObjectExtraData const QGuiPlatformPlugin::staticMetaObjectExtraData - ?removeRows@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13318 NONAME ; bool QIdentityProxyModel::removeRows(int, int, class QModelIndex const &) - ?staticMetaObjectExtraData@QPixmapDropShadowFilter@@0UQMetaObjectExtraData@@B @ 13319 NONAME ; struct QMetaObjectExtraData const QPixmapDropShadowFilter::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGridLayout@@0UQMetaObjectExtraData@@B @ 13320 NONAME ; struct QMetaObjectExtraData const QGridLayout::staticMetaObjectExtraData - ?raster@QBlitterPaintEngine@@ABEPAVQRasterPaintEngine@@XZ @ 13321 NONAME ; class QRasterPaintEngine * QBlitterPaintEngine::raster(void) const - ?sort@QAbstractProxyModel@@UAEXHW4SortOrder@Qt@@@Z @ 13322 NONAME ; void QAbstractProxyModel::sort(int, enum Qt::SortOrder) - ?staticMetaObjectExtraData@QPlainTextEdit@@0UQMetaObjectExtraData@@B @ 13323 NONAME ; struct QMetaObjectExtraData const QPlainTextEdit::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QTableWidget@@0UQMetaObjectExtraData@@B @ 13324 NONAME ; struct QMetaObjectExtraData const QTableWidget::staticMetaObjectExtraData - ?qt_static_metacall@QSyntaxHighlighter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13325 NONAME ; void QSyntaxHighlighter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setCreationPermissions@QZipWriter@@QAEXV?$QFlags@W4Permission@QFile@@@@@Z @ 13326 NONAME ; void QZipWriter::setCreationPermissions(class QFlags<enum QFile::Permission>) - ?d_func@QBlittable@@AAEPAVQBlittablePrivate@@XZ @ 13327 NONAME ; class QBlittablePrivate * QBlittable::d_func(void) - ?previousLogicalPosition@QTextEngine@@QBEHH@Z @ 13328 NONAME ; int QTextEngine::previousLogicalPosition(int) const - ?type@QBlitterPaintEngine@@UBE?AW4Type@QPaintEngine@@XZ @ 13329 NONAME ; enum QPaintEngine::Type QBlitterPaintEngine::type(void) const - ?qt_static_metacall@QCommandLinkButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13330 NONAME ; void QCommandLinkButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?buddy@QAbstractProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13331 NONAME ; class QModelIndex QAbstractProxyModel::buddy(class QModelIndex const &) const - ?staticMetaObjectExtraData@QProxyModel@@0UQMetaObjectExtraData@@B @ 13332 NONAME ; struct QMetaObjectExtraData const QProxyModel::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QInputContextPlugin@@0UQMetaObjectExtraData@@B @ 13333 NONAME ; struct QMetaObjectExtraData const QInputContextPlugin::staticMetaObjectExtraData - ?metaObject@QIdentityProxyModel@@UBEPBUQMetaObject@@XZ @ 13334 NONAME ; struct QMetaObject const * QIdentityProxyModel::metaObject(void) const - ?cursorMoveStyle@QLineControl@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13335 NONAME ; enum QTextCursor::MoveStyle QLineControl::cursorMoveStyle(void) const - ?removeColumns@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13336 NONAME ; bool QIdentityProxyModel::removeColumns(int, int, class QModelIndex const &) - ?qt_static_metacall@QDirModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13337 NONAME ; void QDirModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QMdiSubWindow@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13338 NONAME ; void QMdiSubWindow::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?fill@QImage@@QAEXABVQColor@@@Z @ 13339 NONAME ; void QImage::fill(class QColor const &) - ??0QZipWriter@@QAE@PAVQIODevice@@@Z @ 13340 NONAME ; QZipWriter::QZipWriter(class QIODevice *) - ?fill@QImage@@QAEXW4GlobalColor@Qt@@@Z @ 13341 NONAME ; void QImage::fill(enum Qt::GlobalColor) - ?staticMetaObjectExtraData@QUndoView@@0UQMetaObjectExtraData@@B @ 13342 NONAME ; struct QMetaObjectExtraData const QUndoView::staticMetaObjectExtraData - ?canFetchMore@QAbstractProxyModel@@UBE_NABVQModelIndex@@@Z @ 13343 NONAME ; bool QAbstractProxyModel::canFetchMore(class QModelIndex const &) const - ?staticMetaObjectExtraData@QTextObject@@0UQMetaObjectExtraData@@B @ 13344 NONAME ; struct QMetaObjectExtraData const QTextObject::staticMetaObjectExtraData - ?qt_static_metacall@QPixmapConvolutionFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13345 NONAME ; void QPixmapConvolutionFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?alignLine@QTextEngine@@QAE?AUQFixed@@ABUQScriptLine@@@Z @ 13346 NONAME ; struct QFixed QTextEngine::alignLine(struct QScriptLine const &) - ?qt_static_metacall@QSortFilterProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13347 NONAME ; void QSortFilterProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTreeView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13348 NONAME ; void QTreeView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGraphicsSystemPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13349 NONAME ; void QGraphicsSystemPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?resize@QBlittablePixmapData@@UAEXHH@Z @ 13350 NONAME ; void QBlittablePixmapData::resize(int, int) - ?setTabsClosable@QMdiArea@@QAEX_N@Z @ 13351 NONAME ; void QMdiArea::setTabsClosable(bool) - ?staticMetaObjectExtraData@QTreeWidget@@0UQMetaObjectExtraData@@B @ 13352 NONAME ; struct QMetaObjectExtraData const QTreeWidget::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QBoxLayout@@0UQMetaObjectExtraData@@B @ 13353 NONAME ; struct QMetaObjectExtraData const QBoxLayout::staticMetaObjectExtraData - ?qt_s60_setPartialScreenAutomaticTranslation@@YAX_N@Z @ 13354 NONAME ; void qt_s60_setPartialScreenAutomaticTranslation(bool) - ?qt_static_metacall@QTabBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13355 NONAME ; void QTabBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?parent@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13356 NONAME ; class QModelIndex QIdentityProxyModel::parent(class QModelIndex const &) const - ?insertColumns@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13357 NONAME ; bool QIdentityProxyModel::insertColumns(int, int, class QModelIndex const &) - ?staticMetaObjectExtraData@QDesktopWidget@@0UQMetaObjectExtraData@@B @ 13358 NONAME ; struct QMetaObjectExtraData const QDesktopWidget::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QScrollArea@@0UQMetaObjectExtraData@@B @ 13359 NONAME ; struct QMetaObjectExtraData const QScrollArea::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QImageIOPlugin@@0UQMetaObjectExtraData@@B @ 13360 NONAME ; struct QMetaObjectExtraData const QImageIOPlugin::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QVBoxLayout@@0UQMetaObjectExtraData@@B @ 13361 NONAME ; struct QMetaObjectExtraData const QVBoxLayout::staticMetaObjectExtraData - ?compressionPolicy@QZipWriter@@QBE?AW4CompressionPolicy@1@XZ @ 13362 NONAME ; enum QZipWriter::CompressionPolicy QZipWriter::compressionPolicy(void) const - ?getText@QInputDialog@@SA?AVQString@@PAVQWidget@@ABV2@1W4EchoMode@QLineEdit@@1PA_NV?$QFlags@W4WindowType@Qt@@@@V?$QFlags@W4InputMethodHint@Qt@@@@@Z @ 13363 NONAME ; class QString QInputDialog::getText(class QWidget *, class QString const &, class QString const &, enum QLineEdit::EchoMode, class QString const &, bool *, class QFlags<enum Qt::WindowType>, class QFlags<enum Qt::InputMethodHint>) - ?hasWidthForHeight@QSizePolicy@@QBE_NXZ @ 13364 NONAME ; bool QSizePolicy::hasWidthForHeight(void) const - ?staticMetaObjectExtraData@QSizeGrip@@0UQMetaObjectExtraData@@B @ 13365 NONAME ; struct QMetaObjectExtraData const QSizeGrip::staticMetaObjectExtraData - ?qt_static_metacall@QDesktopWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13366 NONAME ; void QDesktopWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGraphicsDropShadowEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13367 NONAME ; void QGraphicsDropShadowEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QAbstractProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13368 NONAME ; void QAbstractProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?transformChanged@QBlitterPaintEngine@@UAEXXZ @ 13369 NONAME ; void QBlitterPaintEngine::transformChanged(void) - ??0QBlittablePixmapData@@QAE@XZ @ 13370 NONAME ; QBlittablePixmapData::QBlittablePixmapData(void) - ?staticMetaObjectExtraData@QHBoxLayout@@0UQMetaObjectExtraData@@B @ 13371 NONAME ; struct QMetaObjectExtraData const QHBoxLayout::staticMetaObjectExtraData - ?close@QZipWriter@@QAEXXZ @ 13372 NONAME ; void QZipWriter::close(void) - ?staticMetaObjectExtraData@QUndoGroup@@0UQMetaObjectExtraData@@B @ 13373 NONAME ; struct QMetaObjectExtraData const QUndoGroup::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QDoubleSpinBox@@0UQMetaObjectExtraData@@B @ 13374 NONAME ; struct QMetaObjectExtraData const QDoubleSpinBox::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsTransform@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13375 NONAME ; void QGraphicsTransform::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?dropMimeData@QIdentityProxyModel@@UAE_NPBVQMimeData@@W4DropAction@Qt@@HHABVQModelIndex@@@Z @ 13376 NONAME ; bool QIdentityProxyModel::dropMimeData(class QMimeData const *, enum Qt::DropAction, int, int, class QModelIndex const &) - ?staticMetaObjectExtraData@QErrorMessage@@0UQMetaObjectExtraData@@B @ 13377 NONAME ; struct QMetaObjectExtraData const QErrorMessage::staticMetaObjectExtraData - ?size@QBlittable@@QBE?AVQSize@@XZ @ 13378 NONAME ; class QSize QBlittable::size(void) const - ?staticMetaObjectExtraData@QGraphicsScene@@0UQMetaObjectExtraData@@B @ 13379 NONAME ; struct QMetaObjectExtraData const QGraphicsScene::staticMetaObjectExtraData - ?qt_static_metacall@QPixmapFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13380 NONAME ; void QPixmapFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13381 NONAME ; void QStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setBlittable@QBlittablePixmapData@@QAEXPAVQBlittable@@@Z @ 13382 NONAME ; void QBlittablePixmapData::setBlittable(class QBlittable *) - ?qt_static_metacall@QMdiArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13383 NONAME ; void QMdiArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?visualCursorMovement@QTextEngine@@QBE_NXZ @ 13384 NONAME ; bool QTextEngine::visualCursorMovement(void) const - ?qt_static_metacall@QComboBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13385 NONAME ; void QComboBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QRadialGradient@@QAE@MMMMMM@Z @ 13386 NONAME ; QRadialGradient::QRadialGradient(float, float, float, float, float, float) - ?staticMetaObjectExtraData@QRadioButton@@0UQMetaObjectExtraData@@B @ 13387 NONAME ; struct QMetaObjectExtraData const QRadioButton::staticMetaObjectExtraData - ?opacityChanged@QBlitterPaintEngine@@UAEXXZ @ 13388 NONAME ; void QBlitterPaintEngine::opacityChanged(void) - ?qt_static_metacall@QAbstractScrollArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13389 NONAME ; void QAbstractScrollArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QDateTimeEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13390 NONAME ; void QDateTimeEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QFontComboBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13391 NONAME ; void QFontComboBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGraphicsRotation@@0UQMetaObjectExtraData@@B @ 13392 NONAME ; struct QMetaObjectExtraData const QGraphicsRotation::staticMetaObjectExtraData - ?setState@QBlitterPaintEngine@@UAEXPAVQPainterState@@@Z @ 13393 NONAME ; void QBlitterPaintEngine::setState(class QPainterState *) - ?addFile@QZipWriter@@QAEXABVQString@@ABVQByteArray@@@Z @ 13394 NONAME ; void QZipWriter::addFile(class QString const &, class QByteArray const &) - ?qt_static_metacall@QAbstractButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13395 NONAME ; void QAbstractButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTextDocument@@0UQMetaObjectExtraData@@B @ 13396 NONAME ; struct QMetaObjectExtraData const QTextDocument::staticMetaObjectExtraData - ?setSourceModel@QIdentityProxyModel@@UAEXPAVQAbstractItemModel@@@Z @ 13397 NONAME ; void QIdentityProxyModel::setSourceModel(class QAbstractItemModel *) - ?clip@QBlitterPaintEngine@@UAEXABVQRegion@@W4ClipOperation@Qt@@@Z @ 13398 NONAME ; void QBlitterPaintEngine::clip(class QRegion const &, enum Qt::ClipOperation) - ?subPixelPositionForX@QTextureGlyphCache@@QBE?AUQFixed@@U2@@Z @ 13399 NONAME ; struct QFixed QTextureGlyphCache::subPixelPositionForX(struct QFixed) const - ?addFile@QZipWriter@@QAEXABVQString@@PAVQIODevice@@@Z @ 13400 NONAME ; void QZipWriter::addFile(class QString const &, class QIODevice *) - ?hasAlphaChannel@QBlittablePixmapData@@UBE_NXZ @ 13401 NONAME ; bool QBlittablePixmapData::hasAlphaChannel(void) const - ?numberSuffix@QTextListFormat@@QBE?AVQString@@XZ @ 13402 NONAME ; class QString QTextListFormat::numberSuffix(void) const - ?tabsMovable@QMdiArea@@QBE_NXZ @ 13403 NONAME ; bool QMdiArea::tabsMovable(void) const - ?staticMetaObjectExtraData@QRubberBand@@0UQMetaObjectExtraData@@B @ 13404 NONAME ; struct QMetaObjectExtraData const QRubberBand::staticMetaObjectExtraData - ?qt_static_metacall@QRubberBand@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13405 NONAME ; void QRubberBand::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QMenu@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13406 NONAME ; void QMenu::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?end@QBlitterPaintEngine@@UAE_NXZ @ 13407 NONAME ; bool QBlitterPaintEngine::end(void) - ?staticMetaObjectExtraData@QAbstractItemDelegate@@0UQMetaObjectExtraData@@B @ 13408 NONAME ; struct QMetaObjectExtraData const QAbstractItemDelegate::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsTextItem@@0UQMetaObjectExtraData@@B @ 13409 NONAME ; struct QMetaObjectExtraData const QGraphicsTextItem::staticMetaObjectExtraData - ?getStaticMetaObject@QIdentityProxyModel@@SAABUQMetaObject@@XZ @ 13410 NONAME ; struct QMetaObject const & QIdentityProxyModel::getStaticMetaObject(void) - ?qt_static_metacall@QFormLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13411 NONAME ; void QFormLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTextTable@@0UQMetaObjectExtraData@@B @ 13412 NONAME ; struct QMetaObjectExtraData const QTextTable::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QWizard@@0UQMetaObjectExtraData@@B @ 13413 NONAME ; struct QMetaObjectExtraData const QWizard::staticMetaObjectExtraData - ?fill@QBlitterPaintEngine@@UAEXABVQVectorPath@@ABVQBrush@@@Z @ 13414 NONAME ; void QBlitterPaintEngine::fill(class QVectorPath const &, class QBrush const &) - ?drawPixmap@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQPixmap@@0@Z @ 13415 NONAME ; void QBlitterPaintEngine::drawPixmap(class QRectF const &, class QPixmap const &, class QRectF const &) - ?staticMetaObjectExtraData@QTextBlockGroup@@0UQMetaObjectExtraData@@B @ 13416 NONAME ; struct QMetaObjectExtraData const QTextBlockGroup::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QActionGroup@@0UQMetaObjectExtraData@@B @ 13417 NONAME ; struct QMetaObjectExtraData const QActionGroup::staticMetaObjectExtraData - ?index@QIdentityProxyModel@@UBE?AVQModelIndex@@HHABV2@@Z @ 13418 NONAME ; class QModelIndex QIdentityProxyModel::index(int, int, class QModelIndex const &) const - ?status@QZipWriter@@QBE?AW4Status@1@XZ @ 13419 NONAME ; enum QZipWriter::Status QZipWriter::status(void) const - ?qt_static_metacall@QTextFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13420 NONAME ; void QTextFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QSlider@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13421 NONAME ; void QSlider::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?tr@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13422 NONAME ; class QString QInternalMimeData::tr(char const *, char const *, int) - ?qt_static_metacall@QTimeEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13423 NONAME ; void QTimeEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QPaintBufferSignalProxy@@0UQMetaObjectExtraData@@B @ 13424 NONAME ; struct QMetaObjectExtraData const QPaintBufferSignalProxy::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QIconEnginePluginV2@@0UQMetaObjectExtraData@@B @ 13425 NONAME ; struct QMetaObjectExtraData const QIconEnginePluginV2::staticMetaObjectExtraData - ?get@QFontPrivate@@SAPAV1@ABVQFont@@@Z @ 13426 NONAME ; class QFontPrivate * QFontPrivate::get(class QFont const &) - ?staticMetaObjectExtraData@QStyledItemDelegate@@0UQMetaObjectExtraData@@B @ 13427 NONAME ; struct QMetaObjectExtraData const QStyledItemDelegate::staticMetaObjectExtraData - ?qt_static_metacall@QMouseEventTransition@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13428 NONAME ; void QMouseEventTransition::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setInstantInvalidatePropagation@QGraphicsLayout@@SAX_N@Z @ 13429 NONAME ; void QGraphicsLayout::setInstantInvalidatePropagation(bool) - ?qt_static_metacall@QItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13430 NONAME ; void QItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QMdiArea@@0UQMetaObjectExtraData@@B @ 13431 NONAME ; struct QMetaObjectExtraData const QMdiArea::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsView@@0UQMetaObjectExtraData@@B @ 13432 NONAME ; struct QMetaObjectExtraData const QGraphicsView::staticMetaObjectExtraData - ?paintingActive@QVolatileImage@@QBE_NXZ @ 13433 NONAME ; bool QVolatileImage::paintingActive(void) const - ?staticMetaObjectExtraData@QStyle@@0UQMetaObjectExtraData@@B @ 13434 NONAME ; struct QMetaObjectExtraData const QStyle::staticMetaObjectExtraData - ?fetchMore@QAbstractProxyModel@@UAEXABVQModelIndex@@@Z @ 13435 NONAME ; void QAbstractProxyModel::fetchMore(class QModelIndex const &) - ?insertRows@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13436 NONAME ; bool QIdentityProxyModel::insertRows(int, int, class QModelIndex const &) - ?positionAfterVisualMovement@QTextEngine@@QAEHHW4MoveOperation@QTextCursor@@@Z @ 13437 NONAME ; int QTextEngine::positionAfterVisualMovement(int, enum QTextCursor::MoveOperation) - ?resolveFontFamilyAlias@QFontDatabase@@CA?AVQString@@ABV2@@Z @ 13438 NONAME ; class QString QFontDatabase::resolveFontFamilyAlias(class QString const &) - ?alphaRGBMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@HABVQTransform@@@Z @ 13439 NONAME ; class QImage QFontEngine::alphaRGBMapForGlyph(unsigned int, struct QFixed, int, class QTransform const &) - ?setCenterRadius@QRadialGradient@@QAEXM@Z @ 13440 NONAME ; void QRadialGradient::setCenterRadius(float) - ?staticMetaObjectExtraData@QPixmapBlurFilter@@0UQMetaObjectExtraData@@B @ 13441 NONAME ; struct QMetaObjectExtraData const QPixmapBlurFilter::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QMenu@@0UQMetaObjectExtraData@@B @ 13442 NONAME ; struct QMetaObjectExtraData const QMenu::staticMetaObjectExtraData - ?swap@QBitmap@@QAEXAAV1@@Z @ 13443 NONAME ; void QBitmap::swap(class QBitmap &) - ?hasFormat@QInternalMimeData@@UBE_NABVQString@@@Z @ 13444 NONAME ; bool QInternalMimeData::hasFormat(class QString const &) const - ?leftCursorPosition@QTextLayout@@QBEHH@Z @ 13445 NONAME ; int QTextLayout::leftCursorPosition(int) const - ?staticMetaObjectExtraData@QGroupBox@@0UQMetaObjectExtraData@@B @ 13446 NONAME ; struct QMetaObjectExtraData const QGroupBox::staticMetaObjectExtraData - ?renderDataHelper@QInternalMimeData@@SA?AVQByteArray@@ABVQString@@PBVQMimeData@@@Z @ 13447 NONAME ; class QByteArray QInternalMimeData::renderDataHelper(class QString const &, class QMimeData const *) - ?staticMetaObjectExtraData@QKeyEventTransition@@0UQMetaObjectExtraData@@B @ 13448 NONAME ; struct QMetaObjectExtraData const QKeyEventTransition::staticMetaObjectExtraData - ?qt_static_metacall@QKeyEventTransition@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13449 NONAME ; void QKeyEventTransition::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QWindowSurface@@QAE@PAVQWidget@@_N@Z @ 13450 NONAME ; QWindowSurface::QWindowSurface(class QWidget *, bool) - ?fill@QBlittablePixmapData@@UAEXABVQColor@@@Z @ 13451 NONAME ; void QBlittablePixmapData::fill(class QColor const &) - ?staticMetaObjectExtraData@QTabWidget@@0UQMetaObjectExtraData@@B @ 13452 NONAME ; struct QMetaObjectExtraData const QTabWidget::staticMetaObjectExtraData - ?metric@QBlittablePixmapData@@UBEHW4PaintDeviceMetric@QPaintDevice@@@Z @ 13453 NONAME ; int QBlittablePixmapData::metric(enum QPaintDevice::PaintDeviceMetric) const - ?fillRect@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQColor@@@Z @ 13454 NONAME ; void QBlitterPaintEngine::fillRect(class QRectF const &, class QColor const &) - ??6@YA?AVQDebug@@V0@PBVQSymbianEvent@@@Z @ 13455 NONAME ; class QDebug operator<<(class QDebug, class QSymbianEvent const *) - ?qt_static_metacall@QSplitterHandle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13456 NONAME ; void QSplitterHandle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTextEdit@@0UQMetaObjectExtraData@@B @ 13457 NONAME ; struct QMetaObjectExtraData const QTextEdit::staticMetaObjectExtraData - ?qt_static_metacall@QCompleter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13458 NONAME ; void QCompleter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QSwipeGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13459 NONAME ; void QSwipeGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QWindowsStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13460 NONAME ; void QWindowsStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?ProcessCommandParametersL@QS60MainAppUi@@UAEHW4TApaCommand@@AAV?$TBuf@$0BAA@@@ABVTDesC8@@@Z @ 13461 NONAME ; int QS60MainAppUi::ProcessCommandParametersL(enum TApaCommand, class TBuf<256> &, class TDesC8 const &) - ?qt_static_metacall@QVBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13462 NONAME ; void QVBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13463 NONAME ; void QSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??_EQBlittablePixmapData@@UAE@I@Z @ 13464 NONAME ; QBlittablePixmapData::~QBlittablePixmapData(unsigned int) - ?qt_static_metacall@QStringListModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13465 NONAME ; void QStringListModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QPanGesture@@0UQMetaObjectExtraData@@B @ 13466 NONAME ; struct QMetaObjectExtraData const QPanGesture::staticMetaObjectExtraData - ?device@QZipWriter@@QBEPAVQIODevice@@XZ @ 13467 NONAME ; class QIODevice * QZipWriter::device(void) const - ?mimeData@QAbstractProxyModel@@UBEPAVQMimeData@@ABV?$QList@VQModelIndex@@@@@Z @ 13468 NONAME ; class QMimeData * QAbstractProxyModel::mimeData(class QList<class QModelIndex> const &) const - ?qt_static_metacall@QWidgetResizeHandler@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13469 NONAME ; void QWidgetResizeHandler::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QZipWriter@@QAE@ABVQString@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13470 NONAME ; QZipWriter::QZipWriter(class QString const &, class QFlags<enum QIODevice::OpenModeFlag>) - ?qt_static_metacall@QPinchGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13471 NONAME ; void QPinchGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTextBrowser@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13472 NONAME ; void QTextBrowser::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTabBar@@0UQMetaObjectExtraData@@B @ 13473 NONAME ; struct QMetaObjectExtraData const QTabBar::staticMetaObjectExtraData - ?setTabsMovable@QMdiArea@@QAEX_N@Z @ 13474 NONAME ; void QMdiArea::setTabsMovable(bool) - ?minimumSizeHint@QRadioButton@@UBE?AVQSize@@XZ @ 13475 NONAME ; class QSize QRadioButton::minimumSizeHint(void) const - ?staticMetaObjectExtraData@QGraphicsObject@@0UQMetaObjectExtraData@@B @ 13476 NONAME ; struct QMetaObjectExtraData const QGraphicsObject::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QPaintBufferResource@@0UQMetaObjectExtraData@@B @ 13477 NONAME ; struct QMetaObjectExtraData const QPaintBufferResource::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QToolBar@@0UQMetaObjectExtraData@@B @ 13478 NONAME ; struct QMetaObjectExtraData const QToolBar::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QFontDialog@@0UQMetaObjectExtraData@@B @ 13479 NONAME ; struct QMetaObjectExtraData const QFontDialog::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QCheckBox@@0UQMetaObjectExtraData@@B @ 13480 NONAME ; struct QMetaObjectExtraData const QCheckBox::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsRotation@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13481 NONAME ; void QGraphicsRotation::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?drawRects@QBlitterPaintEngine@@UAEXPBVQRect@@H@Z @ 13482 NONAME ; void QBlitterPaintEngine::drawRects(class QRect const *, int) - ?fillInPendingGlyphs@QTextureGlyphCache@@QAEXXZ @ 13483 NONAME ; void QTextureGlyphCache::fillInPendingGlyphs(void) - ?qt_static_metacall@QColorDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13484 NONAME ; void QColorDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QPixmapBlurFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13485 NONAME ; void QPixmapBlurFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QFontDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13486 NONAME ; void QFontDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?focalRadius@QRadialGradient@@QBEMXZ @ 13487 NONAME ; float QRadialGradient::focalRadius(void) const - ?renderHintsChanged@QBlitterPaintEngine@@UAEXXZ @ 13488 NONAME ; void QBlitterPaintEngine::renderHintsChanged(void) - ?staticMetaObjectExtraData@QColorDialog@@0UQMetaObjectExtraData@@B @ 13489 NONAME ; struct QMetaObjectExtraData const QColorDialog::staticMetaObjectExtraData - ?supportedDropActions@QAbstractProxyModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 13490 NONAME ; class QFlags<enum Qt::DropAction> QAbstractProxyModel::supportedDropActions(void) const - ?qt_metacast@QIdentityProxyModel@@UAEPAXPBD@Z @ 13491 NONAME ; void * QIdentityProxyModel::qt_metacast(char const *) - ?qt_static_metacall@QLineControl@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13492 NONAME ; void QLineControl::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?fillRect@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQBrush@@@Z @ 13493 NONAME ; void QBlitterPaintEngine::fillRect(class QRectF const &, class QBrush const &) - ?qt_draw_decoration_for_glyphs@@YAXPAVQPainter@@PBIPBUQFixedPoint@@HPAVQFontEngine@@ABVQFont@@ABVQTextCharFormat@@@Z @ 13494 NONAME ; void qt_draw_decoration_for_glyphs(class QPainter *, unsigned int const *, struct QFixedPoint const *, int, class QFontEngine *, class QFont const &, class QTextCharFormat const &) - ?staticMetaObjectExtraData@QClipboard@@0UQMetaObjectExtraData@@B @ 13495 NONAME ; struct QMetaObjectExtraData const QClipboard::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QPixmapColorizeFilter@@0UQMetaObjectExtraData@@B @ 13496 NONAME ; struct QMetaObjectExtraData const QPixmapColorizeFilter::staticMetaObjectExtraData - ?qt_static_metacall@QUndoStack@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13497 NONAME ; void QUndoStack::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QStandardItemModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13498 NONAME ; void QStandardItemModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QSessionManager@@0UQMetaObjectExtraData@@B @ 13499 NONAME ; struct QMetaObjectExtraData const QSessionManager::staticMetaObjectExtraData - ?d_func@QBlittable@@ABEPBVQBlittablePrivate@@XZ @ 13500 NONAME ; class QBlittablePrivate const * QBlittable::d_func(void) const - ?staticMetaObjectExtraData@QStringListModel@@0UQMetaObjectExtraData@@B @ 13501 NONAME ; struct QMetaObjectExtraData const QStringListModel::staticMetaObjectExtraData - ?qt_static_metacall@QPaintBufferSignalProxy@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13502 NONAME ; void QPaintBufferSignalProxy::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDrag@@0UQMetaObjectExtraData@@B @ 13503 NONAME ; struct QMetaObjectExtraData const QDrag::staticMetaObjectExtraData - ?qt_static_metacall@QProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13504 NONAME ; void QProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QWidgetResizeHandler@@0UQMetaObjectExtraData@@B @ 13505 NONAME ; struct QMetaObjectExtraData const QWidgetResizeHandler::staticMetaObjectExtraData - ?state@QBlitterPaintEngine@@QBEPBVQPainterState@@XZ @ 13506 NONAME ; class QPainterState const * QBlitterPaintEngine::state(void) const - ?qt_static_metacall@QGroupBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13507 NONAME ; void QGroupBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTextObject@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13508 NONAME ; void QTextObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QScrollBar@@0UQMetaObjectExtraData@@B @ 13509 NONAME ; struct QMetaObjectExtraData const QScrollBar::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QWizardPage@@0UQMetaObjectExtraData@@B @ 13510 NONAME ; struct QMetaObjectExtraData const QWizardPage::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QShortcut@@0UQMetaObjectExtraData@@B @ 13511 NONAME ; struct QMetaObjectExtraData const QShortcut::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsScale@@0UQMetaObjectExtraData@@B @ 13512 NONAME ; struct QMetaObjectExtraData const QGraphicsScale::staticMetaObjectExtraData - ??0QRadialGradient@@QAE@ABVQPointF@@M0M@Z @ 13513 NONAME ; QRadialGradient::QRadialGradient(class QPointF const &, float, class QPointF const &, float) - ?qt_static_metacall@QTextEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13514 NONAME ; void QTextEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QTapAndHoldGesture@@0UQMetaObjectExtraData@@B @ 13515 NONAME ; struct QMetaObjectExtraData const QTapAndHoldGesture::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QApplication@@0UQMetaObjectExtraData@@B @ 13516 NONAME ; struct QMetaObjectExtraData const QApplication::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsEffectSource@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13517 NONAME ; void QGraphicsEffectSource::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QPushButton@@0UQMetaObjectExtraData@@B @ 13518 NONAME ; struct QMetaObjectExtraData const QPushButton::staticMetaObjectExtraData - ?centerRadius@QRadialGradient@@QBEMXZ @ 13519 NONAME ; float QRadialGradient::centerRadius(void) const - ?qt_static_metacall@QAbstractItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13520 NONAME ; void QAbstractItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??1QBlittablePixmapData@@UAE@XZ @ 13521 NONAME ; QBlittablePixmapData::~QBlittablePixmapData(void) - ?formatsHelper@QInternalMimeData@@SA?AVQStringList@@PBVQMimeData@@@Z @ 13522 NONAME ; class QStringList QInternalMimeData::formatsHelper(class QMimeData const *) - ?qt_metacast@QInternalMimeData@@UAEPAXPBD@Z @ 13523 NONAME ; void * QInternalMimeData::qt_metacast(char const *) - ?qt_isExtendedRadialGradient@@YA_NABVQBrush@@@Z @ 13524 NONAME ; bool qt_isExtendedRadialGradient(class QBrush const &) - ?staticMetaObjectExtraData@QStatusBar@@0UQMetaObjectExtraData@@B @ 13525 NONAME ; struct QMetaObjectExtraData const QStatusBar::staticMetaObjectExtraData - ?qt_static_metacall@QScrollArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13526 NONAME ; void QScrollArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13527 NONAME ; void QWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDial@@0UQMetaObjectExtraData@@B @ 13528 NONAME ; struct QMetaObjectExtraData const QDial::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QItemSelectionModel@@0UQMetaObjectExtraData@@B @ 13529 NONAME ; struct QMetaObjectExtraData const QItemSelectionModel::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QFileSystemModel@@0UQMetaObjectExtraData@@B @ 13530 NONAME ; struct QMetaObjectExtraData const QFileSystemModel::staticMetaObjectExtraData - ?setCompressionPolicy@QZipWriter@@QAEXW4CompressionPolicy@1@@Z @ 13531 NONAME ; void QZipWriter::setCompressionPolicy(enum QZipWriter::CompressionPolicy) - ?mapToSource@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13532 NONAME ; class QModelIndex QIdentityProxyModel::mapToSource(class QModelIndex const &) const - ?staticMetaObjectExtraData@QColumnView@@0UQMetaObjectExtraData@@B @ 13533 NONAME ; struct QMetaObjectExtraData const QColumnView::staticMetaObjectExtraData - ?paintEngine@QBlittablePixmapData@@UBEPAVQPaintEngine@@XZ @ 13534 NONAME ; class QPaintEngine * QBlittablePixmapData::paintEngine(void) const - ?qt_static_metacall@QInputContextPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13535 NONAME ; void QInputContextPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?d_func@QIdentityProxyModel@@AAEPAVQIdentityProxyModelPrivate@@XZ @ 13536 NONAME ; class QIdentityProxyModelPrivate * QIdentityProxyModel::d_func(void) - ?qt_static_metacall@QGraphicsColorizeEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13537 NONAME ; void QGraphicsColorizeEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?hasChildren@QAbstractProxyModel@@UBE_NABVQModelIndex@@@Z @ 13538 NONAME ; bool QAbstractProxyModel::hasChildren(class QModelIndex const &) const - ?qt_static_metacall@QPushButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13539 NONAME ; void QPushButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QPen@@QAEXAAV1@@Z @ 13540 NONAME ; void QPen::swap(class QPen &) - ?span@QAbstractProxyModel@@UBE?AVQSize@@ABVQModelIndex@@@Z @ 13541 NONAME ; class QSize QAbstractProxyModel::span(class QModelIndex const &) const - ?staticMetaObjectExtraData@QSound@@0UQMetaObjectExtraData@@B @ 13542 NONAME ; struct QMetaObjectExtraData const QSound::staticMetaObjectExtraData - ?qt_static_metacall@QDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13543 NONAME ; void QDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGraphicsItemAnimation@@0UQMetaObjectExtraData@@B @ 13544 NONAME ; struct QMetaObjectExtraData const QGraphicsItemAnimation::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsAnchor@@0UQMetaObjectExtraData@@B @ 13545 NONAME ; struct QMetaObjectExtraData const QGraphicsAnchor::staticMetaObjectExtraData - ?qt_static_metacall@QImageIOPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13546 NONAME ; void QImageIOPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?textureMapForGlyph@QTextureGlyphCache@@QBE?AVQImage@@IUQFixed@@@Z @ 13547 NONAME ; class QImage QTextureGlyphCache::textureMapForGlyph(unsigned int, struct QFixed) const - ?qt_static_metacall@QUndoView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13548 NONAME ; void QUndoView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QIntValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13549 NONAME ; void QIntValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QRegExpValidator@@0UQMetaObjectExtraData@@B @ 13550 NONAME ; struct QMetaObjectExtraData const QRegExpValidator::staticMetaObjectExtraData - ?insertionPointsForLine@QTextEngine@@QAEXHAAV?$QVector@H@@@Z @ 13551 NONAME ; void QTextEngine::insertionPointsForLine(int, class QVector<int> &) - ?staticMetaObjectExtraData@QAbstractSpinBox@@0UQMetaObjectExtraData@@B @ 13552 NONAME ; struct QMetaObjectExtraData const QAbstractSpinBox::staticMetaObjectExtraData - ?qt_metacall@QInternalMimeData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13553 NONAME ; int QInternalMimeData::qt_metacall(enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QLCDNumber@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13554 NONAME ; void QLCDNumber::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??1QZipWriter@@QAE@XZ @ 13555 NONAME ; QZipWriter::~QZipWriter(void) - ?staticMetaObjectExtraData@QSpinBox@@0UQMetaObjectExtraData@@B @ 13556 NONAME ; struct QMetaObjectExtraData const QSpinBox::staticMetaObjectExtraData - ?lineHeightType@QTextBlockFormat@@QBEHXZ @ 13557 NONAME ; int QTextBlockFormat::lineHeightType(void) const - ?hintingPreference@QFont@@QBE?AW4HintingPreference@1@XZ @ 13558 NONAME ; enum QFont::HintingPreference QFont::hintingPreference(void) const - ?qt_static_metacall@QDockWidgetLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13559 NONAME ; void QDockWidgetLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13560 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *, int) - ?cloneWithSize@QFontEngine@@UBEPAV1@M@Z @ 13561 NONAME ; class QFontEngine * QFontEngine::cloneWithSize(float) const - ?begin@QBlitterPaintEngine@@UAE_NPAVQPaintDevice@@@Z @ 13562 NONAME ; bool QBlitterPaintEngine::begin(class QPaintDevice *) - ?staticMetaObjectExtraData@QPixmapFilter@@0UQMetaObjectExtraData@@B @ 13563 NONAME ; struct QMetaObjectExtraData const QPixmapFilter::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QTapGesture@@0UQMetaObjectExtraData@@B @ 13564 NONAME ; struct QMetaObjectExtraData const QTapGesture::staticMetaObjectExtraData - ?inFontUcs4@QFontMetricsF@@QBE_NI@Z @ 13565 NONAME ; bool QFontMetricsF::inFontUcs4(unsigned int) const - ?staticMetaObjectExtraData@QTextControl@@0UQMetaObjectExtraData@@B @ 13566 NONAME ; struct QMetaObjectExtraData const QTextControl::staticMetaObjectExtraData - ?qt_static_metacall@QScrollBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13567 NONAME ; void QScrollBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QStackedWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13568 NONAME ; void QStackedWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQRectF@@@Z @ 13569 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRectF const &) - ?d_func@QBlitterPaintEngine@@AAEPAVQBlitterPaintEnginePrivate@@XZ @ 13570 NONAME ; class QBlitterPaintEnginePrivate * QBlitterPaintEngine::d_func(void) - ?setNumberPrefix@QTextListFormat@@QAEXABVQString@@@Z @ 13571 NONAME ; void QTextListFormat::setNumberPrefix(class QString const &) - ?qt_static_metacall@QAbstractSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13572 NONAME ; void QAbstractSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setCursorMoveStyle@QLineEdit@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13573 NONAME ; void QLineEdit::setCursorMoveStyle(enum QTextCursor::MoveStyle) - ?lineHeight@QTextBlockFormat@@QBEMMM@Z @ 13574 NONAME ; float QTextBlockFormat::lineHeight(float, float) const - ??0QIdentityProxyModel@@IAE@AAVQIdentityProxyModelPrivate@@PAVQObject@@@Z @ 13575 NONAME ; QIdentityProxyModel::QIdentityProxyModel(class QIdentityProxyModelPrivate &, class QObject *) - ?staticMetaObjectExtraData@QGraphicsEffect@@0UQMetaObjectExtraData@@B @ 13576 NONAME ; struct QMetaObjectExtraData const QGraphicsEffect::staticMetaObjectExtraData - ?qt_static_metacall@QMovie@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13577 NONAME ; void QMovie::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QToolBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13578 NONAME ; void QToolBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?getItem@QInputDialog@@SA?AVQString@@PAVQWidget@@ABV2@1ABVQStringList@@H_NPA_NV?$QFlags@W4WindowType@Qt@@@@V?$QFlags@W4InputMethodHint@Qt@@@@@Z @ 13579 NONAME ; class QString QInputDialog::getItem(class QWidget *, class QString const &, class QString const &, class QStringList const &, int, bool, bool *, class QFlags<enum Qt::WindowType>, class QFlags<enum Qt::InputMethodHint>) - ?staticMetaObjectExtraData@QItemDelegate@@0UQMetaObjectExtraData@@B @ 13580 NONAME ; struct QMetaObjectExtraData const QItemDelegate::staticMetaObjectExtraData - ?qt_static_metacall@QFileSystemModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13581 NONAME ; void QFileSystemModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?hasFeature@QWindowSurface@@QBE_NW4WindowSurfaceFeature@1@@Z @ 13582 NONAME ; bool QWindowSurface::hasFeature(enum QWindowSurface::WindowSurfaceFeature) const - ?qGamma_correct_back_to_linear_cs@@YAXPAVQImage@@@Z @ 13583 NONAME ; void qGamma_correct_back_to_linear_cs(class QImage *) - ?qt_static_metacall@QBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13584 NONAME ; void QBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QInputContext@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13585 NONAME ; void QInputContext::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QColumnView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13586 NONAME ; void QColumnView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?clip@QBlitterPaintEngine@@UAEXABVQVectorPath@@W4ClipOperation@Qt@@@Z @ 13587 NONAME ; void QBlitterPaintEngine::clip(class QVectorPath const &, enum Qt::ClipOperation) - ?qt_static_metacall@QSizeGrip@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13588 NONAME ; void QSizeGrip::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QFileDialog@@0UQMetaObjectExtraData@@B @ 13589 NONAME ; struct QMetaObjectExtraData const QFileDialog::staticMetaObjectExtraData - ?qt_static_metacall@QCalendarWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13590 NONAME ; void QCalendarWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?canReadData@QInternalMimeData@@SA_NABVQString@@@Z @ 13591 NONAME ; bool QInternalMimeData::canReadData(class QString const &) - ?leadingSpaceWidth@QTextEngine@@QAE?AUQFixed@@ABUQScriptLine@@@Z @ 13592 NONAME ; struct QFixed QTextEngine::leadingSpaceWidth(struct QScriptLine const &) - ?staticMetaObjectExtraData@QSwipeGesture@@0UQMetaObjectExtraData@@B @ 13593 NONAME ; struct QMetaObjectExtraData const QSwipeGesture::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QProxyStyle@@0UQMetaObjectExtraData@@B @ 13594 NONAME ; struct QMetaObjectExtraData const QProxyStyle::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QMessageBox@@0UQMetaObjectExtraData@@B @ 13595 NONAME ; struct QMetaObjectExtraData const QMessageBox::staticMetaObjectExtraData - ?qt_static_metacall@QStatusBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13596 NONAME ; void QStatusBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDataWidgetMapper@@0UQMetaObjectExtraData@@B @ 13597 NONAME ; struct QMetaObjectExtraData const QDataWidgetMapper::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QPlainTextDocumentLayout@@0UQMetaObjectExtraData@@B @ 13598 NONAME ; struct QMetaObjectExtraData const QPlainTextDocumentLayout::staticMetaObjectExtraData - ?qt_static_metacall@QProxyStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13599 NONAME ; void QProxyStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QAbstractTextDocumentLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13600 NONAME ; void QAbstractTextDocumentLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QDockWidgetLayout@@0UQMetaObjectExtraData@@B @ 13601 NONAME ; struct QMetaObjectExtraData const QDockWidgetLayout::staticMetaObjectExtraData - ?qt_static_metacall@QIconEnginePluginV2@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13602 NONAME ; void QIconEnginePluginV2::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QRegExpValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13603 NONAME ; void QRegExpValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?lineNumberForTextPosition@QTextEngine@@QAEHH@Z @ 13604 NONAME ; int QTextEngine::lineNumberForTextPosition(int) - ?instantInvalidatePropagation@QGraphicsLayout@@SA_NXZ @ 13605 NONAME ; bool QGraphicsLayout::instantInvalidatePropagation(void) - ?staticMetaObjectExtraData@QDoubleValidator@@0UQMetaObjectExtraData@@B @ 13606 NONAME ; struct QMetaObjectExtraData const QDoubleValidator::staticMetaObjectExtraData - ?qt_static_metacall@QCommonStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13607 NONAME ; void QCommonStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTextList@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13608 NONAME ; void QTextList::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?beginningOfLine@QTextEngine@@AAEHH@Z @ 13609 NONAME ; int QTextEngine::beginningOfLine(int) - ?qt_static_metacall@QDockWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13610 NONAME ; void QDockWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QAbstractProxyModel@@0UQMetaObjectExtraData@@B @ 13611 NONAME ; struct QMetaObjectExtraData const QAbstractProxyModel::staticMetaObjectExtraData - ?alphaMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@ABVQTransform@@@Z @ 13612 NONAME ; class QImage QFontEngine::alphaMapForGlyph(unsigned int, struct QFixed, class QTransform const &) - ?staticMetaObjectExtraData@QUndoStack@@0UQMetaObjectExtraData@@B @ 13613 NONAME ; struct QMetaObjectExtraData const QUndoStack::staticMetaObjectExtraData - ?qt_static_metacall@QErrorMessage@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13614 NONAME ; void QErrorMessage::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?fromImage@QBlittablePixmapData@@UAEXABVQImage@@V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 13615 NONAME ; void QBlittablePixmapData::fromImage(class QImage const &, class QFlags<enum Qt::ImageConversionFlag>) - ??0QInternalMimeData@@QAE@XZ @ 13616 NONAME ; QInternalMimeData::QInternalMimeData(void) - ?features@QRasterWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13617 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QRasterWindowSurface::features(void) const - ?qt_static_metacall@QActionGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13618 NONAME ; void QActionGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QBlittable@@QAE@ABVQSize@@V?$QFlags@W4Capability@QBlittable@@@@@Z @ 13619 NONAME ; QBlittable::QBlittable(class QSize const &, class QFlags<enum QBlittable::Capability>) - ?qt_static_metacall@QDataWidgetMapper@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13620 NONAME ; void QDataWidgetMapper::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGraphicsSystemPlugin@@0UQMetaObjectExtraData@@B @ 13621 NONAME ; struct QMetaObjectExtraData const QGraphicsSystemPlugin::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QCommonStyle@@0UQMetaObjectExtraData@@B @ 13622 NONAME ; struct QMetaObjectExtraData const QCommonStyle::staticMetaObjectExtraData - ?qt_static_metacall@QWizard@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13623 NONAME ; void QWizard::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QIdentityProxyModel@@QAE@PAVQObject@@@Z @ 13624 NONAME ; QIdentityProxyModel::QIdentityProxyModel(class QObject *) - ?staticMetaObjectExtraData@QTreeView@@0UQMetaObjectExtraData@@B @ 13625 NONAME ; struct QMetaObjectExtraData const QTreeView::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QDateEdit@@0UQMetaObjectExtraData@@B @ 13626 NONAME ; struct QMetaObjectExtraData const QDateEdit::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGesture@@0UQMetaObjectExtraData@@B @ 13627 NONAME ; struct QMetaObjectExtraData const QGesture::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsProxyWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13628 NONAME ; void QGraphicsProxyWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?markRasterOverlay@QBlittablePixmapData@@QAEXPBVQRect@@H@Z @ 13629 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRect const *, int) - ?rightCursorPosition@QTextLayout@@QBEHH@Z @ 13630 NONAME ; int QTextLayout::rightCursorPosition(int) const - ?tabsClosable@QMdiArea@@QBE_NXZ @ 13631 NONAME ; bool QMdiArea::tabsClosable(void) const - ?staticMetaObjectExtraData@QTextFrame@@0UQMetaObjectExtraData@@B @ 13632 NONAME ; struct QMetaObjectExtraData const QTextFrame::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QAbstractScrollArea@@0UQMetaObjectExtraData@@B @ 13633 NONAME ; struct QMetaObjectExtraData const QAbstractScrollArea::staticMetaObjectExtraData - ?setLineHeight@QTextBlockFormat@@QAEXMH@Z @ 13634 NONAME ; void QTextBlockFormat::setLineHeight(float, int) - ?staticMetaObjectExtraData@QFormLayout@@0UQMetaObjectExtraData@@B @ 13635 NONAME ; struct QMetaObjectExtraData const QFormLayout::staticMetaObjectExtraData - ?calculateSubPixelPositionCount@QTextureGlyphCache@@IBEHI@Z @ 13636 NONAME ; int QTextureGlyphCache::calculateSubPixelPositionCount(unsigned int) const - ?staticMetaObjectExtraData@QStackedWidget@@0UQMetaObjectExtraData@@B @ 13637 NONAME ; struct QMetaObjectExtraData const QStackedWidget::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QDialogButtonBox@@0UQMetaObjectExtraData@@B @ 13638 NONAME ; struct QMetaObjectExtraData const QDialogButtonBox::staticMetaObjectExtraData - ?qt_static_metacall@QToolButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13639 NONAME ; void QToolButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QPanGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13640 NONAME ; void QPanGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?features@QWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13641 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QWindowSurface::features(void) const - ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQVectorPath@@@Z @ 13642 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QVectorPath const &) - ?alphaMapBoundingBox@QFontEngine@@UAE?AUglyph_metrics_t@@IUQFixed@@ABVQTransform@@W4GlyphFormat@1@@Z @ 13643 NONAME ; struct glyph_metrics_t QFontEngine::alphaMapBoundingBox(unsigned int, struct QFixed, class QTransform const &, enum QFontEngine::GlyphFormat) - ?qt_static_metacall@QTapGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13644 NONAME ; void QTapGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QIntValidator@@0UQMetaObjectExtraData@@B @ 13645 NONAME ; struct QMetaObjectExtraData const QIntValidator::staticMetaObjectExtraData - ?qt_static_metacall@QInputDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13646 NONAME ; void QInputDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?clip@QBlitterPaintEngine@@QAEPBVQClipData@@XZ @ 13647 NONAME ; class QClipData const * QBlitterPaintEngine::clip(void) - ?qt_static_metacall@QStylePlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13648 NONAME ; void QStylePlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setNumberSuffix@QTextListFormat@@QAEXABVQString@@@Z @ 13649 NONAME ; void QTextListFormat::setNumberSuffix(class QString const &) - ?qt_static_metacall@QApplication@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13650 NONAME ; void QApplication::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QPicture@@QAEXAAV1@@Z @ 13651 NONAME ; void QPicture::swap(class QPicture &) - ?d_func@QIdentityProxyModel@@ABEPBVQIdentityProxyModelPrivate@@XZ @ 13652 NONAME ; class QIdentityProxyModelPrivate const * QIdentityProxyModel::d_func(void) const - ?qt_static_metacall@QSplashScreen@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13653 NONAME ; void QSplashScreen::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QPainterPath@@QAEXAAV1@@Z @ 13654 NONAME ; void QPainterPath::swap(class QPainterPath &) - ?qt_static_metacall@QFocusFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13655 NONAME ; void QFocusFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?minimumSizeHint@QCheckBox@@UBE?AVQSize@@XZ @ 13656 NONAME ; class QSize QCheckBox::minimumSizeHint(void) const - ?alphaMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@@Z @ 13657 NONAME ; class QImage QFontEngine::alphaMapForGlyph(unsigned int, struct QFixed) - ?fillTexture@QImageTextureGlyphCache@@UAEXABUCoord@QTextureGlyphCache@@IUQFixed@@@Z @ 13658 NONAME ; void QImageTextureGlyphCache::fillTexture(struct QTextureGlyphCache::Coord const &, unsigned int, struct QFixed) - ?swap@QIcon@@QAEXAAV1@@Z @ 13659 NONAME ; void QIcon::swap(class QIcon &) - ?columnCount@QIdentityProxyModel@@UBEHABVQModelIndex@@@Z @ 13660 NONAME ; int QIdentityProxyModel::columnCount(class QModelIndex const &) const - ?unmarkRasterOverlay@QBlittablePixmapData@@QAEXABVQRectF@@@Z @ 13661 NONAME ; void QBlittablePixmapData::unmarkRasterOverlay(class QRectF const &) - ?cursorMoveStyle@QLineEdit@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13662 NONAME ; enum QTextCursor::MoveStyle QLineEdit::cursorMoveStyle(void) const - ?trUtf8@QIdentityProxyModel@@SA?AVQString@@PBD0H@Z @ 13663 NONAME ; class QString QIdentityProxyModel::trUtf8(char const *, char const *, int) - ?brushOriginChanged@QBlitterPaintEngine@@UAEXXZ @ 13664 NONAME ; void QBlitterPaintEngine::brushOriginChanged(void) - ?openFile@QFileOpenEvent@@QBE_NAAVQFile@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13665 NONAME ; bool QFileOpenEvent::openFile(class QFile &, class QFlags<enum QIODevice::OpenModeFlag>) const - ??0QApplicationPrivate@@QAE@AAHPAPADW4Type@QApplication@@H@Z @ 13666 NONAME ; QApplicationPrivate::QApplicationPrivate(int &, char * *, enum QApplication::Type, int) - ?qt_static_metacall@QSound@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13667 NONAME ; void QSound::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QToolBox@@0UQMetaObjectExtraData@@B @ 13668 NONAME ; struct QMetaObjectExtraData const QToolBox::staticMetaObjectExtraData - ?addDirectory@QZipWriter@@QAEXABVQString@@@Z @ 13669 NONAME ; void QZipWriter::addDirectory(class QString const &) - ?staticMetaObjectExtraData@QGraphicsOpacityEffect@@0UQMetaObjectExtraData@@B @ 13670 NONAME ; struct QMetaObjectExtraData const QGraphicsOpacityEffect::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QGraphicsColorizeEffect@@0UQMetaObjectExtraData@@B @ 13671 NONAME ; struct QMetaObjectExtraData const QGraphicsColorizeEffect::staticMetaObjectExtraData - ?inFontUcs4@QFontMetrics@@QBE_NI@Z @ 13672 NONAME ; bool QFontMetrics::inFontUcs4(unsigned int) const - ?staticMetaObjectExtraData@QIconEnginePlugin@@0UQMetaObjectExtraData@@B @ 13673 NONAME ; struct QMetaObjectExtraData const QIconEnginePlugin::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QFrame@@0UQMetaObjectExtraData@@B @ 13674 NONAME ; struct QMetaObjectExtraData const QFrame::staticMetaObjectExtraData - ?isWritable@QZipWriter@@QBE_NXZ @ 13675 NONAME ; bool QZipWriter::isWritable(void) const - ?qt_static_metacall@QValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13676 NONAME ; void QValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QStandardItemModel@@0UQMetaObjectExtraData@@B @ 13677 NONAME ; struct QMetaObjectExtraData const QStandardItemModel::staticMetaObjectExtraData - ?qt_static_metacall@QDrag@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13678 NONAME ; void QDrag::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QFontComboBox@@0UQMetaObjectExtraData@@B @ 13679 NONAME ; struct QMetaObjectExtraData const QFontComboBox::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QInputDialog@@0UQMetaObjectExtraData@@B @ 13680 NONAME ; struct QMetaObjectExtraData const QInputDialog::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QInputContext@@0UQMetaObjectExtraData@@B @ 13681 NONAME ; struct QMetaObjectExtraData const QInputContext::staticMetaObjectExtraData - ?unlock@QBlittable@@QAEXXZ @ 13682 NONAME ; void QBlittable::unlock(void) - ?swap@QRegion@@QAEXAAV1@@Z @ 13683 NONAME ; void QRegion::swap(class QRegion &) - ?staticMetaObjectExtraData@QLCDNumber@@0UQMetaObjectExtraData@@B @ 13684 NONAME ; struct QMetaObjectExtraData const QLCDNumber::staticMetaObjectExtraData - ?setDefaultCursorMoveStyle@QTextDocument@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13685 NONAME ; void QTextDocument::setDefaultCursorMoveStyle(enum QTextCursor::MoveStyle) - ?staticMetaObjectExtraData@QS60Style@@0UQMetaObjectExtraData@@B @ 13686 NONAME ; struct QMetaObjectExtraData const QS60Style::staticMetaObjectExtraData - ?qt_static_metacall@QWidgetAction@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13687 NONAME ; void QWidgetAction::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QListView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13688 NONAME ; void QListView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?setItemData@QAbstractProxyModel@@UAE_NABVQModelIndex@@ABV?$QMap@HVQVariant@@@@@Z @ 13689 NONAME ; bool QAbstractProxyModel::setItemData(class QModelIndex const &, class QMap<int, class QVariant> const &) - ?getStaticMetaObject@QInternalMimeData@@SAABUQMetaObject@@XZ @ 13690 NONAME ; struct QMetaObject const & QInternalMimeData::getStaticMetaObject(void) - ?swap@QPolygonF@@QAEXAAV1@@Z @ 13691 NONAME ; void QPolygonF::swap(class QPolygonF &) - ?creationPermissions@QZipWriter@@QBE?AV?$QFlags@W4Permission@QFile@@@@XZ @ 13692 NONAME ; class QFlags<enum QFile::Permission> QZipWriter::creationPermissions(void) const - ?qt_static_metacall@QDial@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13693 NONAME ; void QDial::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?swap@QPolygon@@QAEXAAV1@@Z @ 13694 NONAME ; void QPolygon::swap(class QPolygon &) - ?qt_static_metacall@QWorkspace@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13695 NONAME ; void QWorkspace::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QProgressDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13696 NONAME ; void QProgressDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?d_func@QBlitterPaintEngine@@ABEPBVQBlitterPaintEnginePrivate@@XZ @ 13697 NONAME ; class QBlitterPaintEnginePrivate const * QBlitterPaintEngine::d_func(void) const - ?actionText@QUndoCommand@@QBE?AVQString@@XZ @ 13698 NONAME ; class QString QUndoCommand::actionText(void) const - ?staticMetaObjectExtraData@QWidgetAction@@0UQMetaObjectExtraData@@B @ 13699 NONAME ; struct QMetaObjectExtraData const QWidgetAction::staticMetaObjectExtraData - ?qt_static_metacall@QListWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13700 NONAME ; void QListWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?tr@QIdentityProxyModel@@SA?AVQString@@PBD0H@Z @ 13701 NONAME ; class QString QIdentityProxyModel::tr(char const *, char const *, int) - ?swap@QKeySequence@@QAEXAAV1@@Z @ 13702 NONAME ; void QKeySequence::swap(class QKeySequence &) - ?staticMetaObjectExtraData@QGraphicsDropShadowEffect@@0UQMetaObjectExtraData@@B @ 13703 NONAME ; struct QMetaObjectExtraData const QGraphicsDropShadowEffect::staticMetaObjectExtraData - ?qt_static_metacall@QProgressBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13704 NONAME ; void QProgressBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QTextBlockGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13705 NONAME ; void QTextBlockGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?lineHeight@QTextBlockFormat@@QBEMXZ @ 13706 NONAME ; float QTextBlockFormat::lineHeight(void) const - ?stroke@QBlitterPaintEngine@@UAEXABVQVectorPath@@ABVQPen@@@Z @ 13707 NONAME ; void QBlitterPaintEngine::stroke(class QVectorPath const &, class QPen const &) - ?qt_static_metacall@QWizardPage@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13708 NONAME ; void QWizardPage::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QToolButton@@0UQMetaObjectExtraData@@B @ 13709 NONAME ; struct QMetaObjectExtraData const QToolButton::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QSyntaxHighlighter@@0UQMetaObjectExtraData@@B @ 13710 NONAME ; struct QMetaObjectExtraData const QSyntaxHighlighter::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QHeaderView@@0UQMetaObjectExtraData@@B @ 13711 NONAME ; struct QMetaObjectExtraData const QHeaderView::staticMetaObjectExtraData - ?tr@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13712 NONAME ; class QString QInternalMimeData::tr(char const *, char const *) - ?mapFromSource@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13713 NONAME ; class QModelIndex QIdentityProxyModel::mapFromSource(class QModelIndex const &) const - ??1QBlittable@@UAE@XZ @ 13714 NONAME ; QBlittable::~QBlittable(void) - ??_EQBlitterPaintEngine@@UAE@I@Z @ 13715 NONAME ; QBlitterPaintEngine::~QBlitterPaintEngine(unsigned int) - ?staticMetaObjectExtraData@QInternalMimeData@@0UQMetaObjectExtraData@@B @ 13716 NONAME ; struct QMetaObjectExtraData const QInternalMimeData::staticMetaObjectExtraData - ?buffer@QBlittablePixmapData@@UAEPAVQImage@@XZ @ 13717 NONAME ; class QImage * QBlittablePixmapData::buffer(void) - ?staticMetaObjectExtraData@QComboBox@@0UQMetaObjectExtraData@@B @ 13718 NONAME ; struct QMetaObjectExtraData const QComboBox::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QWorkspace@@0UQMetaObjectExtraData@@B @ 13719 NONAME ; struct QMetaObjectExtraData const QWorkspace::staticMetaObjectExtraData - ?nextLogicalPosition@QTextEngine@@QBEHH@Z @ 13720 NONAME ; int QTextEngine::nextLogicalPosition(int) const - ?qt_static_metacall@QGraphicsEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13721 NONAME ; void QGraphicsEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QUndoGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13722 NONAME ; void QUndoGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QProgressBar@@0UQMetaObjectExtraData@@B @ 13723 NONAME ; struct QMetaObjectExtraData const QProgressBar::staticMetaObjectExtraData - ?qt_static_metacall@QLineEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13724 NONAME ; void QLineEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?drawStaticTextItem@QBlitterPaintEngine@@UAEXPAVQStaticTextItem@@@Z @ 13725 NONAME ; void QBlitterPaintEngine::drawStaticTextItem(class QStaticTextItem *) - ?setCursorMoveStyle@QTextLayout@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13726 NONAME ; void QTextLayout::setCursorMoveStyle(enum QTextCursor::MoveStyle) - ?lock@QBlittable@@QAEPAVQImage@@XZ @ 13727 NONAME ; class QImage * QBlittable::lock(void) - ?setFontHintingPreference@QTextCharFormat@@QAEXW4HintingPreference@QFont@@@Z @ 13728 NONAME ; void QTextCharFormat::setFontHintingPreference(enum QFont::HintingPreference) - ?qt_static_metacall@QPixmapColorizeFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13729 NONAME ; void QPixmapColorizeFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGuiPlatformPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13730 NONAME ; void QGuiPlatformPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QSplitterHandle@@0UQMetaObjectExtraData@@B @ 13731 NONAME ; struct QMetaObjectExtraData const QSplitterHandle::staticMetaObjectExtraData - ?qt_static_metacall@QButtonGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13732 NONAME ; void QButtonGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QCalendarWidget@@0UQMetaObjectExtraData@@B @ 13733 NONAME ; struct QMetaObjectExtraData const QCalendarWidget::staticMetaObjectExtraData - ?qt_static_metacall@QTreeWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13734 NONAME ; void QTreeWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?doItemsLayout@QTableView@@UAEXXZ @ 13735 NONAME ; void QTableView::doItemsLayout(void) - ??_EQInternalMimeData@@UAE@I@Z @ 13736 NONAME ; QInternalMimeData::~QInternalMimeData(unsigned int) - ?staticMetaObjectExtraData@QMouseEventTransition@@0UQMetaObjectExtraData@@B @ 13737 NONAME ; struct QMetaObjectExtraData const QMouseEventTransition::staticMetaObjectExtraData - ?qt_static_metacall@QIconEnginePlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13738 NONAME ; void QIconEnginePlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QDialogButtonBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13739 NONAME ; void QDialogButtonBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQPointF@@ABVQTextItem@@@Z @ 13740 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QPointF const &, class QTextItem const &) - ?qt_static_metacall@QPlainTextDocumentLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13741 NONAME ; void QPlainTextDocumentLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QLabel@@0UQMetaObjectExtraData@@B @ 13742 NONAME ; struct QMetaObjectExtraData const QLabel::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QCompleter@@0UQMetaObjectExtraData@@B @ 13743 NONAME ; struct QMetaObjectExtraData const QCompleter::staticMetaObjectExtraData - ?qt_static_metacall@QDateEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13744 NONAME ; void QDateEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?drawEllipse@QBlitterPaintEngine@@UAEXABVQRectF@@@Z @ 13745 NONAME ; void QBlitterPaintEngine::drawEllipse(class QRectF const &) - ?staticMetaObjectExtraData@QTimeEdit@@0UQMetaObjectExtraData@@B @ 13746 NONAME ; struct QMetaObjectExtraData const QTimeEdit::staticMetaObjectExtraData - ?blittable@QBlittablePixmapData@@QBEPAVQBlittable@@XZ @ 13747 NONAME ; class QBlittable * QBlittablePixmapData::blittable(void) const - ?setFocalRadius@QRadialGradient@@QAEXM@Z @ 13748 NONAME ; void QRadialGradient::setFocalRadius(float) - ?qt_painterPathFromVectorPath@@YA?AVQPainterPath@@ABVQVectorPath@@@Z @ 13749 NONAME ; class QPainterPath qt_painterPathFromVectorPath(class QVectorPath const &) - ?staticMetaObjectExtraData@QAction@@0UQMetaObjectExtraData@@B @ 13750 NONAME ; struct QMetaObjectExtraData const QAction::staticMetaObjectExtraData - ?resizeCache@QTextureGlyphCache@@QAEXHH@Z @ 13751 NONAME ; void QTextureGlyphCache::resizeCache(int, int) - ?qt_static_metacall@QHeaderView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13752 NONAME ; void QHeaderView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QGraphicsProxyWidget@@0UQMetaObjectExtraData@@B @ 13753 NONAME ; struct QMetaObjectExtraData const QGraphicsProxyWidget::staticMetaObjectExtraData - ?metaObject@QInternalMimeData@@UBEPBUQMetaObject@@XZ @ 13754 NONAME ; struct QMetaObject const * QInternalMimeData::metaObject(void) const - ?addSymLink@QZipWriter@@QAEXABVQString@@0@Z @ 13755 NONAME ; void QZipWriter::addSymLink(class QString const &, class QString const &) - ?tr@QIdentityProxyModel@@SA?AVQString@@PBD0@Z @ 13756 NONAME ; class QString QIdentityProxyModel::tr(char const *, char const *) - ?qt_static_metacall@QFileDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13757 NONAME ; void QFileDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QInternalMimeData@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13758 NONAME ; void QInternalMimeData::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13759 NONAME ; void QGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?hasFormatHelper@QInternalMimeData@@SA_NABVQString@@PBVQMimeData@@@Z @ 13760 NONAME ; bool QInternalMimeData::hasFormatHelper(class QString const &, class QMimeData const *) - ?state@QBlitterPaintEngine@@QAEPAVQPainterState@@XZ @ 13761 NONAME ; class QPainterState * QBlitterPaintEngine::state(void) - ?penChanged@QBlitterPaintEngine@@UAEXXZ @ 13762 NONAME ; void QBlitterPaintEngine::penChanged(void) - ??0QFileOpenEvent@@QAE@ABVRFile@@@Z @ 13763 NONAME ; QFileOpenEvent::QFileOpenEvent(class RFile const &) - ?staticMetaObjectExtraData@QStackedLayout@@0UQMetaObjectExtraData@@B @ 13764 NONAME ; struct QMetaObjectExtraData const QStackedLayout::staticMetaObjectExtraData - ?match@QIdentityProxyModel@@UBE?AV?$QList@VQModelIndex@@@@ABVQModelIndex@@HABVQVariant@@HV?$QFlags@W4MatchFlag@Qt@@@@@Z @ 13765 NONAME ; class QList<class QModelIndex> QIdentityProxyModel::match(class QModelIndex const &, int, class QVariant const &, int, class QFlags<enum Qt::MatchFlag>) const - ?hasHeightForWidth@QWidgetPrivate@@UBE_NXZ @ 13766 NONAME ; bool QWidgetPrivate::hasHeightForWidth(void) const - ?qt_static_metacall@QMessageBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13767 NONAME ; void QMessageBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObjectExtraData@QSortFilterProxyModel@@0UQMetaObjectExtraData@@B @ 13768 NONAME ; struct QMetaObjectExtraData const QSortFilterProxyModel::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QCommandLinkButton@@0UQMetaObjectExtraData@@B @ 13769 NONAME ; struct QMetaObjectExtraData const QCommandLinkButton::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QWidget@@0UQMetaObjectExtraData@@B @ 13770 NONAME ; struct QMetaObjectExtraData const QWidget::staticMetaObjectExtraData - ?toImage@QBlittablePixmapData@@UBE?AVQImage@@XZ @ 13771 NONAME ; class QImage QBlittablePixmapData::toImage(void) const - ??_EQBlittable@@UAE@I@Z @ 13772 NONAME ; QBlittable::~QBlittable(unsigned int) - ?staticMetaObject@QIdentityProxyModel@@2UQMetaObject@@B @ 13773 NONAME ; struct QMetaObject const QIdentityProxyModel::staticMetaObject - ?rowCount@QIdentityProxyModel@@UBEHABVQModelIndex@@@Z @ 13774 NONAME ; int QIdentityProxyModel::rowCount(class QModelIndex const &) const - ?trUtf8@QIdentityProxyModel@@SA?AVQString@@PBD0@Z @ 13775 NONAME ; class QString QIdentityProxyModel::trUtf8(char const *, char const *) - ?qt_static_metacall@QRadioButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13776 NONAME ; void QRadioButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??1QInternalMimeData@@UAE@XZ @ 13777 NONAME ; QInternalMimeData::~QInternalMimeData(void) - ?cursorMoveStyle@QTextLayout@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13778 NONAME ; enum QTextCursor::MoveStyle QTextLayout::cursorMoveStyle(void) const - ?qt_addBitmapToPath@@YAXMMPBEHHHPAVQPainterPath@@@Z @ 13779 NONAME ; void qt_addBitmapToPath(float, float, unsigned char const *, int, int, int, class QPainterPath *) - ?qt_static_metacall@QTextTable@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13780 NONAME ; void QTextTable::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QItemSelectionModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13781 NONAME ; void QItemSelectionModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?staticMetaObject@QInternalMimeData@@2UQMetaObject@@B @ 13782 NONAME ; struct QMetaObject const QInternalMimeData::staticMetaObject - ?staticMetaObjectExtraData@QGraphicsTransform@@0UQMetaObjectExtraData@@B @ 13783 NONAME ; struct QMetaObjectExtraData const QGraphicsTransform::staticMetaObjectExtraData - ?staticMetaObjectExtraData@QAbstractTextDocumentLayout@@0UQMetaObjectExtraData@@B @ 13784 NONAME ; struct QMetaObjectExtraData const QAbstractTextDocumentLayout::staticMetaObjectExtraData - ?qt_static_metacall@QGraphicsWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13785 NONAME ; void QGraphicsWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?qt_static_metacall@QShortcut@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13786 NONAME ; void QShortcut::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ?endOfLine@QTextEngine@@AAEHH@Z @ 13787 NONAME ; int QTextEngine::endOfLine(int) - + ??_EQScrollerProperties@@UAE@I@Z @ 13203 NONAME ; QScrollerProperties::~QScrollerProperties(unsigned int) + ??_EQFontPrivate@@QAE@I@Z @ 13204 NONAME ABSENT ; QFontPrivate::~QFontPrivate(unsigned int) + ??0QMimeSource@@QAE@XZ @ 13205 NONAME ABSENT ; QMimeSource::QMimeSource(void) + ??0QStyleFactoryInterface@@QAE@XZ @ 13206 NONAME ABSENT ; QStyleFactoryInterface::QStyleFactoryInterface(void) + ?d_func@QScrollEvent@@AAEPAVQScrollEventPrivate@@XZ @ 13207 NONAME ; class QScrollEventPrivate * QScrollEvent::d_func(void) + ??0QFileOpenEvent@@QAE@ABV0@@Z @ 13208 NONAME ABSENT ; QFileOpenEvent::QFileOpenEvent(class QFileOpenEvent const &) + ??4QStyleOptionViewItemV2@@QAEAAV0@ABV0@@Z @ 13209 NONAME ABSENT ; class QStyleOptionViewItemV2 & QStyleOptionViewItemV2::operator=(class QStyleOptionViewItemV2 const &) + ?heightForWidth@QTabWidget@@UBEHH@Z @ 13210 NONAME ; int QTabWidget::heightForWidth(int) const + ??1QFlickGesture@@UAE@XZ @ 13211 NONAME ; QFlickGesture::~QFlickGesture(void) + ??0QRasterWindowSurface@@QAE@PAVQWidget@@_N@Z @ 13212 NONAME ; QRasterWindowSurface::QRasterWindowSurface(class QWidget *, bool) + ?brushChanged@QBlitterPaintEngine@@UAEXXZ @ 13213 NONAME ; void QBlitterPaintEngine::brushChanged(void) + ?clip@QBlitterPaintEngine@@UAEXABVQRect@@W4ClipOperation@Qt@@@Z @ 13214 NONAME ; void QBlitterPaintEngine::clip(class QRect const &, enum Qt::ClipOperation) + ?detach@QGlyphs@@AAEXXZ @ 13215 NONAME ; void QGlyphs::detach(void) + ?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13216 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *) + ??0QShowEvent@@QAE@ABV0@@Z @ 13217 NONAME ABSENT ; QShowEvent::QShowEvent(class QShowEvent const &) + ??0QMouseEvent@@QAE@ABV0@@Z @ 13218 NONAME ABSENT ; QMouseEvent::QMouseEvent(class QMouseEvent const &) + ?setHintingPreference@QFont@@QAEXW4HintingPreference@1@@Z @ 13219 NONAME ; void QFont::setHintingPreference(enum QFont::HintingPreference) + ??0QActionEvent@@QAE@ABV0@@Z @ 13220 NONAME ABSENT ; QActionEvent::QActionEvent(class QActionEvent const &) + ??0QTouchEvent@@QAE@ABV0@@Z @ 13221 NONAME ABSENT ; QTouchEvent::QTouchEvent(class QTouchEvent const &) + ?capabilities@QBlittable@@QBE?AV?$QFlags@W4Capability@QBlittable@@@@XZ @ 13222 NONAME ; class QFlags<enum QBlittable::Capability> QBlittable::capabilities(void) const + ?setContentPosRange@QScrollPrepareEvent@@QAEXABVQRectF@@@Z @ 13223 NONAME ; void QScrollPrepareEvent::setContentPosRange(class QRectF const &) + ??_EQImageData@@QAE@I@Z @ 13224 NONAME ABSENT ; QImageData::~QImageData(unsigned int) + ?swap@QBrush@@QAEXAAV1@@Z @ 13225 NONAME ; void QBrush::swap(class QBrush &) + ?trUtf8@QFlickGesture@@SA?AVQString@@PBD0H@Z @ 13226 NONAME ; class QString QFlickGesture::trUtf8(char const *, char const *, int) + ?fontHintingPreference@QTextCharFormat@@QBE?AW4HintingPreference@QFont@@XZ @ 13227 NONAME ; enum QFont::HintingPreference QTextCharFormat::fontHintingPreference(void) const + ?swap@QPixmap@@QAEXAAV1@@Z @ 13228 NONAME ; void QPixmap::swap(class QPixmap &) + ??0QBlitterPaintEngine@@QAE@PAVQBlittablePixmapData@@@Z @ 13229 NONAME ; QBlitterPaintEngine::QBlitterPaintEngine(class QBlittablePixmapData *) + ?numberPrefix@QTextListFormat@@QBE?AVQString@@XZ @ 13230 NONAME ; class QString QTextListFormat::numberPrefix(void) const + ?setSnapPositionsX@QScroller@@QAEXMM@Z @ 13231 NONAME ; void QScroller::setSnapPositionsX(float, float) + ?scroller@QScroller@@SAPBV1@PBVQObject@@@Z @ 13232 NONAME ; class QScroller const * QScroller::scroller(class QObject const *) + ?qt_metacall@QScroller@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13233 NONAME ; int QScroller::qt_metacall(enum QMetaObject::Call, int, void * *) + ?tr@QFlickGesture@@SA?AVQString@@PBD0@Z @ 13234 NONAME ; class QString QFlickGesture::tr(char const *, char const *) + ??4QBezier@@QAEAAV0@ABV0@@Z @ 13235 NONAME ABSENT ; class QBezier & QBezier::operator=(class QBezier const &) + ?setScrollerProperties@QScroller@@QAEXABVQScrollerProperties@@@Z @ 13236 NONAME ; void QScroller::setScrollerProperties(class QScrollerProperties const &) + ??0QIconEngineV2@@QAE@XZ @ 13237 NONAME ABSENT ; QIconEngineV2::QIconEngineV2(void) + ??4iterator@QTextBlock@@QAEAAV01@ABV01@@Z @ 13238 NONAME ABSENT ; class QTextBlock::iterator & QTextBlock::iterator::operator=(class QTextBlock::iterator const &) + ??MQItemSelectionRange@@QBE_NABV0@@Z @ 13239 NONAME ; bool QItemSelectionRange::operator<(class QItemSelectionRange const &) const + ?setWidthForHeight@QSizePolicy@@QAEX_N@Z @ 13240 NONAME ; void QSizePolicy::setWidthForHeight(bool) + ?qt_fontdata_from_index@@YA?AVQByteArray@@H@Z @ 13241 NONAME ; class QByteArray qt_fontdata_from_index(int) + ??0QIconEngineV2@@QAE@ABV0@@Z @ 13242 NONAME ABSENT ; QIconEngineV2::QIconEngineV2(class QIconEngineV2 const &) + ?swap@QImage@@QAEXAAV1@@Z @ 13243 NONAME ; void QImage::swap(class QImage &) + ??0QIconEngineFactoryInterfaceV2@@QAE@XZ @ 13244 NONAME ABSENT ; QIconEngineFactoryInterfaceV2::QIconEngineFactoryInterfaceV2(void) + ??0QScroller@@AAE@PAVQObject@@@Z @ 13245 NONAME ; QScroller::QScroller(class QObject *) + ?compositionModeChanged@QBlitterPaintEngine@@UAEXXZ @ 13246 NONAME ; void QBlitterPaintEngine::compositionModeChanged(void) + ?contentPosRange@QScrollPrepareEvent@@QBE?AVQRectF@@XZ @ 13247 NONAME ; class QRectF QScrollPrepareEvent::contentPosRange(void) const + ?grabGesture@QScroller@@SA?AW4GestureType@Qt@@PAVQObject@@W4ScrollerGestureType@1@@Z @ 13248 NONAME ; enum Qt::GestureType QScroller::grabGesture(class QObject *, enum QScroller::ScrollerGestureType) + ??_EQFlickGesture@@UAE@I@Z @ 13249 NONAME ; QFlickGesture::~QFlickGesture(unsigned int) + ?drawRects@QBlitterPaintEngine@@UAEXPBVQRectF@@H@Z @ 13250 NONAME ; void QBlitterPaintEngine::drawRects(class QRectF const *, int) + ??4QTextLine@@QAEAAV0@ABV0@@Z @ 13251 NONAME ABSENT ; class QTextLine & QTextLine::operator=(class QTextLine const &) + ??0QToolBarChangeEvent@@QAE@ABV0@@Z @ 13252 NONAME ABSENT ; QToolBarChangeEvent::QToolBarChangeEvent(class QToolBarChangeEvent const &) + ??1QBlitterPaintEngine@@UAE@XZ @ 13253 NONAME ; QBlitterPaintEngine::~QBlitterPaintEngine(void) + ?markRasterOverlay@QBlittablePixmapData@@QAEXPBVQRectF@@H@Z @ 13254 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRectF const *, int) + ??0QResizeEvent@@QAE@ABV0@@Z @ 13255 NONAME ABSENT ; QResizeEvent::QResizeEvent(class QResizeEvent const &) + ??0QIconEngineFactoryInterface@@QAE@XZ @ 13256 NONAME ABSENT ; QIconEngineFactoryInterface::QIconEngineFactoryInterface(void) + ?drawTextItem@QBlitterPaintEngine@@UAEXABVQPointF@@ABVQTextItem@@@Z @ 13257 NONAME ; void QBlitterPaintEngine::drawTextItem(class QPointF const &, class QTextItem const &) + ??0QPictureFormatInterface@@QAE@XZ @ 13258 NONAME ABSENT ; QPictureFormatInterface::QPictureFormatInterface(void) + ?trUtf8@QFlickGesture@@SA?AVQString@@PBD0@Z @ 13259 NONAME ; class QString QFlickGesture::trUtf8(char const *, char const *) + ?stop@QScroller@@QAEXXZ @ 13260 NONAME ; void QScroller::stop(void) + ?retrieveData@QInternalMimeData@@MBE?AVQVariant@@ABVQString@@W4Type@2@@Z @ 13261 NONAME ; class QVariant QInternalMimeData::retrieveData(class QString const &, enum QVariant::Type) const + ??8QGlyphs@@QBE_NABV0@@Z @ 13262 NONAME ; bool QGlyphs::operator==(class QGlyphs const &) const + ?drawImage@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQImage@@0V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 13263 NONAME ; void QBlitterPaintEngine::drawImage(class QRectF const &, class QImage const &, class QRectF const &, class QFlags<enum Qt::ImageConversionFlag>) + ?contentPos@QScrollEvent@@QBE?AVQPointF@@XZ @ 13264 NONAME ; class QPointF QScrollEvent::contentPos(void) const + ?mimeTypes@QAbstractProxyModel@@UBE?AVQStringList@@XZ @ 13265 NONAME ; class QStringList QAbstractProxyModel::mimeTypes(void) const + ?createState@QBlitterPaintEngine@@UBEPAVQPainterState@@PAV2@@Z @ 13266 NONAME ; class QPainterState * QBlitterPaintEngine::createState(class QPainterState *) const + ?removeItem@QGraphicsGridLayout@@QAEXPAVQGraphicsLayoutItem@@@Z @ 13267 NONAME ; void QGraphicsGridLayout::removeItem(class QGraphicsLayoutItem *) + ?clipBoundingRect@QPainter@@QBE?AVQRectF@@XZ @ 13268 NONAME ; class QRectF QPainter::clipBoundingRect(void) const + ?formats@QInternalMimeData@@UBE?AVQStringList@@XZ @ 13269 NONAME ; class QStringList QInternalMimeData::formats(void) const + ?stateChanged@QScroller@@IAEXW4State@1@@Z @ 13270 NONAME ; void QScroller::stateChanged(enum QScroller::State) + ?raster@QBlitterPaintEngine@@ABEPAVQRasterPaintEngine@@XZ @ 13271 NONAME ; class QRasterPaintEngine * QBlitterPaintEngine::raster(void) const + ?sort@QAbstractProxyModel@@UAEXHW4SortOrder@Qt@@@Z @ 13272 NONAME ; void QAbstractProxyModel::sort(int, enum Qt::SortOrder) + ?d_func@QBlittable@@AAEPAVQBlittablePrivate@@XZ @ 13273 NONAME ; class QBlittablePrivate * QBlittable::d_func(void) + ?setDefaultScrollerProperties@QScrollerProperties@@SAXABV1@@Z @ 13274 NONAME ; void QScrollerProperties::setDefaultScrollerProperties(class QScrollerProperties const &) + ??_EQPolygon@@QAE@I@Z @ 13275 NONAME ABSENT ; QPolygon::~QPolygon(unsigned int) + ?type@QBlitterPaintEngine@@UBE?AW4Type@QPaintEngine@@XZ @ 13276 NONAME ; enum QPaintEngine::Type QBlitterPaintEngine::type(void) const + ?qt_metacast@QScroller@@UAEPAXPBD@Z @ 13277 NONAME ; void * QScroller::qt_metacast(char const *) + ??_EQImageReader@@QAE@I@Z @ 13278 NONAME ABSENT ; QImageReader::~QImageReader(unsigned int) + ?buddy@QAbstractProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13279 NONAME ; class QModelIndex QAbstractProxyModel::buddy(class QModelIndex const &) const + ?tr@QScroller@@SA?AVQString@@PBD0H@Z @ 13280 NONAME ; class QString QScroller::tr(char const *, char const *, int) + ?fill@QImage@@QAEXABVQColor@@@Z @ 13281 NONAME ; void QImage::fill(class QColor const &) + ?scrollMetric@QScrollerProperties@@QBE?AVQVariant@@W4ScrollMetric@1@@Z @ 13282 NONAME ; class QVariant QScrollerProperties::scrollMetric(enum QScrollerProperties::ScrollMetric) const + ?fill@QImage@@QAEXW4GlobalColor@Qt@@@Z @ 13283 NONAME ; void QImage::fill(enum Qt::GlobalColor) + ??4QStyleOptionGraphicsItem@@QAEAAV0@ABV0@@Z @ 13284 NONAME ABSENT ; class QStyleOptionGraphicsItem & QStyleOptionGraphicsItem::operator=(class QStyleOptionGraphicsItem const &) + ?canFetchMore@QAbstractProxyModel@@UBE_NABVQModelIndex@@@Z @ 13285 NONAME ; bool QAbstractProxyModel::canFetchMore(class QModelIndex const &) const + ??4QStyleOptionProgressBarV2@@QAEAAV0@ABV0@@Z @ 13286 NONAME ABSENT ; class QStyleOptionProgressBarV2 & QStyleOptionProgressBarV2::operator=(class QStyleOptionProgressBarV2 const &) + ??1QScroller@@EAE@XZ @ 13287 NONAME ; QScroller::~QScroller(void) + ?setFont@QGlyphs@@QAEXABVQFont@@@Z @ 13288 NONAME ; void QGlyphs::setFont(class QFont const &) + ?startPos@QScrollPrepareEvent@@QBE?AVQPointF@@XZ @ 13289 NONAME ; class QPointF QScrollPrepareEvent::startPos(void) const + ?resize@QBlittablePixmapData@@UAEXHH@Z @ 13290 NONAME ; void QBlittablePixmapData::resize(int, int) + ?setTabsClosable@QMdiArea@@QAEX_N@Z @ 13291 NONAME ; void QMdiArea::setTabsClosable(bool) + ?ensureVisible@QScroller@@QAEXABVQRectF@@MM@Z @ 13292 NONAME ; void QScroller::ensureVisible(class QRectF const &, float, float) + ?getText@QInputDialog@@SA?AVQString@@PAVQWidget@@ABV2@1W4EchoMode@QLineEdit@@1PA_NV?$QFlags@W4WindowType@Qt@@@@V?$QFlags@W4InputMethodHint@Qt@@@@@Z @ 13293 NONAME ; class QString QInputDialog::getText(class QWidget *, class QString const &, class QString const &, enum QLineEdit::EchoMode, class QString const &, bool *, class QFlags<enum Qt::WindowType>, class QFlags<enum Qt::InputMethodHint>) + ?hasWidthForHeight@QSizePolicy@@QBE_NXZ @ 13294 NONAME ; bool QSizePolicy::hasWidthForHeight(void) const + ?transformChanged@QBlitterPaintEngine@@UAEXXZ @ 13295 NONAME ; void QBlitterPaintEngine::transformChanged(void) + ??0QDragEnterEvent@@QAE@ABV0@@Z @ 13296 NONAME ABSENT ; QDragEnterEvent::QDragEnterEvent(class QDragEnterEvent const &) + ??0QBlittablePixmapData@@QAE@XZ @ 13297 NONAME ; QBlittablePixmapData::QBlittablePixmapData(void) + ??_EKey@QPixmapCache@@QAE@I@Z @ 13298 NONAME ABSENT ; QPixmapCache::Key::~Key(unsigned int) + ??_EQCursor@@QAE@I@Z @ 13299 NONAME ABSENT ; QCursor::~QCursor(unsigned int) + ?size@QBlittable@@QBE?AVQSize@@XZ @ 13300 NONAME ; class QSize QBlittable::size(void) const + ??0QShortcutEvent@@QAE@ABV0@@Z @ 13301 NONAME ABSENT ; QShortcutEvent::QShortcutEvent(class QShortcutEvent const &) + ?setBlittable@QBlittablePixmapData@@QAEXPAVQBlittable@@@Z @ 13302 NONAME ; void QBlittablePixmapData::setBlittable(class QBlittable *) + ?opacityChanged@QBlitterPaintEngine@@UAEXXZ @ 13303 NONAME ; void QBlitterPaintEngine::opacityChanged(void) + ?tr@QFlickGesture@@SA?AVQString@@PBD0H@Z @ 13304 NONAME ; class QString QFlickGesture::tr(char const *, char const *, int) + ??_EQTextCursor@@QAE@I@Z @ 13305 NONAME ABSENT ; QTextCursor::~QTextCursor(unsigned int) + ?createExplicitFontWithName@QFontEngine@@IBE?AVQFont@@ABVQString@@@Z @ 13306 NONAME ; class QFont QFontEngine::createExplicitFontWithName(class QString const &) const + ?setState@QBlitterPaintEngine@@UAEXPAVQPainterState@@@Z @ 13307 NONAME ; void QBlitterPaintEngine::setState(class QPainterState *) + ?clip@QBlitterPaintEngine@@UAEXABVQRegion@@W4ClipOperation@Qt@@@Z @ 13308 NONAME ; void QBlitterPaintEngine::clip(class QRegion const &, enum Qt::ClipOperation) + ?subPixelPositionForX@QTextureGlyphCache@@QBE?AUQFixed@@U2@@Z @ 13309 NONAME ; struct QFixed QTextureGlyphCache::subPixelPositionForX(struct QFixed) const + ?hasAlphaChannel@QBlittablePixmapData@@UBE_NXZ @ 13310 NONAME ; bool QBlittablePixmapData::hasAlphaChannel(void) const + ?setSnapPositionsX@QScroller@@QAEXABV?$QList@M@@@Z @ 13311 NONAME ; void QScroller::setSnapPositionsX(class QList<float> const &) + ?numberSuffix@QTextListFormat@@QBE?AVQString@@XZ @ 13312 NONAME ; class QString QTextListFormat::numberSuffix(void) const + ??HQGlyphs@@ABE?AV0@ABV0@@Z @ 13313 NONAME ; class QGlyphs QGlyphs::operator+(class QGlyphs const &) const + ??0QGradient@@QAE@ABV0@@Z @ 13314 NONAME ABSENT ; QGradient::QGradient(class QGradient const &) + ?tabsMovable@QMdiArea@@QBE_NXZ @ 13315 NONAME ; bool QMdiArea::tabsMovable(void) const + ??4QInputMethodEvent@@QAEAAV0@ABV0@@Z @ 13316 NONAME ABSENT ; class QInputMethodEvent & QInputMethodEvent::operator=(class QInputMethodEvent const &) + ?contentPos@QScrollPrepareEvent@@QBE?AVQPointF@@XZ @ 13317 NONAME ; class QPointF QScrollPrepareEvent::contentPos(void) const + ?getStaticMetaObject@QScroller@@SAABUQMetaObject@@XZ @ 13318 NONAME ; struct QMetaObject const & QScroller::getStaticMetaObject(void) + ?end@QBlitterPaintEngine@@UAE_NXZ @ 13319 NONAME ; bool QBlitterPaintEngine::end(void) + ??1QScrollerProperties@@UAE@XZ @ 13320 NONAME ; QScrollerProperties::~QScrollerProperties(void) + ??0QFlickGesture@@QAE@PAVQObject@@W4MouseButton@Qt@@0@Z @ 13321 NONAME ; QFlickGesture::QFlickGesture(class QObject *, enum Qt::MouseButton, class QObject *) + ?fill@QBlitterPaintEngine@@UAEXABVQVectorPath@@ABVQBrush@@@Z @ 13322 NONAME ; void QBlitterPaintEngine::fill(class QVectorPath const &, class QBrush const &) + ?drawPixmap@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQPixmap@@0@Z @ 13323 NONAME ; void QBlitterPaintEngine::drawPixmap(class QRectF const &, class QPixmap const &, class QRectF const &) + ??0QVector2D@@QAE@ABV0@@Z @ 13324 NONAME ABSENT ; QVector2D::QVector2D(class QVector2D const &) + ?setSnapPositionsY@QScroller@@QAEXABV?$QList@M@@@Z @ 13325 NONAME ; void QScroller::setSnapPositionsY(class QList<float> const &) + ??4QStyleOptionFocusRect@@QAEAAV0@ABV0@@Z @ 13326 NONAME ABSENT ; class QStyleOptionFocusRect & QStyleOptionFocusRect::operator=(class QStyleOptionFocusRect const &) + ??_EQPen@@QAE@I@Z @ 13327 NONAME ABSENT ; QPen::~QPen(unsigned int) + ??_EQKeySequence@@QAE@I@Z @ 13328 NONAME ABSENT ; QKeySequence::~QKeySequence(unsigned int) + ?tr@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13329 NONAME ; class QString QInternalMimeData::tr(char const *, char const *, int) + ?velocity@QScroller@@QBE?AVQPointF@@XZ @ 13330 NONAME ; class QPointF QScroller::velocity(void) const + ?glyphIndexes@QGlyphs@@QBE?AV?$QVector@I@@XZ @ 13331 NONAME ; class QVector<unsigned int> QGlyphs::glyphIndexes(void) const + ?get@QFontPrivate@@SAPAV1@ABVQFont@@@Z @ 13332 NONAME ; class QFontPrivate * QFontPrivate::get(class QFont const &) + ?setScrollMetric@QScrollerProperties@@QAEXW4ScrollMetric@1@ABVQVariant@@@Z @ 13333 NONAME ; void QScrollerProperties::setScrollMetric(enum QScrollerProperties::ScrollMetric, class QVariant const &) + ??4QGradient@@QAEAAV0@ABV0@@Z @ 13334 NONAME ABSENT ; class QGradient & QGradient::operator=(class QGradient const &) + ??0QScrollEvent@@QAE@ABVQPointF@@0W4ScrollState@0@@Z @ 13335 NONAME ; QScrollEvent::QScrollEvent(class QPointF const &, class QPointF const &, enum QScrollEvent::ScrollState) + ?d_func@QFlickGesture@@AAEPAVQFlickGesturePrivate@@XZ @ 13336 NONAME ; class QFlickGesturePrivate * QFlickGesture::d_func(void) + ?scrollState@QScrollEvent@@QBE?AW4ScrollState@1@XZ @ 13337 NONAME ; enum QScrollEvent::ScrollState QScrollEvent::scrollState(void) const + ??0QTextTableFormat@@QAE@ABV0@@Z @ 13338 NONAME ABSENT ; QTextTableFormat::QTextTableFormat(class QTextTableFormat const &) + ??_EQImagePixmapCleanupHooks@@QAE@I@Z @ 13339 NONAME ABSENT ; QImagePixmapCleanupHooks::~QImagePixmapCleanupHooks(unsigned int) + ?fetchMore@QAbstractProxyModel@@UAEXABVQModelIndex@@@Z @ 13340 NONAME ; void QAbstractProxyModel::fetchMore(class QModelIndex const &) + ?glyphs@QTextLine@@ABE?AV?$QList@VQGlyphs@@@@HH@Z @ 13341 NONAME ; class QList<class QGlyphs> QTextLine::glyphs(int, int) const + ?getStaticMetaObject@QFlickGesture@@SAABUQMetaObject@@XZ @ 13342 NONAME ; struct QMetaObject const & QFlickGesture::getStaticMetaObject(void) + ?setViewportSize@QScrollPrepareEvent@@QAEXABVQSizeF@@@Z @ 13343 NONAME ; void QScrollPrepareEvent::setViewportSize(class QSizeF const &) + ??0QStatusTipEvent@@QAE@ABV0@@Z @ 13344 NONAME ABSENT ; QStatusTipEvent::QStatusTipEvent(class QStatusTipEvent const &) + ??0Value@QCss@@QAE@ABU01@@Z @ 13345 NONAME ABSENT ; QCss::Value::Value(struct QCss::Value const &) + ?d_func@QScrollPrepareEvent@@AAEPAVQScrollPrepareEventPrivate@@XZ @ 13346 NONAME ; class QScrollPrepareEventPrivate * QScrollPrepareEvent::d_func(void) + ?overshootDistance@QScrollEvent@@QBE?AVQPointF@@XZ @ 13347 NONAME ; class QPointF QScrollEvent::overshootDistance(void) const + ?resolveFontFamilyAlias@QFontDatabase@@CA?AVQString@@ABV2@@Z @ 13348 NONAME ; class QString QFontDatabase::resolveFontFamilyAlias(class QString const &) + ?alphaRGBMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@HABVQTransform@@@Z @ 13349 NONAME ; class QImage QFontEngine::alphaRGBMapForGlyph(unsigned int, struct QFixed, int, class QTransform const &) + ??4QSizePolicy@@QAEAAV0@ABV0@@Z @ 13350 NONAME ABSENT ; class QSizePolicy & QSizePolicy::operator=(class QSizePolicy const &) + ?swap@QBitmap@@QAEXAAV1@@Z @ 13351 NONAME ; void QBitmap::swap(class QBitmap &) + ?hasFormat@QInternalMimeData@@UBE_NABVQString@@@Z @ 13352 NONAME ; bool QInternalMimeData::hasFormat(class QString const &) const + ?renderDataHelper@QInternalMimeData@@SA?AVQByteArray@@ABVQString@@PBVQMimeData@@@Z @ 13353 NONAME ; class QByteArray QInternalMimeData::renderDataHelper(class QString const &, class QMimeData const *) + ??_ETouchPoint@QTouchEvent@@QAE@I@Z @ 13354 NONAME ABSENT ; QTouchEvent::TouchPoint::~TouchPoint(unsigned int) + ??0QWindowSurface@@QAE@PAVQWidget@@_N@Z @ 13355 NONAME ; QWindowSurface::QWindowSurface(class QWidget *, bool) + ?fill@QBlittablePixmapData@@UAEXABVQColor@@@Z @ 13356 NONAME ; void QBlittablePixmapData::fill(class QColor const &) + ?metric@QBlittablePixmapData@@UBEHW4PaintDeviceMetric@QPaintDevice@@@Z @ 13357 NONAME ; int QBlittablePixmapData::metric(enum QPaintDevice::PaintDeviceMetric) const + ??4QItemSelection@@QAEAAV0@ABV0@@Z @ 13358 NONAME ABSENT ; class QItemSelection & QItemSelection::operator=(class QItemSelection const &) + ?fillRect@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQColor@@@Z @ 13359 NONAME ; void QBlitterPaintEngine::fillRect(class QRectF const &, class QColor const &) + ??4QStyleOptionQ3ListView@@QAEAAV0@ABV0@@Z @ 13360 NONAME ABSENT ; class QStyleOptionQ3ListView & QStyleOptionQ3ListView::operator=(class QStyleOptionQ3ListView const &) + ??6@YA?AVQDebug@@V0@PBVQSymbianEvent@@@Z @ 13361 NONAME ; class QDebug operator<<(class QDebug, class QSymbianEvent const *) + ??0QSizePolicy@@QAE@ABV0@@Z @ 13362 NONAME ABSENT ; QSizePolicy::QSizePolicy(class QSizePolicy const &) + ?ProcessCommandParametersL@QS60MainAppUi@@UAEHW4TApaCommand@@AAV?$TBuf@$0BAA@@@ABVTDesC8@@@Z @ 13363 NONAME ; int QS60MainAppUi::ProcessCommandParametersL(enum TApaCommand, class TBuf<256> &, class TDesC8 const &) + ?scrollerProperties@QScroller@@QBE?AVQScrollerProperties@@XZ @ 13364 NONAME ; class QScrollerProperties QScroller::scrollerProperties(void) const + ??_EQBlittablePixmapData@@UAE@I@Z @ 13365 NONAME ; QBlittablePixmapData::~QBlittablePixmapData(unsigned int) + ?mimeData@QAbstractProxyModel@@UBEPAVQMimeData@@ABV?$QList@VQModelIndex@@@@@Z @ 13366 NONAME ; class QMimeData * QAbstractProxyModel::mimeData(class QList<class QModelIndex> const &) const + ??4QStyleOptionFrameV2@@QAEAAV0@ABV0@@Z @ 13367 NONAME ABSENT ; class QStyleOptionFrameV2 & QStyleOptionFrameV2::operator=(class QStyleOptionFrameV2 const &) + ??_EQScroller@@UAE@I@Z @ 13368 NONAME ; QScroller::~QScroller(unsigned int) + ??1QScrollPrepareEvent@@UAE@XZ @ 13369 NONAME ; QScrollPrepareEvent::~QScrollPrepareEvent(void) + ??4QVector3D@@QAEAAV0@ABV0@@Z @ 13370 NONAME ABSENT ; class QVector3D & QVector3D::operator=(class QVector3D const &) + ?setTabsMovable@QMdiArea@@QAEX_N@Z @ 13371 NONAME ; void QMdiArea::setTabsMovable(bool) + ?minimumSizeHint@QRadioButton@@UBE?AVQSize@@XZ @ 13372 NONAME ; class QSize QRadioButton::minimumSizeHint(void) const + ??4QStyleOptionQ3DockWindow@@QAEAAV0@ABV0@@Z @ 13373 NONAME ABSENT ; class QStyleOptionQ3DockWindow & QStyleOptionQ3DockWindow::operator=(class QStyleOptionQ3DockWindow const &) + ?qt_metacast@QFlickGesture@@UAEPAXPBD@Z @ 13374 NONAME ; void * QFlickGesture::qt_metacast(char const *) + ??_EQFont@@QAE@I@Z @ 13375 NONAME ABSENT ; QFont::~QFont(unsigned int) + ?setPositions@QGlyphs@@QAEXABV?$QVector@VQPointF@@@@@Z @ 13376 NONAME ; void QGlyphs::setPositions(class QVector<class QPointF> const &) + ??4QStyleOptionDockWidget@@QAEAAV0@ABV0@@Z @ 13377 NONAME ABSENT ; class QStyleOptionDockWidget & QStyleOptionDockWidget::operator=(class QStyleOptionDockWidget const &) + ??0QPainterState@@QAE@ABV0@@Z @ 13378 NONAME ABSENT ; QPainterState::QPainterState(class QPainterState const &) + ??4QStyleOptionFrame@@QAEAAV0@ABV0@@Z @ 13379 NONAME ABSENT ; class QStyleOptionFrame & QStyleOptionFrame::operator=(class QStyleOptionFrame const &) + ?drawRects@QBlitterPaintEngine@@UAEXPBVQRect@@H@Z @ 13380 NONAME ; void QBlitterPaintEngine::drawRects(class QRect const *, int) + ?fillInPendingGlyphs@QTextureGlyphCache@@QAEXXZ @ 13381 NONAME ; void QTextureGlyphCache::fillInPendingGlyphs(void) + ?metaObject@QFlickGesture@@UBEPBUQMetaObject@@XZ @ 13382 NONAME ; struct QMetaObject const * QFlickGesture::metaObject(void) const + ?renderHintsChanged@QBlitterPaintEngine@@UAEXXZ @ 13383 NONAME ; void QBlitterPaintEngine::renderHintsChanged(void) + ?supportedDropActions@QAbstractProxyModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 13384 NONAME ; class QFlags<enum Qt::DropAction> QAbstractProxyModel::supportedDropActions(void) const + ?fillRect@QBlitterPaintEngine@@UAEXABVQRectF@@ABVQBrush@@@Z @ 13385 NONAME ; void QBlitterPaintEngine::fillRect(class QRectF const &, class QBrush const &) + ?setGlyphIndexes@QGlyphs@@QAEXABV?$QVector@I@@@Z @ 13386 NONAME ; void QGlyphs::setGlyphIndexes(class QVector<unsigned int> const &) + ?alphaMapBoundingBox@QFontEngine@@UAE?AUglyph_metrics_t@@IABVQTransform@@W4GlyphFormat@1@@Z @ 13387 NONAME ABSENT ; struct glyph_metrics_t QFontEngine::alphaMapBoundingBox(unsigned int, class QTransform const &, enum QFontEngine::GlyphFormat) + ?resendPrepareEvent@QScroller@@QAEXXZ @ 13388 NONAME ; void QScroller::resendPrepareEvent(void) + ??4QTextLength@@QAEAAV0@ABV0@@Z @ 13389 NONAME ABSENT ; class QTextLength & QTextLength::operator=(class QTextLength const &) + ??0QHelpEvent@@QAE@ABV0@@Z @ 13390 NONAME ABSENT ; QHelpEvent::QHelpEvent(class QHelpEvent const &) + ??0QContextMenuEvent@@QAE@ABV0@@Z @ 13391 NONAME ABSENT ; QContextMenuEvent::QContextMenuEvent(class QContextMenuEvent const &) + ?d_func@QBlittable@@ABEPBVQBlittablePrivate@@XZ @ 13392 NONAME ; class QBlittablePrivate const * QBlittable::d_func(void) const + ?state@QBlitterPaintEngine@@QBEPBVQPainterState@@XZ @ 13393 NONAME ; class QPainterState const * QBlitterPaintEngine::state(void) const + ??0QScrollPrepareEvent@@QAE@ABVQPointF@@@Z @ 13394 NONAME ; QScrollPrepareEvent::QScrollPrepareEvent(class QPointF const &) + ??0QWhatsThisClickedEvent@@QAE@ABV0@@Z @ 13395 NONAME ABSENT ; QWhatsThisClickedEvent::QWhatsThisClickedEvent(class QWhatsThisClickedEvent const &) + ??4QStyleOptionTab@@QAEAAV0@ABV0@@Z @ 13396 NONAME ABSENT ; class QStyleOptionTab & QStyleOptionTab::operator=(class QStyleOptionTab const &) + ??0QTabletEvent@@QAE@ABV0@@Z @ 13397 NONAME ABSENT ; QTabletEvent::QTabletEvent(class QTabletEvent const &) + ?scrollTo@QScroller@@QAEXABVQPointF@@H@Z @ 13398 NONAME ; void QScroller::scrollTo(class QPointF const &, int) + ?ungrabGesture@QScroller@@SAXPAVQObject@@@Z @ 13399 NONAME ; void QScroller::ungrabGesture(class QObject *) + ??4QItemSelectionRange@@QAEAAV0@ABV0@@Z @ 13400 NONAME ABSENT ; class QItemSelectionRange & QItemSelectionRange::operator=(class QItemSelectionRange const &) + ?clear@QGlyphs@@QAEXXZ @ 13401 NONAME ; void QGlyphs::clear(void) + ??_EQStyleOptionViewItemV4@@QAE@I@Z @ 13402 NONAME ABSENT ; QStyleOptionViewItemV4::~QStyleOptionViewItemV4(unsigned int) + ??1QBlittablePixmapData@@UAE@XZ @ 13403 NONAME ; QBlittablePixmapData::~QBlittablePixmapData(void) + ?formatsHelper@QInternalMimeData@@SA?AVQStringList@@PBVQMimeData@@@Z @ 13404 NONAME ; class QStringList QInternalMimeData::formatsHelper(class QMimeData const *) + ?qt_metacast@QInternalMimeData@@UAEPAXPBD@Z @ 13405 NONAME ; void * QInternalMimeData::qt_metacast(char const *) + ?font@QGlyphs@@QBE?AVQFont@@XZ @ 13406 NONAME ; class QFont QGlyphs::font(void) const + ?paintEngine@QBlittablePixmapData@@UBEPAVQPaintEngine@@XZ @ 13407 NONAME ; class QPaintEngine * QBlittablePixmapData::paintEngine(void) const + ?unsetDefaultScrollerProperties@QScrollerProperties@@SAXXZ @ 13408 NONAME ; void QScrollerProperties::unsetDefaultScrollerProperties(void) + ?hasChildren@QAbstractProxyModel@@UBE_NABVQModelIndex@@@Z @ 13409 NONAME ; bool QAbstractProxyModel::hasChildren(class QModelIndex const &) const + ?swap@QPen@@QAEXAAV1@@Z @ 13410 NONAME ; void QPen::swap(class QPen &) + ?span@QAbstractProxyModel@@UBE?AVQSize@@ABVQModelIndex@@@Z @ 13411 NONAME ; class QSize QAbstractProxyModel::span(class QModelIndex const &) const + ??4QEglProperties@@QAEAAV0@ABV0@@Z @ 13412 NONAME ABSENT ; class QEglProperties & QEglProperties::operator=(class QEglProperties const &) + ??0QHoverEvent@@QAE@ABV0@@Z @ 13413 NONAME ABSENT ; QHoverEvent::QHoverEvent(class QHoverEvent const &) + ??0QPaintEngineState@@QAE@XZ @ 13414 NONAME ABSENT ; QPaintEngineState::QPaintEngineState(void) + ?setSnapPositionsY@QScroller@@QAEXMM@Z @ 13415 NONAME ; void QScroller::setSnapPositionsY(float, float) + ?d_func@QScrollPrepareEvent@@ABEPBVQScrollPrepareEventPrivate@@XZ @ 13416 NONAME ; class QScrollPrepareEventPrivate const * QScrollPrepareEvent::d_func(void) const + ?textureMapForGlyph@QTextureGlyphCache@@QBE?AVQImage@@IUQFixed@@@Z @ 13417 NONAME ; class QImage QTextureGlyphCache::textureMapForGlyph(unsigned int, struct QFixed) const + ??0QKeyEvent@@QAE@ABV0@@Z @ 13418 NONAME ABSENT ; QKeyEvent::QKeyEvent(class QKeyEvent const &) + ??0QIconEngine@@QAE@ABV0@@Z @ 13419 NONAME ABSENT ; QIconEngine::QIconEngine(class QIconEngine const &) + ??4QStyleOptionToolBoxV2@@QAEAAV0@ABV0@@Z @ 13420 NONAME ABSENT ; class QStyleOptionToolBoxV2 & QStyleOptionToolBoxV2::operator=(class QStyleOptionToolBoxV2 const &) + ?qt_metacall@QInternalMimeData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13421 NONAME ; int QInternalMimeData::qt_metacall(enum QMetaObject::Call, int, void * *) + ?lineHeightType@QTextBlockFormat@@QBEHXZ @ 13422 NONAME ; int QTextBlockFormat::lineHeightType(void) const + ?hintingPreference@QFont@@QBE?AW4HintingPreference@1@XZ @ 13423 NONAME ; enum QFont::HintingPreference QFont::hintingPreference(void) const + ??0QGlyphs@@QAE@XZ @ 13424 NONAME ; QGlyphs::QGlyphs(void) + ?trUtf8@QInternalMimeData@@SA?AVQString@@PBD0H@Z @ 13425 NONAME ; class QString QInternalMimeData::trUtf8(char const *, char const *, int) + ??0QImageIOHandlerFactoryInterface@@QAE@XZ @ 13426 NONAME ABSENT ; QImageIOHandlerFactoryInterface::QImageIOHandlerFactoryInterface(void) + ??_EQRegion@@QAE@I@Z @ 13427 NONAME ABSENT ; QRegion::~QRegion(unsigned int) + ?begin@QBlitterPaintEngine@@UAE_NPAVQPaintDevice@@@Z @ 13428 NONAME ; bool QBlitterPaintEngine::begin(class QPaintDevice *) + ?inFontUcs4@QFontMetricsF@@QBE_NI@Z @ 13429 NONAME ; bool QFontMetricsF::inFontUcs4(unsigned int) const + ?viewportSize@QScrollPrepareEvent@@QBE?AVQSizeF@@XZ @ 13430 NONAME ; class QSizeF QScrollPrepareEvent::viewportSize(void) const + ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQRectF@@@Z @ 13431 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRectF const &) + ?d_func@QBlitterPaintEngine@@AAEPAVQBlitterPaintEnginePrivate@@XZ @ 13432 NONAME ; class QBlitterPaintEnginePrivate * QBlitterPaintEngine::d_func(void) + ?setNumberPrefix@QTextListFormat@@QAEXABVQString@@@Z @ 13433 NONAME ; void QTextListFormat::setNumberPrefix(class QString const &) + ?lineHeight@QTextBlockFormat@@QBEMMM@Z @ 13434 NONAME ; float QTextBlockFormat::lineHeight(float, float) const + ??4QStyleOptionComplex@@QAEAAV0@ABV0@@Z @ 13435 NONAME ABSENT ; class QStyleOptionComplex & QStyleOptionComplex::operator=(class QStyleOptionComplex const &) + ?getItem@QInputDialog@@SA?AVQString@@PAVQWidget@@ABV2@1ABVQStringList@@H_NPA_NV?$QFlags@W4WindowType@Qt@@@@V?$QFlags@W4InputMethodHint@Qt@@@@@Z @ 13436 NONAME ; class QString QInputDialog::getItem(class QWidget *, class QString const &, class QString const &, class QStringList const &, int, bool, bool *, class QFlags<enum Qt::WindowType>, class QFlags<enum Qt::InputMethodHint>) + ??_EFileInfo@QZipReader@@QAE@I@Z @ 13437 NONAME ABSENT ; QZipReader::FileInfo::~FileInfo(unsigned int) + ?hasFeature@QWindowSurface@@QBE_NW4WindowSurfaceFeature@1@@Z @ 13438 NONAME ; bool QWindowSurface::hasFeature(enum QWindowSurface::WindowSurfaceFeature) const + ?qGamma_correct_back_to_linear_cs@@YAXPAVQImage@@@Z @ 13439 NONAME ; void qGamma_correct_back_to_linear_cs(class QImage *) + ??0QBitmap@@QAE@ABV0@@Z @ 13440 NONAME ABSENT ; QBitmap::QBitmap(class QBitmap const &) + ?clip@QBlitterPaintEngine@@UAEXABVQVectorPath@@W4ClipOperation@Qt@@@Z @ 13441 NONAME ; void QBlitterPaintEngine::clip(class QVectorPath const &, enum Qt::ClipOperation) + ??1QScrollEvent@@UAE@XZ @ 13442 NONAME ; QScrollEvent::~QScrollEvent(void) + ?state@QScroller@@QBE?AW4State@1@XZ @ 13443 NONAME ; enum QScroller::State QScroller::state(void) const + ?positions@QGlyphs@@QBE?AV?$QVector@VQPointF@@@@XZ @ 13444 NONAME ; class QVector<class QPointF> QGlyphs::positions(void) const + ?tr@QScroller@@SA?AVQString@@PBD0@Z @ 13445 NONAME ; class QString QScroller::tr(char const *, char const *) + ?canReadData@QInternalMimeData@@SA_NABVQString@@@Z @ 13446 NONAME ; bool QInternalMimeData::canReadData(class QString const &) + ?glyphs@QTextLayout@@QBE?AV?$QList@VQGlyphs@@@@XZ @ 13447 NONAME ; class QList<class QGlyphs> QTextLayout::glyphs(void) const + ?leadingSpaceWidth@QTextEngine@@QAE?AUQFixed@@ABUQScriptLine@@@Z @ 13448 NONAME ; struct QFixed QTextEngine::leadingSpaceWidth(struct QScriptLine const &) + ??_EQTextFormat@@QAE@I@Z @ 13449 NONAME ABSENT ; QTextFormat::~QTextFormat(unsigned int) + ??4QStyleOptionTabWidgetFrame@@QAEAAV0@ABV0@@Z @ 13450 NONAME ABSENT ; class QStyleOptionTabWidgetFrame & QStyleOptionTabWidgetFrame::operator=(class QStyleOptionTabWidgetFrame const &) + ?trUtf8@QScroller@@SA?AVQString@@PBD0H@Z @ 13451 NONAME ; class QString QScroller::trUtf8(char const *, char const *, int) + ?d_func@QFlickGesture@@ABEPBVQFlickGesturePrivate@@XZ @ 13452 NONAME ; class QFlickGesturePrivate const * QFlickGesture::d_func(void) const + ??4QMouseEvent@@QAEAAV0@ABV0@@Z @ 13453 NONAME ABSENT ; class QMouseEvent & QMouseEvent::operator=(class QMouseEvent const &) + ??_EQPainter@@QAE@I@Z @ 13454 NONAME ABSENT ; QPainter::~QPainter(unsigned int) + ??4QStyleOptionTabBarBaseV2@@QAEAAV0@ABV0@@Z @ 13455 NONAME ABSENT ; class QStyleOptionTabBarBaseV2 & QStyleOptionTabBarBaseV2::operator=(class QStyleOptionTabBarBaseV2 const &) + ??4QInputEvent@@QAEAAV0@ABV0@@Z @ 13456 NONAME ABSENT ; class QInputEvent & QInputEvent::operator=(class QInputEvent const &) + ?hasScroller@QScroller@@SA_NPAVQObject@@@Z @ 13457 NONAME ; bool QScroller::hasScroller(class QObject *) + ?alphaMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@ABVQTransform@@@Z @ 13458 NONAME ; class QImage QFontEngine::alphaMapForGlyph(unsigned int, struct QFixed, class QTransform const &) + ??_EQPainterPath@@QAE@I@Z @ 13459 NONAME ABSENT ; QPainterPath::~QPainterPath(unsigned int) + ??_EQGlyphs@@QAE@I@Z @ 13460 NONAME ABSENT ; QGlyphs::~QGlyphs(unsigned int) + ?fromImage@QBlittablePixmapData@@UAEXABVQImage@@V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 13461 NONAME ; void QBlittablePixmapData::fromImage(class QImage const &, class QFlags<enum Qt::ImageConversionFlag>) + ??0QInternalMimeData@@QAE@XZ @ 13462 NONAME ; QInternalMimeData::QInternalMimeData(void) + ??_EQScrollEvent@@UAE@I@Z @ 13463 NONAME ; QScrollEvent::~QScrollEvent(unsigned int) + ?features@QRasterWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13464 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QRasterWindowSurface::features(void) const + ??4QGlyphs@@QAEAAV0@ABV0@@Z @ 13465 NONAME ; class QGlyphs & QGlyphs::operator=(class QGlyphs const &) + ??4QQuaternion@@QAEAAV0@ABV0@@Z @ 13466 NONAME ABSENT ; class QQuaternion & QQuaternion::operator=(class QQuaternion const &) + ??4Symbol@QCss@@QAEAAU01@ABU01@@Z @ 13467 NONAME ABSENT ; struct QCss::Symbol & QCss::Symbol::operator=(struct QCss::Symbol const &) + ??0QBlittable@@QAE@ABVQSize@@V?$QFlags@W4Capability@QBlittable@@@@@Z @ 13468 NONAME ; QBlittable::QBlittable(class QSize const &, class QFlags<enum QBlittable::Capability>) + ??0QIconDragEvent@@QAE@ABV0@@Z @ 13469 NONAME ABSENT ; QIconDragEvent::QIconDragEvent(class QIconDragEvent const &) + ?scroller@QScroller@@SAPAV1@PAVQObject@@@Z @ 13470 NONAME ; class QScroller * QScroller::scroller(class QObject *) + ??4QScrollerProperties@@QAEAAV0@ABV0@@Z @ 13471 NONAME ; class QScrollerProperties & QScrollerProperties::operator=(class QScrollerProperties const &) + ?d_func@QScroller@@AAEPAVQScrollerPrivate@@XZ @ 13472 NONAME ; class QScrollerPrivate * QScroller::d_func(void) + ?scrollerPropertiesChanged@QScroller@@IAEXABVQScrollerProperties@@@Z @ 13473 NONAME ; void QScroller::scrollerPropertiesChanged(class QScrollerProperties const &) + ?markRasterOverlay@QBlittablePixmapData@@QAEXPBVQRect@@H@Z @ 13474 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QRect const *, int) + ?tabsClosable@QMdiArea@@QBE_NXZ @ 13475 NONAME ; bool QMdiArea::tabsClosable(void) const + ?canStartScrollingAt@QAbstractScrollAreaPrivate@@QAE_NABVQPoint@@@Z @ 13476 NONAME ; bool QAbstractScrollAreaPrivate::canStartScrollingAt(class QPoint const &) + ??0QScrollerProperties@@QAE@XZ @ 13477 NONAME ; QScrollerProperties::QScrollerProperties(void) + ?setLineHeight@QTextBlockFormat@@QAEXMH@Z @ 13478 NONAME ; void QTextBlockFormat::setLineHeight(float, int) + ?calculateSubPixelPositionCount@QTextureGlyphCache@@IBEHI@Z @ 13479 NONAME ; int QTextureGlyphCache::calculateSubPixelPositionCount(unsigned int) const + ??0QTextImageFormat@@QAE@ABV0@@Z @ 13480 NONAME ABSENT ; QTextImageFormat::QTextImageFormat(class QTextImageFormat const &) + ??0QMoveEvent@@QAE@ABV0@@Z @ 13481 NONAME ABSENT ; QMoveEvent::QMoveEvent(class QMoveEvent const &) + ?glyphs@QTextFragment@@QBE?AV?$QList@VQGlyphs@@@@XZ @ 13482 NONAME ; class QList<class QGlyphs> QTextFragment::glyphs(void) const + ??0QInputContextFactoryInterface@@QAE@XZ @ 13483 NONAME ABSENT ; QInputContextFactoryInterface::QInputContextFactoryInterface(void) + ??0QTextFrameFormat@@QAE@ABV0@@Z @ 13484 NONAME ABSENT ; QTextFrameFormat::QTextFrameFormat(class QTextFrameFormat const &) + ?resetInternalData@QAbstractProxyModel@@IAEXXZ @ 13485 NONAME ; void QAbstractProxyModel::resetInternalData(void) + ??0Symbol@QCss@@QAE@ABU01@@Z @ 13486 NONAME ABSENT ; QCss::Symbol::Symbol(struct QCss::Symbol const &) + ?features@QWindowSurface@@UBE?AV?$QFlags@W4WindowSurfaceFeature@QWindowSurface@@@@XZ @ 13487 NONAME ; class QFlags<enum QWindowSurface::WindowSurfaceFeature> QWindowSurface::features(void) const + ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQVectorPath@@@Z @ 13488 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QVectorPath const &) + ??4QStyleOptionFrameV3@@QAEAAV0@ABV0@@Z @ 13489 NONAME ABSENT ; class QStyleOptionFrameV3 & QStyleOptionFrameV3::operator=(class QStyleOptionFrameV3 const &) + ?scrollTo@QScroller@@QAEXABVQPointF@@@Z @ 13490 NONAME ; void QScroller::scrollTo(class QPointF const &) + ??0QGraphicsSystem@@QAE@XZ @ 13491 NONAME ABSENT ; QGraphicsSystem::QGraphicsSystem(void) + ??4QStyleOptionViewItem@@QAEAAV0@ABV0@@Z @ 13492 NONAME ABSENT ; class QStyleOptionViewItem & QStyleOptionViewItem::operator=(class QStyleOptionViewItem const &) + ??4QStyleOptionProgressBar@@QAEAAV0@ABV0@@Z @ 13493 NONAME ABSENT ; class QStyleOptionProgressBar & QStyleOptionProgressBar::operator=(class QStyleOptionProgressBar const &) + ?clip@QBlitterPaintEngine@@QAEPBVQClipData@@XZ @ 13494 NONAME ; class QClipData const * QBlitterPaintEngine::clip(void) + ?d_func@QScroller@@ABEPBVQScrollerPrivate@@XZ @ 13495 NONAME ; class QScrollerPrivate const * QScroller::d_func(void) const + ?setNumberSuffix@QTextListFormat@@QAEXABVQString@@@Z @ 13496 NONAME ; void QTextListFormat::setNumberSuffix(class QString const &) + ?swap@QPicture@@QAEXAAV1@@Z @ 13497 NONAME ; void QPicture::swap(class QPicture &) + ?swap@QPainterPath@@QAEXAAV1@@Z @ 13498 NONAME ; void QPainterPath::swap(class QPainterPath &) + ??4QStyleOptionRubberBand@@QAEAAV0@ABV0@@Z @ 13499 NONAME ABSENT ; class QStyleOptionRubberBand & QStyleOptionRubberBand::operator=(class QStyleOptionRubberBand const &) + ?minimumSizeHint@QCheckBox@@UBE?AVQSize@@XZ @ 13500 NONAME ; class QSize QCheckBox::minimumSizeHint(void) const + ?createExplicitFont@QFontEngine@@UBE?AVQFont@@XZ @ 13501 NONAME ; class QFont QFontEngine::createExplicitFont(void) const + ?alphaMapForGlyph@QFontEngine@@UAE?AVQImage@@IUQFixed@@@Z @ 13502 NONAME ; class QImage QFontEngine::alphaMapForGlyph(unsigned int, struct QFixed) + ?fillTexture@QImageTextureGlyphCache@@UAEXABUCoord@QTextureGlyphCache@@IUQFixed@@@Z @ 13503 NONAME ; void QImageTextureGlyphCache::fillTexture(struct QTextureGlyphCache::Coord const &, unsigned int, struct QFixed) + ?swap@QIcon@@QAEXAAV1@@Z @ 13504 NONAME ; void QIcon::swap(class QIcon &) + ?unmarkRasterOverlay@QBlittablePixmapData@@QAEXABVQRectF@@@Z @ 13505 NONAME ; void QBlittablePixmapData::unmarkRasterOverlay(class QRectF const &) + ??0QDragResponseEvent@@QAE@ABV0@@Z @ 13506 NONAME ABSENT ; QDragResponseEvent::QDragResponseEvent(class QDragResponseEvent const &) + ??0QIconEngine@@QAE@XZ @ 13507 NONAME ABSENT ; QIconEngine::QIconEngine(void) + ?brushOriginChanged@QBlitterPaintEngine@@UAEXXZ @ 13508 NONAME ; void QBlitterPaintEngine::brushOriginChanged(void) + ?openFile@QFileOpenEvent@@QBE_NAAVQFile@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13509 NONAME ; bool QFileOpenEvent::openFile(class QFile &, class QFlags<enum QIODevice::OpenModeFlag>) const + ??_EQBrush@@QAE@I@Z @ 13510 NONAME ABSENT ; QBrush::~QBrush(unsigned int) + ??0QApplicationPrivate@@QAE@AAHPAPADW4Type@QApplication@@H@Z @ 13511 NONAME ; QApplicationPrivate::QApplicationPrivate(int &, char * *, enum QApplication::Type, int) + ?handleInput@QScroller@@QAE_NW4Input@1@ABVQPointF@@_J@Z @ 13512 NONAME ; bool QScroller::handleInput(enum QScroller::Input, class QPointF const &, long long) + ??8QScrollerProperties@@QBE_NABV0@@Z @ 13513 NONAME ; bool QScrollerProperties::operator==(class QScrollerProperties const &) const + ?inFontUcs4@QFontMetrics@@QBE_NI@Z @ 13514 NONAME ; bool QFontMetrics::inFontUcs4(unsigned int) const + ??_EQTableWidgetSelectionRange@@QAE@I@Z @ 13515 NONAME ABSENT ; QTableWidgetSelectionRange::~QTableWidgetSelectionRange(unsigned int) + ??4QStyleOptionTabBarBase@@QAEAAV0@ABV0@@Z @ 13516 NONAME ABSENT ; class QStyleOptionTabBarBase & QStyleOptionTabBarBase::operator=(class QStyleOptionTabBarBase const &) + ??0QTextObjectInterface@@QAE@XZ @ 13517 NONAME ABSENT ; QTextObjectInterface::QTextObjectInterface(void) + ?unlock@QBlittable@@QAEXXZ @ 13518 NONAME ; void QBlittable::unlock(void) + ?metaObject@QScroller@@UBEPBUQMetaObject@@XZ @ 13519 NONAME ; struct QMetaObject const * QScroller::metaObject(void) const + ?d_func@QScrollEvent@@ABEPBVQScrollEventPrivate@@XZ @ 13520 NONAME ; class QScrollEventPrivate const * QScrollEvent::d_func(void) const + ?swap@QRegion@@QAEXAAV1@@Z @ 13521 NONAME ; void QRegion::swap(class QRegion &) + ??0QHideEvent@@QAE@ABV0@@Z @ 13522 NONAME ABSENT ; QHideEvent::QHideEvent(class QHideEvent const &) + ?ensureVisible@QScroller@@QAEXABVQRectF@@MMH@Z @ 13523 NONAME ; void QScroller::ensureVisible(class QRectF const &, float, float, int) + ?qt_metacall@QFlickGesture@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13524 NONAME ; int QFlickGesture::qt_metacall(enum QMetaObject::Call, int, void * *) + ?setItemData@QAbstractProxyModel@@UAE_NABVQModelIndex@@ABV?$QMap@HVQVariant@@@@@Z @ 13525 NONAME ; bool QAbstractProxyModel::setItemData(class QModelIndex const &, class QMap<int, class QVariant> const &) + ?getStaticMetaObject@QInternalMimeData@@SAABUQMetaObject@@XZ @ 13526 NONAME ; struct QMetaObject const & QInternalMimeData::getStaticMetaObject(void) + ?swap@QPolygonF@@QAEXAAV1@@Z @ 13527 NONAME ; void QPolygonF::swap(class QPolygonF &) + ?swap@QPolygon@@QAEXAAV1@@Z @ 13528 NONAME ; void QPolygon::swap(class QPolygon &) + ??_EQScrollPrepareEvent@@UAE@I@Z @ 13529 NONAME ; QScrollPrepareEvent::~QScrollPrepareEvent(unsigned int) + ?d_func@QBlitterPaintEngine@@ABEPBVQBlitterPaintEnginePrivate@@XZ @ 13530 NONAME ; class QBlitterPaintEnginePrivate const * QBlitterPaintEngine::d_func(void) const + ?pixelPerMeter@QScroller@@QBE?AVQPointF@@XZ @ 13531 NONAME ; class QPointF QScroller::pixelPerMeter(void) const + ?target@QScroller@@QBEPAVQObject@@XZ @ 13532 NONAME ; class QObject * QScroller::target(void) const + ?swap@QKeySequence@@QAEXAAV1@@Z @ 13533 NONAME ; void QKeySequence::swap(class QKeySequence &) + ??1QGlyphs@@QAE@XZ @ 13534 NONAME ; QGlyphs::~QGlyphs(void) + ?lineHeight@QTextBlockFormat@@QBEMXZ @ 13535 NONAME ; float QTextBlockFormat::lineHeight(void) const + ?stroke@QBlitterPaintEngine@@UAEXABVQVectorPath@@ABVQPen@@@Z @ 13536 NONAME ; void QBlitterPaintEngine::stroke(class QVectorPath const &, class QPen const &) + ?tr@QInternalMimeData@@SA?AVQString@@PBD0@Z @ 13537 NONAME ; class QString QInternalMimeData::tr(char const *, char const *) + ??9QGlyphs@@QBE_NABV0@@Z @ 13538 NONAME ; bool QGlyphs::operator!=(class QGlyphs const &) const + ??1QBlittable@@UAE@XZ @ 13539 NONAME ; QBlittable::~QBlittable(void) + ??_EQBlitterPaintEngine@@UAE@I@Z @ 13540 NONAME ; QBlitterPaintEngine::~QBlitterPaintEngine(unsigned int) + ??0QCloseEvent@@QAE@ABV0@@Z @ 13541 NONAME ABSENT ; QCloseEvent::QCloseEvent(class QCloseEvent const &) + ?grabbedGesture@QScroller@@SA?AW4GestureType@Qt@@PAVQObject@@@Z @ 13542 NONAME ; enum Qt::GestureType QScroller::grabbedGesture(class QObject *) + ?buffer@QBlittablePixmapData@@UAEPAVQImage@@XZ @ 13543 NONAME ; class QImage * QBlittablePixmapData::buffer(void) + ??0QTextFrameLayoutData@@QAE@XZ @ 13544 NONAME ABSENT ; QTextFrameLayoutData::QTextFrameLayoutData(void) + ?staticMetaObject@QFlickGesture@@2UQMetaObject@@B @ 13545 NONAME ; struct QMetaObject const QFlickGesture::staticMetaObject + ?finalPosition@QScroller@@QBE?AVQPointF@@XZ @ 13546 NONAME ; class QPointF QScroller::finalPosition(void) const + ??4QStyleOptionTabWidgetFrameV2@@QAEAAV0@ABV0@@Z @ 13547 NONAME ABSENT ; class QStyleOptionTabWidgetFrameV2 & QStyleOptionTabWidgetFrameV2::operator=(class QStyleOptionTabWidgetFrameV2 const &) + ?drawStaticTextItem@QBlitterPaintEngine@@UAEXPAVQStaticTextItem@@@Z @ 13548 NONAME ; void QBlitterPaintEngine::drawStaticTextItem(class QStaticTextItem *) + ??0QGlyphs@@QAE@ABV0@@Z @ 13549 NONAME ; QGlyphs::QGlyphs(class QGlyphs const &) + ?lock@QBlittable@@QAEPAVQImage@@XZ @ 13550 NONAME ; class QImage * QBlittable::lock(void) + ?setFontHintingPreference@QTextCharFormat@@QAEXW4HintingPreference@QFont@@@Z @ 13551 NONAME ; void QTextCharFormat::setFontHintingPreference(enum QFont::HintingPreference) + ??4QStyleOptionTabV2@@QAEAAV0@ABV0@@Z @ 13552 NONAME ABSENT ; class QStyleOptionTabV2 & QStyleOptionTabV2::operator=(class QStyleOptionTabV2 const &) + ??_EQInternalMimeData@@UAE@I@Z @ 13553 NONAME ; QInternalMimeData::~QInternalMimeData(unsigned int) + ??4QTextListFormat@@QAEAAV0@ABV0@@Z @ 13554 NONAME ABSENT ; class QTextListFormat & QTextListFormat::operator=(class QTextListFormat const &) + ??_EQPalette@@QAE@I@Z @ 13555 NONAME ABSENT ; QPalette::~QPalette(unsigned int) + ??0QFocusEvent@@QAE@ABV0@@Z @ 13556 NONAME ABSENT ; QFocusEvent::QFocusEvent(class QFocusEvent const &) + ??4QStyleOptionQ3ListViewItem@@QAEAAV0@ABV0@@Z @ 13557 NONAME ABSENT ; class QStyleOptionQ3ListViewItem & QStyleOptionQ3ListViewItem::operator=(class QStyleOptionQ3ListViewItem const &) + ?markRasterOverlay@QBlittablePixmapData@@QAEXABVQPointF@@ABVQTextItem@@@Z @ 13558 NONAME ; void QBlittablePixmapData::markRasterOverlay(class QPointF const &, class QTextItem const &) + ?trUtf8@QScroller@@SA?AVQString@@PBD0@Z @ 13559 NONAME ; class QString QScroller::trUtf8(char const *, char const *) + ??_EQIcon@@QAE@I@Z @ 13560 NONAME ABSENT ; QIcon::~QIcon(unsigned int) + ??YQGlyphs@@AAEAAV0@ABV0@@Z @ 13561 NONAME ; class QGlyphs & QGlyphs::operator+=(class QGlyphs const &) + ??9QScrollerProperties@@QBE_NABV0@@Z @ 13562 NONAME ; bool QScrollerProperties::operator!=(class QScrollerProperties const &) const + ??0QTextListFormat@@QAE@ABV0@@Z @ 13563 NONAME ABSENT ; QTextListFormat::QTextListFormat(class QTextListFormat const &) + ?drawEllipse@QBlitterPaintEngine@@UAEXABVQRectF@@@Z @ 13564 NONAME ; void QBlitterPaintEngine::drawEllipse(class QRectF const &) + ??0QGuiPlatformPluginInterface@@QAE@XZ @ 13565 NONAME ABSENT ; QGuiPlatformPluginInterface::QGuiPlatformPluginInterface(void) + ??_EQTextLayout@@QAE@I@Z @ 13566 NONAME ABSENT ; QTextLayout::~QTextLayout(unsigned int) + ??0QWheelEvent@@QAE@ABV0@@Z @ 13567 NONAME ABSENT ; QWheelEvent::QWheelEvent(class QWheelEvent const &) + ?blittable@QBlittablePixmapData@@QBEPAVQBlittable@@XZ @ 13568 NONAME ; class QBlittable * QBlittablePixmapData::blittable(void) const + ?resizeCache@QTextureGlyphCache@@QAEXHH@Z @ 13569 NONAME ; void QTextureGlyphCache::resizeCache(int, int) + ??0QScrollerProperties@@QAE@ABV0@@Z @ 13570 NONAME ; QScrollerProperties::QScrollerProperties(class QScrollerProperties const &) + ??0QWindowStateChangeEvent@@QAE@ABV0@@Z @ 13571 NONAME ABSENT ; QWindowStateChangeEvent::QWindowStateChangeEvent(class QWindowStateChangeEvent const &) + ?metaObject@QInternalMimeData@@UBEPBUQMetaObject@@XZ @ 13572 NONAME ; struct QMetaObject const * QInternalMimeData::metaObject(void) const + ?setContentPos@QScrollPrepareEvent@@QAEXABVQPointF@@@Z @ 13573 NONAME ; void QScrollPrepareEvent::setContentPos(class QPointF const &) + ??_EQTextEngine@@QAE@I@Z @ 13574 NONAME ABSENT ; QTextEngine::~QTextEngine(unsigned int) + ??4QStyleOptionTitleBar@@QAEAAV0@ABV0@@Z @ 13575 NONAME ABSENT ; class QStyleOptionTitleBar & QStyleOptionTitleBar::operator=(class QStyleOptionTitleBar const &) + ??4Value@QCss@@QAEAAU01@ABU01@@Z @ 13576 NONAME ABSENT ; struct QCss::Value & QCss::Value::operator=(struct QCss::Value const &) + ?staticMetaObject@QScroller@@2UQMetaObject@@B @ 13577 NONAME ; struct QMetaObject const QScroller::staticMetaObject + ?hasFormatHelper@QInternalMimeData@@SA_NABVQString@@PBVQMimeData@@@Z @ 13578 NONAME ; bool QInternalMimeData::hasFormatHelper(class QString const &, class QMimeData const *) + ?state@QBlitterPaintEngine@@QAEPAVQPainterState@@XZ @ 13579 NONAME ; class QPainterState * QBlitterPaintEngine::state(void) + ?penChanged@QBlitterPaintEngine@@UAEXXZ @ 13580 NONAME ; void QBlitterPaintEngine::penChanged(void) + ??0QFileOpenEvent@@QAE@ABVRFile@@@Z @ 13581 NONAME ; QFileOpenEvent::QFileOpenEvent(class RFile const &) + ?hasHeightForWidth@QWidgetPrivate@@UBE_NXZ @ 13582 NONAME ; bool QWidgetPrivate::hasHeightForWidth(void) const + ??0QDragLeaveEvent@@QAE@ABV0@@Z @ 13583 NONAME ABSENT ; QDragLeaveEvent::QDragLeaveEvent(class QDragLeaveEvent const &) + ?toImage@QBlittablePixmapData@@UBE?AVQImage@@XZ @ 13584 NONAME ; class QImage QBlittablePixmapData::toImage(void) const + ??_EQBlittable@@UAE@I@Z @ 13585 NONAME ; QBlittable::~QBlittable(unsigned int) + ??4QBitmap@@QAEAAV0@ABV0@@Z @ 13586 NONAME ABSENT ; class QBitmap & QBitmap::operator=(class QBitmap const &) + ??1QInternalMimeData@@UAE@XZ @ 13587 NONAME ; QInternalMimeData::~QInternalMimeData(void) + ??0QItemSelection@@QAE@ABV0@@Z @ 13588 NONAME ABSENT ; QItemSelection::QItemSelection(class QItemSelection const &) + ?qt_addBitmapToPath@@YAXMMPBEHHHPAVQPainterPath@@@Z @ 13589 NONAME ; void qt_addBitmapToPath(float, float, unsigned char const *, int, int, int, class QPainterPath *) + ?staticMetaObject@QInternalMimeData@@2UQMetaObject@@B @ 13590 NONAME ; struct QMetaObject const QInternalMimeData::staticMetaObject + ?activeScrollers@QScroller@@SA?AV?$QList@PAVQScroller@@@@XZ @ 13591 NONAME ; class QList<class QScroller *> QScroller::activeScrollers(void) + ?drawGlyphs@QPainter@@QAEXABVQPointF@@ABVQGlyphs@@@Z @ 13592 NONAME ; void QPainter::drawGlyphs(class QPointF const &, class QGlyphs const &) + ??4QTextFrameFormat@@QAEAAV0@ABV0@@Z @ 13593 NONAME ABSENT ; class QTextFrameFormat & QTextFrameFormat::operator=(class QTextFrameFormat const &) + ?staticMetaObjectExtraData@QStylePlugin@@0UQMetaObjectExtraData@@B @ 13594 NONAME ; struct QMetaObjectExtraData const QStylePlugin::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QToolBar@@0UQMetaObjectExtraData@@B @ 13595 NONAME ; struct QMetaObjectExtraData const QToolBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTableView@@0UQMetaObjectExtraData@@B @ 13596 NONAME ; struct QMetaObjectExtraData const QTableView::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QValidator@@0UQMetaObjectExtraData@@B @ 13597 NONAME ; struct QMetaObjectExtraData const QValidator::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPaintBufferSignalProxy@@0UQMetaObjectExtraData@@B @ 13598 NONAME ; struct QMetaObjectExtraData const QPaintBufferSignalProxy::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QSplashScreen@@0UQMetaObjectExtraData@@B @ 13599 NONAME ; struct QMetaObjectExtraData const QSplashScreen::staticMetaObjectExtraData + ?qt_static_metacall@QDockWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13600 NONAME ; void QDockWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QVBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13601 NONAME ; void QVBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QCommonStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13602 NONAME ; void QCommonStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QMenuBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13603 NONAME ; void QMenuBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsObject@@0UQMetaObjectExtraData@@B @ 13604 NONAME ; struct QMetaObjectExtraData const QGraphicsObject::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QSplitter@@0UQMetaObjectExtraData@@B @ 13605 NONAME ; struct QMetaObjectExtraData const QSplitter::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QUndoStack@@0UQMetaObjectExtraData@@B @ 13606 NONAME ; struct QMetaObjectExtraData const QUndoStack::staticMetaObjectExtraData + ?qt_static_metacall@QPaintBufferResource@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13607 NONAME ; void QPaintBufferResource::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QSound@@0UQMetaObjectExtraData@@B @ 13608 NONAME ; struct QMetaObjectExtraData const QSound::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QSwipeGesture@@0UQMetaObjectExtraData@@B @ 13609 NONAME ; struct QMetaObjectExtraData const QSwipeGesture::staticMetaObjectExtraData + ?qt_static_metacall@QSizeGrip@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13610 NONAME ; void QSizeGrip::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QSlider@@0UQMetaObjectExtraData@@B @ 13611 NONAME ; struct QMetaObjectExtraData const QSlider::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QAbstractItemView@@0UQMetaObjectExtraData@@B @ 13612 NONAME ; struct QMetaObjectExtraData const QAbstractItemView::staticMetaObjectExtraData + ?setCompressionPolicy@QZipWriter@@QAEXW4CompressionPolicy@1@@Z @ 13613 NONAME ; void QZipWriter::setCompressionPolicy(enum QZipWriter::CompressionPolicy) + ?staticMetaObjectExtraData@QPlainTextEdit@@0UQMetaObjectExtraData@@B @ 13614 NONAME ; struct QMetaObjectExtraData const QPlainTextEdit::staticMetaObjectExtraData + ?addFile@QZipWriter@@QAEXABVQString@@PAVQIODevice@@@Z @ 13615 NONAME ; void QZipWriter::addFile(class QString const &, class QIODevice *) + ?staticMetaObjectExtraData@QDateEdit@@0UQMetaObjectExtraData@@B @ 13616 NONAME ; struct QMetaObjectExtraData const QDateEdit::staticMetaObjectExtraData + ?qt_static_metacall@QGuiPlatformPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13617 NONAME ; void QGuiPlatformPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFlickGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13618 NONAME ; void QFlickGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QStyledItemDelegate@@0UQMetaObjectExtraData@@B @ 13619 NONAME ; struct QMetaObjectExtraData const QStyledItemDelegate::staticMetaObjectExtraData + ?qt_static_metacall@QWizard@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13620 NONAME ; void QWizard::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTextControl@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13621 NONAME ; void QTextControl::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsRotation@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13622 NONAME ; void QGraphicsRotation::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractProxyModel@@0UQMetaObjectExtraData@@B @ 13623 NONAME ; struct QMetaObjectExtraData const QAbstractProxyModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDialog@@0UQMetaObjectExtraData@@B @ 13624 NONAME ; struct QMetaObjectExtraData const QDialog::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPixmapDropShadowFilter@@0UQMetaObjectExtraData@@B @ 13625 NONAME ; struct QMetaObjectExtraData const QPixmapDropShadowFilter::staticMetaObjectExtraData + ?qt_static_metacall@QPanGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13626 NONAME ; void QPanGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QWidgetResizeHandler@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13627 NONAME ; void QWidgetResizeHandler::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsSystemPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13628 NONAME ; void QGraphicsSystemPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QProxyModel@@0UQMetaObjectExtraData@@B @ 13629 NONAME ; struct QMetaObjectExtraData const QProxyModel::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13630 NONAME ; void QGraphicsWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QSizeGrip@@0UQMetaObjectExtraData@@B @ 13631 NONAME ; struct QMetaObjectExtraData const QSizeGrip::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QImageIOPlugin@@0UQMetaObjectExtraData@@B @ 13632 NONAME ; struct QMetaObjectExtraData const QImageIOPlugin::staticMetaObjectExtraData + ?qt_static_metacall@QSortFilterProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13633 NONAME ; void QSortFilterProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QDrag@@0UQMetaObjectExtraData@@B @ 13634 NONAME ; struct QMetaObjectExtraData const QDrag::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QAction@@0UQMetaObjectExtraData@@B @ 13635 NONAME ; struct QMetaObjectExtraData const QAction::staticMetaObjectExtraData + ?qt_static_metacall@QUndoView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13636 NONAME ; void QUndoView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?creationPermissions@QZipWriter@@QBE?AV?$QFlags@W4Permission@QFile@@@@XZ @ 13637 NONAME ; class QFlags<enum QFile::Permission> QZipWriter::creationPermissions(void) const + ?staticMetaObjectExtraData@QTabBar@@0UQMetaObjectExtraData@@B @ 13638 NONAME ; struct QMetaObjectExtraData const QTabBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QColumnView@@0UQMetaObjectExtraData@@B @ 13639 NONAME ; struct QMetaObjectExtraData const QColumnView::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QProxyStyle@@0UQMetaObjectExtraData@@B @ 13640 NONAME ; struct QMetaObjectExtraData const QProxyStyle::staticMetaObjectExtraData + ?qt_static_metacall@QActionGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13641 NONAME ; void QActionGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QLineEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13642 NONAME ; void QLineEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ??0QZipWriter@@QAE@ABVQString@@V?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z @ 13643 NONAME ; QZipWriter::QZipWriter(class QString const &, class QFlags<enum QIODevice::OpenModeFlag>) + ?staticMetaObjectExtraData@QSortFilterProxyModel@@0UQMetaObjectExtraData@@B @ 13644 NONAME ; struct QMetaObjectExtraData const QSortFilterProxyModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QIconEnginePlugin@@0UQMetaObjectExtraData@@B @ 13645 NONAME ; struct QMetaObjectExtraData const QIconEnginePlugin::staticMetaObjectExtraData + ?qt_static_metacall@QPixmapConvolutionFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13646 NONAME ; void QPixmapConvolutionFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QApplication@@0UQMetaObjectExtraData@@B @ 13647 NONAME ; struct QMetaObjectExtraData const QApplication::staticMetaObjectExtraData + ?qt_static_metacall@QCalendarWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13648 NONAME ; void QCalendarWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QInputContextPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13649 NONAME ; void QInputContextPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGuiPlatformPlugin@@0UQMetaObjectExtraData@@B @ 13650 NONAME ; struct QMetaObjectExtraData const QGuiPlatformPlugin::staticMetaObjectExtraData + ?qt_static_metacall@QTextObject@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13651 NONAME ; void QTextObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QStandardItemModel@@0UQMetaObjectExtraData@@B @ 13652 NONAME ; struct QMetaObjectExtraData const QStandardItemModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QProgressDialog@@0UQMetaObjectExtraData@@B @ 13653 NONAME ; struct QMetaObjectExtraData const QProgressDialog::staticMetaObjectExtraData + ?qt_static_metacall@QAbstractItemView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13654 NONAME ; void QAbstractItemView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QColumnView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13655 NONAME ; void QColumnView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QPixmapBlurFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13656 NONAME ; void QPixmapBlurFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsTransform@@0UQMetaObjectExtraData@@B @ 13657 NONAME ; struct QMetaObjectExtraData const QGraphicsTransform::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QFontDialog@@0UQMetaObjectExtraData@@B @ 13658 NONAME ; struct QMetaObjectExtraData const QFontDialog::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsBlurEffect@@0UQMetaObjectExtraData@@B @ 13659 NONAME ; struct QMetaObjectExtraData const QGraphicsBlurEffect::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsProxyWidget@@0UQMetaObjectExtraData@@B @ 13660 NONAME ; struct QMetaObjectExtraData const QGraphicsProxyWidget::staticMetaObjectExtraData + ?qt_static_metacall@QPictureFormatPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13661 NONAME ; void QPictureFormatPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFileDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13662 NONAME ; void QFileDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QFlickGesture@@0UQMetaObjectExtraData@@B @ 13663 NONAME ; struct QMetaObjectExtraData const QFlickGesture::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QWizard@@0UQMetaObjectExtraData@@B @ 13664 NONAME ; struct QMetaObjectExtraData const QWizard::staticMetaObjectExtraData + ?qt_static_metacall@QS60Style@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13665 NONAME ; void QS60Style::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTapGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13666 NONAME ; void QTapGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QItemDelegate@@0UQMetaObjectExtraData@@B @ 13667 NONAME ; struct QMetaObjectExtraData const QItemDelegate::staticMetaObjectExtraData + ?qt_static_metacall@QProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13668 NONAME ; void QProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QScrollBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13669 NONAME ; void QScrollBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QComboBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13670 NONAME ; void QComboBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QToolButton@@0UQMetaObjectExtraData@@B @ 13671 NONAME ; struct QMetaObjectExtraData const QToolButton::staticMetaObjectExtraData + ?qt_static_metacall@QItemSelectionModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13672 NONAME ; void QItemSelectionModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ??0QZipWriter@@QAE@PAVQIODevice@@@Z @ 13673 NONAME ; QZipWriter::QZipWriter(class QIODevice *) + ?staticMetaObjectExtraData@QButtonGroup@@0UQMetaObjectExtraData@@B @ 13674 NONAME ; struct QMetaObjectExtraData const QButtonGroup::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QErrorMessage@@0UQMetaObjectExtraData@@B @ 13675 NONAME ; struct QMetaObjectExtraData const QErrorMessage::staticMetaObjectExtraData + ?qt_static_metacall@QTableView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13676 NONAME ; void QTableView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTextEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13677 NONAME ; void QTextEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13678 NONAME ; void QDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QMessageBox@@0UQMetaObjectExtraData@@B @ 13679 NONAME ; struct QMetaObjectExtraData const QMessageBox::staticMetaObjectExtraData + ?qt_static_metacall@QWorkspace@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13680 NONAME ; void QWorkspace::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTextEdit@@0UQMetaObjectExtraData@@B @ 13681 NONAME ; struct QMetaObjectExtraData const QTextEdit::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDoubleValidator@@0UQMetaObjectExtraData@@B @ 13682 NONAME ; struct QMetaObjectExtraData const QDoubleValidator::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsWidget@@0UQMetaObjectExtraData@@B @ 13683 NONAME ; struct QMetaObjectExtraData const QGraphicsWidget::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QSplitterHandle@@0UQMetaObjectExtraData@@B @ 13684 NONAME ; struct QMetaObjectExtraData const QSplitterHandle::staticMetaObjectExtraData + ?qt_static_metacall@QPinchGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13685 NONAME ; void QPinchGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?alphaMapBoundingBox@QFontEngine@@UAE?AUglyph_metrics_t@@IUQFixed@@ABVQTransform@@W4GlyphFormat@1@@Z @ 13686 NONAME ; struct glyph_metrics_t QFontEngine::alphaMapBoundingBox(unsigned int, struct QFixed, class QTransform const &, enum QFontEngine::GlyphFormat) + ?qt_static_metacall@QGridLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13687 NONAME ; void QGridLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QSplitter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13688 NONAME ; void QSplitter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QStackedLayout@@0UQMetaObjectExtraData@@B @ 13689 NONAME ; struct QMetaObjectExtraData const QStackedLayout::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTapAndHoldGesture@@0UQMetaObjectExtraData@@B @ 13690 NONAME ; struct QMetaObjectExtraData const QTapAndHoldGesture::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QLCDNumber@@0UQMetaObjectExtraData@@B @ 13691 NONAME ; struct QMetaObjectExtraData const QLCDNumber::staticMetaObjectExtraData + ?qt_static_metacall@QDoubleSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13692 NONAME ; void QDoubleSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13693 NONAME ; void QValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?addDirectory@QZipWriter@@QAEXABVQString@@@Z @ 13694 NONAME ; void QZipWriter::addDirectory(class QString const &) + ?staticMetaObjectExtraData@QEventDispatcherS60@@0UQMetaObjectExtraData@@B @ 13695 NONAME ; struct QMetaObjectExtraData const QEventDispatcherS60::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QLineControl@@0UQMetaObjectExtraData@@B @ 13696 NONAME ; struct QMetaObjectExtraData const QLineControl::staticMetaObjectExtraData + ?qt_static_metacall@QStylePlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13697 NONAME ; void QStylePlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QScrollArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13698 NONAME ; void QScrollArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QProgressDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13699 NONAME ; void QProgressDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QWidget@@0UQMetaObjectExtraData@@B @ 13700 NONAME ; struct QMetaObjectExtraData const QWidget::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QRubberBand@@0UQMetaObjectExtraData@@B @ 13701 NONAME ; struct QMetaObjectExtraData const QRubberBand::staticMetaObjectExtraData + ?qt_static_metacall@QLineControl@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13702 NONAME ; void QLineControl::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QDockWidgetLayout@@0UQMetaObjectExtraData@@B @ 13703 NONAME ; struct QMetaObjectExtraData const QDockWidgetLayout::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTextControl@@0UQMetaObjectExtraData@@B @ 13704 NONAME ; struct QMetaObjectExtraData const QTextControl::staticMetaObjectExtraData + ?qt_static_metacall@QTreeView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13705 NONAME ; void QTreeView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsScene@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13706 NONAME ; void QGraphicsScene::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QApplication@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13707 NONAME ; void QApplication::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QCommandLinkButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13708 NONAME ; void QCommandLinkButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTextBlockGroup@@0UQMetaObjectExtraData@@B @ 13709 NONAME ; struct QMetaObjectExtraData const QTextBlockGroup::staticMetaObjectExtraData + ?qt_static_metacall@QIntValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13710 NONAME ; void QIntValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QInputContextPlugin@@0UQMetaObjectExtraData@@B @ 13711 NONAME ; struct QMetaObjectExtraData const QInputContextPlugin::staticMetaObjectExtraData + ?qt_static_metacall@QFontComboBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13712 NONAME ; void QFontComboBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTextDocument@@0UQMetaObjectExtraData@@B @ 13713 NONAME ; struct QMetaObjectExtraData const QTextDocument::staticMetaObjectExtraData + ?qt_static_metacall@QTextList@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13714 NONAME ; void QTextList::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13715 NONAME ; void QStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsObject@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13716 NONAME ; void QGraphicsObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13717 NONAME ; void QSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsScale@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13718 NONAME ; void QGraphicsScale::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QPlainTextDocumentLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13719 NONAME ; void QPlainTextDocumentLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QShortcut@@0UQMetaObjectExtraData@@B @ 13720 NONAME ; struct QMetaObjectExtraData const QShortcut::staticMetaObjectExtraData + ?qt_static_metacall@QDial@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13721 NONAME ; void QDial::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsItemAnimation@@0UQMetaObjectExtraData@@B @ 13722 NONAME ; struct QMetaObjectExtraData const QGraphicsItemAnimation::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsProxyWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13723 NONAME ; void QGraphicsProxyWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QMenuBar@@0UQMetaObjectExtraData@@B @ 13724 NONAME ; struct QMetaObjectExtraData const QMenuBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsColorizeEffect@@0UQMetaObjectExtraData@@B @ 13725 NONAME ; struct QMetaObjectExtraData const QGraphicsColorizeEffect::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QScrollArea@@0UQMetaObjectExtraData@@B @ 13726 NONAME ; struct QMetaObjectExtraData const QScrollArea::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPaintBufferResource@@0UQMetaObjectExtraData@@B @ 13727 NONAME ; struct QMetaObjectExtraData const QPaintBufferResource::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTextFrame@@0UQMetaObjectExtraData@@B @ 13728 NONAME ; struct QMetaObjectExtraData const QTextFrame::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QItemSelectionModel@@0UQMetaObjectExtraData@@B @ 13729 NONAME ; struct QMetaObjectExtraData const QItemSelectionModel::staticMetaObjectExtraData + ?qt_static_metacall@QIconEnginePluginV2@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13730 NONAME ; void QIconEnginePluginV2::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsBlurEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13731 NONAME ; void QGraphicsBlurEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QSpinBox@@0UQMetaObjectExtraData@@B @ 13732 NONAME ; struct QMetaObjectExtraData const QSpinBox::staticMetaObjectExtraData + ?qt_static_metacall@QMenu@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13733 NONAME ; void QMenu::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QListWidget@@0UQMetaObjectExtraData@@B @ 13734 NONAME ; struct QMetaObjectExtraData const QListWidget::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTimeEdit@@0UQMetaObjectExtraData@@B @ 13735 NONAME ; struct QMetaObjectExtraData const QTimeEdit::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QMenu@@0UQMetaObjectExtraData@@B @ 13736 NONAME ; struct QMetaObjectExtraData const QMenu::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QFrame@@0UQMetaObjectExtraData@@B @ 13737 NONAME ; struct QMetaObjectExtraData const QFrame::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDirModel@@0UQMetaObjectExtraData@@B @ 13738 NONAME ; struct QMetaObjectExtraData const QDirModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QAbstractSpinBox@@0UQMetaObjectExtraData@@B @ 13739 NONAME ; struct QMetaObjectExtraData const QAbstractSpinBox::staticMetaObjectExtraData + ?qt_static_metacall@QProxyStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13740 NONAME ; void QProxyStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QDateTimeEdit@@0UQMetaObjectExtraData@@B @ 13741 NONAME ; struct QMetaObjectExtraData const QDateTimeEdit::staticMetaObjectExtraData + ?qt_static_metacall@QStyledItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13742 NONAME ; void QStyledItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QListView@@0UQMetaObjectExtraData@@B @ 13743 NONAME ; struct QMetaObjectExtraData const QListView::staticMetaObjectExtraData + ?qt_static_metacall@QFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13744 NONAME ; void QFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QHeaderView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13745 NONAME ; void QHeaderView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?exists@QZipWriter@@QBE_NXZ @ 13746 NONAME ; bool QZipWriter::exists(void) const + ?qt_static_metacall@QSyntaxHighlighter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13747 NONAME ; void QSyntaxHighlighter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QScroller@@0UQMetaObjectExtraData@@B @ 13748 NONAME ; struct QMetaObjectExtraData const QScroller::staticMetaObjectExtraData + ?qt_static_metacall@QTextFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13749 NONAME ; void QTextFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDirModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13750 NONAME ; void QDirModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QScrollBar@@0UQMetaObjectExtraData@@B @ 13751 NONAME ; struct QMetaObjectExtraData const QScrollBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QMovie@@0UQMetaObjectExtraData@@B @ 13752 NONAME ; struct QMetaObjectExtraData const QMovie::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsDropShadowEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13753 NONAME ; void QGraphicsDropShadowEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QSound@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13754 NONAME ; void QSound::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTextBrowser@@0UQMetaObjectExtraData@@B @ 13755 NONAME ; struct QMetaObjectExtraData const QTextBrowser::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QHeaderView@@0UQMetaObjectExtraData@@B @ 13756 NONAME ; struct QMetaObjectExtraData const QHeaderView::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPixmapBlurFilter@@0UQMetaObjectExtraData@@B @ 13757 NONAME ; struct QMetaObjectExtraData const QPixmapBlurFilter::staticMetaObjectExtraData + ?qt_static_metacall@QUndoStack@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13758 NONAME ; void QUndoStack::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsAnchor@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13759 NONAME ; void QGraphicsAnchor::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QPanGesture@@0UQMetaObjectExtraData@@B @ 13760 NONAME ; struct QMetaObjectExtraData const QPanGesture::staticMetaObjectExtraData + ?qt_static_metacall@QDataWidgetMapper@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13761 NONAME ; void QDataWidgetMapper::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTextBlockGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13762 NONAME ; void QTextBlockGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QStringListModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13763 NONAME ; void QStringListModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsTextItem@@0UQMetaObjectExtraData@@B @ 13764 NONAME ; struct QMetaObjectExtraData const QGraphicsTextItem::staticMetaObjectExtraData + ?qt_static_metacall@QTimeEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13765 NONAME ; void QTimeEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QToolBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13766 NONAME ; void QToolBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QCheckBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13767 NONAME ; void QCheckBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QFontComboBox@@0UQMetaObjectExtraData@@B @ 13768 NONAME ; struct QMetaObjectExtraData const QFontComboBox::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDesktopWidget@@0UQMetaObjectExtraData@@B @ 13769 NONAME ; struct QMetaObjectExtraData const QDesktopWidget::staticMetaObjectExtraData + ?qt_static_metacall@QSwipeGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13770 NONAME ; void QSwipeGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFormLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13771 NONAME ; void QFormLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAbstractButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13772 NONAME ; void QAbstractButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QClipboard@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13773 NONAME ; void QClipboard::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QWidgetResizeHandler@@0UQMetaObjectExtraData@@B @ 13774 NONAME ; struct QMetaObjectExtraData const QWidgetResizeHandler::staticMetaObjectExtraData + ?qt_static_metacall@QIconEnginePlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13775 NONAME ; void QIconEnginePlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTreeWidget@@0UQMetaObjectExtraData@@B @ 13776 NONAME ; struct QMetaObjectExtraData const QTreeWidget::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QFileSystemModel@@0UQMetaObjectExtraData@@B @ 13777 NONAME ; struct QMetaObjectExtraData const QFileSystemModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsDropShadowEffect@@0UQMetaObjectExtraData@@B @ 13778 NONAME ; struct QMetaObjectExtraData const QGraphicsDropShadowEffect::staticMetaObjectExtraData + ?qt_static_metacall@QPushButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13779 NONAME ; void QPushButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QClipboard@@0UQMetaObjectExtraData@@B @ 13780 NONAME ; struct QMetaObjectExtraData const QClipboard::staticMetaObjectExtraData + ?qt_static_metacall@QHBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13781 NONAME ; void QHBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QKeyEventTransition@@0UQMetaObjectExtraData@@B @ 13782 NONAME ; struct QMetaObjectExtraData const QKeyEventTransition::staticMetaObjectExtraData + ?qt_static_metacall@QWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13783 NONAME ; void QWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QListView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13784 NONAME ; void QListView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?status@QZipWriter@@QBE?AW4Status@1@XZ @ 13785 NONAME ; enum QZipWriter::Status QZipWriter::status(void) const + ?qt_static_metacall@QProgressBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13786 NONAME ; void QProgressBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QMouseEventTransition@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13787 NONAME ; void QMouseEventTransition::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTextBrowser@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13788 NONAME ; void QTextBrowser::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QMessageBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13789 NONAME ; void QMessageBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QPaintBufferSignalProxy@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13790 NONAME ; void QPaintBufferSignalProxy::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QWizardPage@@0UQMetaObjectExtraData@@B @ 13791 NONAME ; struct QMetaObjectExtraData const QWizardPage::staticMetaObjectExtraData + ?qt_static_metacall@QMdiSubWindow@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13792 NONAME ; void QMdiSubWindow::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QFocusFrame@@0UQMetaObjectExtraData@@B @ 13793 NONAME ; struct QMetaObjectExtraData const QFocusFrame::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDockWidget@@0UQMetaObjectExtraData@@B @ 13794 NONAME ; struct QMetaObjectExtraData const QDockWidget::staticMetaObjectExtraData + ?qt_static_metacall@QShortcut@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13795 NONAME ; void QShortcut::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTextDocument@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13796 NONAME ; void QTextDocument::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFileSystemModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13797 NONAME ; void QFileSystemModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QCompleter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13798 NONAME ; void QCompleter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QIntValidator@@0UQMetaObjectExtraData@@B @ 13799 NONAME ; struct QMetaObjectExtraData const QIntValidator::staticMetaObjectExtraData + ?qt_static_metacall@QDrag@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13800 NONAME ; void QDrag::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QRegExpValidator@@0UQMetaObjectExtraData@@B @ 13801 NONAME ; struct QMetaObjectExtraData const QRegExpValidator::staticMetaObjectExtraData + ?qt_static_metacall@QTabWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13802 NONAME ; void QTabWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QButtonGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13803 NONAME ; void QButtonGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAction@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13804 NONAME ; void QAction::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QPixmapConvolutionFilter@@0UQMetaObjectExtraData@@B @ 13805 NONAME ; struct QMetaObjectExtraData const QPixmapConvolutionFilter::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QIconEnginePluginV2@@0UQMetaObjectExtraData@@B @ 13806 NONAME ; struct QMetaObjectExtraData const QIconEnginePluginV2::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QLabel@@0UQMetaObjectExtraData@@B @ 13807 NONAME ; struct QMetaObjectExtraData const QLabel::staticMetaObjectExtraData + ?qt_static_metacall@QInputDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13808 NONAME ; void QInputDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QMdiArea@@0UQMetaObjectExtraData@@B @ 13809 NONAME ; struct QMetaObjectExtraData const QMdiArea::staticMetaObjectExtraData + ?qt_static_metacall@QRadioButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13810 NONAME ; void QRadioButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QS60Style@@0UQMetaObjectExtraData@@B @ 13811 NONAME ; struct QMetaObjectExtraData const QS60Style::staticMetaObjectExtraData + ?qt_static_metacall@QToolBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13812 NONAME ; void QToolBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDateEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13813 NONAME ; void QDateEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractScrollArea@@0UQMetaObjectExtraData@@B @ 13814 NONAME ; struct QMetaObjectExtraData const QAbstractScrollArea::staticMetaObjectExtraData + ?qt_static_metacall@QGroupBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13815 NONAME ; void QGroupBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?isWritable@QZipWriter@@QBE_NXZ @ 13816 NONAME ; bool QZipWriter::isWritable(void) const + ?qt_static_metacall@QToolButton@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13817 NONAME ; void QToolButton::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsRotation@@0UQMetaObjectExtraData@@B @ 13818 NONAME ; struct QMetaObjectExtraData const QGraphicsRotation::staticMetaObjectExtraData + ?qt_static_metacall@QDateTimeEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13819 NONAME ; void QDateTimeEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QPlainTextDocumentLayout@@0UQMetaObjectExtraData@@B @ 13820 NONAME ; struct QMetaObjectExtraData const QPlainTextDocumentLayout::staticMetaObjectExtraData + ?addFile@QZipWriter@@QAEXABVQString@@ABVQByteArray@@@Z @ 13821 NONAME ; void QZipWriter::addFile(class QString const &, class QByteArray const &) + ?staticMetaObjectExtraData@QComboBox@@0UQMetaObjectExtraData@@B @ 13822 NONAME ; struct QMetaObjectExtraData const QComboBox::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsColorizeEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13823 NONAME ; void QGraphicsColorizeEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QPixmapDropShadowFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13824 NONAME ; void QPixmapDropShadowFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractTextDocumentLayout@@0UQMetaObjectExtraData@@B @ 13825 NONAME ; struct QMetaObjectExtraData const QAbstractTextDocumentLayout::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QCheckBox@@0UQMetaObjectExtraData@@B @ 13826 NONAME ; struct QMetaObjectExtraData const QCheckBox::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QCalendarWidget@@0UQMetaObjectExtraData@@B @ 13827 NONAME ; struct QMetaObjectExtraData const QCalendarWidget::staticMetaObjectExtraData + ?qt_static_metacall@QWidgetAction@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13828 NONAME ; void QWidgetAction::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?device@QZipWriter@@QBEPAVQIODevice@@XZ @ 13829 NONAME ; class QIODevice * QZipWriter::device(void) const + ?staticMetaObjectExtraData@QBoxLayout@@0UQMetaObjectExtraData@@B @ 13830 NONAME ; struct QMetaObjectExtraData const QBoxLayout::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QRadioButton@@0UQMetaObjectExtraData@@B @ 13831 NONAME ; struct QMetaObjectExtraData const QRadioButton::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGridLayout@@0UQMetaObjectExtraData@@B @ 13832 NONAME ; struct QMetaObjectExtraData const QGridLayout::staticMetaObjectExtraData + ?qt_static_metacall@QDoubleValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13833 NONAME ; void QDoubleValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QKeyEventTransition@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13834 NONAME ; void QKeyEventTransition::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QMainWindow@@0UQMetaObjectExtraData@@B @ 13835 NONAME ; struct QMetaObjectExtraData const QMainWindow::staticMetaObjectExtraData + ?qt_static_metacall@QTextTable@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13836 NONAME ; void QTextTable::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsView@@0UQMetaObjectExtraData@@B @ 13837 NONAME ; struct QMetaObjectExtraData const QGraphicsView::staticMetaObjectExtraData + ?qt_static_metacall@QErrorMessage@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13838 NONAME ; void QErrorMessage::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QToolBox@@0UQMetaObjectExtraData@@B @ 13839 NONAME ; struct QMetaObjectExtraData const QToolBox::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTreeView@@0UQMetaObjectExtraData@@B @ 13840 NONAME ; struct QMetaObjectExtraData const QTreeView::staticMetaObjectExtraData + ?qt_static_metacall@QSlider@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13841 NONAME ; void QSlider::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QStringListModel@@0UQMetaObjectExtraData@@B @ 13842 NONAME ; struct QMetaObjectExtraData const QStringListModel::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QProgressBar@@0UQMetaObjectExtraData@@B @ 13843 NONAME ; struct QMetaObjectExtraData const QProgressBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTextList@@0UQMetaObjectExtraData@@B @ 13844 NONAME ; struct QMetaObjectExtraData const QTextList::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsTransform@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13845 NONAME ; void QGraphicsTransform::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QFormLayout@@0UQMetaObjectExtraData@@B @ 13846 NONAME ; struct QMetaObjectExtraData const QFormLayout::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGesture@@0UQMetaObjectExtraData@@B @ 13847 NONAME ; struct QMetaObjectExtraData const QGesture::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsAnchor@@0UQMetaObjectExtraData@@B @ 13848 NONAME ; struct QMetaObjectExtraData const QGraphicsAnchor::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTextObject@@0UQMetaObjectExtraData@@B @ 13849 NONAME ; struct QMetaObjectExtraData const QTextObject::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsView@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13850 NONAME ; void QGraphicsView::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsOpacityEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13851 NONAME ; void QGraphicsOpacityEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAbstractSlider@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13852 NONAME ; void QAbstractSlider::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QTreeWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13853 NONAME ; void QTreeWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractItemDelegate@@0UQMetaObjectExtraData@@B @ 13854 NONAME ; struct QMetaObjectExtraData const QAbstractItemDelegate::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QStatusBar@@0UQMetaObjectExtraData@@B @ 13855 NONAME ; struct QMetaObjectExtraData const QStatusBar::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QActionGroup@@0UQMetaObjectExtraData@@B @ 13856 NONAME ; struct QMetaObjectExtraData const QActionGroup::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDataWidgetMapper@@0UQMetaObjectExtraData@@B @ 13857 NONAME ; struct QMetaObjectExtraData const QDataWidgetMapper::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDial@@0UQMetaObjectExtraData@@B @ 13858 NONAME ; struct QMetaObjectExtraData const QDial::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QMdiSubWindow@@0UQMetaObjectExtraData@@B @ 13859 NONAME ; struct QMetaObjectExtraData const QMdiSubWindow::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsEffect@@0UQMetaObjectExtraData@@B @ 13860 NONAME ; struct QMetaObjectExtraData const QGraphicsEffect::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPictureFormatPlugin@@0UQMetaObjectExtraData@@B @ 13861 NONAME ; struct QMetaObjectExtraData const QPictureFormatPlugin::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsScale@@0UQMetaObjectExtraData@@B @ 13862 NONAME ; struct QMetaObjectExtraData const QGraphicsScale::staticMetaObjectExtraData + ?qt_static_metacall@QStandardItemModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13863 NONAME ; void QStandardItemModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDockWidgetLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13864 NONAME ; void QDockWidgetLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QPinchGesture@@0UQMetaObjectExtraData@@B @ 13865 NONAME ; struct QMetaObjectExtraData const QPinchGesture::staticMetaObjectExtraData + ?qt_static_metacall@QLabel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13866 NONAME ; void QLabel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTableWidget@@0UQMetaObjectExtraData@@B @ 13867 NONAME ; struct QMetaObjectExtraData const QTableWidget::staticMetaObjectExtraData + ?close@QZipWriter@@QAEXXZ @ 13868 NONAME ; void QZipWriter::close(void) + ?qt_static_metacall@QStatusBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13869 NONAME ; void QStatusBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QCommandLinkButton@@0UQMetaObjectExtraData@@B @ 13870 NONAME ; struct QMetaObjectExtraData const QCommandLinkButton::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPushButton@@0UQMetaObjectExtraData@@B @ 13871 NONAME ; struct QMetaObjectExtraData const QPushButton::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QWidgetAction@@0UQMetaObjectExtraData@@B @ 13872 NONAME ; struct QMetaObjectExtraData const QWidgetAction::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QDoubleSpinBox@@0UQMetaObjectExtraData@@B @ 13873 NONAME ; struct QMetaObjectExtraData const QDoubleSpinBox::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTextTable@@0UQMetaObjectExtraData@@B @ 13874 NONAME ; struct QMetaObjectExtraData const QTextTable::staticMetaObjectExtraData + ?qt_static_metacall@QSplashScreen@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13875 NONAME ; void QSplashScreen::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QStackedLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13876 NONAME ; void QStackedLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QCompleter@@0UQMetaObjectExtraData@@B @ 13877 NONAME ; struct QMetaObjectExtraData const QCompleter::staticMetaObjectExtraData + ?qt_static_metacall@QAbstractScrollArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13878 NONAME ; void QAbstractScrollArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDesktopWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13879 NONAME ; void QDesktopWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAbstractSpinBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13880 NONAME ; void QAbstractSpinBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsEffectSource@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13881 NONAME ; void QGraphicsEffectSource::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?addSymLink@QZipWriter@@QAEXABVQString@@0@Z @ 13882 NONAME ; void QZipWriter::addSymLink(class QString const &, class QString const &) + ?staticMetaObjectExtraData@QGraphicsEffectSource@@0UQMetaObjectExtraData@@B @ 13883 NONAME ; struct QMetaObjectExtraData const QGraphicsEffectSource::staticMetaObjectExtraData + ?qt_static_metacall@QScroller@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13884 NONAME ; void QScroller::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QStyle@@0UQMetaObjectExtraData@@B @ 13885 NONAME ; struct QMetaObjectExtraData const QStyle::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QTabWidget@@0UQMetaObjectExtraData@@B @ 13886 NONAME ; struct QMetaObjectExtraData const QTabWidget::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QPixmapFilter@@0UQMetaObjectExtraData@@B @ 13887 NONAME ; struct QMetaObjectExtraData const QPixmapFilter::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGraphicsOpacityEffect@@0UQMetaObjectExtraData@@B @ 13888 NONAME ; struct QMetaObjectExtraData const QGraphicsOpacityEffect::staticMetaObjectExtraData + ?qt_static_metacall@QBoxLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13889 NONAME ; void QBoxLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAbstractTextDocumentLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13890 NONAME ; void QAbstractTextDocumentLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsSystemPlugin@@0UQMetaObjectExtraData@@B @ 13891 NONAME ; struct QMetaObjectExtraData const QGraphicsSystemPlugin::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QMouseEventTransition@@0UQMetaObjectExtraData@@B @ 13892 NONAME ; struct QMetaObjectExtraData const QMouseEventTransition::staticMetaObjectExtraData + ?qt_static_metacall@QTabBar@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13893 NONAME ; void QTabBar::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?compressionPolicy@QZipWriter@@QBE?AW4CompressionPolicy@1@XZ @ 13894 NONAME ; enum QZipWriter::CompressionPolicy QZipWriter::compressionPolicy(void) const + ?qt_static_metacall@QWindowsStyle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13895 NONAME ; void QWindowsStyle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QUndoGroup@@0UQMetaObjectExtraData@@B @ 13896 NONAME ; struct QMetaObjectExtraData const QUndoGroup::staticMetaObjectExtraData + ?qt_static_metacall@QStackedWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13897 NONAME ; void QStackedWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QColorDialog@@0UQMetaObjectExtraData@@B @ 13898 NONAME ; struct QMetaObjectExtraData const QColorDialog::staticMetaObjectExtraData + ?qt_static_metacall@QMdiArea@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13899 NONAME ; void QMdiArea::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QGraphicsScene@@0UQMetaObjectExtraData@@B @ 13900 NONAME ; struct QMetaObjectExtraData const QGraphicsScene::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QGroupBox@@0UQMetaObjectExtraData@@B @ 13901 NONAME ; struct QMetaObjectExtraData const QGroupBox::staticMetaObjectExtraData + ?qt_static_metacall@QInternalMimeData@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13902 NONAME ; void QInternalMimeData::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractSlider@@0UQMetaObjectExtraData@@B @ 13903 NONAME ; struct QMetaObjectExtraData const QAbstractSlider::staticMetaObjectExtraData + ?qt_static_metacall@QTapAndHoldGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13904 NONAME ; void QTapAndHoldGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFocusFrame@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13905 NONAME ; void QFocusFrame::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QHBoxLayout@@0UQMetaObjectExtraData@@B @ 13906 NONAME ; struct QMetaObjectExtraData const QHBoxLayout::staticMetaObjectExtraData + ?qt_static_metacall@QSessionManager@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13907 NONAME ; void QSessionManager::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QSyntaxHighlighter@@0UQMetaObjectExtraData@@B @ 13908 NONAME ; struct QMetaObjectExtraData const QSyntaxHighlighter::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QLineEdit@@0UQMetaObjectExtraData@@B @ 13909 NONAME ; struct QMetaObjectExtraData const QLineEdit::staticMetaObjectExtraData + ?qt_static_metacall@QWizardPage@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13910 NONAME ; void QWizardPage::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QColorDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13911 NONAME ; void QColorDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QInputDialog@@0UQMetaObjectExtraData@@B @ 13912 NONAME ; struct QMetaObjectExtraData const QInputDialog::staticMetaObjectExtraData + ?qt_static_metacall@QPixmapColorizeFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13913 NONAME ; void QPixmapColorizeFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QListWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13914 NONAME ; void QListWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QAbstractProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13915 NONAME ; void QAbstractProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QVBoxLayout@@0UQMetaObjectExtraData@@B @ 13916 NONAME ; struct QMetaObjectExtraData const QVBoxLayout::staticMetaObjectExtraData + ?qt_static_metacall@QAbstractItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13917 NONAME ; void QAbstractItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QCommonStyle@@0UQMetaObjectExtraData@@B @ 13918 NONAME ; struct QMetaObjectExtraData const QCommonStyle::staticMetaObjectExtraData + ?qt_static_metacall@QPixmapFilter@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13919 NONAME ; void QPixmapFilter::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QLayout@@0UQMetaObjectExtraData@@B @ 13920 NONAME ; struct QMetaObjectExtraData const QLayout::staticMetaObjectExtraData + ?qt_static_metacall@QLayout@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13921 NONAME ; void QLayout::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QWindowsStyle@@0UQMetaObjectExtraData@@B @ 13922 NONAME ; struct QMetaObjectExtraData const QWindowsStyle::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QStackedWidget@@0UQMetaObjectExtraData@@B @ 13923 NONAME ; struct QMetaObjectExtraData const QStackedWidget::staticMetaObjectExtraData + ?qt_static_metacall@QGesture@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13924 NONAME ; void QGesture::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QMovie@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13925 NONAME ; void QMovie::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QPixmapColorizeFilter@@0UQMetaObjectExtraData@@B @ 13926 NONAME ; struct QMetaObjectExtraData const QPixmapColorizeFilter::staticMetaObjectExtraData + ?qt_static_metacall@QTableWidget@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13927 NONAME ; void QTableWidget::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QRubberBand@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13928 NONAME ; void QRubberBand::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QPlainTextEdit@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13929 NONAME ; void QPlainTextEdit::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QAbstractButton@@0UQMetaObjectExtraData@@B @ 13930 NONAME ; struct QMetaObjectExtraData const QAbstractButton::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QInternalMimeData@@0UQMetaObjectExtraData@@B @ 13931 NONAME ; struct QMetaObjectExtraData const QInternalMimeData::staticMetaObjectExtraData + ??1QZipWriter@@QAE@XZ @ 13932 NONAME ; QZipWriter::~QZipWriter(void) + ?staticMetaObjectExtraData@QDialogButtonBox@@0UQMetaObjectExtraData@@B @ 13933 NONAME ; struct QMetaObjectExtraData const QDialogButtonBox::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QUndoView@@0UQMetaObjectExtraData@@B @ 13934 NONAME ; struct QMetaObjectExtraData const QUndoView::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsTextItem@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13935 NONAME ; void QGraphicsTextItem::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?setCreationPermissions@QZipWriter@@QAEXV?$QFlags@W4Permission@QFile@@@@@Z @ 13936 NONAME ; void QZipWriter::setCreationPermissions(class QFlags<enum QFile::Permission>) + ?staticMetaObjectExtraData@QInputContext@@0UQMetaObjectExtraData@@B @ 13937 NONAME ; struct QMetaObjectExtraData const QInputContext::staticMetaObjectExtraData + ?qt_static_metacall@QInputContext@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13938 NONAME ; void QInputContext::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QEventDispatcherS60@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13939 NONAME ; void QEventDispatcherS60::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QFileDialog@@0UQMetaObjectExtraData@@B @ 13940 NONAME ; struct QMetaObjectExtraData const QFileDialog::staticMetaObjectExtraData + ?qt_static_metacall@QUndoGroup@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13941 NONAME ; void QUndoGroup::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QDialogButtonBox@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13942 NONAME ; void QDialogButtonBox::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QImageIOPlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13943 NONAME ; void QImageIOPlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QLCDNumber@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13944 NONAME ; void QLCDNumber::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QFontDialog@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13945 NONAME ; void QFontDialog::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QMainWindow@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13946 NONAME ; void QMainWindow::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QRegExpValidator@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13947 NONAME ; void QRegExpValidator::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QSplitterHandle@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13948 NONAME ; void QSplitterHandle::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?qt_static_metacall@QGraphicsEffect@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13949 NONAME ; void QGraphicsEffect::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QTapGesture@@0UQMetaObjectExtraData@@B @ 13950 NONAME ; struct QMetaObjectExtraData const QTapGesture::staticMetaObjectExtraData + ?qt_static_metacall@QItemDelegate@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13951 NONAME ; void QItemDelegate::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?staticMetaObjectExtraData@QWorkspace@@0UQMetaObjectExtraData@@B @ 13952 NONAME ; struct QMetaObjectExtraData const QWorkspace::staticMetaObjectExtraData + ?staticMetaObjectExtraData@QSessionManager@@0UQMetaObjectExtraData@@B @ 13953 NONAME ; struct QMetaObjectExtraData const QSessionManager::staticMetaObjectExtraData + ?qt_static_metacall@QGraphicsItemAnimation@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13954 NONAME ; void QGraphicsItemAnimation::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?setCursorMoveStyle@QLineControl@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13955 NONAME ABSENT ; void QLineControl::setCursorMoveStyle(enum QTextCursor::MoveStyle) + ?staticMetaObjectExtraData@QIdentityProxyModel@@0UQMetaObjectExtraData@@B @ 13956 NONAME ; struct QMetaObjectExtraData const QIdentityProxyModel::staticMetaObjectExtraData + ?defaultCursorMoveStyle@QTextDocument@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13957 NONAME ABSENT ; enum QTextCursor::MoveStyle QTextDocument::defaultCursorMoveStyle(void) const + ?offsetInLigature@QTextEngine@@QAE?AUQFixed@@PBUQScriptItem@@HHH@Z @ 13958 NONAME ; struct QFixed QTextEngine::offsetInLigature(struct QScriptItem const *, int, int, int) + ?qt_metacall@QIdentityProxyModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13959 NONAME ; int QIdentityProxyModel::qt_metacall(enum QMetaObject::Call, int, void * *) + ?mapSelectionFromSource@QIdentityProxyModel@@UBE?AVQItemSelection@@ABV2@@Z @ 13960 NONAME ; class QItemSelection QIdentityProxyModel::mapSelectionFromSource(class QItemSelection const &) const + ?qt_static_metacall@QIdentityProxyModel@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 13961 NONAME ; void QIdentityProxyModel::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) + ?mapSelectionToSource@QIdentityProxyModel@@UBE?AVQItemSelection@@ABV2@@Z @ 13962 NONAME ; class QItemSelection QIdentityProxyModel::mapSelectionToSource(class QItemSelection const &) const + ??1QIdentityProxyModel@@UAE@XZ @ 13963 NONAME ; QIdentityProxyModel::~QIdentityProxyModel(void) + ??_EQIdentityProxyModel@@UAE@I@Z @ 13964 NONAME ; QIdentityProxyModel::~QIdentityProxyModel(unsigned int) + ?removeRows@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13965 NONAME ; bool QIdentityProxyModel::removeRows(int, int, class QModelIndex const &) + ?previousLogicalPosition@QTextEngine@@QBEHH@Z @ 13966 NONAME ; int QTextEngine::previousLogicalPosition(int) const + ?metaObject@QIdentityProxyModel@@UBEPBUQMetaObject@@XZ @ 13967 NONAME ; struct QMetaObject const * QIdentityProxyModel::metaObject(void) const + ?cursorMoveStyle@QLineControl@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 13968 NONAME ABSENT ; enum QTextCursor::MoveStyle QLineControl::cursorMoveStyle(void) const + ?removeColumns@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13969 NONAME ; bool QIdentityProxyModel::removeColumns(int, int, class QModelIndex const &) + ?alignLine@QTextEngine@@QAE?AUQFixed@@ABUQScriptLine@@@Z @ 13970 NONAME ; struct QFixed QTextEngine::alignLine(struct QScriptLine const &) + ?qt_s60_setPartialScreenAutomaticTranslation@@YAX_N@Z @ 13971 NONAME ; void qt_s60_setPartialScreenAutomaticTranslation(bool) + ?parent@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13972 NONAME ; class QModelIndex QIdentityProxyModel::parent(class QModelIndex const &) const + ?insertColumns@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13973 NONAME ; bool QIdentityProxyModel::insertColumns(int, int, class QModelIndex const &) + ?dropMimeData@QIdentityProxyModel@@UAE_NPBVQMimeData@@W4DropAction@Qt@@HHABVQModelIndex@@@Z @ 13974 NONAME ; bool QIdentityProxyModel::dropMimeData(class QMimeData const *, enum Qt::DropAction, int, int, class QModelIndex const &) + ?visualCursorMovement@QTextEngine@@QBE_NXZ @ 13975 NONAME ; bool QTextEngine::visualCursorMovement(void) const + ??0QRadialGradient@@QAE@MMMMMM@Z @ 13976 NONAME ; QRadialGradient::QRadialGradient(float, float, float, float, float, float) + ?setSourceModel@QIdentityProxyModel@@UAEXPAVQAbstractItemModel@@@Z @ 13977 NONAME ; void QIdentityProxyModel::setSourceModel(class QAbstractItemModel *) + ?getStaticMetaObject@QIdentityProxyModel@@SAABUQMetaObject@@XZ @ 13978 NONAME ; struct QMetaObject const & QIdentityProxyModel::getStaticMetaObject(void) + ?index@QIdentityProxyModel@@UBE?AVQModelIndex@@HHABV2@@Z @ 13979 NONAME ; class QModelIndex QIdentityProxyModel::index(int, int, class QModelIndex const &) const + ?setInstantInvalidatePropagation@QGraphicsLayout@@SAX_N@Z @ 13980 NONAME ; void QGraphicsLayout::setInstantInvalidatePropagation(bool) + ?paintingActive@QVolatileImage@@QBE_NXZ @ 13981 NONAME ; bool QVolatileImage::paintingActive(void) const + ?insertRows@QIdentityProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 13982 NONAME ; bool QIdentityProxyModel::insertRows(int, int, class QModelIndex const &) + ?positionAfterVisualMovement@QTextEngine@@QAEHHW4MoveOperation@QTextCursor@@@Z @ 13983 NONAME ; int QTextEngine::positionAfterVisualMovement(int, enum QTextCursor::MoveOperation) + ?setCenterRadius@QRadialGradient@@QAEXM@Z @ 13984 NONAME ; void QRadialGradient::setCenterRadius(float) + ?leftCursorPosition@QTextLayout@@QBEHH@Z @ 13985 NONAME ; int QTextLayout::leftCursorPosition(int) const + ?focalRadius@QRadialGradient@@QBEMXZ @ 13986 NONAME ; float QRadialGradient::focalRadius(void) const + ?qt_metacast@QIdentityProxyModel@@UAEPAXPBD@Z @ 13987 NONAME ; void * QIdentityProxyModel::qt_metacast(char const *) + ?qt_draw_decoration_for_glyphs@@YAXPAVQPainter@@PBIPBUQFixedPoint@@HPAVQFontEngine@@ABVQFont@@ABVQTextCharFormat@@@Z @ 13988 NONAME ; void qt_draw_decoration_for_glyphs(class QPainter *, unsigned int const *, struct QFixedPoint const *, int, class QFontEngine *, class QFont const &, class QTextCharFormat const &) + ??0QRadialGradient@@QAE@ABVQPointF@@M0M@Z @ 13989 NONAME ; QRadialGradient::QRadialGradient(class QPointF const &, float, class QPointF const &, float) + ?centerRadius@QRadialGradient@@QBEMXZ @ 13990 NONAME ; float QRadialGradient::centerRadius(void) const + ?qt_isExtendedRadialGradient@@YA_NABVQBrush@@@Z @ 13991 NONAME ; bool qt_isExtendedRadialGradient(class QBrush const &) + ?mapToSource@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 13992 NONAME ; class QModelIndex QIdentityProxyModel::mapToSource(class QModelIndex const &) const + ?d_func@QIdentityProxyModel@@AAEPAVQIdentityProxyModelPrivate@@XZ @ 13993 NONAME ; class QIdentityProxyModelPrivate * QIdentityProxyModel::d_func(void) + ?insertionPointsForLine@QTextEngine@@QAEXHAAV?$QVector@H@@@Z @ 13994 NONAME ; void QTextEngine::insertionPointsForLine(int, class QVector<int> &) + ?cloneWithSize@QFontEngine@@UBEPAV1@M@Z @ 13995 NONAME ; class QFontEngine * QFontEngine::cloneWithSize(float) const + ?setCursorMoveStyle@QLineEdit@@QAEXW4MoveStyle@QTextCursor@@@Z @ 13996 NONAME ABSENT ; void QLineEdit::setCursorMoveStyle(enum QTextCursor::MoveStyle) + ??0QIdentityProxyModel@@IAE@AAVQIdentityProxyModelPrivate@@PAVQObject@@@Z @ 13997 NONAME ; QIdentityProxyModel::QIdentityProxyModel(class QIdentityProxyModelPrivate &, class QObject *) + ?lineNumberForTextPosition@QTextEngine@@QAEHH@Z @ 13998 NONAME ; int QTextEngine::lineNumberForTextPosition(int) + ?instantInvalidatePropagation@QGraphicsLayout@@SA_NXZ @ 13999 NONAME ; bool QGraphicsLayout::instantInvalidatePropagation(void) + ?beginningOfLine@QTextEngine@@AAEHH@Z @ 14000 NONAME ; int QTextEngine::beginningOfLine(int) + ??0QIdentityProxyModel@@QAE@PAVQObject@@@Z @ 14001 NONAME ; QIdentityProxyModel::QIdentityProxyModel(class QObject *) + ?rightCursorPosition@QTextLayout@@QBEHH@Z @ 14002 NONAME ; int QTextLayout::rightCursorPosition(int) const + ?d_func@QIdentityProxyModel@@ABEPBVQIdentityProxyModelPrivate@@XZ @ 14003 NONAME ; class QIdentityProxyModelPrivate const * QIdentityProxyModel::d_func(void) const + ?columnCount@QIdentityProxyModel@@UBEHABVQModelIndex@@@Z @ 14004 NONAME ; int QIdentityProxyModel::columnCount(class QModelIndex const &) const + ?cursorMoveStyle@QLineEdit@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 14005 NONAME ABSENT ; enum QTextCursor::MoveStyle QLineEdit::cursorMoveStyle(void) const + ?trUtf8@QIdentityProxyModel@@SA?AVQString@@PBD0H@Z @ 14006 NONAME ; class QString QIdentityProxyModel::trUtf8(char const *, char const *, int) + ?setDefaultCursorMoveStyle@QTextDocument@@QAEXW4MoveStyle@QTextCursor@@@Z @ 14007 NONAME ABSENT ; void QTextDocument::setDefaultCursorMoveStyle(enum QTextCursor::MoveStyle) + ?actionText@QUndoCommand@@QBE?AVQString@@XZ @ 14008 NONAME ; class QString QUndoCommand::actionText(void) const + ?tr@QIdentityProxyModel@@SA?AVQString@@PBD0H@Z @ 14009 NONAME ; class QString QIdentityProxyModel::tr(char const *, char const *, int) + ?mapFromSource@QIdentityProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 14010 NONAME ; class QModelIndex QIdentityProxyModel::mapFromSource(class QModelIndex const &) const + ?nextLogicalPosition@QTextEngine@@QBEHH@Z @ 14011 NONAME ; int QTextEngine::nextLogicalPosition(int) const + ?setCursorMoveStyle@QTextLayout@@QAEXW4MoveStyle@QTextCursor@@@Z @ 14012 NONAME ABSENT ; void QTextLayout::setCursorMoveStyle(enum QTextCursor::MoveStyle) + ?doItemsLayout@QTableView@@UAEXXZ @ 14013 NONAME ; void QTableView::doItemsLayout(void) + ?setFocalRadius@QRadialGradient@@QAEXM@Z @ 14014 NONAME ; void QRadialGradient::setFocalRadius(float) + ?qt_painterPathFromVectorPath@@YA?AVQPainterPath@@ABVQVectorPath@@@Z @ 14015 NONAME ; class QPainterPath qt_painterPathFromVectorPath(class QVectorPath const &) + ?tr@QIdentityProxyModel@@SA?AVQString@@PBD0@Z @ 14016 NONAME ; class QString QIdentityProxyModel::tr(char const *, char const *) + ?match@QIdentityProxyModel@@UBE?AV?$QList@VQModelIndex@@@@ABVQModelIndex@@HABVQVariant@@HV?$QFlags@W4MatchFlag@Qt@@@@@Z @ 14017 NONAME ; class QList<class QModelIndex> QIdentityProxyModel::match(class QModelIndex const &, int, class QVariant const &, int, class QFlags<enum Qt::MatchFlag>) const + ?staticMetaObject@QIdentityProxyModel@@2UQMetaObject@@B @ 14018 NONAME ; struct QMetaObject const QIdentityProxyModel::staticMetaObject + ?rowCount@QIdentityProxyModel@@UBEHABVQModelIndex@@@Z @ 14019 NONAME ; int QIdentityProxyModel::rowCount(class QModelIndex const &) const + ?trUtf8@QIdentityProxyModel@@SA?AVQString@@PBD0@Z @ 14020 NONAME ; class QString QIdentityProxyModel::trUtf8(char const *, char const *) + ?cursorMoveStyle@QTextLayout@@QBE?AW4MoveStyle@QTextCursor@@XZ @ 14021 NONAME ABSENT ; enum QTextCursor::MoveStyle QTextLayout::cursorMoveStyle(void) const + ?endOfLine@QTextEngine@@AAEHH@Z @ 14022 NONAME ; int QTextEngine::endOfLine(int) + ?setCursorMoveStyle@QTextLayout@@QAEXW4CursorMoveStyle@Qt@@@Z @ 14023 NONAME ; void QTextLayout::setCursorMoveStyle(enum Qt::CursorMoveStyle) + ?defaultCursorMoveStyle@QTextDocument@@QBE?AW4CursorMoveStyle@Qt@@XZ @ 14024 NONAME ; enum Qt::CursorMoveStyle QTextDocument::defaultCursorMoveStyle(void) const + ?cursorMoveStyle@QTextLayout@@QBE?AW4CursorMoveStyle@Qt@@XZ @ 14025 NONAME ; enum Qt::CursorMoveStyle QTextLayout::cursorMoveStyle(void) const + ?setDefaultCursorMoveStyle@QTextDocument@@QAEXW4CursorMoveStyle@Qt@@@Z @ 14026 NONAME ; void QTextDocument::setDefaultCursorMoveStyle(enum Qt::CursorMoveStyle) + ?setCursorMoveStyle@QLineControl@@QAEXW4CursorMoveStyle@Qt@@@Z @ 14027 NONAME ; void QLineControl::setCursorMoveStyle(enum Qt::CursorMoveStyle) + ?cursorMoveStyle@QLineEdit@@QBE?AW4CursorMoveStyle@Qt@@XZ @ 14028 NONAME ; enum Qt::CursorMoveStyle QLineEdit::cursorMoveStyle(void) const + ?forceToRaster@QSymbianGraphicsSystemEx@@UAEXPAVQWidget@@@Z @ 14029 NONAME ; void QSymbianGraphicsSystemEx::forceToRaster(class QWidget *) + ?releaseCachedGpuResources@QSymbianGraphicsSystemEx@@UAEXXZ @ 14030 NONAME ; void QSymbianGraphicsSystemEx::releaseCachedGpuResources(void) + ?setCursorMoveStyle@QLineEdit@@QAEXW4CursorMoveStyle@Qt@@@Z @ 14031 NONAME ; void QLineEdit::setCursorMoveStyle(enum Qt::CursorMoveStyle) + ?platformExtension@QGraphicsSystem@@UAEPAVQGraphicsSystemEx@@XZ @ 14032 NONAME ; class QGraphicsSystemEx * QGraphicsSystem::platformExtension(void) + ?releaseAllGpuResources@QSymbianGraphicsSystemEx@@UAEXXZ @ 14033 NONAME ; void QSymbianGraphicsSystemEx::releaseAllGpuResources(void) + ?cursorMoveStyle@QLineControl@@QBE?AW4CursorMoveStyle@Qt@@XZ @ 14034 NONAME ; enum Qt::CursorMoveStyle QLineControl::cursorMoveStyle(void) const + ?hasBCM2727@QSymbianGraphicsSystemEx@@UAE_NXZ @ 14035 NONAME ; bool QSymbianGraphicsSystemEx::hasBCM2727(void) + ?hasStaticContentsSupport@QWindowSurface@@QBE_NXZ @ 14036 NONAME ; bool QWindowSurface::hasStaticContentsSupport(void) const + ?hasPartialUpdateSupport@QWindowSurface@@QBE_NXZ @ 14037 NONAME ; bool QWindowSurface::hasPartialUpdateSupport(void) const + ??0QSymbianGraphicsSystemEx@@QAE@XZ @ 14038 NONAME ABSENT ; QSymbianGraphicsSystemEx::QSymbianGraphicsSystemEx(void) + ?hasBCM2727@QSymbianGraphicsSystemEx@@SA_NXZ @ 14039 NONAME ; bool QSymbianGraphicsSystemEx::hasBCM2727(void) diff --git a/src/s60installs/bwins/QtNetworku.def b/src/s60installs/bwins/QtNetworku.def index dd9dfae..49538ef 100644 --- a/src/s60installs/bwins/QtNetworku.def +++ b/src/s60installs/bwins/QtNetworku.def @@ -1237,9 +1237,4 @@ EXPORTS ?qt_static_metacall@QBearerEnginePlugin@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 1236 NONAME ; void QBearerEnginePlugin::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) ?staticMetaObjectExtraData@QNetworkConfigurationManager@@0UQMetaObjectExtraData@@B @ 1237 NONAME ; struct QMetaObjectExtraData const QNetworkConfigurationManager::staticMetaObjectExtraData ?qt_static_metacall@QTcpSocket@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 1238 NONAME ; void QTcpSocket::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - ??0QNetworkProxyQuery@@QAE@ABVQNetworkConfiguration@@GABVQString@@W4QueryType@0@@Z @ 1239 NONAME ; QNetworkProxyQuery::QNetworkProxyQuery(class QNetworkConfiguration const &, unsigned short, class QString const &, enum QNetworkProxyQuery::QueryType) - ??0QNetworkProxyQuery@@QAE@ABVQNetworkConfiguration@@ABVQString@@H1W4QueryType@0@@Z @ 1240 NONAME ; QNetworkProxyQuery::QNetworkProxyQuery(class QNetworkConfiguration const &, class QString const &, int, class QString const &, enum QNetworkProxyQuery::QueryType) - ?networkConfiguration@QNetworkProxyQuery@@QBE?AVQNetworkConfiguration@@XZ @ 1241 NONAME ; class QNetworkConfiguration QNetworkProxyQuery::networkConfiguration(void) const - ?setNetworkConfiguration@QNetworkProxyQuery@@QAEXABVQNetworkConfiguration@@@Z @ 1242 NONAME ; void QNetworkProxyQuery::setNetworkConfiguration(class QNetworkConfiguration const &) - ??0QNetworkProxyQuery@@QAE@ABVQNetworkConfiguration@@ABVQUrl@@W4QueryType@0@@Z @ 1243 NONAME ; QNetworkProxyQuery::QNetworkProxyQuery(class QNetworkConfiguration const &, class QUrl const &, enum QNetworkProxyQuery::QueryType) diff --git a/src/s60installs/bwins/QtOpenGLu.def b/src/s60installs/bwins/QtOpenGLu.def index b4dcf4f..f1edc23 100644 --- a/src/s60installs/bwins/QtOpenGLu.def +++ b/src/s60installs/bwins/QtOpenGLu.def @@ -715,7 +715,7 @@ EXPORTS ?detachTextureFromPool@QGLPixmapData@@QAEXXZ @ 714 NONAME ; void QGLPixmapData::detachTextureFromPool(void) ?reclaimTexture@QGLPixmapData@@QAEXXZ @ 715 NONAME ; void QGLPixmapData::reclaimTexture(void) ?destroyTexture@QGLPixmapData@@QAEXXZ @ 716 NONAME ; void QGLPixmapData::destroyTexture(void) - ?releaseCachedResources@QGLGraphicsSystem@@UAEXXZ @ 717 NONAME ; void QGLGraphicsSystem::releaseCachedResources(void) + ?releaseCachedResources@QGLGraphicsSystem@@UAEXXZ @ 717 NONAME ABSENT ; void QGLGraphicsSystem::releaseCachedResources(void) ?serialNumber@QGLTextureGlyphCache@@QBEHXZ @ 718 NONAME ; int QGLTextureGlyphCache::serialNumber(void) const ?forceToImage@QGLPixmapData@@QAEXXZ @ 719 NONAME ; void QGLPixmapData::forceToImage(void) ?idealFormat@QGLPixmapData@@QAE?AW4Format@QImage@@AAV3@V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 720 NONAME ; enum QImage::Format QGLPixmapData::idealFormat(class QImage &, class QFlags<enum Qt::ImageConversionFlag>) @@ -818,7 +818,7 @@ EXPORTS ?glGenFramebuffers@QGLFunctions@@QAEXHPAI@Z @ 817 NONAME ; void QGLFunctions::glGenFramebuffers(int, unsigned int *) ?glVertexAttrib3fv@QGLFunctions@@QAEXIPBM@Z @ 818 NONAME ; void QGLFunctions::glVertexAttrib3fv(unsigned int, float const *) ?glGetVertexAttribPointerv@QGLFunctions@@QAEXIIPAPAX@Z @ 819 NONAME ; void QGLFunctions::glGetVertexAttribPointerv(unsigned int, unsigned int, void * *) - ?snippetNameStr@QGLEngineSharedShaders@@SA?AVQByteArray@@W4SnippetName@1@@Z @ 820 NONAME ABSENT ; class QByteArray QGLEngineSharedShaders::snippetNameStr(enum QGLEngineSharedShaders::SnippetName) + ?snippetNameStr@QGLEngineSharedShaders@@SA?AVQByteArray@@W4SnippetName@1@@Z @ 820 NONAME ; class QByteArray QGLEngineSharedShaders::snippetNameStr(enum QGLEngineSharedShaders::SnippetName) ?glUniformMatrix4fv@QGLFunctions@@QAEXHHEPBM@Z @ 821 NONAME ; void QGLFunctions::glUniformMatrix4fv(int, int, unsigned char, float const *) ?setContext@QGLTextureGlyphCache@@QAEXPBVQGLContext@@@Z @ 822 NONAME ; void QGLTextureGlyphCache::setContext(class QGLContext const *) ?glDeleteBuffers@QGLFunctions@@QAEXHPBI@Z @ 823 NONAME ; void QGLFunctions::glDeleteBuffers(int, unsigned int const *) @@ -874,4 +874,5 @@ EXPORTS ?staticMetaObjectExtraData@QGraphicsShaderEffect@@0UQMetaObjectExtraData@@B @ 873 NONAME ; struct QMetaObjectExtraData const QGraphicsShaderEffect::staticMetaObjectExtraData ?staticMetaObjectExtraData@QGLEngineShaderManager@@0UQMetaObjectExtraData@@B @ 874 NONAME ; struct QMetaObjectExtraData const QGLEngineShaderManager::staticMetaObjectExtraData ?qt_static_metacall@QGLShaderProgram@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z @ 875 NONAME ; void QGLShaderProgram::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void * *) - + ?platformExtension@QGLGraphicsSystem@@UAEPAVQGraphicsSystemEx@@XZ @ 876 NONAME ; class QGraphicsSystemEx * QGLGraphicsSystem::platformExtension(void) + ?releaseCachedGpuResources@QGLGraphicsSystem@@UAEXXZ @ 877 NONAME ; void QGLGraphicsSystem::releaseCachedGpuResources(void) diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def index 6c4e837..d6b2e93 100644 --- a/src/s60installs/eabi/QtCoreu.def +++ b/src/s60installs/eabi/QtCoreu.def @@ -43,7 +43,7 @@ EXPORTS _Z21qt_regexp_toCanonicalRK7QStringN7QRegExp13PatternSyntaxE @ 42 NONAME _Z23qUnregisterResourceDataiPKhS0_S0_ @ 43 NONAME _Z23qt_qFindChildren_helperPK7QObjectRK7QStringPK7QRegExpRK11QMetaObjectP5QListIPvE @ 44 NONAME - _Z23qt_resolveS60PluginFunci @ 45 NONAME + _Z23qt_resolveS60PluginFunci @ 45 NONAME ABSENT _Z23qt_symbian_throwIfErrori @ 46 NONAME _Z24qGlobalPostedEventsCountv @ 47 NONAME _Z24qcoreStateMachineHandlerv @ 48 NONAME @@ -1294,7 +1294,7 @@ EXPORTS _ZN23QEventDispatcherSymbian24reactivateSocketNotifierEP15QSocketNotifier @ 1293 NONAME _ZN23QEventDispatcherSymbian24sendDeferredSocketEventsEv @ 1294 NONAME _ZN23QEventDispatcherSymbian24unregisterSocketNotifierEP15QSocketNotifier @ 1295 NONAME - _ZN23QEventDispatcherSymbian31reactivateDeferredActiveObjectsEv @ 1296 NONAME + _ZN23QEventDispatcherSymbian31reactivateDeferredActiveObjectsEv @ 1296 NONAME ABSENT _ZN23QEventDispatcherSymbian5flushEv @ 1297 NONAME _ZN23QEventDispatcherSymbian6wakeUpEv @ 1298 NONAME _ZN23QEventDispatcherSymbian9interruptEv @ 1299 NONAME @@ -3713,7 +3713,7 @@ EXPORTS _ZrsR11QDataStreamR12QEasingCurve @ 3712 NONAME _Z26qt_symbian_SetupThreadHeapiR24SStdEpocThreadCreateInfo @ 3713 NONAME _ZN24QAbstractDeclarativeData17objectNameChangedE @ 3714 NONAME DATA 4 - _ZN23QEventDispatcherSymbian36queueDeferredActiveObjectsCompletionEv @ 3715 NONAME + _ZN23QEventDispatcherSymbian36queueDeferredActiveObjectsCompletionEv @ 3715 NONAME ABSENT _ZN23QCoreApplicationPrivate18symbianCommandLineEv @ 3716 NONAME _ZNK11QMetaMethod8revisionEv @ 3717 NONAME _ZNK13QMetaProperty8revisionEv @ 3718 NONAME @@ -3850,11 +3850,11 @@ EXPORTS _ZN11QTranslator18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 3849 NONAME _ZN11QTranslator25staticMetaObjectExtraDataE @ 3850 NONAME DATA 8 _ZN11QTranslator4loadERK7QLocaleRK7QStringS5_S5_S5_ @ 3851 NONAME - _ZN13QActiveObject18maybeQueueForLaterEv @ 3852 NONAME + _ZN13QActiveObject18maybeQueueForLaterEv @ 3852 NONAME ABSENT _ZN13QActiveObject21maybeDeferSocketEventEv @ 3853 NONAME _ZN13QActiveObject21reactivateAndCompleteEv @ 3854 NONAME - _ZN13QActiveObject4waitE5QListIP7CActiveEi @ 3855 NONAME - _ZN13QActiveObject4waitEP7CActivei @ 3856 NONAME + _ZN13QActiveObject4waitE5QListIP7CActiveEi @ 3855 NONAME ABSENT + _ZN13QActiveObject4waitEP7CActivei @ 3856 NONAME ABSENT _ZN13QActiveObjectC2EiP23QEventDispatcherSymbian @ 3857 NONAME _ZN13QActiveObjectD0Ev @ 3858 NONAME _ZN13QActiveObjectD1Ev @ 3859 NONAME diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def index 8cd3dd4..fb09d5c 100644 --- a/src/s60installs/eabi/QtGuiu.def +++ b/src/s60installs/eabi/QtGuiu.def @@ -12104,7 +12104,7 @@ EXPORTS _ZN15QStaticTextItem13setFontEngineEP11QFontEngine @ 12103 NONAME _ZN15QStaticTextItemD1Ev @ 12104 NONAME _ZN15QStaticTextItemD2Ev @ 12105 NONAME - _ZN19QEventDispatcherS6031reactivateDeferredActiveObjectsEv @ 12106 NONAME + _ZN19QEventDispatcherS6031reactivateDeferredActiveObjectsEv @ 12106 NONAME ABSENT _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItemS1_ @ 12107 NONAME _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItemS1_ @ 12108 NONAME _ZN12QLineControl21resetCursorBlinkTimerEv @ 12109 NONAME @@ -12180,7 +12180,7 @@ EXPORTS _ZNK14QVolatileImage7toImageEv @ 12179 NONAME _ZNK14QVolatileImage9byteCountEv @ 12180 NONAME _ZNK14QVolatileImage9constBitsEv @ 12181 NONAME - _ZN15QGraphicsSystem22releaseCachedResourcesEv @ 12182 NONAME + _ZN15QGraphicsSystem22releaseCachedResourcesEv @ 12182 NONAME ABSENT _Z32qt_s60_setPartialScreenInputModeb @ 12183 NONAME _Z18qt_addBitmapToPathffPKhiiiP12QPainterPath @ 12184 NONAME _Z22qt_fontdata_from_indexi @ 12185 NONAME @@ -12288,7 +12288,7 @@ EXPORTS _ZN11QTextEngine27positionAfterVisualMovementEiN11QTextCursor13MoveOperationE @ 12287 NONAME _ZN11QTextEngine9alignLineERK11QScriptLine @ 12288 NONAME _ZN11QTextEngine9endOfLineEi @ 12289 NONAME - _ZN11QTextLayout18setCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12290 NONAME + _ZN11QTextLayout18setCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12290 NONAME ABSENT _ZN11QTextObject18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12291 NONAME _ZN11QTextObject25staticMetaObjectExtraDataE @ 12292 NONAME DATA 8 _ZN11QToolButton18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12293 NONAME @@ -12352,7 +12352,7 @@ EXPORTS _ZN13QSwipeGesture18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12351 NONAME _ZN13QSwipeGesture25staticMetaObjectExtraDataE @ 12352 NONAME DATA 8 _ZN13QTextDocument18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12353 NONAME - _ZN13QTextDocument25setDefaultCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12354 NONAME + _ZN13QTextDocument25setDefaultCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12354 NONAME ABSENT _ZN13QTextDocument25staticMetaObjectExtraDataE @ 12355 NONAME DATA 8 _ZN13QWidgetAction18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12356 NONAME _ZN13QWidgetAction25staticMetaObjectExtraDataE @ 12357 NONAME DATA 8 @@ -12641,7 +12641,7 @@ EXPORTS _ZN9QGroupBox18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12640 NONAME _ZN9QGroupBox25staticMetaObjectExtraDataE @ 12641 NONAME DATA 8 _ZN9QLineEdit18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12642 NONAME - _ZN9QLineEdit18setCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12643 NONAME + _ZN9QLineEdit18setCursorMoveStyleEN11QTextCursor9MoveStyleE @ 12643 NONAME ABSENT _ZN9QLineEdit25staticMetaObjectExtraDataE @ 12644 NONAME DATA 8 _ZN9QListView18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 12645 NONAME _ZN9QListView25staticMetaObjectExtraDataE @ 12646 NONAME DATA 8 @@ -12666,7 +12666,7 @@ EXPORTS _ZNK10QBlittable12capabilitiesEv @ 12665 NONAME _ZNK10QBlittable4sizeEv @ 12666 NONAME _ZNK10QTabWidget14heightForWidthEi @ 12667 NONAME - _ZNK10QTextBlock7isValidEv @ 12668 NONAME + _ZNK10QTextBlock7isValidEv @ 12668 NONAME ABSENT _ZNK10QZipWriter10isWritableEv @ 12669 NONAME _ZNK10QZipWriter17compressionPolicyEv @ 12670 NONAME _ZNK10QZipWriter19creationPermissionsEv @ 12671 NONAME @@ -12738,4 +12738,15 @@ EXPORTS _ZTV19QIdentityProxyModel @ 12737 NONAME _ZTV20QBlittablePixmapData @ 12738 NONAME _Zls6QDebugPK13QSymbianEvent @ 12739 NONAME + _ZN11QTextLayout18setCursorMoveStyleEN2Qt15CursorMoveStyleE @ 12740 NONAME + _ZN13QTextDocument25setDefaultCursorMoveStyleEN2Qt15CursorMoveStyleE @ 12741 NONAME + _ZN15QGraphicsSystem17platformExtensionEv @ 12742 NONAME + _ZN24QSymbianGraphicsSystemEx10hasBCM2727Ev @ 12743 NONAME + _ZN24QSymbianGraphicsSystemEx13forceToRasterEP7QWidget @ 12744 NONAME + _ZN24QSymbianGraphicsSystemEx22releaseAllGpuResourcesEv @ 12745 NONAME + _ZN24QSymbianGraphicsSystemEx25releaseCachedGpuResourcesEv @ 12746 NONAME + _ZN9QLineEdit18setCursorMoveStyleEN2Qt15CursorMoveStyleE @ 12747 NONAME + _ZTI17QGraphicsSystemEx @ 12748 NONAME + _ZTI24QSymbianGraphicsSystemEx @ 12749 NONAME + _ZTV24QSymbianGraphicsSystemEx @ 12750 NONAME diff --git a/src/s60installs/eabi/QtOpenGLu.def b/src/s60installs/eabi/QtOpenGLu.def index c252484..695829c 100644 --- a/src/s60installs/eabi/QtOpenGLu.def +++ b/src/s60installs/eabi/QtOpenGLu.def @@ -719,7 +719,7 @@ EXPORTS _ZN13QGLPixmapData14reclaimTextureEv @ 718 NONAME _ZN13QGLPixmapData21detachTextureFromPoolEv @ 719 NONAME _ZN13QGLPixmapData9hibernateEv @ 720 NONAME - _ZN17QGLGraphicsSystem22releaseCachedResourcesEv @ 721 NONAME + _ZN17QGLGraphicsSystem22releaseCachedResourcesEv @ 721 NONAME ABSENT _ZN13QGLPixmapData11idealFormatER6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 722 NONAME _ZN13QGLPixmapData24releaseNativeImageHandleEv @ 723 NONAME _ZN13QGLPixmapData25initFromNativeImageHandleEPvRK7QString @ 724 NONAME @@ -763,9 +763,9 @@ EXPORTS _ZTI27QGLContextGroupResourceBase @ 762 NONAME ABSENT _ZTV22QGLContextResourceBase @ 763 NONAME ABSENT _ZTV27QGLContextGroupResourceBase @ 764 NONAME ABSENT - _ZThn104_N20QGLTextureGlyphCacheD0Ev @ 765 NONAME ABSENT - _ZThn104_N20QGLTextureGlyphCacheD1Ev @ 766 NONAME ABSENT - _ZThn8_NK16QGLWindowSurface8featuresEv @ 767 NONAME ABSENT + _ZThn104_N20QGLTextureGlyphCacheD0Ev @ 765 NONAME + _ZThn104_N20QGLTextureGlyphCacheD1Ev @ 766 NONAME + _ZThn8_NK16QGLWindowSurface8featuresEv @ 767 NONAME _ZN14QGLSignalProxy18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 768 NONAME _ZN14QGLSignalProxy25staticMetaObjectExtraDataE @ 769 NONAME DATA 8 _ZN16QGLShaderProgram18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 770 NONAME @@ -780,4 +780,7 @@ EXPORTS _ZN9QGLShader25staticMetaObjectExtraDataE @ 779 NONAME DATA 8 _ZN9QGLWidget18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv @ 780 NONAME _ZN9QGLWidget25staticMetaObjectExtraDataE @ 781 NONAME DATA 8 + _ZN17QGLGraphicsSystem17platformExtensionEv @ 782 NONAME + _ZN17QGLGraphicsSystem25releaseCachedGpuResourcesEv @ 783 NONAME + _ZThn4_N17QGLGraphicsSystem25releaseCachedGpuResourcesEv @ 784 NONAME diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby index d6b36e0..bddabd5 100644 --- a/src/s60installs/qt.iby +++ b/src/s60installs/qt.iby @@ -40,7 +40,7 @@ file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll // Phonon MMF backend file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll -data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin // graphicssystems file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll @@ -49,46 +49,42 @@ file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dl // bearer file=ABI_DIR\BUILD_DIR\qsymbianbearer.dll SHARED_LIB_DIR\qsymbianbearer.dll -// S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM, -// so don't bother including those plugins -file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll - // imageformats stubs -data=\epoc32\data\z\resource\qt\plugins\imageformats\qgif.qtplugin resource\qt\plugins\imageformats\qgif.qtplugin -data=\epoc32\data\z\resource\qt\plugins\imageformats\qico.qtplugin resource\qt\plugins\imageformats\qico.qtplugin -data=\epoc32\data\z\resource\qt\plugins\imageformats\qjpeg.qtplugin resource\qt\plugins\imageformats\qjpeg.qtplugin -data=\epoc32\data\z\resource\qt\plugins\imageformats\qmng.qtplugin resource\qt\plugins\imageformats\qmng.qtplugin -data=\epoc32\data\z\resource\qt\plugins\imageformats\qsvg.qtplugin resource\qt\plugins\imageformats\qsvg.qtplugin -data=\epoc32\data\z\resource\qt\plugins\imageformats\qtiff.qtplugin resource\qt\plugins\imageformats\qtiff.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qgif.qtplugin resource\qt\plugins\imageformats\qgif.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qico.qtplugin resource\qt\plugins\imageformats\qico.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qjpeg.qtplugin resource\qt\plugins\imageformats\qjpeg.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qmng.qtplugin resource\qt\plugins\imageformats\qmng.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qsvg.qtplugin resource\qt\plugins\imageformats\qsvg.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\imageformats\qtiff.qtplugin resource\qt\plugins\imageformats\qtiff.qtplugin // codecs stubs -data=\epoc32\data\z\resource\qt\plugins\codecs\qcncodecs.qtplugin resource\qt\plugins\codecs\qcncodecs.qtplugin -data=\epoc32\data\z\resource\qt\plugins\codecs\qjpcodecs.qtplugin resource\qt\plugins\codecs\qjpcodecs.qtplugin -data=\epoc32\data\z\resource\qt\plugins\codecs\qkrcodecs.qtplugin resource\qt\plugins\codecs\qkrcodecs.qtplugin -data=\epoc32\data\z\resource\qt\plugins\codecs\qtwcodecs.qtplugin resource\qt\plugins\codecs\qtwcodecs.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\codecs\qcncodecs.qtplugin resource\qt\plugins\codecs\qcncodecs.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\codecs\qjpcodecs.qtplugin resource\qt\plugins\codecs\qjpcodecs.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\codecs\qkrcodecs.qtplugin resource\qt\plugins\codecs\qkrcodecs.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\codecs\qtwcodecs.qtplugin resource\qt\plugins\codecs\qtwcodecs.qtplugin // iconengines stubs -data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin resource\qt\plugins\iconengines\qsvgicon.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin resource\qt\plugins\iconengines\qsvgicon.qtplugin // qml import plugins file=ABI_DIR\BUILD_DIR\qmlfolderlistmodelplugin.dll SHARED_LIB_DIR\qmlfolderlistmodelplugin.dll file=ABI_DIR\BUILD_DIR\qmlgesturesplugin.dll SHARED_LIB_DIR\qmlgesturesplugin.dll file=ABI_DIR\BUILD_DIR\qmlparticlesplugin.dll SHARED_LIB_DIR\qmlparticlesplugin.dll -data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin -data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin -data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin -data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmldir resource\qt\imports\Qt\labs\folderlistmodel\qmldir -data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmldir resource\qt\imports\Qt\labs\gestures\qmldir -data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmldir resource\qt\imports\Qt\labs\particles\qmldir +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmldir resource\qt\imports\Qt\labs\folderlistmodel\qmldir +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmldir resource\qt\imports\Qt\labs\gestures\qmldir +data=EPOCROOT##epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmldir resource\qt\imports\Qt\labs\particles\qmldir // graphicssystems -data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin -data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin // bearer stub -data=\epoc32\data\z\resource\qt\plugins\bearer\qsymbianbearer.qtplugin resource\qt\plugins\bearer\qsymbianbearer.qtplugin +data=EPOCROOT##epoc32\data\z\resource\qt\plugins\bearer\qsymbianbearer.qtplugin resource\qt\plugins\bearer\qsymbianbearer.qtplugin // Stub sis file data=ZSYSTEM\install\qt_stub.sis System\Install\qt_stub.sis diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index 02c3da0..0d257fb 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -10,10 +10,10 @@ symbian: { TARGET = "Qt$${QT_LIBINFIX}" isEmpty(QT_LIBINFIX) { - TARGET.UID3 = 0x2001E61C + TARGET.UID3 = 0x2001e61c } else { # Always use experimental UID for infixed configuration to avoid UID clash - TARGET.UID3 = 0xE001E61C + TARGET.UID3 = 0xe001e61c } VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION} @@ -40,37 +40,24 @@ symbian: { bearerStubZ = $${PWD}/qsymbianbearer.qtplugin } - contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) { + contains(S60_VERSION, 5.0) { qts60plugindeployment = \ "IF package(0x2003A678) OR package(0x20022E6D)" \ - " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x1028315F)" \ - " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}_3_2.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ - "ELSEIF package(0x102752AE)" \ - " \"$$pluginLocations/qts60plugin_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}_3_2.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ - "ELSEIF package(0x102032BE)" \ - " \"$$pluginLocations/qts60plugin_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}_3_1.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSE" \ - " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ENDIF" \ " \"$$bearerStubZ\" - \"c:$$replace(QT_PLUGINS_BASE_DIR,/,\\)\\bearer\\qsymbianbearer$${QT_LIBINFIX}.qtplugin\"" + qtlibraries.pkg_postrules += qts60plugindeployment } else { # No need to deploy plugins for older platform versions when building on Symbian3 or later - qts60plugindeployment = \ - " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" - bearer_plugin.files = $$QT_BUILD_TREE/plugins/bearer/qsymbianbearer$${QT_LIBINFIX}.dll bearer_plugin.path = c:$$QT_PLUGINS_BASE_DIR/bearer DEPLOYMENT += bearer_plugin } - qtlibraries.pkg_postrules += qts60plugindeployment - qtlibraries.path = c:/sys/bin vendorinfo = \ @@ -86,7 +73,7 @@ symbian: { qtlibraries.pkg_prerules += "; Dependencies of Qt libraries" # It is expected that Symbian^3 and newer phones will have sufficiently new OpenC already installed - contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) { + contains(S60_VERSION, 5.0) { qtlibraries.pkg_prerules += "(0x20013851), 1, 5, 1, {\"PIPS Installer\"}" contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked) { qtlibraries.pkg_prerules += "(0x200110CB), 1, 5, 1, {\"Open C LIBSSL Common\"}" @@ -116,7 +103,7 @@ symbian: { # Support backup & restore for Qt libraries qtbackup.files = backup_registration.xml - qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) + qtbackup.path = c:/private/10202d56/import/packages/$$replace(TARGET.UID3, 0x,) DEPLOYMENT += qtlibraries \ qtbackup \ diff --git a/src/tools/uic/cpp/cppwriteincludes.cpp b/src/tools/uic/cpp/cppwriteincludes.cpp index 748d918..0be3385 100644 --- a/src/tools/uic/cpp/cppwriteincludes.cpp +++ b/src/tools/uic/cpp/cppwriteincludes.cpp @@ -82,7 +82,7 @@ static inline QString moduleHeader(const QString &module, const QString &header) namespace CPP { WriteIncludes::WriteIncludes(Uic *uic) - : m_uic(uic), m_output(uic->output()), m_scriptsActivated(false) + : m_uic(uic), m_output(uic->output()), m_scriptsActivated(false), m_laidOut(false) { // When possible (no namespace) use the "QtModule/QClass" convention // and create a re-mapping of the old header "qclass.h" to it. Do not do this @@ -106,6 +106,7 @@ WriteIncludes::WriteIncludes(Uic *uic) void WriteIncludes::acceptUI(DomUI *node) { m_scriptsActivated = false; + m_laidOut = false; m_localIncludes.clear(); m_globalIncludes.clear(); m_knownClasses.clear(); @@ -160,6 +161,7 @@ void WriteIncludes::acceptWidget(DomWidget *node) void WriteIncludes::acceptLayout(DomLayout *node) { add(node->attributeClass()); + m_laidOut = true; TreeWalker::acceptLayout(node); } @@ -236,6 +238,9 @@ void WriteIncludes::add(const QString &className, bool determineHeader, const QS m_knownClasses.insert(className); + if (!m_laidOut && m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBox"))) + add(QLatin1String("QLayout")); // spacing property of QToolBox) + if (className == QLatin1String("Line")) { // ### hmm, deprecate me! add(QLatin1String("QFrame")); return; diff --git a/src/tools/uic/cpp/cppwriteincludes.h b/src/tools/uic/cpp/cppwriteincludes.h index 39b1ddf..e821536 100644 --- a/src/tools/uic/cpp/cppwriteincludes.h +++ b/src/tools/uic/cpp/cppwriteincludes.h @@ -107,6 +107,7 @@ private: StringMap m_oldHeaderToNewHeader; bool m_scriptsActivated; + bool m_laidOut; }; } // namespace CPP diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 06d054b..cd8c96c 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -1527,7 +1527,7 @@ void WriteInitialization::writeProperties(const QString &varName, case DomProperty::Url: { const DomUrl* u = p->elementUrl(); - propertyValue = QString::fromLatin1("QUrl(%1)") + propertyValue = QString::fromLatin1("QUrl(QString::fromUtf8(%1))") .arg(fixString(u->elementString()->text(), m_dindent)); break; } diff --git a/tests/arthur/common/paintcommands.cpp b/tests/arthur/common/paintcommands.cpp index 184fbb9..298c699 100644 --- a/tests/arthur/common/paintcommands.cpp +++ b/tests/arthur/common/paintcommands.cpp @@ -48,6 +48,7 @@ #include <qtextstream.h> #include <qtextlayout.h> #include <qdebug.h> +#include <QStaticText> #ifdef QT3_SUPPORT #include <q3painter.h> @@ -464,6 +465,10 @@ void PaintCommands::staticInit() "^drawText\\s+(-?\\w*)\\s+(-?\\w*)\\s+\"(.*)\"$", "drawText <x> <y> <text>", "drawText 10 10 \"my text\""); + DECL_PAINTCOMMAND("drawStaticText", command_drawStaticText, + "^drawStaticText\\s+(-?\\w*)\\s+(-?\\w*)\\s+\"(.*)\"$", + "drawStaticText <x> <y> <text>", + "drawStaticText 10 10 \"my text\""); DECL_PAINTCOMMAND("drawTiledPixmap", command_drawTiledPixmap, "^drawTiledPixmap\\s+([\\w.:\\/]*)" "\\s+(-?\\w*)\\s+(-?\\w*)\\s*(-?\\w*)\\s*(-?\\w*)" @@ -1404,6 +1409,21 @@ void PaintCommands::command_drawText(QRegExp re) m_painter->drawText(x, y, txt); } +void PaintCommands::command_drawStaticText(QRegExp re) +{ + if (!m_shouldDrawText) + return; + QStringList caps = re.capturedTexts(); + int x = convertToInt(caps.at(1)); + int y = convertToInt(caps.at(2)); + QString txt = caps.at(3); + + if (m_verboseMode) + printf(" -(lance) drawStaticText(%d, %d, %s)\n", x, y, qPrintable(txt)); + + m_painter->drawStaticText(x, y, QStaticText(txt)); +} + /***************************************************************************************************/ void PaintCommands::command_noop(QRegExp) { diff --git a/tests/arthur/common/paintcommands.h b/tests/arthur/common/paintcommands.h index 6cc0889..04492ea 100644 --- a/tests/arthur/common/paintcommands.h +++ b/tests/arthur/common/paintcommands.h @@ -209,6 +209,7 @@ private: void command_drawRoundedRect(QRegExp re); void command_drawRoundRect(QRegExp re); void command_drawText(QRegExp re); + void command_drawStaticText(QRegExp re); void command_drawTiledPixmap(QRegExp re); void command_path_addEllipse(QRegExp re); void command_path_addPolygon(QRegExp re); diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro index 98e15e8..72c32cb 100644 --- a/tests/auto/declarative/declarative.pro +++ b/tests/auto/declarative/declarative.pro @@ -78,5 +78,7 @@ contains(QT_CONFIG, private_tests) { qpacketprotocol } +contains(QT_CONFIG, opengl): SUBDIRS += qmlshadersplugin + # Tests which should run in Pulse PULSE_TESTS = $$SUBDIRS diff --git a/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp b/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp index 3a626bf..541d9a1 100644 --- a/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp +++ b/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp @@ -58,7 +58,6 @@ Q_DECLARE_METATYPE(QDeclarativeAnchors::Anchor) Q_DECLARE_METATYPE(QDeclarativeAnchorLine::AnchorLine) - class tst_qdeclarativeanchors : public QObject { Q_OBJECT @@ -291,7 +290,7 @@ void tst_qdeclarativeanchors::basicAnchorsRTL() QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(view->rootObject()); foreach(QObject *child, rootItem->children()) { - bool mirrored = QDeclarativeItemPrivate::get(qobject_cast<QDeclarativeItem*>(child))->anchors()->property("mirrored").toBool(); + bool mirrored = QDeclarativeItemPrivate::get(qobject_cast<QDeclarativeItem*>(child))->anchors()->mirrored(); QCOMPARE(mirrored, false); } @@ -299,7 +298,7 @@ void tst_qdeclarativeanchors::basicAnchorsRTL() mirrorAnchors(qobject_cast<QDeclarativeItem*>(child)); foreach(QObject *child, rootItem->children()) { - bool mirrored = QDeclarativeItemPrivate::get(qobject_cast<QDeclarativeItem*>(child))->anchors()->property("mirrored").toBool(); + bool mirrored = QDeclarativeItemPrivate::get(qobject_cast<QDeclarativeItem*>(child))->anchors()->mirrored(); QCOMPARE(mirrored, true); } diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp index 8871e45..9c20bd6 100644 --- a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp +++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp @@ -224,7 +224,7 @@ void tst_QDeclarativeDebug::recursiveObjectTest(QObject *o, const QDeclarativeDe QCOMPARE(p.name(), QString::fromUtf8(pmeta.name())); - if (pmeta.type() < QVariant::UserType) // TODO test complex types + if (pmeta.type() > 0 && pmeta.type() < QVariant::UserType) // TODO test complex types QCOMPARE(p.value(), pmeta.read(o)); if (p.name() == "parent") diff --git a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp index d75960c..0d581d4 100644 --- a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp +++ b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp @@ -174,7 +174,7 @@ void tst_qdeclarativeqt::rect() QCOMPARE(qvariant_cast<QRectF>(object->property("test2")), QRectF(-10, 13, 100, 109.6)); QCOMPARE(qvariant_cast<QRectF>(object->property("test3")), QRectF()); QCOMPARE(qvariant_cast<QRectF>(object->property("test4")), QRectF()); - QCOMPARE(qvariant_cast<QRectF>(object->property("test5")), QRectF()); + QCOMPARE(qvariant_cast<QRectF>(object->property("test5")), QRectF(10, 13, 100, -109)); delete object; } diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp index 1720c33..19b7a76 100644 --- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp +++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp @@ -2431,15 +2431,20 @@ void tst_qdeclarativetextinput::preeditAutoScroll() QTest::qWaitForWindowShown(&view); QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view)); + QSignalSpy cursorRectangleSpy(&input, SIGNAL(cursorRectangleChanged())); + int cursorRectangleChanges = 0; + // test the text is scrolled so the preedit is visible. ic.sendPreeditText(preeditText.mid(0, 3), 1); QVERIFY(input.positionAt(0) != 0); QVERIFY(input.cursorRectangle().left() < input.boundingRect().width()); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); // test the text is scrolled back when the preedit is removed. ic.sendEvent(QInputMethodEvent()); QCOMPARE(input.positionAt(0), 0); QCOMPARE(input.positionAt(input.width()), 5); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); // some tolerance for different fonts. #ifdef Q_OS_LINUX @@ -2455,26 +2460,31 @@ void tst_qdeclarativetextinput::preeditAutoScroll() ic.sendPreeditText(preeditText, i + 1); QVERIFY(input.cursorRectangle().right() >= fm.width(preeditText.at(i)) - error); QVERIFY(input.positionToRectangle(0).x() < x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); x = input.positionToRectangle(0).x(); } for (int i = 1; i >= 0; --i) { ic.sendPreeditText(preeditText, i + 1); QVERIFY(input.cursorRectangle().right() >= fm.width(preeditText.at(i)) - error); QVERIFY(input.positionToRectangle(0).x() > x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); x = input.positionToRectangle(0).x(); } // Test incrementing the preedit cursor doesn't cause further // scrolling when right most text is visible. ic.sendPreeditText(preeditText, preeditText.length() - 3); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); x = input.positionToRectangle(0).x(); for (int i = 2; i >= 0; --i) { ic.sendPreeditText(preeditText, preeditText.length() - i); QCOMPARE(input.positionToRectangle(0).x(), x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); } for (int i = 1; i < 3; ++i) { ic.sendPreeditText(preeditText, preeditText.length() - i); QCOMPARE(input.positionToRectangle(0).x(), x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); } // Test disabling auto scroll. diff --git a/tests/auto/declarative/qmlshadersplugin/main.qml b/tests/auto/declarative/qmlshadersplugin/main.qml new file mode 100644 index 0000000..fc80b39 --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/main.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + + Rectangle { + width: 300 + height: 300 + + Text { + id: textLabel + text: "Hello World" + anchors.centerIn: parent + font.pixelSize: 48 + } + + ShaderEffectItem { + objectName: "effectItem" + property variant source: ShaderEffectSource { objectName: "effectSource"; sourceItem: textLabel; hideSource: true } + property real wiggleAmount: 0.01 + anchors.fill: textLabel + + SequentialAnimation on wiggleAmount { + loops: Animation.Infinite + NumberAnimation { to: -0.01; duration: 500 } + NumberAnimation { to: 0.01; duration: 500 } + } + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + uniform highp float wiggleAmount; + void main(void) + { + highp vec2 wiggledTexCoord = qt_TexCoord0; + wiggledTexCoord.s += sin(4.0 * 3.141592653589 * wiggledTexCoord.t) * wiggleAmount; + gl_FragColor = texture2D(source, wiggledTexCoord.st); + } + " + } + } diff --git a/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro b/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro new file mode 100644 index 0000000..aa0e07a --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro @@ -0,0 +1,18 @@ +load(qttest_p4) + +QT += opengl declarative +SOURCES += tst_qmlshadersplugin.cpp + +SOURCES += \ + ../../../../src/imports/shaders/shadereffectitem.cpp \ + ../../../../src/imports/shaders/shadereffectsource.cpp \ + ../../../../src/imports/shaders/shadereffect.cpp \ + ../../../../src/imports/shaders/shadereffectbuffer.cpp \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.cpp + +HEADERS += \ + ../../../../src/imports/shaders/shadereffectitem.h \ + ../../../../src/imports/shaders/shadereffectsource.h \ + ../../../../src/imports/shaders/shadereffect.h \ + ../../../../src/imports/shaders/shadereffectbuffer.h \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.h diff --git a/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp b/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp new file mode 100644 index 0000000..a904a88 --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp @@ -0,0 +1,205 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QtDeclarative> +#include "../../../../src/imports/shaders/shadereffectitem.h" +#include "../../../../src/imports/shaders/shadereffectsource.h" +#include "../../../../src/imports/shaders/shadereffect.h" + +static const char qt_default_vertex_code[] = + "uniform highp mat4 qt_ModelViewProjectionMatrix;\n" + "attribute highp vec4 qt_Vertex;\n" + "attribute highp vec2 qt_MultiTexCoord0;\n" + "varying highp vec2 qt_TexCoord0;\n" + "void main(void)\n" + "{\n" + "qt_TexCoord0 = qt_MultiTexCoord0;\n" + "gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex;\n" + "}\n"; + +static const char qt_default_fragment_code[] = + "varying highp vec2 qt_TexCoord0;\n" + "uniform lowp sampler2D source;\n" + "void main(void)\n" + "{\n" + "gl_FragColor = texture2D(source, qt_TexCoord0.st);\n" + "}\n"; + +class tst_qmlshadersplugin : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void shaderEffectItemAPI(); + void shaderEffectSourceAPI(); + void combined(); + +private: + QDeclarativeEngine engine; +}; + +void tst_qmlshadersplugin::initTestCase() +{ + const char *uri ="Qt.labs.shaders"; + qmlRegisterType<ShaderEffectItem>(uri, 1, 0, "ShaderEffectItem"); + qmlRegisterType<ShaderEffectSource>(uri, 1, 0, "ShaderEffectSource"); +} + + +void tst_qmlshadersplugin::shaderEffectItemAPI() +{ + // Creation + QString componentStr = "import QtQuick 1.0\n" + "import Qt.labs.shaders 1.0\n" + "ShaderEffectItem {\n" + "property variant source\n" + "width: 200; height: 300\n" + "}"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + + QObject *obj = component.create(); + QTest::qWait(100); + QVERIFY(obj != 0); + + // Default values + QCOMPARE(obj->property("width").toDouble(), 200.); + QCOMPARE(obj->property("height").toDouble(), 300.); + QCOMPARE(obj->property("fragmentShader").toString(), QString("")); + QCOMPARE(obj->property("vertexShader").toString(), QString("")); + QCOMPARE(obj->property("blending").toBool(), true); + QCOMPARE(obj->property("meshResolution").toSize(), QSize(1, 1)); + QCOMPARE(obj->property("visible").toBool(), true); + + // Seting the values + QVERIFY(obj->setProperty("fragmentShader", QString(qt_default_fragment_code))); + QVERIFY(obj->setProperty("vertexShader", QString(qt_default_vertex_code))); + QVERIFY(obj->setProperty("blending", false)); + QVERIFY(obj->setProperty("meshResolution", QSize(20, 10))); + QVERIFY(obj->setProperty("visible", false)); + + QCOMPARE(obj->property("fragmentShader").toString(), QString(qt_default_fragment_code)); + QCOMPARE(obj->property("vertexShader").toString(), QString(qt_default_vertex_code)); + QCOMPARE(obj->property("blending").toBool(), false); + QCOMPARE(obj->property("meshResolution").toSize(), QSize(20, 10)); + QCOMPARE(obj->property("visible").toBool(), false); + + delete obj; +} + +void tst_qmlshadersplugin::shaderEffectSourceAPI() +{ + // Creation + QString componentStr = "import QtQuick 1.0\n" + "import Qt.labs.shaders 1.0\n" + "ShaderEffectSource {}"; + QDeclarativeComponent shaderEffectSourceComponent(&engine); + shaderEffectSourceComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + + QObject *obj = shaderEffectSourceComponent.create(); + QTest::qWait(100); + QVERIFY(obj != 0); + + // Default values + QCOMPARE(obj->property("sourceRect").toRect(), QRect(0, 0, 0, 0)); + QCOMPARE(obj->property("textureSize").toSize(), QSize(0, 0)); + QCOMPARE(obj->property("live").toBool(), true); + QCOMPARE(obj->property("hideSource").toBool(), false); + QCOMPARE(obj->property("wrapMode").toUInt(), static_cast<unsigned int>(ShaderEffectSource::ClampToEdge)); + + // Seting the values + componentStr = "import QtQuick 1.0\n" + "Item {}"; + QDeclarativeComponent itemComponent(&engine); + itemComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast<QDeclarativeItem *> (itemComponent.create()); + QVERIFY(item != 0); + + QVERIFY(obj->setProperty("sourceItem", QVariant::fromValue(item))); + QVERIFY(obj->setProperty("sourceRect", QRect(10, 20, 30, 40))); + QVERIFY(obj->setProperty("textureSize", QSize(50, 100))); + QVERIFY(obj->setProperty("live", false)); + QVERIFY(obj->setProperty("hideSource", true)); + QVERIFY(obj->setProperty("wrapMode", static_cast<unsigned int>(ShaderEffectSource::Repeat))); + + QCOMPARE(obj->property("sourceItem"), QVariant::fromValue(item)); + QCOMPARE(obj->property("sourceRect").toRect(), QRect(10, 20, 30, 40)); + QCOMPARE(obj->property("textureSize").toSize(), QSize(50, 100)); + QCOMPARE(obj->property("live").toBool(), false); + QCOMPARE(obj->property("hideSource").toBool(), true); + QCOMPARE(obj->property("wrapMode").toUInt(), static_cast<unsigned int>(ShaderEffectSource::Repeat)); + + delete item; + delete obj; +} + +void tst_qmlshadersplugin::combined() +{ + QGLFormat format = QGLFormat::defaultFormat(); + format.setSampleBuffers(false); + format.setSwapInterval(1); + + QGLWidget* glWidget = new QGLWidget(format); + glWidget->setAutoFillBackground(false); + + QDeclarativeView view; + view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + view.setAttribute(Qt::WA_OpaquePaintEvent); + view.setAttribute(Qt::WA_NoSystemBackground); + view.setViewport(glWidget); + view.setSource(QUrl::fromLocalFile("main.qml")); + view.show(); + QTest::qWait(1000); + + QObject *item = view.rootObject()->findChild<QDeclarativeItem*>("effectItem"); + QVERIFY(item != 0); + + QObject *src = view.rootObject()->findChild<QDeclarativeItem*>("effectSource"); + QVERIFY(src != 0); + + QCOMPARE(item->property("source"), QVariant::fromValue(src)); +} + +QTEST_MAIN(tst_qmlshadersplugin) + +#include "tst_qmlshadersplugin.moc" diff --git a/tests/auto/headers/tst_headers.cpp b/tests/auto/headers/tst_headers.cpp index 2686a00..335e832 100644 --- a/tests/auto/headers/tst_headers.cpp +++ b/tests/auto/headers/tst_headers.cpp @@ -177,7 +177,7 @@ void tst_Headers::allSourceFilesData() || sourceFile.endsWith("/src/corelib/global/qconfig.h") || sourceFile.endsWith("/src/corelib/global/qconfig.cpp") || sourceFile.endsWith("/src/tools/uic/qclass_lib_map.h") - || sourceFile.endsWith("src/network/access/qnetworkcookiejartlds_p.h") + || sourceFile.endsWith("src/corelib/io/qurltlds_p.h") ) continue; diff --git a/tests/auto/lancelot/scripts/statictext.qps b/tests/auto/lancelot/scripts/statictext.qps new file mode 100644 index 0000000..b62b623 --- /dev/null +++ b/tests/auto/lancelot/scripts/statictext.qps @@ -0,0 +1,122 @@ +drawStaticText -5 5 "Text that is drawn outside the bounds..." + +translate 20 20 +begin_block text_drawing +save + setFont "sansserif" 10 normal + drawStaticText 0 20 "sansserif 10pt, normal" + + setFont "sansserif" 12 normal + drawStaticText 0 40 "sansserif 12pt, normal" + + setFont "sansserif" 10 bold + drawStaticText 0 60 "sansserif 12pt, bold" + + setFont "sansserif" 10 bold italic + drawStaticText 0 80 "sansserif 10pt, bold italic" + + + translate 0 100 + setPen #7fff0000 + + setFont "sansserif" 10 normal + drawStaticText 0 20 "alpha sansserif 10pt, normal" + + setFont "sansserif" 12 normal + drawStaticText 0 40 "alpha sansserif 12pt, normal" + + setFont "sansserif" 10 bold + drawStaticText 0 60 "alpha sansserif 12pt, bold" + + setFont "sansserif" 10 bold italic + drawStaticText 0 80 "alpha sansserif 10pt, bold italic" + + + translate 0 100 + setPen black + save + scale 0.9 0.9 + + setFont "sansserif" 10 normal + drawStaticText 0 20 "scaled sansserif 10pt, normal" + + setFont "sansserif" 12 normal + drawStaticText 0 40 "scaled sansserif 12pt, normal" + + setFont "sansserif" 10 bold + drawStaticText 0 60 "scaled sansserif 12pt, bold" + + setFont "sansserif" 10 bold italic + drawStaticText 0 80 "scaled sansserif 10pt, bold italic" + restore + + translate 0 100 + setPen black + save + translate 200 90 + rotate 185 + + setFont "sansserif" 10 normal + drawStaticText 0 20 "scaled sansserif 10pt, normal" + + setFont "sansserif" 12 normal + drawStaticText 0 40 "scaled sansserif 12pt, normal" + + setFont "sansserif" 10 bold + drawStaticText 0 60 "scaled sansserif 12pt, bold" + + setFont "sansserif" 10 bold italic + drawStaticText 0 80 "scaled sansserif 10pt, bold italic" + restore + + translate 0 100 + gradient_appendStop 0 red + gradient_appendStop 0.5 #00ff00 + gradient_appendStop 1 blue + gradient_setLinear 0 0 200 0 + setPen brush + + setFont "sansserif" 10 normal + drawStaticText 0 0 "gradient sansserif 10pt, normal" + + setFont "sansserif" 12 normal + drawStaticText 0 20 "gradient sansserif 12pt, normal" + + setFont "sansserif" 10 bold + drawStaticText 0 40 "gradient sansserif 12pt, bold" + + setFont "sansserif" 10 bold italic + drawStaticText 0 60 "gradient sansserif 10pt, bold italic" +restore +end_block + +translate 250 0 +drawStaticText 25 520 "clipped to rectangle" +save + setPen #3f000000 + setBrush nobrush + drawRect 20 0 100 500 + setClipRect 20 0 100 500 + setPen black + repeat_block text_drawing +restore + +translate 150 0 +drawStaticText 25 520 "clipped to path" +save + path_moveTo clip 20 0 + path_cubicTo clip 0 200 40 400 20 400 + path_lineTo clip 30 500 + path_lineTo clip 30 0 + path_lineTo clip 40 0 + path_lineTo clip 40 500 + path_lineTo clip 120 500 + path_lineTo clip 120 0 + path_lineTo clip 20 0 + setPen #3f000000 + setBrush nobrush + drawPath clip + setClipPath clip + setPen black + repeat_block text_drawing +restore diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp index c21fd03..b2ce5ca 100644 --- a/tests/auto/networkselftest/tst_networkselftest.cpp +++ b/tests/auto/networkselftest/tst_networkselftest.cpp @@ -371,11 +371,18 @@ void tst_NetworkSelfTest::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp index e4372c5..aefe0b9 100644 --- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp +++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp @@ -141,11 +141,18 @@ void tst_QAbstractNetworkCache::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qaccessibility/tst_qaccessibility.cpp b/tests/auto/qaccessibility/tst_qaccessibility.cpp index 92e3a8b..7b70a5e 100644 --- a/tests/auto/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/qaccessibility/tst_qaccessibility.cpp @@ -238,6 +238,7 @@ private slots: void navigateControllers(); void navigateLabels(); void text(); + void textAttributes(); void setText(); void hideShowTest(); @@ -1563,6 +1564,60 @@ void tst_QAccessibility::text() #endif // !QT3_SUPPORT } +void tst_QAccessibility::textAttributes() +{ + QTextEdit textEdit; + int startOffset; + int endOffset; + QString attributes; + QString text("<html><head></head><body>" + "Hello, <b>this</b> is an <i><b>example</b> text</i>." + "<span style=\"font-family: monospace\">Multiple fonts are used.</span>" + "Multiple <span style=\"font-size: 8pt\">text sizes</span> are used." + "Let's give some color to <span style=\"color:#f0f1f2; background-color:#14f01e\">Qt</span>." + "</body></html>"); + + textEdit.setText(text); + QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(&textEdit); + + QAccessibleTextInterface *textInterface=interface->textInterface(); + + QVERIFY(textInterface); + QCOMPARE(textInterface->characterCount(), 112); + + attributes = textInterface->attributes(10, &startOffset, &endOffset); + QCOMPARE(startOffset, 7); + QCOMPARE(endOffset, 11); + attributes.prepend(';'); + QVERIFY(attributes.contains(QLatin1String(";font-weight:bold;"))); + + attributes = textInterface->attributes(18, &startOffset, &endOffset); + QCOMPARE(startOffset, 18); + QCOMPARE(endOffset, 25); + attributes.prepend(';'); + QVERIFY(attributes.contains(QLatin1String(";font-weight:bold;"))); + QVERIFY(attributes.contains(QLatin1String(";font-style:italic;"))); + + attributes = textInterface->attributes(34, &startOffset, &endOffset); + QCOMPARE(startOffset, 31); + QCOMPARE(endOffset, 55); + attributes.prepend(';'); + QVERIFY(attributes.contains(QLatin1String(";font-family:\"monospace\";"))); + + attributes = textInterface->attributes(65, &startOffset, &endOffset); + QCOMPARE(startOffset, 64); + QCOMPARE(endOffset, 74); + attributes.prepend(';'); + QVERIFY(attributes.contains(QLatin1String(";font-size:8pt;"))); + + attributes = textInterface->attributes(110, &startOffset, &endOffset); + QCOMPARE(startOffset, 109); + QCOMPARE(endOffset, 111); + attributes.prepend(';'); + QVERIFY(attributes.contains(QLatin1String(";background-color:rgb(20,240,30);"))); + QVERIFY(attributes.contains(QLatin1String(";color:rgb(240,241,242);"))); +} + void tst_QAccessibility::setText() { #if !defined(QT3_SUPPORT) @@ -2645,6 +2700,8 @@ void tst_QAccessibility::textEditTest() { { QTextEdit edit; + int startOffset; + int endOffset; QString text = "hello world\nhow are you today?\n"; edit.setText(text); edit.show(); @@ -2654,6 +2711,12 @@ void tst_QAccessibility::textEditTest() QCOMPARE(iface->childCount(), 6); QCOMPARE(iface->text(QAccessible::Value, 4), QString("hello world")); QCOMPARE(iface->text(QAccessible::Value, 5), QString("how are you today?")); + QCOMPARE(iface->textInterface()->textAtOffset(8, QAccessible2::WordBoundary, &startOffset, &endOffset), QString("world")); + QCOMPARE(startOffset, 6); + QCOMPARE(endOffset, 11); + QCOMPARE(iface->textInterface()->textAtOffset(14, QAccessible2::LineBoundary, &startOffset, &endOffset), QString("how are you today?")); + QCOMPARE(startOffset, 12); + QCOMPARE(endOffset, 30); QCOMPARE(iface->text(QAccessible::Value, 6), QString()); QCOMPARE(iface->textInterface()->characterCount(), 31); QFontMetrics fm(edit.font()); @@ -2986,6 +3049,12 @@ void tst_QAccessibility::lineEditTest() QTestAccessibility::clearEvents(); le2->setFocus(Qt::TabFocusReason); QTRY_VERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(le2, 0, QAccessible::Focus))); + + le->setText(QLatin1String("500")); + le->setValidator(new QIntValidator()); + iface->setText(QAccessible::Value, 0, QLatin1String("This text is not a number")); + QCOMPARE(le->text(), QLatin1String("500")); + delete iface; delete le; delete le2; diff --git a/tests/auto/qcssparser/qcssparser.pro b/tests/auto/qcssparser/qcssparser.pro index f696f19..fc3daa3 100644 --- a/tests/auto/qcssparser/qcssparser.pro +++ b/tests/auto/qcssparser/qcssparser.pro @@ -10,7 +10,7 @@ requires(contains(QT_CONFIG,private_tests)) wince*|symbian: { addFiles.files = testdata addFiles.path = . - timesFont.files = C:/Windows/Fonts/times.ttf + timesFont.files = c:/windows/fonts/times.ttf timesFont.path = . DEPLOYMENT += addFiles timesFont } diff --git a/tests/auto/qdatetime/qdatetime.pro b/tests/auto/qdatetime/qdatetime.pro index 08a321e..a3f3091 100644 --- a/tests/auto/qdatetime/qdatetime.pro +++ b/tests/auto/qdatetime/qdatetime.pro @@ -1,5 +1,4 @@ load(qttest_p4) - SOURCES += tst_qdatetime.cpp QT = core @@ -10,6 +9,5 @@ win32-msvc|win32-msvc9x { QMAKE_CFLAGS_RELEASE -= -O1 QMAKE_CXXFLAGS_RELEASE -= -O1 } - - CONFIG += parallel_test +HEADERS = tst_qdatetime.loc diff --git a/tests/auto/qdatetime/tst_qdatetime.cpp b/tests/auto/qdatetime/tst_qdatetime.cpp index 95995e8..5462250 100644 --- a/tests/auto/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/qdatetime/tst_qdatetime.cpp @@ -155,9 +155,16 @@ Q_DECLARE_METATYPE(QTime) tst_QDateTime::tst_QDateTime() { +#ifdef Q_OS_SYMBIAN + // Symbian's timezone server cannot handle DST correctly for dates before year 1997 + uint x1 = QDateTime(QDate(2000, 1, 1), QTime()).toTime_t(); + uint x2 = QDateTime(QDate(2000, 6, 1), QTime()).toTime_t(); + europeanTimeZone = (x1 == 946681200 && x2 == 959810400); +#else uint x1 = QDateTime(QDate(1990, 1, 1), QTime()).toTime_t(); uint x2 = QDateTime(QDate(1990, 6, 1), QTime()).toTime_t(); europeanTimeZone = (x1 == 631148400 && x2 == 644191200); +#endif } tst_QDateTime::~tst_QDateTime() diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp index b31f8cd..7a8c441 100644 --- a/tests/auto/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/qeventloop/tst_qeventloop.cpp @@ -602,10 +602,12 @@ public slots: QTcpSocket *serverSocket = server->nextPendingConnection(); serverSocket->write(data, size); serverSocket->flush(); - QTest::qSleep(200); //allow the TCP/IP stack time to loopback the data, so our socket is ready to read - QCoreApplication::processEvents(QEventLoop::ExcludeSocketNotifiers); + QEventLoop loop; + QTimer::singleShot(200, &loop, SLOT(quit())); //allow the TCP/IP stack time to loopback the data, so our socket is ready to read + loop.exec(QEventLoop::ExcludeSocketNotifiers); testResult = dataArrived; - QCoreApplication::processEvents(); //check the deferred event is processed + QTimer::singleShot(200, &loop, SLOT(quit())); + loop.exec(); //check the deferred event is processed serverSocket->close(); QThread::currentThread()->exit(0); } @@ -631,6 +633,9 @@ public: void tst_QEventLoop::processEventsExcludeSocket() { +#if defined(Q_WS_QWS) + QSKIP("Socket message seems to be leaking through QEventLoop::exec(ExcludeSocketNotifiers) on qws (QTBUG-19699)", SkipAll); +#endif SocketTestThread thread; thread.start(); QVERIFY(thread.wait()); diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp index bc076c5..08d2e88 100644 --- a/tests/auto/qfiledialog/tst_qfiledialog.cpp +++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp @@ -78,6 +78,10 @@ # define STRINGIFY(x) #x # define TOSTRING(x) STRINGIFY(x) # define SRCDIR "C:/Private/" TOSTRING(SYMBIAN_SRCDIR_UID) "/" +#elif defined(Q_OS_UNIX) +#ifdef QT_BUILD_INTERNAL +extern Q_GUI_EXPORT QString qt_tildeExpansion(const QString &path, bool *expanded = 0); +#endif #endif class QNonNativeFileDialog : public QFileDialog @@ -144,6 +148,10 @@ private slots: void clearLineEdit(); void enableChooseButton(); void hooks(); +#ifdef Q_OS_UNIX + void tildeExpansion_data(); + void tildeExpansion(); +#endif private: QByteArray userSettings; @@ -1323,5 +1331,36 @@ void tst_QFiledialog::hooks() QCOMPARE(QFileDialog::getSaveFileName(), QString("saveName")); } +#ifdef Q_OS_UNIX +void tst_QFiledialog::tildeExpansion_data() +{ + QTest::addColumn<QString>("tildePath"); + QTest::addColumn<QString>("expandedPath"); + + QTest::newRow("empty path") << QString() << QString(); + QTest::newRow("~") << QString::fromLatin1("~") << QDir::homePath(); + QTest::newRow("~/some/sub/dir/") << QString::fromLatin1("~/some/sub/dir") << QDir::homePath() + + QString::fromLatin1("/some/sub/dir"); + QString userHome = QString(qgetenv("USER")); + userHome.prepend('~'); + QTest::newRow("current user (~<user> syntax)") << userHome << QDir::homePath(); + QString invalid = QString::fromLatin1("~thisIsNotAValidUserName"); + QTest::newRow("invalid user name") << invalid << invalid; +} + + +void tst_QFiledialog::tildeExpansion() +{ +#ifndef QT_BUILD_INTERNAL + QSKIP("Test case relies on developer build (AUTOTEST_EXPORT)", SkipAll); +#else + QFETCH(QString, tildePath); + QFETCH(QString, expandedPath); + + QCOMPARE(qt_tildeExpansion(tildePath), expandedPath); +#endif +} +#endif + QTEST_MAIN(tst_QFiledialog) #include "tst_qfiledialog.moc" diff --git a/tests/auto/qftp/tst_qftp.cpp b/tests/auto/qftp/tst_qftp.cpp index 1fa0787..7e431cf 100644 --- a/tests/auto/qftp/tst_qftp.cpp +++ b/tests/auto/qftp/tst_qftp.cpp @@ -155,6 +155,7 @@ private: QFtp *ftp; #ifndef QT_NO_BEARERMANAGEMENT + QNetworkConfigurationManager *netConfMan; QSharedPointer<QNetworkSession> networkSessionExplicit; QSharedPointer<QNetworkSession> networkSessionImplicit; #endif @@ -225,10 +226,20 @@ void tst_QFtp::initTestCase_data() void tst_QFtp::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - QNetworkConfigurationManager manager; - networkSessionImplicit = QSharedPointer<QNetworkSession>(new QNetworkSession(manager.defaultConfiguration())); - networkSessionImplicit->open(); - QVERIFY(networkSessionImplicit->waitForOpened(60000)); //there may be user prompt on 1st connect + netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QNetworkConfiguration networkConfiguration = netConfMan->defaultConfiguration(); + if (networkConfiguration.isValid()) { + networkSessionImplicit = QSharedPointer<QNetworkSession>(new QNetworkSession(networkConfiguration)); + if (!networkSessionImplicit->isOpen()) { + networkSessionImplicit->open(); + QVERIFY(networkSessionImplicit->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); + } #endif } @@ -254,6 +265,8 @@ void tst_QFtp::init() } #ifndef QT_NO_BEARERMANAGEMENT if (setSession) { + if (!networkSessionImplicit) + QSKIP("test requires a valid default network configuration", SkipSingle); networkSessionExplicit = networkSessionImplicit; if (!networkSessionExplicit->isOpen()) { networkSessionExplicit->open(); diff --git a/tests/auto/qglyphrun/tst_qglyphrun.cpp b/tests/auto/qglyphrun/tst_qglyphrun.cpp index 3ea84e3..a18a2ac 100644 --- a/tests/auto/qglyphrun/tst_qglyphrun.cpp +++ b/tests/auto/qglyphrun/tst_qglyphrun.cpp @@ -72,6 +72,8 @@ private slots: void drawUnderlinedText(); void drawRightToLeft(); void detach(); + void setRawData(); + void setRawDataAndGetAsVector(); private: int m_testFontId; @@ -284,6 +286,83 @@ void tst_QGlyphRun::drawExistingGlyphs() QCOMPARE(textLayoutDraw, drawGlyphs); } +void tst_QGlyphRun::setRawData() +{ + QGlyphRun glyphRun; + glyphRun.setRawFont(QRawFont::fromFont(m_testFont)); + glyphRun.setGlyphIndexes(QVector<quint32>() << 2 << 2 << 2); + glyphRun.setPositions(QVector<QPointF>() << QPointF(2, 3) << QPointF(20, 3) << QPointF(10, 20)); + + QPixmap baseline(100, 50); + baseline.fill(Qt::white); + { + QPainter p(&baseline); + p.drawGlyphRun(QPointF(3, 2), glyphRun); + } + + QGlyphRun baselineCopied = glyphRun; + + quint32 glyphIndexArray[3] = { 2, 2, 2 }; + QPointF glyphPositionArray[3] = { QPointF(2, 3), QPointF(20, 3), QPointF(10, 20) }; + + glyphRun.setRawData(glyphIndexArray, glyphPositionArray, 3); + + QPixmap rawDataGlyphs(100, 50); + rawDataGlyphs.fill(Qt::white); + { + QPainter p(&rawDataGlyphs); + p.drawGlyphRun(QPointF(3, 2), glyphRun); + } + + quint32 otherGlyphIndexArray[1] = { 2 }; + QPointF otherGlyphPositionArray[1] = { QPointF(2, 3) }; + + glyphRun.setRawData(otherGlyphIndexArray, otherGlyphPositionArray, 1); + + QPixmap baselineCopiedPixmap(100, 50); + baselineCopiedPixmap.fill(Qt::white); + { + QPainter p(&baselineCopiedPixmap); + p.drawGlyphRun(QPointF(3, 2), baselineCopied); + } + +#if defined(DEBUG_SAVE_IMAGE) + baseline.save("setRawData_baseline.png"); + rawDataGlyphs.save("setRawData_rawDataGlyphs.png"); + baselineCopiedPixmap.save("setRawData_baselineCopiedPixmap.png"); +#endif + + QCOMPARE(rawDataGlyphs, baseline); + QCOMPARE(baselineCopiedPixmap, baseline); +} + +void tst_QGlyphRun::setRawDataAndGetAsVector() +{ + QVector<quint32> glyphIndexArray; + glyphIndexArray << 3 << 2 << 1 << 4; + + QVector<QPointF> glyphPositionArray; + glyphPositionArray << QPointF(1, 2) << QPointF(3, 4) << QPointF(5, 6) << QPointF(7, 8); + + QGlyphRun glyphRun; + glyphRun.setRawData(glyphIndexArray.constData(), glyphPositionArray.constData(), 4); + + QVector<quint32> glyphIndexes = glyphRun.glyphIndexes(); + QVector<QPointF> glyphPositions = glyphRun.positions(); + + QCOMPARE(glyphIndexes.size(), 4); + QCOMPARE(glyphPositions.size(), 4); + + QCOMPARE(glyphIndexes, glyphIndexArray); + QCOMPARE(glyphPositions, glyphPositionArray); + + QGlyphRun otherGlyphRun; + otherGlyphRun.setGlyphIndexes(glyphIndexArray); + otherGlyphRun.setPositions(glyphPositionArray); + + QCOMPARE(glyphRun, otherGlyphRun); +} + void tst_QGlyphRun::drawNonExistentGlyphs() { QVector<quint32> glyphIndexes; diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp index 9b7b228..3665b10 100644 --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp @@ -6413,6 +6413,7 @@ void tst_QGraphicsItem::boundingRegion_data() QTest::newRow("(0, 0, 10, 10) | 0.0 | identity | {(0, 0, 10, 10)}") << QLineF(0, 0, 10, 10) << qreal(0.0) << QTransform() << QRegion(QRect(0, 0, 10, 10)); +#if 0 { QRegion r; r += QRect(0, 0, 6, 2); @@ -6430,6 +6431,7 @@ void tst_QGraphicsItem::boundingRegion_data() r += QRect(6, 9, 4, 1); QTest::newRow("(0, 0, 10, 10) | 1.0 | identity | {(0, 0, 10, 10)}") << QLineF(0, 0, 10, 10) << qreal(1.0) << QTransform() << r; } +#endif QTest::newRow("(0, 0, 10, 0) | 0.0 | identity | {(0, 0, 10, 10)}") << QLineF(0, 0, 10, 0) << qreal(0.0) << QTransform() << QRegion(QRect(0, 0, 10, 1)); QTest::newRow("(0, 0, 10, 0) | 0.5 | identity | {(0, 0, 10, 1)}") << QLineF(0, 0, 10, 0) << qreal(0.5) << QTransform() @@ -8029,7 +8031,16 @@ void tst_QGraphicsItem::sorting() QGraphicsView view(&scene); view.setResizeAnchor(QGraphicsView::NoAnchor); view.setTransformationAnchor(QGraphicsView::NoAnchor); +#ifdef Q_OS_SYMBIAN + // Adjust area in devices where scrollbars are thicker than 25 pixels as they will + // obstruct painting otherwise. + int scrollWidth = qMax(25, view.verticalScrollBar()->width()); + int scrollHeight = qMax(25, view.horizontalScrollBar()->height()); + + view.resize(95 + scrollWidth, 75 + scrollHeight); +#else view.resize(120, 100); +#endif view.setFrameStyle(0); view.show(); #ifdef Q_WS_X11 diff --git a/tests/auto/qheaderview/tst_qheaderview.cpp b/tests/auto/qheaderview/tst_qheaderview.cpp index c4d5272..a6ffea3 100644 --- a/tests/auto/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/qheaderview/tst_qheaderview.cpp @@ -565,7 +565,7 @@ void tst_QHeaderView::sectionSize() QFETCH(int, lastVisibleSectionSize); QFETCH(int, persistentSectionSize); -#ifdef Q_OS_WINCE +#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) // We test on a device with doubled pixels. Therefore we need to specify // different boundaries. initialDefaultSize = qMax(view->minimumSectionSize(), 30); @@ -678,6 +678,16 @@ void tst_QHeaderView::visualIndexAt() QFETCH(QList<int>, coordinate); QFETCH(QList<int>, visual); +#ifdef Q_OS_SYMBIAN + // Some Symbian devices have larger minimum section size than what is expected. + // Need to do this here instead of visualIndexAt_data() as view pointer doesn't + // seem to be valid there. + int minSize = view->minimumSectionSize(); + if (minSize > 30) { + coordinate.clear(); + coordinate << -1 << 0 << minSize + 1 << (minSize * 3) + 1 << 99999; + } +#endif view->setStretchLastSection(true); topLevel->show(); diff --git a/tests/auto/qhostinfo/tst_qhostinfo.cpp b/tests/auto/qhostinfo/tst_qhostinfo.cpp index c528a5c..2fa5e76 100644 --- a/tests/auto/qhostinfo/tst_qhostinfo.cpp +++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp @@ -197,13 +197,19 @@ tst_QHostInfo::~tst_QHostInfo() void tst_QHostInfo::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - //start the default network netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif @@ -213,6 +219,13 @@ void tst_QHostInfo::initTestCase() #else ipv6Available = false; ipv6LookupsAvailable = false; + + QTcpServer server; + if (server.listen(QHostAddress("::1"))) { + // We have IPv6 support + ipv6Available = true; + } + #if !defined(QT_NO_GETADDRINFO) // check if the system getaddrinfo can do IPv6 lookups struct addrinfo hint, *result = 0; @@ -235,13 +248,6 @@ void tst_QHostInfo::initTestCase() #endif #endif - QTcpServer server; - if (server.listen(QHostAddress("::1"))) { - // We have IPv6 support - ipv6Available = true; - } - - // run each testcase with and without test enabled QTest::addColumn<bool>("cache"); QTest::newRow("WithCache") << true; diff --git a/tests/auto/qmenubar/tst_qmenubar.cpp b/tests/auto/qmenubar/tst_qmenubar.cpp index 72048d9..d548a51 100644 --- a/tests/auto/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/qmenubar/tst_qmenubar.cpp @@ -515,6 +515,10 @@ void tst_QMenuBar::activatedCount_noQt3() #if defined(Q_WS_MAC) || defined(Q_OS_WINCE_WM) QSKIP("On Mac/WinCE, native key events are needed to test menu action activation", SkipAll); #endif +#ifdef Q_OS_SYMBIAN + QSKIP("On Symbian OS, native key events are needed to test menu action activation", SkipAll); +#endif + // create a popup menu with menu items set the accelerators later... initSimpleMenubar_noQt3(); @@ -1573,6 +1577,12 @@ void tst_QMenuBar::task256322_highlight() file2->setText("file2"); QAction *nothing = win.menuBar()->addAction("nothing"); +#ifdef Q_WS_S60 + // Set minimum width to ensure that menu items are not added to the menu extension. + // Minimum width 360 is the minimal screen width in any supported Symbian device. + win.menuBar()->setMinimumWidth(360); +#endif + win.show(); QTest::qWait(200); diff --git a/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp b/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp index d29ef77..57bf583 100644 --- a/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp +++ b/tests/auto/qnetworkconfigurationmanager/tst_qnetworkconfigurationmanager.cpp @@ -62,7 +62,6 @@ public slots: void cleanup(); private slots: - void usedInThread(); // this test must be first, or it will falsely pass void allConfigurations(); void defaultConfiguration(); void configurationFromIdentifier(); @@ -330,49 +329,6 @@ void tst_QNetworkConfigurationManager::configurationFromIdentifier() QVERIFY(!invalid.isValid()); } -class QNCMTestThread : public QThread -{ -protected: - virtual void run() - { - QNetworkConfigurationManager manager; - preScanConfigs = manager.allConfigurations(); - QSignalSpy spy(&manager, SIGNAL(updateCompleted())); - manager.updateConfigurations(); //initiate scans - QTRY_VERIFY(spy.count() == 1); //wait for scan to complete - configs = manager.allConfigurations(); - } -public: - QList<QNetworkConfiguration> configs; - QList<QNetworkConfiguration> preScanConfigs; -}; - -// regression test for QTBUG-18795 -void tst_QNetworkConfigurationManager::usedInThread() -{ -#if defined Q_OS_MAC && !defined (QT_NO_COREWLAN) - QSKIP("QTBUG-19070 Mac CoreWlan plugin is broken", SkipAll); -#else - QNCMTestThread thread; - connect(&thread, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - thread.start(); - QTestEventLoop::instance().enterLoop(100); //QTRY_VERIFY could take ~90 seconds to time out in the thread - QVERIFY(!QTestEventLoop::instance().timeout()); - qDebug() << "prescan:" << thread.preScanConfigs.count(); - qDebug() << "postscan:" << thread.configs.count(); - - QNetworkConfigurationManager manager; - QList<QNetworkConfiguration> preScanConfigs = manager.allConfigurations(); - QSignalSpy spy(&manager, SIGNAL(updateCompleted())); - manager.updateConfigurations(); //initiate scans - QTRY_VERIFY(spy.count() == 1); //wait for scan to complete - QList<QNetworkConfiguration> configs = manager.allConfigurations(); - QCOMPARE(thread.configs, configs); - //Don't compare pre scan configs, because these may be cached and therefore give different results - //which makes the test unstable. The post scan results should have all configurations every time - //QCOMPARE(thread.preScanConfigs, preScanConfigs); -#endif -} QTEST_MAIN(tst_QNetworkConfigurationManager) #include "tst_qnetworkconfigurationmanager.moc" diff --git a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp index d59a510..1b4256b 100644 --- a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp +++ b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp @@ -42,7 +42,7 @@ #include <QtTest/QtTest> #include <QtNetwork/QNetworkCookieJar> -#include "private/qnetworkcookiejar_p.h" +#include "private/qtldurl_p.h" class tst_QNetworkCookieJar: public QObject { @@ -438,7 +438,7 @@ void tst_QNetworkCookieJar::effectiveTLDs() #endif QFETCH(QString, domain); QFETCH(bool, isTLD); - QCOMPARE(QNetworkCookieJarPrivate::isEffectiveTLD(domain), isTLD); + QCOMPARE(qIsEffectiveTLD(domain), isTLD); } QTEST_MAIN(tst_QNetworkCookieJar) diff --git a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp index ae3436d..2077717 100644 --- a/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp +++ b/tests/auto/qnetworkinterface/tst_qnetworkinterface.cpp @@ -89,11 +89,18 @@ void tst_QNetworkInterface::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp b/tests/auto/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp index 136d4d8..45464ca 100644 --- a/tests/auto/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp +++ b/tests/auto/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp @@ -41,12 +41,10 @@ #include <QtTest/QTest> -#include <QtTest/QTestEventLoop> #include <qcoreapplication.h> #include <qdebug.h> #include <qnetworkproxy.h> -#include <QThread> #include <QNetworkConfiguration> #include <QNetworkConfigurationManager> #include <QNetworkSession> @@ -78,7 +76,6 @@ public: }; private slots: - void systemProxyForQueryCalledFromThread(); void systemProxyForQuery() const; #ifndef QT_NO_BEARERMANAGEMENT void fromConfigurations(); @@ -138,32 +135,6 @@ void tst_QNetworkProxyFactory::systemProxyForQuery() const QFAIL("One or more system proxy lookup failures occurred."); } -class QSPFQThread : public QThread -{ -protected: - virtual void run() - { - proxies = QNetworkProxyFactory::systemProxyForQuery(query); - } -public: - QNetworkProxyQuery query; - QList<QNetworkProxy> proxies; -}; - -//regression test for QTBUG-18799 -void tst_QNetworkProxyFactory::systemProxyForQueryCalledFromThread() -{ - QUrl url(QLatin1String("http://qt.nokia.com")); - QNetworkProxyQuery query(url); - QSPFQThread thread; - thread.query = query; - connect(&thread, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - thread.start(); - QTestEventLoop::instance().enterLoop(5); - QVERIFY(thread.isFinished()); - QCOMPARE(thread.proxies, QNetworkProxyFactory::systemProxyForQuery(query)); -} - #ifndef QT_NO_BEARERMANAGEMENT //Purpose of this test is just to check systemProxyForQuery doesn't hang or crash diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index c70075f..25925bd 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -219,6 +219,8 @@ private Q_SLOTS: void putGetDeleteGetFromHttp(); void sendCustomRequestToHttp_data(); void sendCustomRequestToHttp(); + void connectToIPv6Address_data(); + void connectToIPv6Address(); void ioGetFromData_data(); void ioGetFromData(); @@ -447,14 +449,19 @@ public: QSemaphore ready; bool doClose; bool doSsl; + bool ipv6; bool multiple; int totalConnections; - MiniHttpServer(const QByteArray &data, bool ssl = false, QThread *thread = 0) - : client(0), dataToTransmit(data), doClose(true), doSsl(ssl), + MiniHttpServer(const QByteArray &data, bool ssl = false, QThread *thread = 0, bool useipv6 = false) + : client(0), dataToTransmit(data), doClose(true), doSsl(ssl), ipv6(useipv6), multiple(false), totalConnections(0) { - listen(); + if(useipv6) { + listen(QHostAddress::AnyIPv6); + } else { + listen(); + } if (thread) { connect(thread, SIGNAL(started()), this, SLOT(threadStartedSlot())); moveToThread(thread); @@ -466,7 +473,7 @@ public: protected: void incomingConnection(int socketDescriptor) { - //qDebug() << "incomingConnection" << socketDescriptor; + //qDebug() << "incomingConnection" << socketDescriptor << "doSsl:" << doSsl << "ipv6:" << ipv6; if (!doSsl) { client = new QTcpSocket; client->setSocketDescriptor(socketDescriptor); @@ -1283,11 +1290,18 @@ void tst_QNetworkReply::initTestCase() #endif #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession.reset(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession.reset(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } @@ -2326,6 +2340,49 @@ void tst_QNetworkReply::putGetDeleteGetFromHttp() } +void tst_QNetworkReply::connectToIPv6Address_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QNetworkReply::NetworkError>("error"); + QTest::addColumn<QByteArray>("dataToSend"); + QTest::addColumn<QByteArray>("hostfield"); + QTest::newRow("localhost") << QUrl(QByteArray("http://[::1]")) << QNetworkReply::NoError<< QByteArray("localhost") << QByteArray("[::1]"); + //QTest::newRow("ipv4localhost") << QUrl(QByteArray("http://127.0.0.1")) << QNetworkReply::NoError<< QByteArray("ipv4localhost") << QByteArray("127.0.0.1"); + //to add more test data here +} + +void tst_QNetworkReply::connectToIPv6Address() +{ + QFETCH(QUrl, url); + QFETCH(QNetworkReply::NetworkError, error); + QFETCH(QByteArray, dataToSend); + QFETCH(QByteArray, hostfield); + + QByteArray httpResponse = QByteArray("HTTP/1.0 200 OK\r\nContent-Length: "); + httpResponse += QByteArray::number(dataToSend.size()); + httpResponse += "\r\n\r\n"; + httpResponse += dataToSend; + + MiniHttpServer server(httpResponse, false, NULL/*thread*/, true/*useipv6*/); + server.doClose = true; + + url.setPort(server.serverPort()); + QNetworkRequest request(url); + + QNetworkReplyPtr reply = manager.get(request); + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + QByteArray content = reply->readAll(); + //qDebug() << server.receivedData; + QByteArray hostinfo = "\r\nHost: " + hostfield + ":" + QByteArray::number(server.serverPort()) + "\r\n"; + QSKIP("Fix this -- Host Info verification failed on Windows XP", SkipAll); + QVERIFY(server.receivedData.contains(hostinfo)); + QVERIFY(content == dataToSend); + QCOMPARE(reply->url(), request.url()); + QVERIFY(reply->error() == error); +} + void tst_QNetworkReply::sendCustomRequestToHttp_data() { QTest::addColumn<QUrl>("url"); diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp index 501074f..948d14a 100644 --- a/tests/auto/qpainter/tst_qpainter.cpp +++ b/tests/auto/qpainter/tst_qpainter.cpp @@ -1315,7 +1315,7 @@ void tst_QPainter::drawRect2() p.end(); QRect stroke = getPaintedSize(image, Qt::white); - QCOMPARE(stroke, fill.adjusted(0, 0, 1, 1)); + QCOMPARE(stroke.adjusted(1, 1, 0, 0), fill.adjusted(0, 0, 1, 1)); } } @@ -1412,13 +1412,13 @@ void tst_QPainter::drawPath_data() { QPainterPath p; p.addRect(2.25, 2.25, 10, 10); - QTest::newRow("non-aligned rect") << p << QRect(2, 2, 10, 10) << 10 * 10; + QTest::newRow("non-aligned rect") << p << QRect(3, 3, 10, 10) << 10 * 10; } { QPainterPath p; p.addRect(2.25, 2.25, 10.5, 10.5); - QTest::newRow("non-aligned rect 2") << p << QRect(2, 2, 11, 11) << 11 * 11; + QTest::newRow("non-aligned rect 2") << p << QRect(3, 3, 10, 10) << 10 * 10; } { diff --git a/tests/auto/qscriptextensionplugin/staticplugin/staticplugin.pro b/tests/auto/qscriptextensionplugin/staticplugin/staticplugin.pro index a003338..65c4e8f 100644 --- a/tests/auto/qscriptextensionplugin/staticplugin/staticplugin.pro +++ b/tests/auto/qscriptextensionplugin/staticplugin/staticplugin.pro @@ -1,5 +1,6 @@ TEMPLATE = lib CONFIG += static plugin +CONFIG -= create_prl # not needed, and complicates debug/release SOURCES = staticplugin.cpp RESOURCES = staticplugin.qrc QT = core script diff --git a/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem new file mode 100644 index 0000000..e1b731d --- /dev/null +++ b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICkTCCAfqgAwIBAgIJAL1nF+PLAF2KMA0GCSqGSIb3DQEBBQUAMGkxKzApBgNV +BAoMIkjElcSCxrLDvyDKjeG6v8qI4bq34bi7IFLDqWPDtnJkxZ0xFTATBgNVBAsM +DOOIp0HjiYHvvatCQzEWMBQGA1UEAwwNSm9obm55IEd1aXRhcjELMAkGA1UEBhMC +Tk8wHhcNMTEwNTA1MDgxMzEwWhcNMTEwNjA0MDgxMzEwWjBpMSswKQYDVQQKDCJI +xJXEgsayw78gyo3hur/KiOG6t+G4uyBSw6ljw7ZyZMWdMRUwEwYDVQQLDAzjiKdB +44mB772rQkMxFjAUBgNVBAMMDUpvaG5ueSBHdWl0YXIxCzAJBgNVBAYTAk5PMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2zSxS17I6596dJE/VAmGz+06D9S8n +3C0hnIGNVu+LwbgDJTvOw0SzNj4UP72UGgd3UI1KLBg5XWIsRNmE3COJMMh6syjI +L1Ept+tVXxGL6n4gl+0nZ7dkUyxJmeFtigYrL+qCH1yd5rmf3sC3jO4IosuAiG66 +IDkJEVo64NT8ZQIDAQABo0EwPzA9BgNVHREENjA0gQ9hcm5lQGZvb2Jhci5vcmeC +Dnd3dy5mb29iYXIub3JngRFiamFybmVAZm9vYmFyLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQAqVhbC0/EUFdnKlYV3PrknwGX1dPEPGJuIQHa0KpoicvNiOhs1HxBDYbzc +F6wcAMEynq4YwGKhcQLZOs2mo0LreAjA9rU/yBnqrnUW/4gxtUUvmJKK+62IjfLp +eO1L+1NcEMJiaZf8fip4VXhXdOYUhgE8WUZ1UJRC6w3T/yAgcQ== +-----END CERTIFICATE----- diff --git a/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san new file mode 100644 index 0000000..f46a637 --- /dev/null +++ b/tests/auto/qsslcertificate/certificates/cert-ss-san-utf8.pem.san @@ -0,0 +1,5 @@ +[subj_alt_name] +subjectAltName=\ + email:arne@foobar.org,\ + DNS:www.foobar.org,\ + email:bjarne@foobar.org diff --git a/tests/auto/qsslcertificate/certificates/gencertificates.sh b/tests/auto/qsslcertificate/certificates/gencertificates.sh index 9f873d9..0bac191 100755 --- a/tests/auto/qsslcertificate/certificates/gencertificates.sh +++ b/tests/auto/qsslcertificate/certificates/gencertificates.sh @@ -90,5 +90,15 @@ openssl req -x509 -in req-san.pem -out $outname -key rsa-pri-1024.pem \ -config san.cnf -extensions subj_alt_name /bin/cp san.cnf $outname.san +#--- Non-ASCII Subject --------------------------------------------------------------------- +echo -e "\n generating self signed root cert. with Subject containing UTF-8 characters ..." +outname=cert-ss-san-utf8.pem +#subject="/O=HĕĂƲÿ ʍếʈặḻ Récördŝ/OU=㈧A㉁ォBC/CN=Johnny Guitar/C=NO" +subject=$'/O=H\xc4\x95\xc4\x82\xc6\xb2\xc3\xbf \xca\x8d\xe1\xba\xbf\xca\x88\xe1\xba\xb7\xe1\xb8\xbb R\xc3\xa9c\xc3\xb6rd\xc5\x9d/OU=\xe3\x88\xa7A\xe3\x89\x81\xef\xbd\xabBC/CN=Johnny Guitar/C=NO' +openssl req -out req-san.pem -new -key rsa-pri-1024.pem -utf8 -subj "$subject" +openssl req -x509 -in req-san.pem -out $outname -key rsa-pri-1024.pem \ + -config san.cnf -extensions subj_alt_name -nameopt multiline,utf8,-esc_msb +/bin/cp san.cnf $outname.san + echo -e "\n cleaning up ..." /bin/rm rsa-pri-1024.pem rsa-pub-1024.* req*.pem diff --git a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp index c38147d..9276685 100644 --- a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp +++ b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp @@ -96,6 +96,7 @@ private slots: void digest_data(); void digest(); void alternateSubjectNames_data(); + void utf8SubjectNames(); void alternateSubjectNames(); void publicKey_data(); void publicKey(); @@ -407,6 +408,27 @@ void tst_QSslCertificate::alternateSubjectNames() } } +void tst_QSslCertificate::utf8SubjectNames() +{ + QSslCertificate cert = QSslCertificate::fromPath("certificates/cert-ss-san-utf8.pem", QSsl::Pem, + QRegExp::FixedString).first(); + QVERIFY(!cert.isNull()); + + // O is "Heavy Metal Records" with heavy use of "decorations" like accents, umlauts etc., + // OU uses arabian / asian script letters near codepoint 64K. + // strings split where the compiler would otherwise find three-digit hex numbers + static const char *o = "H\xc4\x95\xc4\x82\xc6\xb2\xc3\xbf \xca\x8d\xe1\xba\xbf\xca\x88\xe1\xba" + "\xb7\xe1\xb8\xbb R\xc3\xa9" "c" "\xc3\xb6rd\xc5\x9d"; + static const char *ou = "\xe3\x88\xa7" "A" "\xe3\x89\x81\xef\xbd\xab" "BC"; + + // the following two tests should help find "\x"-literal encoding bugs in the test itself + QCOMPARE(cert.subjectInfo("O").length(), QString::fromUtf8(o).length()); + QCOMPARE (cert.subjectInfo("O").toUtf8().toHex(), QByteArray(o).toHex()); + + QCOMPARE(cert.subjectInfo("O"), QString::fromUtf8(o)); + QCOMPARE(cert.subjectInfo("OU"), QString::fromUtf8(ou)); +} + void tst_QSslCertificate::publicKey_data() { QTest::addColumn<QString>("certFilePath"); @@ -519,13 +541,13 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"certificates/*\" fixed der") << QString("certificates/*") << int(QRegExp::FixedString) << false << 0; QTest::newRow("\"certificates/*\" regexp pem") << QString("certificates/*") << int(QRegExp::RegExp) << true << 0; QTest::newRow("\"certificates/*\" regexp der") << QString("certificates/*") << int(QRegExp::RegExp) << false << 0; - QTest::newRow("\"certificates/*\" wildcard pem") << QString("certificates/*") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("\"certificates/*\" wildcard pem") << QString("certificates/*") << int(QRegExp::Wildcard) << true << 5; QTest::newRow("\"certificates/*\" wildcard der") << QString("certificates/*") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"c*/c*.pem\" fixed pem") << QString("c*/c*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"c*/c*.pem\" fixed der") << QString("c*/c*.pem") << int(QRegExp::FixedString) << false << 0; QTest::newRow("\"c*/c*.pem\" regexp pem") << QString("c*/c*.pem") << int(QRegExp::RegExp) << true << 0; QTest::newRow("\"c*/c*.pem\" regexp der") << QString("c*/c*.pem") << int(QRegExp::RegExp) << false << 0; - QTest::newRow("\"c*/c*.pem\" wildcard pem") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("\"c*/c*.pem\" wildcard pem") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << true << 5; QTest::newRow("\"c*/c*.pem\" wildcard der") << QString("c*/c*.pem") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"d*/c*.pem\" fixed pem") << QString("d*/c*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"d*/c*.pem\" fixed der") << QString("d*/c*.pem") << int(QRegExp::FixedString) << false << 0; @@ -535,7 +557,7 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"d*/c*.pem\" wildcard der") << QString("d*/c*.pem") << int(QRegExp::Wildcard) << false << 0; QTest::newRow("\"c.*/c.*.pem\" fixed pem") << QString("c.*/c.*.pem") << int(QRegExp::FixedString) << true << 0; QTest::newRow("\"c.*/c.*.pem\" fixed der") << QString("c.*/c.*.pem") << int(QRegExp::FixedString) << false << 0; - QTest::newRow("\"c.*/c.*.pem\" regexp pem") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << true << 4; + QTest::newRow("\"c.*/c.*.pem\" regexp pem") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << true << 5; QTest::newRow("\"c.*/c.*.pem\" regexp der") << QString("c.*/c.*.pem") << int(QRegExp::RegExp) << false << 0; QTest::newRow("\"c.*/c.*.pem\" wildcard pem") << QString("c.*/c.*.pem") << int(QRegExp::Wildcard) << true << 0; QTest::newRow("\"c.*/c.*.pem\" wildcard der") << QString("c.*/c.*.pem") << int(QRegExp::Wildcard) << false << 0; @@ -546,7 +568,7 @@ void tst_QSslCertificate::fromPath_data() QTest::newRow("\"d.*/c.*.pem\" wildcard pem") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << true << 0; QTest::newRow("\"d.*/c.*.pem\" wildcard der") << QString("d.*/c.*.pem") << int(QRegExp::Wildcard) << false << 0; #ifdef Q_OS_LINUX - QTest::newRow("absolute path wildcard pem") << QString(QDir::currentPath() + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 4; + QTest::newRow("absolute path wildcard pem") << QString(QDir::currentPath() + "/certificates/*.pem") << int(QRegExp::Wildcard) << true << 5; #endif QTest::newRow("trailing-whitespace") << QString("more-certificates/trailing-whitespace.pem") << int(QRegExp::FixedString) << true << 1; @@ -769,7 +791,7 @@ void tst_QSslCertificate::nulInCN() QString cn = cert.subjectInfo(QSslCertificate::CommonName); QVERIFY(cn != "www.bank.com"); - static const char realCN[] = "www.bank.com\\x00.badguy.com"; + static const char realCN[] = "www.bank.com\0.badguy.com"; QCOMPARE(cn, QString::fromLatin1(realCN, sizeof realCN - 1)); } diff --git a/tests/auto/qstatictext/tst_qstatictext.cpp b/tests/auto/qstatictext/tst_qstatictext.cpp index 29845d9..e14c9db 100644 --- a/tests/auto/qstatictext/tst_qstatictext.cpp +++ b/tests/auto/qstatictext/tst_qstatictext.cpp @@ -361,7 +361,7 @@ bool tst_QStaticText::supportsTransformations() const QPaintEngine::Type type = engine->type(); if (type == QPaintEngine::OpenGL -#if !defined(Q_WS_WIN) && !defined(Q_WS_X11) +#if !defined(Q_WS_WIN) && !defined(Q_WS_X11) && !defined(Q_WS_MAC) || type == QPaintEngine::Raster #endif ) @@ -601,7 +601,7 @@ void tst_QStaticText::setPenPlainText() QStaticText staticText("XXXXX"); staticText.setTextFormat(Qt::PlainText); - p.drawStaticText(0, fm.ascent(), staticText); + p.drawStaticText(0, 0, staticText); } QImage img = image.toImage(); diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp index 11fd986..c19b168 100644 --- a/tests/auto/qstring/tst_qstring.cpp +++ b/tests/auto/qstring/tst_qstring.cpp @@ -4334,7 +4334,7 @@ void tst_QString::localeAwareCompare_data() void tst_QString::localeAwareCompare() { #ifdef Q_OS_SYMBIAN - QSKIP("QTBUG-16921: There is no way to set up the system locale, so this test is not reliable in Symbian."); + QSKIP("QTBUG-16921: There is no way to set up the system locale, so this test is not reliable in Symbian.", SkipSingle); #else #ifdef Q_OS_WIN # ifndef Q_OS_WINCE diff --git a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp index 1799019..a4fc1a9 100644 --- a/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp +++ b/tests/auto/qstylesheetstyle/tst_qstylesheetstyle.cpp @@ -1608,7 +1608,12 @@ class ChangeEventWidget : public QWidget static bool recurse = false; if (!recurse) { recurse = true; + +#ifdef Q_OS_SYMBIAN + QStyle *style = new QWindowsStyle(); +#else QStyle *style = new QMotifStyle; +#endif style->setParent(this); setStyle(style); recurse = false; diff --git a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp index 22a90cf..f4249ab 100644 --- a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp +++ b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp @@ -146,6 +146,15 @@ void tst_QtConcurrentMap::map() QCOMPARE(numberList, QList<Number>() << 2 << 4 << 6); QtConcurrent::map(numberList.begin(), numberList.end(), &Number::multiplyBy2).waitForFinished(); QCOMPARE(numberList, QList<Number>() << 4 << 8 << 12); + +#ifdef Q_COMPILER_LAMBDA + // lambda + QtConcurrent::map(list, [](int &x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList<int>() << 128 << 256 << 384); + QtConcurrent::map(list.begin(), list.end(), [](int &x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList<int>() << 256 << 512 << 768); +#endif + } // functors don't take arguments by reference, making these no-ops @@ -170,6 +179,14 @@ void tst_QtConcurrentMap::map() QCOMPARE(list, QList<int>() << 1 << 2 << 3); QtConcurrent::map(list.begin(), list.end(), multiplyBy2Immutable).waitForFinished(); QCOMPARE(list, QList<int>() << 1 << 2 << 3); + +#ifdef Q_COMPILER_LAMBDA + // lambda + QtConcurrent::map(list, [](int x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList<int>() << 1 << 2 << 3); + QtConcurrent::map(list.begin(), list.end(), [](int x){x *= 2;}).waitForFinished(); + QCOMPARE(list, QList<int>() << 1 << 2 << 3); +#endif } // Linked lists and forward iterators @@ -2303,6 +2320,10 @@ void tst_QtConcurrentMap::stlContainers() { #ifdef QT_NO_STL QSKIP("Qt compiled without STL support", SkipAll); +#elif defined(Q_COMPILER_RVALUE_REFS) + //mapped uses &Container::push_back, but in c++0x, std::vector has two overload of it + // meaning it is not possible to take the address of that function anymore. + QSKIP("mapped do not work with c++0x stl vector", SkipAll); #else std::vector<int> vector; vector.push_back(1); diff --git a/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp b/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp index e4e9479..cacb09a 100644 --- a/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp +++ b/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp @@ -67,6 +67,8 @@ private slots: #if 0 void createFunctor(); #endif + void functor(); + void lambda(); }; #if 0 @@ -444,6 +446,71 @@ void tst_QtConcurrentRun::createFunctor() } #endif +struct Functor { + int operator()() { return 42; } + double operator()(double a, double b) { return a/b; } + int operator()(int a, int b) { return a/b; } + void operator()(int) { } + void operator()(int, int, int) { } + void operator()(int, int, int, int) { } + void operator()(int, int, int, int, int) { } + void operator()(int, int, int, int, int, int) { } +}; + +void tst_QtConcurrentRun::functor() +{ + //this test functor without result_type, decltype need to be supported by the compiler +#ifndef Q_COMPILER_DECLTYPE + QSKIP("Compiler do not suport decltype", SkipAll); +#else + Functor f; + { + QFuture<int> fut = QtConcurrent::run(f); + QCOMPARE(fut.result(), 42); + } + { + QFuture<double> fut = QtConcurrent::run(f, 8.5, 1.8); + QCOMPARE(fut.result(), (8.5/1.8)); + } + { + QFuture<int> fut = QtConcurrent::run(f, 19, 3); + QCOMPARE(fut.result(), int(19/3)); + } + { + QtConcurrent::run(f, 1).waitForFinished(); + QtConcurrent::run(f, 1,2).waitForFinished(); + QtConcurrent::run(f, 1,2,3).waitForFinished(); + QtConcurrent::run(f, 1,2,3,4).waitForFinished(); + QtConcurrent::run(f, 1,2,3,4,5).waitForFinished(); + } +#endif +} + + +void tst_QtConcurrentRun::lambda() +{ +#ifndef Q_COMPILER_LAMBDA + QSKIP("Compiler do not suport lambda", SkipAll); +#else + + QCOMPARE(QtConcurrent::run([](){ return 45; }).result(), 45); + QCOMPARE(QtConcurrent::run([](int a){ return a+15; }, 12).result(), 12+15); + QCOMPARE(QtConcurrent::run([](int a, double b){ return a + b; }, 12, 15).result(), double(12+15)); + QCOMPARE(QtConcurrent::run([](int a , int, int, int, int b){ return a + b; }, 1, 2, 3, 4, 5).result(), 1 + 5); + +#ifdef Q_COMPILER_INITIALIZER_LISTS + { + QString str { "Hello World Foo" }; + QFuture<QStringList> f1 = QtConcurrent::run([&](){ return str.split(' '); }); + auto r = f1.result(); + QCOMPARE(r, QStringList({"Hello", "World", "Foo"})); + } +#endif + +#endif +} + + #include "tst_qtconcurrentrun.moc" #else diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp index 3416a7c..a7c2604 100644 --- a/tests/auto/qtcpserver/tst_qtcpserver.cpp +++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp @@ -116,6 +116,7 @@ private slots: private: #ifndef QT_NO_BEARERMANAGEMENT QNetworkSession *networkSession; + QNetworkConfigurationManager *netConfMan; #endif }; @@ -154,10 +155,20 @@ void tst_QTcpServer::initTestCase_data() void tst_QTcpServer::initTestCase() { #ifndef QT_NO_BEARERMANAGEMENT - QNetworkConfigurationManager man; - networkSession = new QNetworkSession(man.defaultConfiguration(), this); - networkSession->open(); - QVERIFY(networkSession->waitForOpened()); + netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QNetworkConfiguration networkConfiguration = netConfMan->defaultConfiguration(); + if (networkConfiguration.isValid()) { + networkSession = new QNetworkSession(networkConfiguration); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); + } #endif } diff --git a/tests/auto/qtextlayout/tst_qtextlayout.cpp b/tests/auto/qtextlayout/tst_qtextlayout.cpp index b6adc2b..2414ab3 100644 --- a/tests/auto/qtextlayout/tst_qtextlayout.cpp +++ b/tests/auto/qtextlayout/tst_qtextlayout.cpp @@ -127,6 +127,8 @@ private slots: void textWithSurrogates_qtbug15679(); void textWidthWithStackedTextEngine(); void textWidthWithLineSeparator(); + void cursorInLigatureWithMultipleLines(); + void xToCursorForLigatures(); private: QFont testFont; @@ -1460,5 +1462,45 @@ void tst_QTextLayout::textWidthWithLineSeparator() QCOMPARE(line1.naturalTextWidth(), line2.naturalTextWidth()); } +void tst_QTextLayout::cursorInLigatureWithMultipleLines() +{ +#if !defined(Q_WS_MAC) + QSKIP("This test can not be run on Mac", SkipAll); +#endif + QTextLayout layout("first line finish", QFont("Times", 20)); + layout.beginLayout(); + QTextLine line = layout.createLine(); + line.setLineWidth(70); + line = layout.createLine(); + layout.endLayout(); + + // The second line will be "finish", with "fi" as a ligature + QVERIFY(line.cursorToX(0) != line.cursorToX(1)); +} + +void tst_QTextLayout::xToCursorForLigatures() +{ +#if !defined(Q_WS_MAC) + QSKIP("This test can not be run on Mac", SkipAll); +#endif + QTextLayout layout("fi", QFont("Times", 20)); + layout.beginLayout(); + QTextLine line = layout.createLine(); + layout.endLayout(); + + QVERIFY(line.xToCursor(0) != line.xToCursor(line.naturalTextWidth() / 2)); + + // U+0061 U+0308 + QTextLayout layout2(QString::fromUtf8("\x61\xCC\x88"), QFont("Times", 20)); + + layout2.beginLayout(); + line = layout2.createLine(); + layout2.endLayout(); + + qreal width = line.naturalTextWidth(); + QVERIFY(line.xToCursor(0) == line.xToCursor(width / 2) || + line.xToCursor(width) == line.xToCursor(width / 2)); +} + QTEST_MAIN(tst_QTextLayout) #include "tst_qtextlayout.moc" diff --git a/tests/auto/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/qtoolbutton/tst_qtoolbutton.cpp index 427a505..a4aa312 100644 --- a/tests/auto/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/qtoolbutton/tst_qtoolbutton.cpp @@ -231,7 +231,7 @@ void tst_QToolButton::task176137_autoRepeatOfAction() void tst_QToolButton::sendMouseClick() { - QTest::mouseClick(w, Qt::LeftButton, 0, QPoint(7,7)); + QTest::mouseClick(w, Qt::LeftButton, 0); } QTEST_MAIN(tst_QToolButton) diff --git a/tests/auto/qtreewidget/tst_qtreewidget.cpp b/tests/auto/qtreewidget/tst_qtreewidget.cpp index dc878c4..7d2cdfb 100644 --- a/tests/auto/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/qtreewidget/tst_qtreewidget.cpp @@ -50,6 +50,8 @@ #include <qlineedit.h> #include <QScrollBar> #include <QStyledItemDelegate> +#include <QDesktopWidget> +#include <QApplication> #include "../../shared/util.h" @@ -3102,10 +3104,21 @@ void tst_QTreeWidget::task206367_duplication() QWidget topLevel; QTreeWidget treeWidget(&topLevel); topLevel.show(); +#ifndef Q_WS_S60 treeWidget.resize(200, 200); +#endif treeWidget.setSortingEnabled(true); QTreeWidgetItem* rootItem = new QTreeWidgetItem( &treeWidget, QStringList("root") ); +#ifdef Q_WS_S60 + // Ensure that eight items fit into tree widget. In Symbian VGA devices 8 rows of + // data will take more than 200 pixels. + int calculatedHeight = treeWidget.visualItemRect(treeWidget.topLevelItem(0)).height() + + 2 * QApplication::style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, 0); + calculatedHeight *= 8; // eight 'rows': header, root and 2 items with 2 children + treeWidget.resize(200, qMax(200, calculatedHeight)); +#endif + for (int nFile = 0; nFile < 2; nFile++ ) { QTreeWidgetItem* itemFile = new QTreeWidgetItem(rootItem, QStringList(QString::number(nFile))); for (int nRecord = 0; nRecord < 2; nRecord++) @@ -3211,6 +3224,13 @@ void tst_QTreeWidget::task239150_editorWidth() { //we check that an item with no text will get an editor with a correct size QTreeWidget tree; +#ifdef Q_OS_SYMBIAN + //By default widgets are 640*360 in Symbian. Call to create_sys() sets the real size of the widget. + //Therefore, with VGA Symbian devices, we need to update the widget width to match screen width. + //As VGA devices have larger font, longer texts wouldn't otherwise fit into tree widget. + if (QApplication::desktop() && QApplication::desktop()->availableGeometry().width() > tree.width()) + tree.resize(QApplication::desktop()->availableGeometry().size()); +#endif QStyleOptionFrameV2 opt; opt.init(&tree); diff --git a/tests/auto/qudpsocket/tst_qudpsocket.cpp b/tests/auto/qudpsocket/tst_qudpsocket.cpp index 9ca049b..a38082e 100644 --- a/tests/auto/qudpsocket/tst_qudpsocket.cpp +++ b/tests/auto/qudpsocket/tst_qudpsocket.cpp @@ -148,11 +148,18 @@ void tst_QUdpSocket::initTestCase_data() #ifndef QT_NO_BEARERMANAGEMENT netConfMan = new QNetworkConfigurationManager(this); + netConfMan->updateConfigurations(); + connect(netConfMan, SIGNAL(updateCompleted()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); networkConfiguration = netConfMan->defaultConfiguration(); - networkSession = QSharedPointer<QNetworkSession>(new QNetworkSession(networkConfiguration)); - if (!networkSession->isOpen()) { - networkSession->open(); - QVERIFY(networkSession->waitForOpened(30000)); + if (networkConfiguration.isValid()) { + networkSession = QSharedPointer<QNetworkSession>(new QNetworkSession(networkConfiguration)); + if (!networkSession->isOpen()) { + networkSession->open(); + QVERIFY(networkSession->waitForOpened(30000)); + } + } else { + QVERIFY(!(netConfMan->capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)); } #endif } diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp index 613053b..b78679b 100644 --- a/tests/auto/qurl/tst_qurl.cpp +++ b/tests/auto/qurl/tst_qurl.cpp @@ -49,6 +49,7 @@ #include <qurl.h> #include <qtextcodec.h> #include <qmap.h> +#include "private/qtldurl_p.h" // For testsuites #define IDNA_ACE_PREFIX "xn--" @@ -88,6 +89,8 @@ public slots: void init(); void cleanup(); private slots: + void effectiveTLDs_data(); + void effectiveTLDs(); void getSetCheck(); void constructing(); void assignment(); @@ -3167,8 +3170,8 @@ void tst_QUrl::nameprep_testsuite_data() #ifdef QT_BUILD_INTERNAL QT_BEGIN_NAMESPACE -extern void qt_nameprep(QString *source, int from); -extern bool qt_check_std3rules(const QChar *, int); +Q_CORE_EXPORT extern void qt_nameprep(QString *source, int from); +Q_CORE_EXPORT extern bool qt_check_std3rules(const QChar *, int); QT_END_NAMESPACE #endif @@ -4005,5 +4008,28 @@ void tst_QUrl::taskQTBUG_8701() QCOMPARE(foo_uni_bar, QUrl(foo_uni_bar, QUrl::StrictMode).toString()); } +void tst_QUrl::effectiveTLDs_data() +{ + QTest::addColumn<QUrl>("domain"); + QTest::addColumn<QString>("TLD"); + + QTest::newRow("yes0") << QUrl::fromEncoded("http://test.co.uk") << ".co.uk"; + QTest::newRow("yes1") << QUrl::fromEncoded("http://test.com") << ".com"; + QTest::newRow("yes2") << QUrl::fromEncoded("http://www.test.de") << ".de"; + QTest::newRow("yes3") << QUrl::fromEncoded("http://test.ulm.museum") << ".ulm.museum"; + QTest::newRow("yes4") << QUrl::fromEncoded("http://www.com.krodsherad.no") << ".krodsherad.no"; + QTest::newRow("yes5") << QUrl::fromEncoded("http://www.co.uk.1.bg") << ".1.bg"; + QTest::newRow("yes6") << QUrl::fromEncoded("http://www.com.com.cn") << ".com.cn"; + QTest::newRow("yes7") << QUrl::fromEncoded("http://www.test.org.ws") << ".org.ws"; + QTest::newRow("yes9") << QUrl::fromEncoded("http://www.com.co.uk.wallonie.museum") << ".wallonie.museum"; +} + +void tst_QUrl::effectiveTLDs() +{ + QFETCH(QUrl, domain); + QFETCH(QString, TLD); + QCOMPARE(domain.topLevelDomain(), TLD); +} + QTEST_MAIN(tst_QUrl) #include "tst_qurl.moc" diff --git a/tests/auto/quuid/tst_quuid.cpp b/tests/auto/quuid/tst_quuid.cpp index 6333e83..4948312 100644 --- a/tests/auto/quuid/tst_quuid.cpp +++ b/tests/auto/quuid/tst_quuid.cpp @@ -60,7 +60,14 @@ public: tst_QUuid(); private slots: + void fromChar(); void toString(); + void fromString(); + void toByteArray(); + void fromByteArray(); + void toRfc4122(); + void fromRfc4122(); + void check_QDataStream(); void isNull(); void equal(); void notEqual(); @@ -83,16 +90,106 @@ public: tst_QUuid::tst_QUuid() { - uuidA = "{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"; - uuidB = "{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"; + //"{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"; + uuidA = QUuid(0xfc69b59e, 0xcc34 ,0x4436 ,0xa4 ,0x3c ,0xee ,0x95 ,0xd1 ,0x28 ,0xb8 ,0xc5); + + //"{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"; + uuidB = QUuid(0x1ab6e93a ,0xb1cb ,0x4a87 ,0xba ,0x47 ,0xec ,0x7e ,0x99 ,0x03 ,0x9a ,0x7b); } +void tst_QUuid::fromChar() +{ + QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + QCOMPARE(uuidA, QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c5")); + QCOMPARE(uuidA, QUuid("fc69b59e-cc34-4436-a43c-ee95d128b8c5")); + QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34-4436-a43c-ee95d128b8c")); + QCOMPARE(QUuid(), QUuid("{fc69b59e-cc34")); + QCOMPARE(QUuid(), QUuid("fc69b59e-cc34-")); + QCOMPARE(QUuid(), QUuid("fc69b59e-cc34")); + QCOMPARE(QUuid(), QUuid("cc34")); + QCOMPARE(QUuid(), QUuid(NULL)); + + QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} void tst_QUuid::toString() { QCOMPARE(uuidA.toString(), QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + + QCOMPARE(uuidB.toString(), QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")); +} + +void tst_QUuid::fromString() +{ + QCOMPARE(uuidA, QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QString("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(uuidA, QUuid(QString("fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(QUuid(), QUuid(QString("{fc69b59e-cc34-4436-a43c-ee95d128b8c"))); + + QCOMPARE(uuidB, QUuid(QString("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} + +void tst_QUuid::toByteArray() +{ + QCOMPARE(uuidA.toByteArray(), QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}")); + + QCOMPARE(uuidB.toByteArray(), QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}")); +} + +void tst_QUuid::fromByteArray() +{ + QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5}"))); + QCOMPARE(uuidA, QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(uuidA, QUuid(QByteArray("fc69b59e-cc34-4436-a43c-ee95d128b8c5"))); + QCOMPARE(QUuid(), QUuid(QByteArray("{fc69b59e-cc34-4436-a43c-ee95d128b8c"))); + + QCOMPARE(uuidB, QUuid(QByteArray("{1ab6e93a-b1cb-4a87-ba47-ec7e99039a7b}"))); +} + +void tst_QUuid::toRfc4122() +{ + QCOMPARE(uuidA.toRfc4122(), QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5")); + + QCOMPARE(uuidB.toRfc4122(), QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b")); } +void tst_QUuid::fromRfc4122() +{ + QCOMPARE(uuidA, QUuid::fromRfc4122(QByteArray::fromHex("fc69b59ecc344436a43cee95d128b8c5"))); + + QCOMPARE(uuidB, QUuid::fromRfc4122(QByteArray::fromHex("1ab6e93ab1cb4a87ba47ec7e99039a7b"))); +} + +void tst_QUuid::check_QDataStream() +{ + QUuid tmp; + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + out.setByteOrder(QDataStream::BigEndian); + out << uuidA; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + in.setByteOrder(QDataStream::BigEndian); + in >> tmp; + QCOMPARE(uuidA, tmp); + } + { + QDataStream out(&ar,QIODevice::WriteOnly); + out.setByteOrder(QDataStream::LittleEndian); + out << uuidA; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + in.setByteOrder(QDataStream::LittleEndian); + in >> tmp; + QCOMPARE(uuidA, tmp); + } +} void tst_QUuid::isNull() { diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp index dbec65c..a035cf3 100644 --- a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp +++ b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp @@ -53,6 +53,18 @@ public: private slots: void createUuid(); + void fromChar(); + void toString(); + void fromString(); + void toByteArray(); + void fromByteArray(); + void toRfc4122(); + void fromRfc4122(); + void toDataStream(); + void fromDataStream(); + void isNull(); + void operatorLess(); + void operatorMore(); }; void tst_bench_QUuid::createUuid() @@ -62,5 +74,118 @@ void tst_bench_QUuid::createUuid() } } +void tst_bench_QUuid::fromChar() +{ + QBENCHMARK { + QUuid uuid("{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"); + } +} + +void tst_bench_QUuid::toString() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toString(); + } +} + +void tst_bench_QUuid::fromString() +{ + QString string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; + QBENCHMARK { + QUuid uuid(string); + } +} + +void tst_bench_QUuid::toByteArray() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toByteArray(); + } +} + +void tst_bench_QUuid::fromByteArray() +{ + QByteArray string = "{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"; + QBENCHMARK { + QUuid uuid(string); + } +} + +void tst_bench_QUuid::toRfc4122() +{ + QUuid uuid = QUuid::createUuid(); + QBENCHMARK { + uuid.toRfc4122(); + } +} + +void tst_bench_QUuid::fromRfc4122() +{ + QByteArray string = QByteArray::fromHex("67C8770B44F1410AAB9AF9B5446F13EE"); + QBENCHMARK { + QUuid uuid = QUuid::fromRfc4122(string); + } +} + +void tst_bench_QUuid::toDataStream() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + QBENCHMARK { + out << uuid1; + } + } +} + +void tst_bench_QUuid::fromDataStream() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + QByteArray ar; + { + QDataStream out(&ar,QIODevice::WriteOnly); + out << uuid1; + } + { + QDataStream in(&ar,QIODevice::ReadOnly); + QBENCHMARK { + in >> uuid2; + } + } +} + +void tst_bench_QUuid::isNull() +{ + QUuid uuid = QUuid(); + QBENCHMARK { + uuid.isNull(); + } +} + +void tst_bench_QUuid::operatorLess() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + uuid2 = QUuid::createUuid(); + QBENCHMARK { + uuid1 < uuid2; + } +} + +void tst_bench_QUuid::operatorMore() +{ + QUuid uuid1, uuid2; + uuid1 = QUuid::createUuid(); + uuid2 = QUuid::createUuid(); + QBENCHMARK { + uuid1 > uuid2; + } +} + QTEST_MAIN(tst_bench_QUuid); #include "tst_quuid.moc" diff --git a/tests/benchmarks/declarative/declarative.pro b/tests/benchmarks/declarative/declarative.pro index cb02a35..73e40b2 100644 --- a/tests/benchmarks/declarative/declarative.pro +++ b/tests/benchmarks/declarative/declarative.pro @@ -10,6 +10,6 @@ SUBDIRS += \ script \ qmltime -contains(QT_CONFIG, opengl): SUBDIRS += painting +contains(QT_CONFIG, opengl): SUBDIRS += painting qmlshadersplugin include(../trusted-benchmarks.pri) diff --git a/tests/benchmarks/declarative/qmlshadersplugin/GaussianBlur.qml b/tests/benchmarks/declarative/qmlshadersplugin/GaussianBlur.qml new file mode 100644 index 0000000..ee4c029 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/GaussianBlur.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + id: gaussianBlur + property variant source: 0 + property real radius: 8; + property real deviation: Math.sqrt(-((radius+1) * (radius+1)) / (2 * Math.log(1.0 / 255.0))) + property bool live: true + + ShaderEffectItem { + id: cache + anchors.fill: parent + visible: !gaussianBlur.live + property variant source: ShaderEffectSource { sourceItem: verticalBlur; live: false; hideSource: true } + } + + GaussianDirectionalBlur { + id: verticalBlur + anchors.fill: parent + + deltaX: 0.0 + deltaY: 1.0/parent.height + + source: ShaderEffectSource { sourceItem: horizontalBlur; hideSource: true } + deviation: gaussianBlur.deviation + radius: gaussianBlur.radius + } + + GaussianDirectionalBlur { + id: horizontalBlur + anchors.fill: parent + blending: false + + deltaX: 1.0/parent.width + deltaY: 0.0 + + source: gaussianBlur.source + deviation: gaussianBlur.deviation + radius: gaussianBlur.radius + } + +} diff --git a/tests/benchmarks/declarative/qmlshadersplugin/GaussianDirectionalBlur.qml b/tests/benchmarks/declarative/qmlshadersplugin/GaussianDirectionalBlur.qml new file mode 100644 index 0000000..e09dde2 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/GaussianDirectionalBlur.qml @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +// Note 1. This shader implements gaussian blur without dynamic array access from inside shader loops (Optional feature in OpenGLES 2.0). +// Note 2. Shader code is generated to avoid ecessive if-else structure in fragment shader. Code re-generation (very slow!) happens if blur radius is changed. + +ShaderEffectItem { + id: effect + property variant source: 0 + property real deviation: Math.sqrt(-((radius+1) * (radius+1)) / (2 * Math.log(1.0 / 255.0))); + property real radius: 8; + property real deltaX: 0.0 + property real deltaY: 0.0 + + property real gaussianSum: 0.0 + property real startIndex: 0.0 + property real samples: radius * 2 + + property variant gwts: [] + property variant delta: Qt.vector3d(effect.deltaX, effect.deltaY, effect.startIndex); + property variant factor_0_2: Qt.vector3d(effect.gwts[0], effect.gwts[1], effect.gwts[2]); + property variant factor_3_5: Qt.vector3d(effect.gwts[3],effect.gwts[4],effect.gwts[5]); + property variant factor_6_8: Qt.vector3d(effect.gwts[6],effect.gwts[7],effect.gwts[8]); + property variant factor_9_11: Qt.vector3d(effect.gwts[9],effect.gwts[10],effect.gwts[11]); + property variant factor_12_14: Qt.vector3d(effect.gwts[12],effect.gwts[13],effect.gwts[14]); + property variant factor_15_17: Qt.vector3d(effect.gwts[15],effect.gwts[16],effect.gwts[17]); + property variant factor_18_20: Qt.vector3d(effect.gwts[18],effect.gwts[19],effect.gwts[20]); + property variant factor_21_23: Qt.vector3d(effect.gwts[21],effect.gwts[22],effect.gwts[23]); + property variant factor_24_26: Qt.vector3d(effect.gwts[24],effect.gwts[25],effect.gwts[26]); + property variant factor_27_29: Qt.vector3d(effect.gwts[27],effect.gwts[28],effect.gwts[29]); + property variant factor_30_32: Qt.vector3d(effect.gwts[30],effect.gwts[31],effect.gwts[32]); + + //Gaussian function = h(x):=(1/sqrt(2*3.14159*(D^2))) * %e^(-(x^2)/(2*(D^2))); + function gausFunc(x){ + return (1/Math.sqrt(2*3.1415926*(Math.pow(effect.deviation,2)))) * Math.pow(2.7182818,-((Math.pow(x,2))/(2*(Math.pow(effect.deviation,2))))); + } + + function calcGWTS() { + var n = new Array(Math.floor(effect.samples)); + var step + for (var i = 0; i < effect.samples; i++) { + step = -effect.samples/2 + i + 0.5 + n[i] = gausFunc(step); + } + return n; + } + + function buildFragmentShader() { + + var shaderSteps = [ + "gl_FragColor += texture2D(source, texCoord) * factor_0_2.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_0_2.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_0_2.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_3_5.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_3_5.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_3_5.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_6_8.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_6_8.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_6_8.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_9_11.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_9_11.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_9_11.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_12_14.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_12_14.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_12_14.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_15_17.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_15_17.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_15_17.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_18_20.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_18_20.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_18_20.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_21_23.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_21_23.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_21_23.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_24_26.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_24_26.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_24_26.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_27_29.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_27_29.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_27_29.z; texCoord += shift;", + + "gl_FragColor += texture2D(source, texCoord) * factor_30_32.x; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_30_32.y; texCoord += shift;", + "gl_FragColor += texture2D(source, texCoord) * factor_30_32.z; texCoord += shift;" + ] + + var shader = fragmentShader_begin + var samples = effect.samples + if (samples > 32) { + console.log("GaussianBlur: Maximum of 32 blur samples exceeded!") + samples = 32 + } + + for (var i = 0; i < samples; i++) { + shader += shaderSteps[i] + } + + shader += fragmentShader_end + effect.fragmentShader = shader + + } + + onDeviationChanged:{ + effect.startIndex = -effect.samples/2 + 0.5 + effect.gwts = calcGWTS(); + var sum = 0.0; + for (var j = 0; j < effect.samples; j++) { + sum += effect.gwts[j]; + } + effect.gaussianSum = sum + } + + Component.onCompleted:{ + effect.startIndex = -effect.samples/2 + 0.5 + effect.gwts = calcGWTS(); + var sum = 0.0; + for (var j = 0; j < effect.samples; j++) { + sum += effect.gwts[j]; + } + effect.gaussianSum = sum + buildFragmentShader() + } + + onSamplesChanged: { + buildFragmentShader() + } + + property string fragmentShader_begin: + " + varying mediump vec2 qt_TexCoord0; + uniform sampler2D source; + uniform highp vec3 delta; + uniform highp vec3 factor_0_2; + uniform highp vec3 factor_3_5; + uniform highp vec3 factor_6_8; + uniform highp vec3 factor_9_11; + uniform highp vec3 factor_12_14; + uniform highp vec3 factor_15_17; + uniform highp vec3 factor_18_20; + uniform highp vec3 factor_21_23; + uniform highp vec3 factor_24_26; + uniform highp vec3 factor_27_29; + uniform highp vec3 factor_30_32; + uniform highp float gaussianSum; + + void main() { + highp vec2 shift = vec2(delta.x, delta.y); + highp float index = delta.z; + mediump vec2 texCoord = qt_TexCoord0 + (shift * index); + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + " + + property string fragmentShader_end: + " + if (gaussianSum > 0.0) + gl_FragColor /= gaussianSum; + } + " +} diff --git a/tests/benchmarks/declarative/qmlshadersplugin/GaussianDropShadow.qml b/tests/benchmarks/declarative/qmlshadersplugin/GaussianDropShadow.qml new file mode 100644 index 0000000..4e8c8d3 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/GaussianDropShadow.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + id: gaussianDropShadow + + property color shadowColor: Qt.rgba(0.5, 0.5, 0.5, 1.0) + property variant source: 0 + property real radius: 8 + property real deviation: Math.sqrt(-((radius+1) * (radius+1)) / (2 * Math.log(1.0 / 255.0))) + property bool live: true + + GaussianBlur { + id: blur + anchors.fill: parent + radius: gaussianDropShadow.radius + deviation: gaussianDropShadow.deviation + source: gaussianDropShadow.source + live: gaussianDropShadow.live + } + + ShaderEffectItem { + id: shadow + property color shadowColor: gaussianDropShadow.shadowColor + property variant source: ShaderEffectSource { sourceItem: blur; hideSource: true } + anchors.fill: parent + + fragmentShader: + " + varying mediump vec2 qt_TexCoord0; + uniform sampler2D source; + uniform lowp vec4 shadowColor; + + void main() { + lowp vec4 sourceColor = texture2D(source, qt_TexCoord0); + gl_FragColor = mix(vec4(0), shadowColor, sourceColor.a); + } + " + } +} + diff --git a/tests/benchmarks/declarative/qmlshadersplugin/TestGaussianDropShadow.qml b/tests/benchmarks/declarative/qmlshadersplugin/TestGaussianDropShadow.qml new file mode 100755 index 0000000..4831758 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/TestGaussianDropShadow.qml @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + id: main + width: 360 + height: 640 + + property bool liveShadows: true + property real r: 0 + + NumberAnimation on r { + loops: Animation.Infinite + from: 0 + to: 360 + duration: 3000 + } + + Image { + id: background + width: main.width + height: main.height + fillMode: Image.Tile + source: "bg.jpg" + } + + GaussianDropShadow { + x: image1.x + 50 + y: image1.y + 50 + width: image1.width + height: image1.height + shadowColor: "#88000000" + source: ShaderEffectSource { sourceItem: image1; hideSource: false; sourceRect: Qt.rect(-10, -10, image1.width + 20, image1.height + 20) } + radius: 12.0 + deviation: 12 + rotation: r + } + + Image { + id: image1 + anchors.fill: parent + source: "drop_shadow_small.png" + smooth: true + rotation: r + } + + GaussianDropShadow { + x: image2.x + 50 + y: image2.y + 50 + width: image2.width + height: image2.height + shadowColor: "#88000000" + source: ShaderEffectSource { sourceItem: image2; hideSource: false; sourceRect: Qt.rect(-10, -10, image2.width + 20, image2.height + 20) } + radius: 12.0 + deviation: 12 + rotation: -r + } + + Image { + id: image2 + anchors.fill: parent + source: "drop_shadow_small.png" + smooth: true + rotation: -r + } +} diff --git a/tests/benchmarks/declarative/qmlshadersplugin/TestWater.qml b/tests/benchmarks/declarative/qmlshadersplugin/TestWater.qml new file mode 100755 index 0000000..c4fbc2a --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/TestWater.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + width: 360 + height: 640 + + Image { + id: image + width: parent.width + height: parent.height * 0.65 + source: "sky.jpg" + smooth: true + } + Water { + sourceItem: image + intensity: 5 + height: parent.height - image.height + } +} diff --git a/tests/benchmarks/declarative/qmlshadersplugin/Water.qml b/tests/benchmarks/declarative/qmlshadersplugin/Water.qml new file mode 100644 index 0000000..6a1ec1c --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/Water.qml @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + id: root + property alias sourceItem: effectsource.sourceItem + property real intensity: 1 + property bool waving: true + anchors.top: sourceItem.bottom + width: sourceItem.width + height: sourceItem.height + + ShaderEffectItem { + anchors.fill: parent + property variant source: effectsource + property real f: 0 + property real f2: 0 + property alias intensity: root.intensity + smooth: true + + ShaderEffectSource { + id: effectsource + hideSource: false + smooth: true + } + + fragmentShader: + " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + uniform lowp float qt_Opacity; + uniform highp float f; + uniform highp float f2; + uniform highp float intensity; + + void main() { + const highp float twopi = 3.141592653589 * 2.0; + + highp float distanceFactorToPhase = pow(qt_TexCoord0.y + 0.5, 8.0) * 5.0; + highp float ofx = sin(f * twopi + distanceFactorToPhase) / 100.0; + highp float ofy = sin(f2 * twopi + distanceFactorToPhase * qt_TexCoord0.x) / 60.0; + + highp float intensityDampingFactor = (qt_TexCoord0.x + 0.1) * (qt_TexCoord0.y + 0.2); + highp float distanceFactor = (1.0 - qt_TexCoord0.y) * 4.0 * intensity * intensityDampingFactor; + + ofx *= distanceFactor; + ofy *= distanceFactor; + + highp float x = qt_TexCoord0.x + ofx; + highp float y = 1.0 - qt_TexCoord0.y + ofy; + + highp float fake = (sin((ofy + ofx) * twopi) + 0.5) * 0.05 * (1.2 - qt_TexCoord0.y) * intensity * intensityDampingFactor; + + highp vec4 pix = + texture2D(source, vec2(x, y)) * 0.6 + + texture2D(source, vec2(x-fake, y)) * 0.15 + + texture2D(source, vec2(x, y-fake)) * 0.15 + + texture2D(source, vec2(x+fake, y)) * 0.15 + + texture2D(source, vec2(x, y+fake)) * 0.15; + + highp float darken = 0.6 - (ofx - ofy) / 2.0; + pix.b *= 1.2 * darken; + pix.r *= 0.9 * darken; + pix.g *= darken; + + gl_FragColor = qt_Opacity * vec4(pix.r, pix.g, pix.b, 1.0); + } + " + + NumberAnimation on f { + running: root.waving + loops: Animation.Infinite + from: 0 + to: 1 + duration: 2410 + } + NumberAnimation on f2 { + running: root.waving + loops: Animation.Infinite + from: 0 + to: 1 + duration: 1754 + } + } +} diff --git a/tests/benchmarks/declarative/qmlshadersplugin/bg.jpg b/tests/benchmarks/declarative/qmlshadersplugin/bg.jpg Binary files differnew file mode 100644 index 0000000..4d22143 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/bg.jpg diff --git a/tests/benchmarks/declarative/qmlshadersplugin/drop_shadow_small.png b/tests/benchmarks/declarative/qmlshadersplugin/drop_shadow_small.png Binary files differnew file mode 100755 index 0000000..4a9b283 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/drop_shadow_small.png diff --git a/tests/benchmarks/declarative/qmlshadersplugin/qmlshadersplugin.pro b/tests/benchmarks/declarative/qmlshadersplugin/qmlshadersplugin.pro new file mode 100644 index 0000000..c4f6925 --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/qmlshadersplugin.pro @@ -0,0 +1,23 @@ +QT += opengl declarative testlib + +TARGET = tst_performance + +SOURCES += \ + tst_performance.cpp \ + ../../../../src/imports/shaders/shadereffectitem.cpp \ + ../../../../src/imports/shaders/shadereffectsource.cpp \ + ../../../../src/imports/shaders/shadereffect.cpp \ + ../../../../src/imports/shaders/shadereffectbuffer.cpp \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.cpp + +HEADERS += \ + ../../../../src/imports/shaders/shadereffectitem.h \ + ../../../../src/imports/shaders/shadereffectsource.h \ + ../../../../src/imports/shaders/shadereffect.h \ + ../../../../src/imports/shaders/shadereffectbuffer.h \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.h + +OTHER_FILES += \ + *.qml \ + *.png \ + *.jpg diff --git a/tests/benchmarks/declarative/qmlshadersplugin/sky.jpg b/tests/benchmarks/declarative/qmlshadersplugin/sky.jpg Binary files differnew file mode 100644 index 0000000..8fc19ed --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/sky.jpg diff --git a/tests/benchmarks/declarative/qmlshadersplugin/tst_performance.cpp b/tests/benchmarks/declarative/qmlshadersplugin/tst_performance.cpp new file mode 100644 index 0000000..728334a --- /dev/null +++ b/tests/benchmarks/declarative/qmlshadersplugin/tst_performance.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/qtest.h> +#include <QtDeclarative> +#include "../../../../src/imports/shaders/shadereffectitem.h" +#include "../../../../src/imports/shaders/shadereffectsource.h" +//#include "../../../src/shadereffect.h" + +class BenchmarkItem : public QDeclarativeItem +{ + Q_OBJECT + +public: + BenchmarkItem( QDeclarativeItem * parent = 0 ) : QDeclarativeItem(parent) + , m_frameCount(0) + { + setFlag(QGraphicsItem::ItemHasNoContents, false); + } + + void paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + QDeclarativeItem::paint(painter, option, widget); + if (timer.restart() > 7) m_frameCount++; + } + + int frameCount() { return m_frameCount; } + +private: + int m_frameCount; + QTime timer; +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QDeclarativeView view; + view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + view.setAttribute(Qt::WA_OpaquePaintEvent); + view.setAttribute(Qt::WA_NoSystemBackground); + view.setResizeMode(QDeclarativeView::SizeViewToRootObject); + + qmlRegisterType<ShaderEffectItem>("Qt.labs.shaders", 1, 0, "ShaderEffectItem"); + qmlRegisterType<ShaderEffectSource>("Qt.labs.shaders", 1, 0, "ShaderEffectSource"); + + QGLFormat format = QGLFormat::defaultFormat(); + format.setSampleBuffers(false); + format.setSwapInterval(1); + + QGLWidget* glWidget = new QGLWidget(format); + glWidget->setAutoFillBackground(false); + view.setViewport(glWidget); + view.show(); + + view.setSource(QUrl::fromLocalFile("TestWater.qml")); + BenchmarkItem *benchmarkItem; + + qDebug() << "Sea Water benchmark:"; + benchmarkItem = new BenchmarkItem(dynamic_cast<QDeclarativeItem *>(view.rootObject())); + QTest::qWait(5000); + qDebug() << "Rendered " << benchmarkItem->frameCount() << " frames in 5 seconds"; + qDebug() << "Average " << benchmarkItem->frameCount() / 5.0 << " frames per second"; + + qDebug() << "Gaussian drop shadow benchmark:"; + view.setSource(QUrl::fromLocalFile("TestGaussianDropShadow.qml")); + benchmarkItem = new BenchmarkItem(dynamic_cast<QDeclarativeItem *>(view.rootObject())); + QTest::qWait(5000); + qDebug() << "Rendered " << benchmarkItem->frameCount() << " frames in 5 seconds"; + qDebug() << "Average " << benchmarkItem->frameCount() / 5.0 << " frames per second"; +} + +#include "tst_performance.moc" diff --git a/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp b/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp index 17eb5a3..941522f 100644 --- a/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp +++ b/tests/benchmarks/gui/kernel/qguimetatype/tst_qguimetatype.cpp @@ -68,8 +68,12 @@ tst_QGuiMetaType::~tst_QGuiMetaType() void tst_QGuiMetaType::constructGuiType_data() { QTest::addColumn<int>("typeId"); - for (int i = QMetaType::FirstGuiType; i <= QMetaType::LastGuiType; ++i) + for (int i = QMetaType::FirstGuiType; i <= QMetaType::LastGuiType; ++i) { +#ifndef QT3_SUPPORT + if (i != 63) // QMetaType::QColorGroup (63) requires QT3_SUPPORT +#endif QTest::newRow(QMetaType::typeName(i)) << i; + } } // Tests how fast QMetaType can default-construct and destroy a Qt GUI diff --git a/tests/benchmarks/gui/kernel/qguivariant/tst_qguivariant.cpp b/tests/benchmarks/gui/kernel/qguivariant/tst_qguivariant.cpp index 30da548..70467bc 100644 --- a/tests/benchmarks/gui/kernel/qguivariant/tst_qguivariant.cpp +++ b/tests/benchmarks/gui/kernel/qguivariant/tst_qguivariant.cpp @@ -70,8 +70,12 @@ tst_QGuiVariant::~tst_QGuiVariant() void tst_QGuiVariant::createGuiType_data() { QTest::addColumn<int>("typeId"); - for (int i = QMetaType::FirstGuiType; i <= QMetaType::LastGuiType; ++i) + for (int i = QMetaType::FirstGuiType; i <= QMetaType::LastGuiType; ++i) { +#ifndef QT3_SUPPORT + if (i != 63) // QMetaType::QColorGroup (63) requires QT3_SUPPORT +#endif QTest::newRow(QMetaType::typeName(i)) << i; + } } // Tests how fast a Qt GUI type can be default-constructed by a diff --git a/tests/manual/declarative/declarative.pro b/tests/manual/declarative/declarative.pro new file mode 100644 index 0000000..337db2f --- /dev/null +++ b/tests/manual/declarative/declarative.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +contains(QT_CONFIG, opengl): SUBDIRS += qmlshadersplugin + diff --git a/tests/manual/declarative/qmlshadersplugin/main.cpp b/tests/manual/declarative/qmlshadersplugin/main.cpp new file mode 100644 index 0000000..3f40e92 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/main.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui/QApplication> +#include <QtOpenGL> +#include "qmlapplicationviewer.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QGLFormat format = QGLFormat::defaultFormat(); + format.setSampleBuffers(false); + format.setSwapInterval(1); + + QGLWidget* glWidget = new QGLWidget(format); + glWidget->setAutoFillBackground(false); + + QmlApplicationViewer viewer; + viewer.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + viewer.setViewport(glWidget); + viewer.setAttribute(Qt::WA_OpaquePaintEvent); + viewer.setAttribute(Qt::WA_NoSystemBackground); + viewer.setOrientation(QmlApplicationViewer::Auto); + viewer.setMainQmlFile(QLatin1String("qml/qmlshadersplugintest/main.qml")); + viewer.show(); + + return app.exec(); +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestActive.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestActive.qml new file mode 100644 index 0000000..303c7db --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestActive.qml @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "red" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + //effect.active = !effect.active + effect.visible = !effect.visible + } + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: effect.visible ? "Effect active (display should be green)" : "Effect not active (display should be red)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBasic.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBasic.qml new file mode 100644 index 0000000..b70cac0 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBasic.qml @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + anchors.fill: parent; + + ShaderEffectItem { + anchors.fill: parent; + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(qt_TexCoord0.x, qt_TexCoord0.y, 1, 1); + } + " + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlending.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlending.qml new file mode 100644 index 0000000..0c31419 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlending.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "green" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + effect.blending = !effect.blending + } + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0); + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: effect.blending ? "Effect blending (display should be orange)" : "Effect not blending (display should be red)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlendingModes.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlendingModes.qml new file mode 100644 index 0000000..47f5bc3 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestBlendingModes.qml @@ -0,0 +1,267 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Item { + id: blendModeTest + property real blendItemHeight: 60 + + anchors.fill: parent; + + Rectangle { + width: parent.width / 6 + height: parent.height + color: "black" + } + Rectangle { + x: parent.width/6 * 1 + width: parent.width / 6 + height: parent.height + color: "white" + } + Rectangle { + x: parent.width/6 * 2 + width: parent.width / 6 + height: parent.height + color: "gray" + } + Rectangle { + x: parent.width/6 * 3 + width: parent.width / 6 + height: parent.height + color: "red" + } + Rectangle { + x: parent.width/6 * 4 + width: parent.width / 6 + height: parent.height + color: "green" + } + Rectangle { + x: parent.width/6 * 5 + width: parent.width / 6 + height: parent.height + color: "blue" + } + + + Image { + anchors.fill: parent; + source: "image.png" + + } + + Rectangle { + id: first + anchors.top: parent.top + anchors.topMargin: 60 + width: parent.width + height: blendModeTest.blendItemHeight + color: "#8000ff00" + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " Rectangle color #8000ff00" + color: "white" + } + } + Rectangle { + id: second + anchors.top: first.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + color: "#ff00ff00" + opacity: 0.5 + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " Rectangle color #ff00ff00, opacity 0.5" + color: "white" + } + } + + ShaderEffectItem { + id: effect + anchors.top: second.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0.0, 1.0, 0.0, 0.5); + } + " + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " ShaderEffectItem gl_FragColor=vec4(0.0, 1.0, 0.0, 0.5)" + color: "white" + } + } + + ShaderEffectItem { + id: effect2 + anchors.top: effect.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0.0, 0.5, 0.0, 0.5); + } + " + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " ShaderEffectItem gl_FragColor=vec4(0.0, 0.5, 0.0, 0.5)" + color: "white" + } + } + + + Image { + id: image1 + source: "green_image_transparent.png" + anchors.top: effect2.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + } + Text { + anchors.bottom: image1.bottom + anchors.bottomMargin: 5 + text: " Image, green and 50% alpha" + color: "white" + } + + + ShaderEffectItem { + id: effect3 + property variant source: ShaderEffectSource { + sourceItem: image1 + hideSource: false + } + anchors.top: image1.bottom + anchors.topMargin: 5 + + width: parent.width + height: blendModeTest.blendItemHeight + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " ShaderEffectItem, source item green 50% alpha." + color: "white" + } + } + + ShaderEffectItem { + id: effect4 + property variant source: ShaderEffectSource { + sourceItem: Image { source: "green_image_transparent.png" } + hideSource: true + } + anchors.top: effect3.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " ShaderEffectItem, source image green 50% alpha." + color: "white" + } + } + + + Rectangle { + id: greenRect2 + anchors.top: effect4.bottom + anchors.topMargin: 5 + width: parent.width + height: blendModeTest.blendItemHeight + opacity: 0.5 + color: "green" + } + + + ShaderEffectItem { + id: effect5 + property variant source: ShaderEffectSource { sourceItem: greenRect2; hideSource: true } + anchors.top: effect4.bottom + anchors.topMargin: 5 + + width: parent.width + height: blendModeTest.blendItemHeight + Text { + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + text: " ShaderEffectItem, source item green rect with 0.5 opacity." + color: "white" + } + } + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + } + } + + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: "Blending test" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectHierarchy.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectHierarchy.qml new file mode 100644 index 0000000..1cad5b1 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectHierarchy.qml @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + id :root + anchors.fill: parent; + color: "green" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + effect1.visible = !effect1.visible + effect2.visible = !effect2.visible + //effect3.visible = !effect3.visible + } + } + + Rectangle { + id: a + x: 90 + y: 90 + color: "red" + width: 220 + height: 220 + Rectangle { + id: b + x: 10 + y: 10 + color: "blue" + width: 100 + height: 100 + rotation: 5 + Rectangle { + id: c + x: 10 + y: 10 + color: "black" + width: 80 + height: 80 + } + } + Rectangle { + id: d + x: 10 + y: 110 + color: "yellow" + width: 100 + height: 100 + } + } + + ShaderEffectItem { + id: effect1 + anchors.fill: a + property variant source: ShaderEffectSource{ sourceItem: a; hideSource: true } + } + + ShaderEffectItem { + id: effect2 + x: 100 + y: 100 + width: 100 + height: 100 + rotation: 5 + property variant source: ShaderEffectSource{ sourceItem: b; hideSource: true } + } + +// ShaderEffectItem { +// id: effect3 +// x: 110 +// y: 210 +// width: 80 +// height: 80 +// property variant source: ShaderEffectSource{ sourceItem: c; hideSource: true } +// } + + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: effect1.visible ? "Effects active" : "Effects NOT active" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectInsideAnotherEffect.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectInsideAnotherEffect.qml new file mode 100644 index 0000000..1446f9b --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestEffectInsideAnotherEffect.qml @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "green" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + + } + } + + Rectangle { + id: theSource + color: "red" + anchors.centerIn: parent; + width: parent.width/2 + height: parent.height/2 + } + + ShaderEffectItem { + id: effect1 + anchors.fill: theSource; + property variant source: ShaderEffectSource{ sourceItem: theSource; hideSource: true } + } + + ShaderEffectItem { + id: effect2 + anchors.fill: effect1; + property variant source: effect1 + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + void main(void) + { + gl_FragColor = vec4(texture2D(source, qt_TexCoord0.st).rgb, 1.0); + } + " + } + + ShaderEffectItem { + id: effect3 + x: effect2.x + y: effect2.y + width: effect2.width + height: effect2.height + + property variant source: ShaderEffectSource { sourceItem: effect2 ; hideSource: false } + + fragmentShader: + " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: "Red rect inside green fullscreen rect." + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFormat.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFormat.qml new file mode 100644 index 0000000..df5e06d --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFormat.qml @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "gray" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (theSource.format == ShaderEffectSource.Alpha) + theSource.format = ShaderEffectSource.RGB + else if (theSource.format == ShaderEffectSource.RGB) + theSource.format = ShaderEffectSource.RGBA + else if (theSource.format == ShaderEffectSource.RGBA) + theSource.format = ShaderEffectSource.Alpha + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent + width: parent.width + height: parent.height + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: "Source format test: " + theSource.format + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFragmentShader.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFragmentShader.qml new file mode 100644 index 0000000..d170358 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestFragmentShader.qml @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + effect.fragmentShader == effect.redFragmentShader ? effect.fragmentShader = effect.greenFragmentShader : effect.fragmentShader = effect.redFragmentShader + } + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + + property string redFragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + " + + property string greenFragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + " + + fragmentShader: redFragmentShader + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: effect.fragmentShader == effect.redFragmentShader ? "Effect (display should be red)" : "Effect (display should be green)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestGrab.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestGrab.qml new file mode 100644 index 0000000..08e9319 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestGrab.qml @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + console.log("Grabbed!") + theSource.grab(); + } + } + + Image { + id: theSourcImage + source: "image_opaque.png" + opacity: 0.5 + } + + ShaderEffectSource { + id: theSource + sourceItem: theSourcImage + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent + width: parent.width + height: parent.height + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: "Effect with grab (opacity 0.5)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHideOriginal.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHideOriginal.qml new file mode 100644 index 0000000..1cd449f --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHideOriginal.qml @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "green" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + //theSource.hideOriginal = !theSource.hideOriginal + theSource.hideSource = !theSource.hideSource + } + } + + Rectangle { + id: redRect + anchors.fill: parent; + color: "red" + } + + ShaderEffectSource { + id: theSource + sourceItem: redRect + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + void main() { + // Empty fragmentshader, we do not write any pixels via this effect item. We only observe hideoriginal functionality. + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + //text: theSource.hideOriginal ? "Hideoriginal true (display should be green)" : "Hideoriginal false (display should be red)" + text: theSource.hideSource ? "HideSource true (display should be green)" : "HideSource false (display should be red)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHorizontalWrap.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHorizontalWrap.qml new file mode 100644 index 0000000..ec372ca --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestHorizontalWrap.qml @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.wrapMode == ShaderEffectSource.RepeatHorizontally ? theSource.wrapMode = ShaderEffectSource.ClampToEdge : theSource.wrapMode = ShaderEffectSource.RepeatHorizontally + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_small.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + highp vec2 tex = qt_TexCoord0 * 4.0; + gl_FragColor = texture2D(source, tex); + } + " + + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.wrapMode == ShaderEffectSource.RepeatHorizontally ? "HorizontalWrap RepeatHorizontally" : "HorizontalWrap ClampToEdge" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageFiltering.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageFiltering.qml new file mode 100644 index 0000000..9d990d0 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageFiltering.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.smooth = !theSource.smooth + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + width: parent.width * 2.0 + height: parent.height * 2.0 + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: !theSource.smooth ? "Filtering nearest (faster)" : "Filtering linear (better quality)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMargins.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMargins.qml new file mode 100644 index 0000000..3ad2b50 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMargins.qml @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + id: imageMarginTester + anchors.fill: parent; + color: "green" + property real testMarginX: 10 + property real testMarginY: 10 + + Timer { + running: true + interval: 2000 + repeat: true + + onTriggered: { + if (imageMarginTester.testMarginX < 20) { + imageMarginTester.testMarginX = 50 + imageMarginTester.testMarginY = 120 + } + else { + imageMarginTester.testMarginX = 10 + imageMarginTester.testMarginY = 10 + } + + console.log("onTriggered...") + theSource.sourceRect = Qt.rect(-testMarginX, -testMarginY, parent.width + testMarginX*2, parent.height + testMarginY*2) + console.log("onTriggered done") + } + } + + ShaderEffectSource { + id: theSource + sourceImage: "image_opaque.png" + sourceRect: Qt.rect(-10,-10, parent.width + 2*10, parent.height + 2*10) + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.sourceRect.width == 0 ? "No margins" : "Green margins " + imageMarginTester.testMarginX + "x" + imageMarginTester.testMarginY + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMarginsWithTextureSize.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMarginsWithTextureSize.qml new file mode 100644 index 0000000..453bbaf --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMarginsWithTextureSize.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + id: marginTester + anchors.fill: parent; + color: "green" + property real testMarginX: 10 + property real testMarginY: 10 + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (marginTester.testMarginX < 20) { + marginTester.testMarginX = 50 + marginTester.testMarginY = 120 + } + else { + marginTester.testMarginX = 10 + marginTester.testMarginY = 10 + } + + theSource.sourceRect = Qt.rect(-testMarginX, -testMarginY, parent.width + testMarginX*2, parent.height + testMarginY*2) + } + } + + ShaderEffectSource { + id: theSource + sourceImage: "image_opaque.png" + textureSize: Qt.size(160,160) + sourceRect: Qt.rect(-10,-10, parent.width + 2*10, parent.height + 2*10) + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.sourceRect.width == 0 ? "No margins" : "Green margins " + marginTester.testMarginX + "x" + marginTester.testMarginY + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMipmap.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMipmap.qml new file mode 100644 index 0000000..a51068d --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestImageMipmap.qml @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (theSource.mipmap && theSource.smooth){ + theSource.smooth = false + } else if (theSource.mipmap && !theSource.smooth){ + theSource.smooth = true + theSource.mipmap = false + } else if (!theSource.mipmap && theSource.smooth){ + theSource.smooth = false + } else if (!theSource.mipmap && !theSource.smooth){ + theSource.smooth = true + theSource.mipmap = true + } + } + } + + ShaderEffectSource { + id: theSource + sourceImage: "wallpaper.jpg" + mipmap: false + smooth: false + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent; + width: parent.width * 0.8 + height: parent.height * 0.8 + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: "Mipmap: " + theSource.mipmap + ", Smooth: " + theSource.smooth + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMargins.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMargins.qml new file mode 100644 index 0000000..94f7824 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMargins.qml @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + id: marginTester + anchors.fill: parent; + color: "green" + property real testMarginX: 10 + property real testMarginY: 10 + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (marginTester.testMarginX < 20) { + marginTester.testMarginX = 50 + marginTester.testMarginY = 120 + } + else { + marginTester.testMarginX = 10 + marginTester.testMarginY = 10 + } + + theSource.sourceRect = Qt.rect(-testMarginX, -testMarginY, parent.width + testMarginX*2, parent.height + testMarginY*2) + console.log("onTriggered") + } + } + + Image { + id: redrect + source: "image_opaque.png" + } + + + ShaderEffectSource { + id: theSource + sourceItem: redrect + sourceRect: Qt.rect(-10,-10, parent.width + 2*10, parent.height + 2*10) + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.sourceRect.width == 0 ? "No margins" : "Green margins " + marginTester.testMarginX + "x" + marginTester.testMarginY + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMarginsWithTextureSize.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMarginsWithTextureSize.qml new file mode 100644 index 0000000..83784c3 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestItemMarginsWithTextureSize.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + id: marginTester + anchors.fill: parent; + color: "green" + property real testMarginX: 10 + property real testMarginY: 10 + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (marginTester.testMarginX < 20) { + marginTester.testMarginX = 50 + marginTester.testMarginY = 120 + } + else { + marginTester.testMarginX = 10 + marginTester.testMarginY = 10 + } + + theSource.sourceRect = Qt.rect(-testMarginX, -testMarginY, parent.width + testMarginX*2, parent.height + testMarginY*2) + } + } + + Image { + id: redrect + source: "image_opaque.png" + } + + ShaderEffectSource { + id: theSource + sourceItem: redrect + textureSize: Qt.size(160,160) + sourceRect: Qt.rect(-10,-10, parent.width + 2*10, parent.height + 2*10) + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.sourceRect.width == 0 ? "No margins" : "Green margins " + marginTester.testMarginX + "x" + marginTester.testMarginY + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestLive.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestLive.qml new file mode 100644 index 0000000..6db568d --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestLive.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.live = !theSource.live + theSource.grab() // This tests grabbing screenshot from static source + } + } + + Rectangle { + id: greenRect + anchors.fill: parent; + color: theSource.live ? "green" : "red" // This works if we use grab() + property int counter: 0 + Text { + id: counterText + anchors.centerIn: parent + text: greenRect.counter + font.pixelSize: 48 + } + Timer { + running: true + interval: 100 + repeat: true + onTriggered: { + greenRect.counter++ + } + } + } + + ShaderEffectSource { + id: theSource + sourceItem: greenRect + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.live ? "live true (color green, number changes)" : "live false (color red, same number)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestMeshResolution.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestMeshResolution.qml new file mode 100644 index 0000000..255df36 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestMeshResolution.qml @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "red" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + effect.meshResolution.width == 1 ? effect.meshResolution = Qt.size(40,40) : effect.meshResolution = Qt.size(1,1) + } + } + + Rectangle { + id: thesource + anchors.centerIn: parent; + color: "green" + width: parent.width + height: parent.height + Image { + anchors.centerIn: parent; + source: "image_opaque.png" + } + } + + + ShaderEffectItem { + id: effect + anchors.fill: thesource; + property variant source: ShaderEffectSource { sourceItem: thesource } + + vertexShader: " + attribute highp vec4 qt_Vertex; + attribute highp vec2 qt_MultiTexCoord0; + uniform highp mat4 qt_ModelViewProjectionMatrix; + varying highp vec2 qt_TexCoord0; + void main() { + qt_TexCoord0 = qt_MultiTexCoord0; + + highp vec4 shift = vec4(cos(1071. * qt_MultiTexCoord0.x + 1.0) + sin(2051. * qt_MultiTexCoord0.y + 1.0), + cos(1131. * qt_MultiTexCoord0.x + 1.0) + sin(3039. * qt_MultiTexCoord0.x + 1.0), 0, 0) * 3.0; + + if (qt_MultiTexCoord0.x < 0.01 || qt_MultiTexCoord0.x > 0.99) + shift.x = 0.; + if (qt_MultiTexCoord0.y < 0.01 || qt_MultiTexCoord0.y > 0.99) + shift.y = 0.; + + gl_Position = qt_ModelViewProjectionMatrix * (qt_Vertex + shift); + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: effect.meshResolution.width == 1 ? "Resolution (1,1) (image looks normal)" : "Resolution (40,40) (image looks distorted)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOneSource.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOneSource.qml new file mode 100644 index 0000000..117ae65 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOneSource.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "black" + + Text { + id: text + anchors.centerIn: parent + font.pixelSize: 80 + text: "Shaderz!" + } + + ShaderEffectSource { + id: source + sourceItem: text + hideSource: true + } + + ShaderEffectItem { + anchors.fill: text; + + property variant source: source + + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(qt_TexCoord0.x, qt_TexCoord0.y, 1, 1) * texture2D(source, qt_TexCoord0).a; + } + " + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOpacity.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOpacity.qml new file mode 100644 index 0000000..00af373 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestOpacity.qml @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (effect.opacity > 0.9) + effect.opacity = 0.0 + else if (effect.opacity < 0.5) + effect.opacity = 0.5 + else if (effect.opacity < 0.9) + effect.opacity = 1.0 + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_opaque.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent + width: parent.width + height: parent.height + property variant source: theSource + + fragmentShader: " + uniform highp float qt_Opacity; + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(texture2D(source, qt_TexCoord0).rgb, qt_Opacity); + } + " + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: "Effect with opacity: " + effect.opacity + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestRotation.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestRotation.qml new file mode 100644 index 0000000..c4435fa --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestRotation.qml @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (effectWrapper.rotation < 45) + effectWrapper.rotation = 45 + else if (effectWrapper.rotation < 90) + effectWrapper.rotation = 90 + else if (effectWrapper.rotation < 180) + effectWrapper.rotation = 0 + + } + } + + Item { + id: effectWrapper + anchors.fill: parent; + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_opaque.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent + width: parent.width - 50 + height: parent.height - 50 + property variant source: theSource + } + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: "Effect is rotated " + effectWrapper.rotation + " degrees" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestScale.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestScale.qml new file mode 100644 index 0000000..3488eab --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestScale.qml @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + if (effectWrapper.scale < 0.3) + effectWrapper.scale = 0.3 + else if (effectWrapper.scale < 1.7) + effectWrapper.scale = 1.7 + else if (effectWrapper.scale < 2.0) + effectWrapper.scale = 0.1 + } + } + + Item { + id: effectWrapper + anchors.fill: parent; + scale: 0.1 + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_opaque.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.centerIn: parent + width: parent.width - 50 + height: parent.height - 50 + property variant source: theSource + } + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + Text { + id: label + anchors.centerIn: parent + text: "Effect is scaled " + effectWrapper.scale + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTextureSize.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTextureSize.qml new file mode 100644 index 0000000..7369efc --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTextureSize.qml @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.textureSize.width == 64 ? theSource.textureSize = Qt.size(360,640) : theSource.textureSize = Qt.size(64,64) + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image.png" } + live: false + textureSize: Qt.size(64,64) + smooth: true + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: "textureSize:" + theSource.textureSize.width + "x" + theSource.textureSize.height + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwiceOnSameSource.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwiceOnSameSource.qml new file mode 100644 index 0000000..8098a4d --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwiceOnSameSource.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "black" + + Text { + id: text + anchors.centerIn: parent + font.pixelSize: 80 + text: "Shaderz!" + } + + ShaderEffectSource { + id: source + sourceItem: text + hideSource: true + } + + ShaderEffectItem { + width: parent.width + height: parent.height / 2 + blending: false + + property variant source: source + + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0, qt_TexCoord0.y, 1, 1) * texture2D(source, qt_TexCoord0).a; + } + " + } + + ShaderEffectItem { + width: parent.width + y: parent.height / 2 + height: parent.height / 2 + + property variant source: source + + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(qt_TexCoord0.x, 1, 0, 1) * texture2D(source, qt_TexCoord0).a; + } + " + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwoSources.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwoSources.qml new file mode 100644 index 0000000..e651cd9 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestTwoSources.qml @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "black" + + Rectangle { + id: rect; + anchors.centerIn: parent + width: 1 + height: 10 + + gradient: Gradient { + GradientStop { position: 0; color: "#ff0000" } + GradientStop { position: 0.5; color: "#00ff00" } + GradientStop { position: 1; color: "#0000ff" } + } + } + + Text { + id: text + anchors.centerIn: parent + font.pixelSize: 80 + text: "Shaderz!" + } + + ShaderEffectSource { + id: maskSource + sourceItem: text + hideSource: true + } + + ShaderEffectSource { + id: colorSource + sourceItem: rect; + hideSource: true + } + + ShaderEffectItem { + anchors.fill: text; + + property variant colorSource: colorSource + property variant maskSource: maskSource; + + fragmentShader: " + uniform lowp sampler2D maskSource; + uniform lowp sampler2D colorSource; + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = texture2D(maskSource, qt_TexCoord0).a * texture2D(colorSource, qt_TexCoord0.yx); + } + " + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVertexShader.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVertexShader.qml new file mode 100644 index 0000000..4edb065 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVertexShader.qml @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "red" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + effect.vertexShader == effect.defaultVertexShader ? effect.vertexShader = effect.dummyVertexShader : effect.vertexShader = effect.defaultVertexShader + } + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + + property string defaultVertexShader: " + uniform highp mat4 qt_ModelViewProjectionMatrix; + attribute highp vec4 qt_Vertex; + attribute highp vec2 qt_MultiTexCoord0; + varying highp vec2 qt_TexCoord0; + void main(void) + { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex; + } + " + + property string dummyVertexShader: " + uniform highp mat4 qt_ModelViewProjectionMatrix; + attribute highp vec4 qt_Vertex; + attribute highp vec2 qt_MultiTexCoord0; + varying highp vec2 qt_TexCoord0; + void main(void) + { + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_Vertex * vec4(0.0, 0.0, 0.0, 0.0001); + } + " + + vertexShader: defaultVertexShader + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + void main() { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + " + + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: effect.vertexShader == effect.defaultVertexShader ? "Effect (display shoud be green)" : "Effect (display shoud be red)" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVerticalWrap.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVerticalWrap.qml new file mode 100644 index 0000000..b7d6db4 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestVerticalWrap.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.wrapMode == ShaderEffectSource.RepeatVertically ? theSource.wrapMode = ShaderEffectSource.ClampToEdge : theSource.wrapMode = ShaderEffectSource.RepeatVertically + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_small.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + highp vec2 tex = qt_TexCoord0 * 4.0; + gl_FragColor = texture2D(source, tex); + } + " + + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.wrapMode == ShaderEffectSource.RepeatVertically ? "Wrap RepeatVertically" : "VerticalWrap ClampToEdge" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestWrapRepeat.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestWrapRepeat.qml new file mode 100644 index 0000000..e09673c --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/TestWrapRepeat.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + +Rectangle { + anchors.fill: parent; + color: "white" + + Timer { + running: true + interval: 2000 + repeat: true + onTriggered: { + theSource.wrapMode == ShaderEffectSource.Repeat ? theSource.wrapMode = ShaderEffectSource.ClampToEdge : theSource.wrapMode = ShaderEffectSource.Repeat + } + } + + ShaderEffectSource { + id: theSource + sourceItem: Image { source: "image_small.png" } + live: false + hideSource: true + } + + ShaderEffectItem { + id: effect + anchors.fill: parent; + property variant source: theSource + fragmentShader: " + uniform lowp sampler2D source; + varying highp vec2 qt_TexCoord0; + void main() { + highp vec2 tex = qt_TexCoord0 * 4.0; + gl_FragColor = texture2D(source, tex); + } + " + + } + + Rectangle { + width: parent.width + height: 40 + color: "#cc000000" + + Text { + id: label + anchors.centerIn: parent + text: theSource.wrapMode == ShaderEffectSource.Repeat ? "Wrap Repeat" : "Wrap ClampToEdge" + color: "white" + font.bold: true + } + } +} diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/back.svg b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/back.svg new file mode 100755 index 0000000..3005133 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/back.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="30px" height="30px" viewBox="0 0 30 30" enable-background="new 0 0 30 30" xml:space="preserve"> +<rect fill="none" width="30" height="30"/> +<path fill="#FFFFFF" d="M19,8h-9V5c0-0.389-0.225-0.74-0.576-0.906C9.289,4.031,9.145,4,9,4C8.771,4,8.543,4.079,8.359,4.231 + l-6,5.001C2.132,9.422,2,9.703,2,10s0.132,0.578,0.359,0.768l6,5C8.543,15.921,8.771,16,9,16c0.145,0,0.289-0.031,0.424-0.094 + C9.775,15.741,10,15.389,10,15v-3h9c2.757,0,5,2.243,5,5s-2.243,5-5,5h-6.917c-1.104,0-2,0.896-2,2s0.896,2,2,2H19 + c4.963,0,9-4.037,9-9S23.963,8,19,8z"/> +</svg> diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/green_image_transparent.png b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/green_image_transparent.png Binary files differnew file mode 100755 index 0000000..f3024f7 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/green_image_transparent.png diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image.png b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image.png Binary files differnew file mode 100755 index 0000000..144c02d --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image.png diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_opaque.png b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_opaque.png Binary files differnew file mode 100755 index 0000000..c73d389 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_opaque.png diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_small.png b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_small.png Binary files differnew file mode 100755 index 0000000..b226773 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/image_small.png diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/main.qml b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/main.qml new file mode 100644 index 0000000..1abf524 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/main.qml @@ -0,0 +1,236 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 + +Item { + id: main + width: 360 + height: 640 + + Rectangle { + id: background + visible: testCaseList.visible + anchors.fill: parent + gradient: Gradient { + GradientStop { position: 0.0; color: "#EEEEEE" } + GradientStop { position: 1.0; color: "#AAAAAA" } + } + } + + Loader { + id: testLoader + width: parent.width + height: parent.height + visible: !testCaseList.visible + } + + ListModel { + id: testcaseModel + ListElement { name: "TestEffectHierarchy.qml"; group: "Effect source property tests" } + ListElement { name: "TestGrab.qml"; group: "Effect source property tests" } + ListElement { name: "TestLive.qml"; group: "Effect source property tests" } + ListElement { name: "TestImageFiltering.qml"; group: "Effect source property tests" } + ListElement { name: "TestWrapRepeat.qml"; group: "Effect source property tests" } + ListElement { name: "TestHorizontalWrap.qml"; group: "Effect source property tests" } + ListElement { name: "TestVerticalWrap.qml"; group: "Effect source property tests" } + ListElement { name: "TestTextureSize.qml"; group: "Effect source property tests" } + ListElement { name: "TestItemMargins.qml"; group: "Effect source property tests" } + ListElement { name: "TestEffectInsideAnotherEffect.qml"; group: "Effect source property tests" } + ListElement { name: "TestItemMarginsWithTextureSize.qml"; group: "Effect source property tests" } + ListElement { name: "TestHideOriginal.qml"; group: "Effect source property tests" } + ListElement { name: "TestActive.qml"; group: "Effect item property tests" } + ListElement { name: "TestBlending.qml"; group: "Effect item property tests" } + ListElement { name: "TestBlendingModes.qml"; group: "Effect item property tests" } + ListElement { name: "TestOpacity.qml"; group: "Effect item property tests" } + ListElement { name: "TestFragmentShader.qml"; group: "Effect item property tests" } + ListElement { name: "TestVertexShader.qml"; group: "Effect item property tests" } + ListElement { name: "TestMeshResolution.qml"; group: "Effect item property tests" } + ListElement { name: "TestRotation.qml"; group: "Shader effect transformation tests" } + ListElement { name: "TestScale.qml"; group: "Shader effect transformation tests" } + ListElement { name: "TestBasic.qml"; group: "Scenegraph effect tests" } + ListElement { name: "TestOneSource.qml"; group: "Scenegraph effect tests" } + ListElement { name: "TestTwiceOnSameSource.qml"; group: "Scenegraph effect tests" } + ListElement { name: "TestTwoSources.qml"; group: "Scenegraph effect tests" } + } + + Component { + id: sectionHeading + Rectangle { + width: testCaseList.width + height: 35 + color: "#00000000" + + Text { + text: section + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + anchors.fill: parent + anchors.leftMargin: 5 + font.bold: true + style: Text.Raised + styleColor: "white" + } + } + } + + ListView { + id: testCaseList + + property int hideTranslation: 0 + transform: Translate { + x: testCaseList.hideTranslation + } + + anchors.fill: parent + anchors.topMargin: 10 + anchors.leftMargin: 5 + anchors.rightMargin: 5 + anchors.bottomMargin: 10 + + model: testcaseModel + spacing: 3 + + state: "testStopped" + + section.property: "group" + section.criteria: ViewSection.FullString + section.delegate: sectionHeading + + delegate: Rectangle { + width: parent.width + height: 50 + radius: 5 + border.width: 1 + border.color: "#888888" + color: delegateMouseArea.pressed ? "#AAAAFF" : "#FFFFFF" + Text { + id: delegateText; + text: " " + name + width: parent.width + height: parent.height + font.pixelSize: 16 + verticalAlignment: Text.AlignVCenter + } + Text { + id: delegateText2; + text: "> " + width: parent.width + height: parent.height + font.pixelSize: 20 + smooth: true + color: "gray" + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignRight + } + + MouseArea { + id: delegateMouseArea + anchors.fill: parent; + onClicked: { + testCaseList.state = "testRunning" + testLoader.source = name + console.log(name) + } + } + } + + states: [ + State { + name: "testRunning" + PropertyChanges { target: testCaseList; visible: false; hideTranslation: -main.width } + }, + State { + name: "testStopped" + PropertyChanges { target: testCaseList; visible: true; hideTranslation: 0 } + } + ] + + transitions: [ + Transition { + to: "testRunning" + SequentialAnimation { + NumberAnimation { properties: "hideTranslation"; easing.type: Easing.InQuad; duration: 300 } + PropertyAction { target: testCaseList; property: "visible"; value: false } + } + }, + Transition { + to: "testStopped" + SequentialAnimation { + PropertyAction { target: testCaseList; property: "visible"; value: true } + NumberAnimation { properties: "hideTranslation"; easing.type: Easing.InQuad; duration: 300 } + } + } + + ] + } + + Rectangle { + visible: true + anchors.bottom: main.bottom + anchors.left: main.left + anchors.right: main.right + height: 40 + color: "#cc000000" + Item { + anchors.top: parent.top + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 20 + Image { + source: "back.svg" + } + } + + MouseArea { + anchors.fill: parent; + onClicked: { + if (testCaseList.visible){ + Qt.quit() + } else if (!testCaseList.state != "testStopped") { + testCaseList.state = "testStopped" + testLoader.source = "" + } + } + } + } +} + diff --git a/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/wallpaper.jpg b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/wallpaper.jpg Binary files differnew file mode 100755 index 0000000..5bc7b58 --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qml/qmlshadersplugintest/wallpaper.jpg diff --git a/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.cpp b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.cpp new file mode 100644 index 0000000..b5b43bf --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// checksum 0xdf1f version 0x10008 +#include "qmlapplicationviewer.h" + +#include <QtCore/QCoreApplication> +#include <QtCore/QDir> +#include <QtCore/QFileInfo> +#include <QtDeclarative/QDeclarativeComponent> +#include <QtDeclarative/QDeclarativeEngine> +#include <QtDeclarative/QDeclarativeContext> + +#if defined(QMLJSDEBUGGER) +#include <jsdebuggeragent.h> +#endif +#if defined(QMLOBSERVER) +#include <qdeclarativeviewobserver.h> +#endif + +#if defined(Q_OS_SYMBIAN) && defined(ORIENTATIONLOCK) +#include <eikenv.h> +#include <eikappui.h> +#include <aknenv.h> +#include <aknappui.h> +#endif // Q_OS_SYMBIAN && ORIENTATIONLOCK + +class QmlApplicationViewerPrivate +{ + QString mainQmlFile; + friend class QmlApplicationViewer; + static QString adjustPath(const QString &path); +}; + +QString QmlApplicationViewerPrivate::adjustPath(const QString &path) +{ +#ifdef Q_OS_UNIX +#ifdef Q_OS_MAC + if (!QDir::isAbsolutePath(path)) + return QCoreApplication::applicationDirPath() + + QLatin1String("/../Resources/") + path; +#else + const QString pathInShareDir = QCoreApplication::applicationDirPath() + + QLatin1String("/../share/") + + QFileInfo(QCoreApplication::applicationFilePath()).fileName() + + QLatin1Char('/') + path; + if (QFileInfo(pathInShareDir).exists()) + return pathInShareDir; +#endif +#endif + return path; +} + +QmlApplicationViewer::QmlApplicationViewer(QWidget *parent) : + QDeclarativeView(parent), + m_d(new QmlApplicationViewerPrivate) +{ + connect(engine(), SIGNAL(quit()), SLOT(close())); + setResizeMode(QDeclarativeView::SizeRootObjectToView); +#ifdef QMLJSDEBUGGER + new QmlJSDebugger::JSDebuggerAgent(engine()); +#endif +#ifdef QMLOBSERVER + new QmlJSDebugger::QDeclarativeViewObserver(this, parent); +#endif +} + +QmlApplicationViewer::~QmlApplicationViewer() +{ + delete m_d; +} + +void QmlApplicationViewer::setMainQmlFile(const QString &file) +{ + m_d->mainQmlFile = QmlApplicationViewerPrivate::adjustPath(file); + setSource(QUrl::fromLocalFile(m_d->mainQmlFile)); +} + +void QmlApplicationViewer::addImportPath(const QString &path) +{ + engine()->addImportPath(QmlApplicationViewerPrivate::adjustPath(path)); +} + +void QmlApplicationViewer::setOrientation(Orientation orientation) +{ +#ifdef Q_OS_SYMBIAN + if (orientation != Auto) { +#if defined(ORIENTATIONLOCK) + const CAknAppUiBase::TAppUiOrientation uiOrientation = + (orientation == LockPortrait) ? CAknAppUi::EAppUiOrientationPortrait + : CAknAppUi::EAppUiOrientationLandscape; + CAknAppUi* appUi = dynamic_cast<CAknAppUi*> (CEikonEnv::Static()->AppUi()); + TRAPD(error, + if (appUi) + appUi->SetOrientationL(uiOrientation); + ); +#else // ORIENTATIONLOCK + qWarning("'ORIENTATIONLOCK' needs to be defined on Symbian when locking the orientation."); +#endif // ORIENTATIONLOCK + } +#elif defined(Q_WS_MAEMO_5) + Qt::WidgetAttribute attribute; + switch (orientation) { + case LockPortrait: + attribute = Qt::WA_Maemo5PortraitOrientation; + break; + case LockLandscape: + attribute = Qt::WA_Maemo5LandscapeOrientation; + break; + case Auto: + default: + attribute = Qt::WA_Maemo5AutoOrientation; + break; + } + setAttribute(attribute, true); +#else // Q_OS_SYMBIAN + Q_UNUSED(orientation); +#endif // Q_OS_SYMBIAN +} + +void QmlApplicationViewer::show() +{ +#ifdef Q_OS_SYMBIAN + showFullScreen(); +#elif defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) + showMaximized(); +#else + QDeclarativeView::show(); +#endif +} diff --git a/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.h b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.h new file mode 100644 index 0000000..4d1a38c --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// checksum 0x39ee version 0x10008 +#ifndef QMLAPPLICATIONVIEWER_H +#define QMLAPPLICATIONVIEWER_H + +#include <QtDeclarative/QDeclarativeView> + +class QmlApplicationViewer : public QDeclarativeView +{ +public: + enum Orientation { + LockPortrait, + LockLandscape, + Auto + }; + + QmlApplicationViewer(QWidget *parent = 0); + virtual ~QmlApplicationViewer(); + + void setMainQmlFile(const QString &file); + void addImportPath(const QString &path); + void setOrientation(Orientation orientation); + void show(); + +private: + class QmlApplicationViewerPrivate *m_d; +}; + +#endif // QMLAPPLICATIONVIEWER_H diff --git a/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.pri b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.pri new file mode 100644 index 0000000..79e6a9f --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qmlapplicationviewer/qmlapplicationviewer.pri @@ -0,0 +1,152 @@ +# checksum 0xc123 version 0x10008 +# This file should not be edited. +# Future versions of Qt Creator might offer updated versions of this file. + +QT += declarative + +SOURCES += $$PWD/qmlapplicationviewer.cpp +HEADERS += $$PWD/qmlapplicationviewer.h +INCLUDEPATH += $$PWD + +contains(DEFINES, QMLOBSERVER) { + DEFINES *= QMLJSDEBUGGER +} + +defineTest(minQtVersion) { + maj = $$1 + min = $$2 + patch = $$3 + isEqual(QT_MAJOR_VERSION, $$maj) { + isEqual(QT_MINOR_VERSION, $$min) { + isEqual(QT_PATCH_VERSION, $$patch) { + return(true) + } + greaterThan(QT_PATCH_VERSION, $$patch) { + return(true) + } + } + greaterThan(QT_MINOR_VERSION, $$min) { + return(true) + } + } + return(false) +} + +contains(DEFINES, QMLJSDEBUGGER) { + CONFIG(debug, debug|release) { + !minQtVersion(4, 7, 1) { + warning() + warning("Debugging QML requires the qmljsdebugger library that ships with Qt Creator.") + warning("This library requires Qt 4.7.1 or newer.") + warning() + + error("Qt version $$QT_VERSION too old for QmlJS Debugging. Aborting.") + } + isEmpty(QMLJSDEBUGGER_PATH) { + warning() + warning("Debugging QML requires the qmljsdebugger library that ships with Qt Creator.") + warning("Please specify its location on the qmake command line, eg") + warning(" qmake -r QMLJSDEBUGGER_PATH=$CREATORDIR/share/qtcreator/qmljsdebugger") + warning() + + error("QMLJSDEBUGGER defined, but no QMLJSDEBUGGER_PATH set on command line. Aborting.") + DEFINES -= QMLJSDEBUGGER + } else { + include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri) + } + } else { + DEFINES -= QMLJSDEBUGGER + } +} +# This file should not be edited. +# Future versions of Qt Creator might offer updated versions of this file. + +defineTest(qtcAddDeployment) { +for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + itemsources = $${item}.sources + $$itemsources = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath= $$eval($${deploymentfolder}.target) + export($$itemsources) + export($$itempath) + DEPLOYMENT += $$item +} + +MAINPROFILEPWD = $$PWD + +symbian { + ICON = $${TARGET}.svg + TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 + contains(DEFINES, ORIENTATIONLOCK):LIBS += -lavkon -leikcore -leiksrv -lcone + contains(DEFINES, NETWORKACCESS):TARGET.CAPABILITY += NetworkServices +} else:win32 { + !isEqual(PWD,$$OUT_PWD) { + copyCommand = @echo Copying application data... + for(deploymentfolder, DEPLOYMENTFOLDERS) { + source = $$eval($${deploymentfolder}.source) + pathSegments = $$split(source, /) + sourceAndTarget = $$MAINPROFILEPWD/$$source $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(pathSegments) + copyCommand += && $(COPY_DIR) $$replace(sourceAndTarget, /, \\) + } + copydeploymentfolders.commands = $$copyCommand + first.depends = $(first) copydeploymentfolders + export(first.depends) + export(copydeploymentfolders.commands) + QMAKE_EXTRA_TARGETS += first copydeploymentfolders + } +} else:unix { + maemo5 { + installPrefix = /opt/usr + desktopfile.path = /usr/share/applications/hildon + } else { + installPrefix = /usr/local + desktopfile.path = /usr/share/applications + !isEqual(PWD,$$OUT_PWD) { + copyCommand = @echo Copying application data... + for(deploymentfolder, DEPLOYMENTFOLDERS) { + macx { + target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target) + } else { + target = $$OUT_PWD/$$eval($${deploymentfolder}.target) + } + copyCommand += && $(MKDIR) $$target + copyCommand += && $(COPY_DIR) $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) $$target + } + copydeploymentfolders.commands = $$copyCommand + first.depends = $(first) copydeploymentfolders + export(first.depends) + export(copydeploymentfolders.commands) + QMAKE_EXTRA_TARGETS += first copydeploymentfolders + } + } + for(deploymentfolder, DEPLOYMENTFOLDERS) { + item = item$${deploymentfolder} + itemfiles = $${item}.files + $$itemfiles = $$eval($${deploymentfolder}.source) + itempath = $${item}.path + $$itempath = $${installPrefix}/share/$${TARGET}/$$eval($${deploymentfolder}.target) + export($$itemfiles) + export($$itempath) + INSTALLS += $$item + } + icon.files = $${TARGET}.png + icon.path = /usr/share/icons/hicolor/64x64/apps + desktopfile.files = $${TARGET}.desktop + target.path = $${installPrefix}/bin + export(icon.files) + export(icon.path) + export(desktopfile.files) + export(desktopfile.path) + export(target.path) + INSTALLS += desktopfile icon target +} + +export (ICON) +export (INSTALLS) +export (DEPLOYMENT) +export (TARGET.EPOCHEAPSIZE) +export (TARGET.CAPABILITY) +export (LIBS) +export (QMAKE_EXTRA_TARGETS) +} diff --git a/tests/manual/declarative/qmlshadersplugin/qmlshadersplugin.pro b/tests/manual/declarative/qmlshadersplugin/qmlshadersplugin.pro new file mode 100644 index 0000000..98101fb --- /dev/null +++ b/tests/manual/declarative/qmlshadersplugin/qmlshadersplugin.pro @@ -0,0 +1,29 @@ +QT += declarative opengl + +# Add more folders to ship with the application, here +folder_01.source = qml/qmlshadersplugintest +folder_01.target = qml +DEPLOYMENTFOLDERS = folder_01 + +# Additional import path used to resolve Qml modules in Creator's code model +QML_IMPORT_PATH = + +# Avoid auto screen rotation +#DEFINES += ORIENTATIONLOCK + +# Needs to be defined for Symbian +#DEFINES += NETWORKACCESS + +symbian:TARGET.UID3 = 0xE40472A7 + +# Define QMLJSDEBUGGER to enable basic debugging (setting breakpoints etc) +# Define QMLOBSERVER for advanced features (requires experimental QmlInspector plugin!) +#DEFINES += QMLJSDEBUGGER +#DEFINES += QMLOBSERVER + +# The .cpp file which was generated for your project. Feel free to hack it. +SOURCES += main.cpp + +# Please do not modify the following two lines. Required for deployment. +include(qmlapplicationviewer/qmlapplicationviewer.pri) +qtcAddDeployment() diff --git a/tools/linguist/linguist/mainwindow.cpp b/tools/linguist/linguist/mainwindow.cpp index 05b34bc..ddefa9a 100644 --- a/tools/linguist/linguist/mainwindow.cpp +++ b/tools/linguist/linguist/mainwindow.cpp @@ -1388,7 +1388,7 @@ void MainWindow::setupPhrase() void MainWindow::closeEvent(QCloseEvent *e) { - if (maybeSaveAll() && closePhraseBooks()) + if (maybeSaveAll() && maybeSavePhraseBooks()) e->accept(); else e->ignore(); @@ -2302,7 +2302,7 @@ bool MainWindow::maybeSavePhraseBook(PhraseBook *pb) return true; } -bool MainWindow::closePhraseBooks() +bool MainWindow::maybeSavePhraseBooks() { foreach(PhraseBook *phraseBook, m_phraseBooks) if (!maybeSavePhraseBook(phraseBook)) diff --git a/tools/linguist/linguist/mainwindow.h b/tools/linguist/linguist/mainwindow.h index c589945..7a81ff6 100644 --- a/tools/linguist/linguist/mainwindow.h +++ b/tools/linguist/linguist/mainwindow.h @@ -192,7 +192,7 @@ private: bool isPhraseBookOpen(const QString &name); bool savePhraseBook(QString *name, PhraseBook &pb); bool maybeSavePhraseBook(PhraseBook *phraseBook); - bool closePhraseBooks(); + bool maybeSavePhraseBooks(); QStringList pickTranslationFiles(); void showTranslationSettings(int model); void updateLatestModel(int model); diff --git a/tools/linguist/linguist/messagemodel.cpp b/tools/linguist/linguist/messagemodel.cpp index 9eea2a3..5cbc5e8 100644 --- a/tools/linguist/linguist/messagemodel.cpp +++ b/tools/linguist/linguist/messagemodel.cpp @@ -375,7 +375,7 @@ bool DataModel::release(const QString &fileName, bool verbose, bool ignoreUnfini cd.m_verbose = verbose; cd.m_ignoreUnfinished = ignoreUnfinished; cd.m_saveMode = mode; - bool ok = tor.release(&file, cd); + bool ok = saveQM(tor, file, cd); if (!ok) QMessageBox::warning(parent, QObject::tr("Qt Linguist"), cd.error()); return ok; diff --git a/tools/linguist/lrelease/lrelease.pro b/tools/linguist/lrelease/lrelease.pro index 89694be..28a741d 100644 --- a/tools/linguist/lrelease/lrelease.pro +++ b/tools/linguist/lrelease/lrelease.pro @@ -5,19 +5,9 @@ DESTDIR = ../../../bin DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII SOURCES += main.cpp -INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global # qlibraryinfo.cpp includes qconfig.cpp -SOURCES += \ - $$QT_SOURCE_TREE/src/corelib/global/qlibraryinfo.cpp \ - $$QT_SOURCE_TREE/src/corelib/io/qsettings.cpp -win32:SOURCES += $$QT_SOURCE_TREE/src/corelib/io/qsettings_win.cpp -macx:SOURCES += $$QT_SOURCE_TREE/src/corelib/io/qsettings_mac.cpp - include(../../../src/tools/bootstrap/bootstrap.pri) include(../shared/formats.pri) include(../shared/proparser.pri) -include(../../shared/symbian/epocroot.pri) - -win32:LIBS += -ladvapi32 # for qsettings_win.cpp target.path=$$[QT_INSTALL_BINS] INSTALLS += target diff --git a/tools/linguist/lrelease/main.cpp b/tools/linguist/lrelease/main.cpp index 72d5d48..1fa1474 100644 --- a/tools/linguist/lrelease/main.cpp +++ b/tools/linguist/lrelease/main.cpp @@ -40,7 +40,9 @@ ****************************************************************************/ #include "translator.h" -#include "profileevaluator.h" + +#include <profileparser.h> +#include <profileevaluator.h> #ifndef QT_BOOTSTRAPPED #include <QtCore/QCoreApplication> @@ -55,11 +57,11 @@ #include <QtCore/QStringList> #include <QtCore/QTextStream> -#include <iostream> - QT_USE_NAMESPACE #ifdef QT_BOOTSTRAPPED +static QString binDir; + static void initBinaryDir( #ifndef Q_OS_WIN const char *argv0 @@ -84,6 +86,12 @@ static void printOut(const QString & out) stream << out; } +static void printErr(const QString & out) +{ + QTextStream stream(stderr); + stream << out; +} + static void printUsage() { printOut(LR::tr( @@ -119,7 +127,7 @@ static bool loadTsFile(Translator &tor, const QString &tsFileName, bool /* verbo ConversionData cd; bool ok = tor.load(tsFileName, cd, QLatin1String("auto")); if (!ok) { - std::cerr << qPrintable(LR::tr("lrelease error: %1").arg(cd.error())); + printErr(LR::tr("lrelease error: %1").arg(cd.error())); } else { if (!cd.errors().isEmpty()) printOut(cd.error()); @@ -143,17 +151,17 @@ static bool releaseTranslator(Translator &tor, const QString &qmFileName, QFile file(qmFileName); if (!file.open(QIODevice::WriteOnly)) { - std::cerr << qPrintable(LR::tr("lrelease error: cannot create '%1': %2\n") + printErr(LR::tr("lrelease error: cannot create '%1': %2\n") .arg(qmFileName, file.errorString())); return false; } tor.normalizeTranslations(cd); - bool ok = tor.release(&file, cd); + bool ok = saveQM(tor, file, cd); file.close(); if (!ok) { - std::cerr << qPrintable(LR::tr("lrelease error: cannot save '%1': %2") + printErr(LR::tr("lrelease error: cannot save '%1': %2") .arg(qmFileName, cd.error())); } else if (!cd.errors().isEmpty()) { printOut(cd.error()); @@ -181,6 +189,40 @@ static bool releaseTsFile(const QString& tsFileName, return releaseTranslator(tor, qmFileName, cd, removeIdentical); } +static void print(const QString &fileName, int lineNo, const QString &msg) +{ + if (lineNo) + printErr(QString::fromLatin1("%2(%1): %3").arg(lineNo).arg(fileName, msg)); + else + printErr(msg); +} + +class ParseHandler : public ProFileParserHandler { +public: + virtual void parseError(const QString &fileName, int lineNo, const QString &msg) + { if (verbose) print(fileName, lineNo, msg); } + + bool verbose; +}; + +class EvalHandler : public ProFileEvaluatorHandler { +public: + virtual void configError(const QString &msg) + { printErr(msg); } + virtual void evalError(const QString &fileName, int lineNo, const QString &msg) + { if (verbose) print(fileName, lineNo, msg); } + virtual void fileMessage(const QString &msg) + { printErr(msg); } + + virtual void aboutToEval(ProFile *, ProFile *, EvalFileType) {} + virtual void doneWithEval(ProFile *) {} + + bool verbose; +}; + +static ParseHandler parseHandler; +static EvalHandler evalHandler; + int main(int argc, char **argv) { #ifdef QT_BOOTSTRAPPED @@ -268,27 +310,36 @@ int main(int argc, char **argv) if (inputFile.endsWith(QLatin1String(".pro"), Qt::CaseInsensitive) || inputFile.endsWith(QLatin1String(".pri"), Qt::CaseInsensitive)) { QFileInfo fi(inputFile); - ProFile pro(fi.absoluteFilePath()); - ProFileEvaluator visitor; - visitor.setVerbose(cd.isVerbose()); + parseHandler.verbose = evalHandler.verbose = cd.isVerbose(); + ProFileOption option; +#ifdef QT_BOOTSTRAPPED + option.initProperties(binDir + QLatin1String("/qmake")); +#else + option.initProperties(app.applicationDirPath() + QLatin1String("/qmake")); +#endif + ProFileParser parser(0, &parseHandler); + ProFileEvaluator visitor(&option, &parser, &evalHandler); - if (!visitor.queryProFile(&pro)) { - std::cerr << qPrintable(LR::tr( + ProFile *pro; + if (!(pro = parser.parsedProFile(QDir::cleanPath(fi.absoluteFilePath())))) { + printErr(LR::tr( "lrelease error: cannot read project file '%1'.\n") .arg(inputFile)); continue; } - if (!visitor.accept(&pro)) { - std::cerr << qPrintable(LR::tr( + if (!visitor.accept(pro)) { + printErr(LR::tr( "lrelease error: cannot process project file '%1'.\n") .arg(inputFile)); + pro->deref(); continue; } + pro->deref(); QStringList translations = visitor.values(QLatin1String("TRANSLATIONS")); if (translations.isEmpty()) { - std::cerr << qPrintable(LR::tr( + printErr(LR::tr( "lrelease warning: Met no 'TRANSLATIONS' entry in project file '%1'\n") .arg(inputFile)); } else { @@ -320,8 +371,6 @@ int main(int argc, char **argv) # include <windows.h> #endif -static QString binDir; - static void initBinaryDir( #ifndef Q_OS_WIN const char *_argv0 @@ -376,16 +425,4 @@ static void initBinaryDir( #endif } -QT_BEGIN_NAMESPACE - -// The name is hard-coded in QLibraryInfo -QString qmake_libraryInfoFile() -{ - if (binDir.isEmpty()) - return QString(); - return QDir(binDir).filePath(QString::fromLatin1("qt.conf")); -} - -QT_END_NAMESPACE - #endif // QT_BOOTSTRAPPED diff --git a/tools/linguist/lupdate/main.cpp b/tools/linguist/lupdate/main.cpp index 737bfd0..34bb792 100644 --- a/tools/linguist/lupdate/main.cpp +++ b/tools/linguist/lupdate/main.cpp @@ -42,6 +42,7 @@ #include "lupdate.h" #include <translator.h> +#include <profileparser.h> #include <profileevaluator.h> #include <QtCore/QCoreApplication> @@ -227,6 +228,40 @@ static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFil } } +static void print(const QString &fileName, int lineNo, const QString &msg) +{ + if (lineNo) + printErr(QString::fromLatin1("%2(%1): %3").arg(lineNo).arg(fileName, msg)); + else + printErr(msg); +} + +class ParseHandler : public ProFileParserHandler { +public: + virtual void parseError(const QString &fileName, int lineNo, const QString &msg) + { if (verbose) print(fileName, lineNo, msg); } + + bool verbose; +}; + +class EvalHandler : public ProFileEvaluatorHandler { +public: + virtual void configError(const QString &msg) + { printErr(msg); } + virtual void evalError(const QString &fileName, int lineNo, const QString &msg) + { if (verbose) print(fileName, lineNo, msg); } + virtual void fileMessage(const QString &msg) + { printErr(msg); } + + virtual void aboutToEval(ProFile *, ProFile *, EvalFileType) {} + virtual void doneWithEval(ProFile *) {} + + bool verbose; +}; + +static ParseHandler parseHandler; +static EvalHandler evalHandler; + static QStringList getSources(const char *var, const char *vvar, const QStringList &baseVPaths, const QString &projectDir, const ProFileEvaluator &visitor) { @@ -288,12 +323,14 @@ static void processSources(Translator &fetchedTor, static void processProjects( bool topLevel, bool nestComplain, const QStringList &proFiles, + ProFileOption *option, ProFileParser *parser, UpdateOptions options, const QByteArray &codecForSource, const QString &targetLanguage, const QString &sourceLanguage, Translator *parentTor, bool *fail); static void processProject( - bool nestComplain, const QFileInfo &pfi, ProFileEvaluator &visitor, + bool nestComplain, const QFileInfo &pfi, + ProFileOption *option, ProFileParser *parser, ProFileEvaluator &visitor, UpdateOptions options, const QByteArray &_codecForSource, const QString &targetLanguage, const QString &sourceLanguage, Translator *fetchedTor, bool *fail) @@ -321,7 +358,7 @@ static void processProject( else subProFiles << subPro; } - processProjects(false, nestComplain, subProFiles, options, codecForSource, + processProjects(false, nestComplain, subProFiles, option, parser, options, codecForSource, targetLanguage, sourceLanguage, fetchedTor, fail); } else { ConversionData cd; @@ -347,23 +384,25 @@ static void processProject( static void processProjects( bool topLevel, bool nestComplain, const QStringList &proFiles, + ProFileOption *option, ProFileParser *parser, UpdateOptions options, const QByteArray &codecForSource, const QString &targetLanguage, const QString &sourceLanguage, Translator *parentTor, bool *fail) { foreach (const QString &proFile, proFiles) { - ProFileEvaluator visitor; - visitor.setVerbose(options & Verbose); - - QHash<QString, QStringList> lupdateConfig; - lupdateConfig.insert(QLatin1String("CONFIG"), QStringList(QLatin1String("lupdate_run"))); - visitor.addVariables(lupdateConfig); - QFileInfo pfi(proFile); - ProFile pro(pfi.absoluteFilePath()); - if (!visitor.queryProFile(&pro) || !visitor.accept(&pro)) { + + ProFileEvaluator visitor(option, parser, &evalHandler); + ProFile *pro; + if (!(pro = parser->parsedProFile(QDir::cleanPath(pfi.absoluteFilePath())))) { + if (topLevel) + *fail = true; + continue; + } + if (!visitor.accept(pro)) { if (topLevel) *fail = true; + pro->deref(); continue; } @@ -376,6 +415,7 @@ static void processProjects( } else if (nestComplain) { printErr(LU::tr("lupdate warning: TS files from command line " "prevent recursing into %1.\n").arg(proFile)); + pro->deref(); continue; } } @@ -387,6 +427,7 @@ static void processProjects( // This might mean either a buggy PRO file or an intentional detach - // we can't know without seeing the actual RHS of the assignment ... // Just assume correctness and be silent. + pro->deref(); continue; } Translator tor; @@ -398,9 +439,10 @@ static void processProjects( tor.setCodecName(tmp.last().toLatin1()); setCodec = true; } - processProject(false, pfi, visitor, options, codecForSource, + processProject(false, pfi, option, parser, visitor, options, codecForSource, targetLanguage, sourceLanguage, &tor, fail); updateTsFiles(tor, tsFiles, setCodec, sourceLanguage, targetLanguage, options, fail); + pro->deref(); continue; } noTrans: @@ -409,12 +451,13 @@ static void processProjects( printErr(LU::tr("lupdate warning: no TS files specified. Only diagnostics " "will be produced for '%1'.\n").arg(proFile)); Translator tor; - processProject(nestComplain, pfi, visitor, options, codecForSource, + processProject(nestComplain, pfi, option, parser, visitor, options, codecForSource, targetLanguage, sourceLanguage, &tor, fail); } else { - processProject(nestComplain, pfi, visitor, options, codecForSource, + processProject(nestComplain, pfi, option, parser, visitor, options, codecForSource, targetLanguage, sourceLanguage, parentTor, fail); } + pro->deref(); } } @@ -714,15 +757,22 @@ int main(int argc, char **argv) " Both project and source files / include paths specified.\n")); return 1; } + + parseHandler.verbose = evalHandler.verbose = !!(options & Verbose); + ProFileOption option; + option.initProperties(app.applicationDirPath() + QLatin1String("/qmake")); + option.setCommandLineArguments(QStringList() << QLatin1String("CONFIG+=lupdate_run")); + ProFileParser parser(0, &parseHandler); + if (!tsFileNames.isEmpty()) { Translator fetchedTor; fetchedTor.setCodecName(codecForTr); - processProjects(true, true, proFiles, options, QByteArray(), + processProjects(true, true, proFiles, &option, &parser, options, QByteArray(), targetLanguage, sourceLanguage, &fetchedTor, &fail); updateTsFiles(fetchedTor, tsFileNames, !codecForTr.isEmpty(), sourceLanguage, targetLanguage, options, &fail); } else { - processProjects(true, false, proFiles, options, QByteArray(), + processProjects(true, false, proFiles, &option, &parser, options, QByteArray(), targetLanguage, sourceLanguage, 0, &fail); } } diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp index 2d5230b..8b6624d 100644 --- a/tools/linguist/lupdate/merge.cpp +++ b/tools/linguist/lupdate/merge.cpp @@ -348,11 +348,11 @@ Translator merge(const Translator &tor, const Translator &virginTor, if (m.sourceText().isEmpty() && m.id().isEmpty()) { // context/file comment - TranslatorMessage mv = virginTor.find(m.context()); - if (!mv.isNull()) - m.setComment(mv.comment()); + int mvi = virginTor.find(m.context()); + if (mvi >= 0) + m.setComment(virginTor.constMessage(mvi).comment()); } else { - TranslatorMessage mv; + const TranslatorMessage *mv; int mvi = virginTor.find(m); if (mvi < 0) { if (!(options & HeuristicSimilarText)) { @@ -362,16 +362,17 @@ Translator merge(const Translator &tor, const Translator &virginTor, obsoleted++; m.clearReferences(); } else { - mv = virginTor.find(m.context(), m.comment(), m.allReferences()); - if (mv.isNull()) { + mvi = virginTor.find(m.context(), m.comment(), m.allReferences()); + if (mvi < 0) { // did not find it in the virgin, mark it as obsolete goto makeObsolete; } else { + mv = &virginTor.constMessage(mvi); // Do not just accept it if its on the same line number, // but different source text. // Also check if the texts are more or less similar before // we consider them to represent the same message... - if (getSimilarityScore(m.sourceText(), mv.sourceText()) >= textSimilarityThreshold) { + if (getSimilarityScore(m.sourceText(), mv->sourceText()) >= textSimilarityThreshold) { // It is just slightly modified, assume that it is the same string // Mark it as unfinished. (Since the source text @@ -382,7 +383,7 @@ Translator merge(const Translator &tor, const Translator &virginTor, outdateSource: m.setOldSourceText(m.sourceText()); - m.setSourceText(mv.sourceText()); + m.setSourceText(mv->sourceText()); const QString &oldpluralsource = m.extra(QLatin1String("po-msgid_plural")); if (!oldpluralsource.isEmpty()) { m.setExtra(QLatin1String("po-old_msgid_plural"), oldpluralsource); @@ -397,22 +398,22 @@ Translator merge(const Translator &tor, const Translator &virginTor, } } } else { - mv = virginTor.message(mvi); - if (!mv.id().isEmpty() - && (mv.context() != m.context() - || mv.sourceText() != m.sourceText() - || mv.comment() != m.comment())) { + mv = &virginTor.message(mvi); + if (!mv->id().isEmpty() + && (mv->context() != m.context() + || mv->sourceText() != m.sourceText() + || mv->comment() != m.comment())) { known++; newType = TranslatorMessage::Unfinished; - m.setContext(mv.context()); - m.setComment(mv.comment()); - if (mv.sourceText() != m.sourceText()) + m.setContext(mv->context()); + m.setComment(mv->comment()); + if (mv->sourceText() != m.sourceText()) goto outdateSource; } else { switch (m.type()) { case TranslatorMessage::Finished: default: - if (m.isPlural() == mv.isPlural()) { + if (m.isPlural() == mv->isPlural()) { newType = TranslatorMessage::Finished; } else { newType = TranslatorMessage::Unfinished; @@ -435,11 +436,11 @@ Translator merge(const Translator &tor, const Translator &virginTor, // have the <location> element. // why not use operator=()? Because it overwrites e.g. userData. copyAttribs: - m.setReferences(mv.allReferences()); - m.setPlural(mv.isPlural()); - m.setUtf8(mv.isUtf8()); - m.setExtraComment(mv.extraComment()); - m.setId(mv.id()); + m.setReferences(mv->allReferences()); + m.setPlural(mv->isPlural()); + m.setUtf8(mv->isUtf8()); + m.setExtraComment(mv->extraComment()); + m.setId(mv->id()); } } @@ -453,15 +454,16 @@ Translator merge(const Translator &tor, const Translator &virginTor, */ foreach (const TranslatorMessage &mv, virginTor.messages()) { if (mv.sourceText().isEmpty() && mv.id().isEmpty()) { - if (tor.contains(mv.context())) + if (tor.find(mv.context()) >= 0) continue; } else { if (tor.find(mv) >= 0) continue; if (options & HeuristicSimilarText) { - TranslatorMessage m = tor.find(mv.context(), mv.comment(), mv.allReferences()); - if (!m.isNull()) { - if (getSimilarityScore(m.sourceText(), mv.sourceText()) >= textSimilarityThreshold) + int mi = tor.find(mv.context(), mv.comment(), mv.allReferences()); + if (mi >= 0) { + if (getSimilarityScore(tor.constMessage(mi).sourceText(), mv.sourceText()) + >= textSimilarityThreshold) continue; } } diff --git a/tools/linguist/phrasebooks/japanese.qph b/tools/linguist/phrasebooks/japanese.qph index 3ecd9e3..b04e525 100644 --- a/tools/linguist/phrasebooks/japanese.qph +++ b/tools/linguist/phrasebooks/japanese.qph @@ -1,4 +1,5 @@ -<!DOCTYPE QPH><QPH language="ja"> +<!DOCTYPE QPH> +<QPH language="ja"> <phrase> <source>About</source> <target>について</target> @@ -1018,4 +1019,16 @@ <source>Yes</source> <target>はい</target> </phrase> +<phrase> + <source>&Next</source> + <target>次を検索(&N)</target> +</phrase> +<phrase> + <source>List View</source> + <target>一覧表示</target> +</phrase> +<phrase> + <source>&Run</source> + <target>実行(&R)</target> +</phrase> </QPH> diff --git a/tools/linguist/shared/abstractproitemvisitor.h b/tools/linguist/shared/abstractproitemvisitor.h deleted file mode 100644 index 73614c5..0000000 --- a/tools/linguist/shared/abstractproitemvisitor.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Linguist 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 ABSTRACTPROITEMVISITOR -#define ABSTRACTPROITEMVISITOR - -#include "proitems.h" - -QT_BEGIN_NAMESPACE - -struct AbstractProItemVisitor -{ - virtual ~AbstractProItemVisitor() {} - - virtual ProItem::ProItemReturn visitBeginProBlock(ProBlock *block) = 0; - virtual void visitEndProBlock(ProBlock *block) = 0; - - virtual ProItem::ProItemReturn visitProLoopIteration() = 0; - virtual void visitProLoopCleanup() = 0; - - virtual void visitBeginProVariable(ProVariable *variable) = 0; - virtual void visitEndProVariable(ProVariable *variable) = 0; - - virtual ProItem::ProItemReturn visitBeginProFile(ProFile *value) = 0; - virtual ProItem::ProItemReturn visitEndProFile(ProFile *value) = 0; - - virtual void visitProValue(ProValue *value) = 0; - virtual ProItem::ProItemReturn visitProFunction(ProFunction *function) = 0; - virtual void visitProOperator(ProOperator *function) = 0; - virtual void visitProCondition(ProCondition *function) = 0; -}; - -QT_END_NAMESPACE - -#endif // ABSTRACTPROITEMVISITOR - diff --git a/tools/linguist/shared/ioutils.cpp b/tools/linguist/shared/ioutils.cpp new file mode 100644 index 0000000..9658cf6 --- /dev/null +++ b/tools/linguist/shared/ioutils.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Linguist 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 "ioutils.h" + +#include <QtCore/QDir> +#include <QtCore/QFile> + +#ifdef Q_OS_WIN +# include <windows.h> +#else +# include <sys/types.h> +# include <sys/stat.h> +# include <unistd.h> +#endif + +using namespace ProFileEvaluatorInternal; + +IoUtils::FileType IoUtils::fileType(const QString &fileName) +{ + Q_ASSERT(fileName.isEmpty() || isAbsolutePath(fileName)); +#ifdef Q_OS_WIN + DWORD attr = GetFileAttributesW((WCHAR*)fileName.utf16()); + if (attr == INVALID_FILE_ATTRIBUTES) + return FileNotFound; + return (attr & FILE_ATTRIBUTE_DIRECTORY) ? FileIsDir : FileIsRegular; +#else + struct ::stat st; + if (::stat(fileName.toLocal8Bit().constData(), &st)) + return FileNotFound; + return S_ISDIR(st.st_mode) ? FileIsDir : FileIsRegular; +#endif +} + +bool IoUtils::isRelativePath(const QString &path) +{ + if (path.startsWith(QLatin1Char('/'))) + return false; +#ifdef Q_OS_WIN + if (path.startsWith(QLatin1Char('\\'))) + return false; + // Unlike QFileInfo, this won't accept a relative path with a drive letter. + // Such paths result in a royal mess anyway ... + if (path.length() >= 3 && path.at(1) == QLatin1Char(':') && path.at(0).isLetter() + && (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\'))) + return false; +#endif + return true; +} + +QStringRef IoUtils::fileName(const QString &fileName) +{ + return fileName.midRef(fileName.lastIndexOf(QLatin1Char('/')) + 1); +} + +QString IoUtils::resolvePath(const QString &baseDir, const QString &fileName) +{ + if (fileName.isEmpty()) + return QString(); + if (isAbsolutePath(fileName)) + return QDir::cleanPath(fileName); + return QDir::cleanPath(baseDir + QLatin1Char('/') + fileName); +} + +#ifdef QT_BOOTSTRAPPED +inline static bool isSpecialChar(ushort c) +{ + // Chars that should be quoted (TM). This includes: +#ifdef Q_OS_WIN + // - control chars & space + // - the shell meta chars "&()<>^| + // - the potential separators ,;= + static const uchar iqm[] = { + 0xff, 0xff, 0xff, 0xff, 0x45, 0x13, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10 + }; +#else + static const uchar iqm[] = { + 0xff, 0xff, 0xff, 0xff, 0xdf, 0x07, 0x00, 0xd8, + 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x78 + }; // 0-32 \'"$`<>|;&(){}*?#!~[] +#endif + + return (c < sizeof(iqm) * 8) && (iqm[c / 8] & (1 << (c & 7))); +} + +inline static bool hasSpecialChars(const QString &arg) +{ + for (int x = arg.length() - 1; x >= 0; --x) + if (isSpecialChar(arg.unicode()[x].unicode())) + return true; + return false; +} + +QString IoUtils::shellQuote(const QString &arg) +{ + if (!arg.length()) + return QString::fromLatin1("\"\""); + + QString ret(arg); + if (hasSpecialChars(ret)) { +#ifdef Q_OS_WIN + // Quotes are escaped and their preceding backslashes are doubled. + // It's impossible to escape anything inside a quoted string on cmd + // level, so the outer quoting must be "suspended". + ret.replace(QRegExp(QLatin1String("(\\\\*)\"")), QLatin1String("\"\\1\\1\\^\"\"")); + // The argument must not end with a \ since this would be interpreted + // as escaping the quote -- rather put the \ behind the quote: e.g. + // rather use "foo"\ than "foo\" + int i = ret.length(); + while (i > 0 && ret.at(i - 1) == QLatin1Char('\\')) + --i; + ret.insert(i, QLatin1Char('"')); + ret.prepend(QLatin1Char('"')); +#else // Q_OS_WIN + ret.replace(QLatin1Char('\''), QLatin1String("'\\''")); + ret.prepend(QLatin1Char('\'')); + ret.append(QLatin1Char('\'')); +#endif // Q_OS_WIN + } + return ret; +} +#endif diff --git a/tools/linguist/shared/ioutils.h b/tools/linguist/shared/ioutils.h new file mode 100644 index 0000000..e013aef --- /dev/null +++ b/tools/linguist/shared/ioutils.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Linguist 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 IOUTILS_H +#define IOUTILS_H + +#include <QtCore/QString> + +namespace ProFileEvaluatorInternal { + +/*! + This class provides replacement functionality for QFileInfo, QFile & QDir, + as these are abysmally slow. +*/ +class IoUtils { +public: + enum FileType { + FileNotFound = 0, + FileIsRegular = 1, + FileIsDir = 2 + }; + + static FileType fileType(const QString &fileName); + static bool exists(const QString &fileName) { return fileType(fileName) != FileNotFound; } + static bool isRelativePath(const QString &fileName); + static bool isAbsolutePath(const QString &fileName) { return !isRelativePath(fileName); } + static QStringRef fileName(const QString &fileName); // Requires normalized path + static QString resolvePath(const QString &baseDir, const QString &fileName); +#ifdef QT_BOOTSTRAPPED + static QString shellQuote(const QString &arg); +#endif +}; + +} + +#endif // IOUTILS_H diff --git a/tools/linguist/shared/profileevaluator.cpp b/tools/linguist/shared/profileevaluator.cpp index 0393768..0539efa 100644 --- a/tools/linguist/shared/profileevaluator.cpp +++ b/tools/linguist/shared/profileevaluator.cpp @@ -40,8 +40,9 @@ ****************************************************************************/ #include "profileevaluator.h" -#include "proparserutils.h" -#include "proitems.h" + +#include "profileparser.h" +#include "ioutils.h" #include <QtCore/QByteArray> #include <QtCore/QDateTime> @@ -56,6 +57,9 @@ #include <QtCore/QString> #include <QtCore/QStringList> #include <QtCore/QTextStream> +#ifdef PROEVALUATOR_THREAD_SAFE +# include <QtCore/QThreadPool> +#endif #ifdef Q_OS_UNIX #include <unistd.h> @@ -74,966 +78,1482 @@ #define QT_PCLOSE pclose #endif +using namespace ProFileEvaluatorInternal; + QT_BEGIN_NAMESPACE +using namespace ProStringConstants; + + +#define fL1S(s) QString::fromLatin1(s) + /////////////////////////////////////////////////////////////////////// // -// Option +// ProFileOption // /////////////////////////////////////////////////////////////////////// -QString -Option::fixString(QString string, uchar flags) +ProFileOption::ProFileOption() { - // XXX Ripped out caching, so this will be slow. Should not matter for current uses. +#ifdef Q_OS_WIN + dirlist_sep = QLatin1Char(';'); + dir_sep = QLatin1Char('\\'); +#else + dirlist_sep = QLatin1Char(':'); + dir_sep = QLatin1Char('/'); +#endif + qmakespec = getEnv(QLatin1String("QMAKESPEC")); - //fix the environment variables - if (flags & Option::FixEnvVars) { - int rep; - QRegExp reg_variableName(QLatin1String("\\$\\(.*\\)")); - reg_variableName.setMinimal(true); - while ((rep = reg_variableName.indexIn(string)) != -1) - string.replace(rep, reg_variableName.matchedLength(), - QString::fromLocal8Bit(qgetenv(string.mid(rep + 2, reg_variableName.matchedLength() - 3).toLatin1().constData()).constData())); - } + host_mode = HOST_UNKNOWN_MODE; + target_mode = TARG_UNKNOWN_MODE; - //canonicalize it (and treat as a path) - if (flags & Option::FixPathCanonicalize) { -#if 0 - string = QFileInfo(string).canonicalFilePath(); +#ifdef PROEVALUATOR_THREAD_SAFE + base_inProgress = false; #endif - string = QDir::cleanPath(string); - } +} - if (string.length() > 2 && string[0].isLetter() && string[1] == QLatin1Char(':')) - string[0] = string[0].toLower(); +ProFileOption::~ProFileOption() +{ +} - //fix separators - Q_ASSERT(!((flags & Option::FixPathToLocalSeparators) && (flags & Option::FixPathToTargetSeparators))); - if (flags & Option::FixPathToLocalSeparators) { -#if defined(Q_OS_WIN32) - string = string.replace(QLatin1Char('/'), QLatin1Char('\\')); -#else - string = string.replace(QLatin1Char('\\'), QLatin1Char('/')); -#endif - } else if (flags & Option::FixPathToTargetSeparators) { - string = string.replace(QLatin1Char('/'), Option::dir_sep) - .replace(QLatin1Char('\\'), Option::dir_sep); +void ProFileOption::setCommandLineArguments(const QStringList &args) +{ + QStringList _precmds, _preconfigs, _postcmds, _postconfigs; + bool after = false; + + bool isConf = false; + foreach (const QString &arg, args) { + if (isConf) { + isConf = false; + if (after) + _postconfigs << arg; + else + _preconfigs << arg; + } else if (arg.startsWith(QLatin1Char('-'))) { + if (arg == QLatin1String("-after")) { + after = true; + } else if (arg == QLatin1String("-config")) { + isConf = true; + } else if (arg == QLatin1String("-win32")) { + host_mode = HOST_WIN_MODE; + target_mode = TARG_WIN_MODE; + } else if (arg == QLatin1String("-unix")) { + host_mode = HOST_UNIX_MODE; + target_mode = TARG_UNIX_MODE; + } else if (arg == QLatin1String("-macx")) { + host_mode = HOST_MACX_MODE; + target_mode = TARG_MACX_MODE; + } + } else if (arg.contains(QLatin1Char('='))) { + if (after) + _postcmds << arg; + else + _precmds << arg; + } } - if ((string.startsWith(QLatin1Char('"')) && string.endsWith(QLatin1Char('"'))) || - (string.startsWith(QLatin1Char('\'')) && string.endsWith(QLatin1Char('\'')))) - string = string.mid(1, string.length() - 2); + if (!_preconfigs.isEmpty()) + _precmds << (fL1S("CONFIG += ") + _preconfigs.join(fL1S(" "))); + precmds = _precmds.join(fL1S("\n")); + if (!_postconfigs.isEmpty()) + _postcmds << (fL1S("CONFIG += ") + _postconfigs.join(fL1S(" "))); + postcmds = _postcmds.join(fL1S("\n")); - return string; + if (host_mode != HOST_UNKNOWN_MODE) + applyHostMode(); } +void ProFileOption::applyHostMode() +{ + if (host_mode == HOST_WIN_MODE) { + dir_sep = fL1S("\\"); + } else { + dir_sep = fL1S("/"); + } +} + +QString ProFileOption::getEnv(const QString &var) const +{ +#ifndef QT_BOOTSTRAPPED + if (!environment.isEmpty()) + return environment.value(var); +#endif + return QString::fromLocal8Bit(qgetenv(var.toLocal8Bit().constData())); +} + +#ifdef PROEVALUATOR_INIT_PROPS +bool ProFileOption::initProperties(const QString &qmake) +{ + QByteArray data; +#ifndef QT_BOOTSTRAPPED + QProcess proc; + proc.start(qmake, QStringList() << QLatin1String("-query")); + if (!proc.waitForFinished()) + return false; + data = proc.readAll(); +#else + if (FILE *proc = QT_POPEN(QString(IoUtils::shellQuote(qmake) + QLatin1String(" -query")) + .toLocal8Bit(), "r")) { + char buff[1024]; + while (!feof(proc)) + data.append(buff, int(fread(buff, 1, 1023, proc))); + QT_PCLOSE(proc); + } +#endif + foreach (QByteArray line, data.split('\n')) + if (!line.startsWith("QMAKE_")) { + int off = line.indexOf(':'); + if (off < 0) // huh? + continue; + if (line.endsWith('\r')) + line.chop(1); + properties.insert(QString::fromLatin1(line.left(off)), + QString::fromLocal8Bit(line.mid(off + 1))); + } + return true; +} +#endif + /////////////////////////////////////////////////////////////////////// // // ProFileEvaluator::Private // /////////////////////////////////////////////////////////////////////// -class ProFileEvaluator::Private : public AbstractProItemVisitor +class ProFileEvaluator::Private { public: - Private(ProFileEvaluator *q_); + static void initStatics(); + Private(ProFileEvaluator *q_, ProFileOption *option, ProFileParser *parser, + ProFileEvaluatorHandler *handler); + ~Private(); ProFileEvaluator *q; - int m_lineNo; // Error reporting - bool m_verbose; - - /////////////// Reading pro file - - bool read(ProFile *pro); - - ProBlock *currentBlock(); - void updateItem(); - bool parseLine(const QString &line); - void insertVariable(const QString &line, int *i); - void insertOperator(const char op); - void insertComment(const QString &comment); - void enterScope(bool multiLine); - void leaveScope(); - void finalizeBlock(); - - QStack<ProBlock *> m_blockstack; - ProBlock *m_block; - - ProItem *m_commentItem; - QString m_proitem; - QString m_pendingComment; - bool m_syntaxError; - bool m_contNextLine; - bool m_inQuote; - int m_parens; - - /////////////// Evaluating pro file contents - - // implementation of AbstractProItemVisitor - ProItem::ProItemReturn visitBeginProBlock(ProBlock *block); - void visitEndProBlock(ProBlock *block); - ProItem::ProItemReturn visitProLoopIteration(); - void visitProLoopCleanup(); - void visitBeginProVariable(ProVariable *variable); - void visitEndProVariable(ProVariable *variable); - ProItem::ProItemReturn visitBeginProFile(ProFile *value); - ProItem::ProItemReturn visitEndProFile(ProFile *value); - void visitProValue(ProValue *value); - ProItem::ProItemReturn visitProFunction(ProFunction *function); - void visitProOperator(ProOperator *oper); - void visitProCondition(ProCondition *condition); - - QStringList valuesDirect(const QString &variableName) const { return m_valuemap[variableName]; } - QStringList values(const QString &variableName) const; - QStringList values(const QString &variableName, const ProFile *pro) const; - QStringList values(const QString &variableName, const QHash<QString, QStringList> &place, - const ProFile *pro) const; - QString propertyValue(const QString &val) const; + enum VisitReturn { + ReturnFalse, + ReturnTrue, + ReturnBreak, + ReturnNext, + ReturnReturn + }; + + static ALWAYS_INLINE uint getBlockLen(const ushort *&tokPtr); + ProString getStr(const ushort *&tokPtr); + ProString getHashStr(const ushort *&tokPtr); + void evaluateExpression(const ushort *&tokPtr, ProStringList *ret, bool joined); + static ALWAYS_INLINE void skipStr(const ushort *&tokPtr); + static ALWAYS_INLINE void skipHashStr(const ushort *&tokPtr); + void skipExpression(const ushort *&tokPtr); + + void visitCmdLine(const QString &cmds); + VisitReturn visitProFile(ProFile *pro, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); + VisitReturn visitProBlock(ProFile *pro, const ushort *tokPtr); + VisitReturn visitProBlock(const ushort *tokPtr); + VisitReturn visitProLoop(const ProString &variable, const ushort *exprPtr, + const ushort *tokPtr); + void visitProFunctionDef(ushort tok, const ProString &name, const ushort *tokPtr); + void visitProVariable(ushort tok, const ProStringList &curr, const ushort *&tokPtr); + + static inline const ProString &map(const ProString &var); + QHash<ProString, ProStringList> *findValues(const ProString &variableName, + QHash<ProString, ProStringList>::Iterator *it); + ProStringList &valuesRef(const ProString &variableName); + ProStringList valuesDirect(const ProString &variableName) const; + ProStringList values(const ProString &variableName) const; + QString propertyValue(const QString &val, bool complain) const; + + ProStringList split_value_list(const QString &vals, const ProFile *source = 0); bool isActiveConfig(const QString &config, bool regex = false); - QStringList expandVariableReferences(const QString &value); - void doVariableReplace(QString *str); - QStringList evaluateExpandFunction(const QString &function, const QString &arguments); - QString format(const char *format) const; + ProStringList expandVariableReferences(const ProString &value, int *pos = 0, bool joined = false); + ProStringList expandVariableReferences(const ushort *&tokPtr, int sizeHint = 0, bool joined = false); + ProStringList evaluateExpandFunction(const ProString &function, const ProString &arguments); + ProStringList evaluateExpandFunction(const ProString &function, const ushort *&tokPtr); + ProStringList evaluateExpandFunction(const ProString &function, const ProStringList &args); + void evalError(const QString &msg) const; QString currentFileName() const; QString currentDirectory() const; ProFile *currentProFile() const; - - ProItem::ProItemReturn evaluateConditionalFunction(const QString &function, const QString &arguments); - bool evaluateFile(const QString &fileName); + QString resolvePath(const QString &fileName) const + { return IoUtils::resolvePath(currentDirectory(), fileName); } + + VisitReturn evaluateConditionalFunction(const ProString &function, const ProString &arguments); + VisitReturn evaluateConditionalFunction(const ProString &function, const ushort *&tokPtr); + VisitReturn evaluateConditionalFunction(const ProString &function, const ProStringList &args); + bool evaluateFileDirect(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); + bool evaluateFile(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags); bool evaluateFeatureFile(const QString &fileName); + enum EvalIntoMode { EvalProOnly, EvalWithDefaults, EvalWithSetup }; + bool evaluateFileInto(const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + QHash<ProString, ProStringList> *values, FunctionDefs *defs, + EvalIntoMode mode); // values are output-only, defs are input-only + + static ALWAYS_INLINE VisitReturn returnBool(bool b) + { return b ? ReturnTrue : ReturnFalse; } + + QList<ProStringList> prepareFunctionArgs(const ushort *&tokPtr); + QList<ProStringList> prepareFunctionArgs(const ProString &arguments); + ProStringList evaluateFunction(const FunctionDef &func, const QList<ProStringList> &argumentsList, bool *ok); + VisitReturn evaluateBoolFunction(const FunctionDef &func, const QList<ProStringList> &argumentsList, + const ProString &function); + + bool modesForGenerator(const QString &gen, + ProFileOption::HOST_MODE *host_mode, ProFileOption::TARG_MODE *target_mode) const; + void validateModes() const; + QStringList qmakeMkspecPaths() const; + QStringList qmakeFeaturePaths() const; + + QString expandEnvVars(const QString &str) const; + QString fixPathToLocalOS(const QString &str) const; + QString sysrootify(const QString &path, const QString &baseDir) const; + +#ifndef QT_BOOTSTRAPPED + void runProcess(QProcess *proc, const QString &command, QProcess::ProcessChannel chan) const; +#endif - static inline ProItem::ProItemReturn returnBool(bool b) - { return b ? ProItem::ReturnTrue : ProItem::ReturnFalse; } - - QStringList evaluateFunction(ProBlock *funcPtr, const QStringList &argumentsList, bool *ok); - - QStringList qmakeFeaturePaths(); - - struct State { - bool condition; - bool prevCondition; - } m_sts; - bool m_invertNext; // Short-lived, so not in State int m_skipLevel; + int m_loopLevel; // To report unexpected break() and next()s +#ifdef PROEVALUATOR_CUMULATIVE bool m_cumulative; - bool m_isFirstVariableValue; - QString m_lastVarName; - ProVariable::VariableOperator m_variableOperator; - QString m_origfile; - QString m_oldPath; // To restore the current path to the path - QStack<ProFile*> m_profileStack; // To handle 'include(a.pri), so we can track back to 'a.pro' when finished with 'a.pri' - struct ProLoop { - QString variable; - QStringList oldVarVal; - QStringList list; - int index; - bool infinite; +#else + enum { m_cumulative = 0 }; +#endif + + struct Location { + Location() : pro(0), line(0) {} + Location(ProFile *_pro, int _line) : pro(_pro), line(_line) {} + ProFile *pro; + int line; }; - QStack<ProLoop> m_loopStack; - // we need the following two variables for handling - // CONFIG = foo bar $$CONFIG - QHash<QString, QStringList> m_tempValuemap; // used while evaluating (variable operator value1 value2 ...) - QHash<const ProFile*, QHash<QString, QStringList> > m_tempFilevaluemap; // used while evaluating (variable operator value1 value2 ...) + Location m_current; // Currently evaluated location + QStack<Location> m_locationStack; // All execution location changes + QStack<ProFile *> m_profileStack; // Includes only - QHash<QString, QStringList> m_valuemap; // VariableName must be us-ascii, the content however can be non-us-ascii. - QHash<const ProFile*, QHash<QString, QStringList> > m_filevaluemap; // Variables per include file - QHash<QString, QString> m_properties; QString m_outputDir; - bool m_definingTest; - QString m_definingFunc; - QHash<QString, ProBlock *> m_testFunctions; - QHash<QString, ProBlock *> m_replaceFunctions; - QStringList m_returnValue; - QStack<QHash<QString, QStringList> > m_valuemapStack; - QStack<QHash<const ProFile*, QHash<QString, QStringList> > > m_filevaluemapStack; + int m_listCount; + FunctionDefs m_functionDefs; + ProStringList m_returnValue; + QStack<QHash<ProString, ProStringList> > m_valuemapStack; // VariableName must be us-ascii, the content however can be non-us-ascii. + QString m_tmp1, m_tmp2, m_tmp3, m_tmp[2]; // Temporaries for efficient toQString + + ProFileOption *m_option; + ProFileParser *m_parser; + ProFileEvaluatorHandler *m_handler; + + enum ExpandFunc { + E_INVALID = 0, E_MEMBER, E_FIRST, E_LAST, E_SIZE, E_CAT, E_FROMFILE, E_EVAL, E_LIST, + E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION, + E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND, + E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE, + E_REPLACE + }; + + enum TestFunc { + T_INVALID = 0, T_REQUIRES, T_GREATERTHAN, T_LESSTHAN, T_EQUALS, + T_EXISTS, T_EXPORT, T_CLEAR, T_UNSET, T_EVAL, T_CONFIG, T_SYSTEM, + T_RETURN, T_BREAK, T_NEXT, T_DEFINED, T_CONTAINS, T_INFILE, + T_COUNT, T_ISEMPTY, T_INCLUDE, T_LOAD, T_DEBUG, T_MESSAGE, T_IF + }; - int m_prevLineNo; // Checking whether we're assigning the same TARGET - ProFile *m_prevProFile; // See m_prevLineNo + enum VarName { + V_LITERAL_DOLLAR, V_LITERAL_HASH, V_LITERAL_WHITESPACE, + V_DIRLIST_SEPARATOR, V_DIR_SEPARATOR, + V_OUT_PWD, V_PWD, V_IN_PWD, + V__FILE_, V__LINE_, V__PRO_FILE_, V__PRO_FILE_PWD_, + V_QMAKE_HOST_arch, V_QMAKE_HOST_name, V_QMAKE_HOST_os, + V_QMAKE_HOST_version, V_QMAKE_HOST_version_string, + V__DATE_, V__QMAKE_CACHE_ + }; }; -Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::State, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::ProLoop, Q_MOVABLE_TYPE); +static struct { + QString field_sep; + QString strtrue; + QString strfalse; + QString strunix; + QString strmacx; + QString strmac; + QString strwin32; + QString strsymbian; + ProString strCONFIG; + ProString strARGS; + QString strDot; + QString strDotDot; + QString strever; + QString strforever; + ProString strTEMPLATE; + ProString strQMAKE_DIR_SEP; + QHash<ProString, int> expands; + QHash<ProString, int> functions; + QHash<ProString, int> varList; + QHash<ProString, ProString> varMap; + QRegExp reg_variableName; + ProStringList fakeValue; +} statics; + +void ProFileEvaluator::Private::initStatics() +{ + if (!statics.field_sep.isNull()) + return; + + statics.field_sep = QLatin1String(" "); + statics.strtrue = QLatin1String("true"); + statics.strfalse = QLatin1String("false"); + statics.strunix = QLatin1String("unix"); + statics.strmacx = QLatin1String("macx"); + statics.strmac = QLatin1String("mac"); + statics.strwin32 = QLatin1String("win32"); + statics.strsymbian = QLatin1String("symbian"); + statics.strCONFIG = ProString("CONFIG"); + statics.strARGS = ProString("ARGS"); + statics.strDot = QLatin1String("."); + statics.strDotDot = QLatin1String(".."); + statics.strever = QLatin1String("ever"); + statics.strforever = QLatin1String("forever"); + statics.strTEMPLATE = ProString("TEMPLATE"); + statics.strQMAKE_DIR_SEP = ProString("QMAKE_DIR_SEP"); + + statics.reg_variableName.setPattern(QLatin1String("\\$\\(.*\\)")); + statics.reg_variableName.setMinimal(true); + + statics.fakeValue.detach(); // It has to have a unique begin() value + + static const struct { + const char * const name; + const ExpandFunc func; + } expandInits[] = { + { "member", E_MEMBER }, + { "first", E_FIRST }, + { "last", E_LAST }, + { "size", E_SIZE }, + { "cat", E_CAT }, + { "fromfile", E_FROMFILE }, + { "eval", E_EVAL }, + { "list", E_LIST }, + { "sprintf", E_SPRINTF }, + { "join", E_JOIN }, + { "split", E_SPLIT }, + { "basename", E_BASENAME }, + { "dirname", E_DIRNAME }, + { "section", E_SECTION }, + { "find", E_FIND }, + { "system", E_SYSTEM }, + { "unique", E_UNIQUE }, + { "quote", E_QUOTE }, + { "escape_expand", E_ESCAPE_EXPAND }, + { "upper", E_UPPER }, + { "lower", E_LOWER }, + { "re_escape", E_RE_ESCAPE }, + { "files", E_FILES }, + { "prompt", E_PROMPT }, // interactive, so cannot be implemented + { "replace", E_REPLACE } + }; + for (unsigned i = 0; i < sizeof(expandInits)/sizeof(expandInits[0]); ++i) + statics.expands.insert(ProString(expandInits[i].name), expandInits[i].func); + + static const struct { + const char * const name; + const TestFunc func; + } testInits[] = { + { "requires", T_REQUIRES }, + { "greaterThan", T_GREATERTHAN }, + { "lessThan", T_LESSTHAN }, + { "equals", T_EQUALS }, + { "isEqual", T_EQUALS }, + { "exists", T_EXISTS }, + { "export", T_EXPORT }, + { "clear", T_CLEAR }, + { "unset", T_UNSET }, + { "eval", T_EVAL }, + { "CONFIG", T_CONFIG }, + { "if", T_IF }, + { "isActiveConfig", T_CONFIG }, + { "system", T_SYSTEM }, + { "return", T_RETURN }, + { "break", T_BREAK }, + { "next", T_NEXT }, + { "defined", T_DEFINED }, + { "contains", T_CONTAINS }, + { "infile", T_INFILE }, + { "count", T_COUNT }, + { "isEmpty", T_ISEMPTY }, + { "load", T_LOAD }, + { "include", T_INCLUDE }, + { "debug", T_DEBUG }, + { "message", T_MESSAGE }, + { "warning", T_MESSAGE }, + { "error", T_MESSAGE }, + }; + for (unsigned i = 0; i < sizeof(testInits)/sizeof(testInits[0]); ++i) + statics.functions.insert(ProString(testInits[i].name), testInits[i].func); + + static const char * const names[] = { + "LITERAL_DOLLAR", "LITERAL_HASH", "LITERAL_WHITESPACE", + "DIRLIST_SEPARATOR", "DIR_SEPARATOR", + "OUT_PWD", "PWD", "IN_PWD", + "_FILE_", "_LINE_", "_PRO_FILE_", "_PRO_FILE_PWD_", + "QMAKE_HOST.arch", "QMAKE_HOST.name", "QMAKE_HOST.os", + "QMAKE_HOST.version", "QMAKE_HOST.version_string", + "_DATE_", "_QMAKE_CACHE_" + }; + for (unsigned i = 0; i < sizeof(names)/sizeof(names[0]); ++i) + statics.varList.insert(ProString(names[i]), i); + + static const struct { + const char * const oldname, * const newname; + } mapInits[] = { + { "INTERFACES", "FORMS" }, + { "QMAKE_POST_BUILD", "QMAKE_POST_LINK" }, + { "TARGETDEPS", "POST_TARGETDEPS" }, + { "LIBPATH", "QMAKE_LIBDIR" }, + { "QMAKE_EXT_MOC", "QMAKE_EXT_CPP_MOC" }, + { "QMAKE_MOD_MOC", "QMAKE_H_MOD_MOC" }, + { "QMAKE_LFLAGS_SHAPP", "QMAKE_LFLAGS_APP" }, + { "PRECOMPH", "PRECOMPILED_HEADER" }, + { "PRECOMPCPP", "PRECOMPILED_SOURCE" }, + { "INCPATH", "INCLUDEPATH" }, + { "QMAKE_EXTRA_WIN_COMPILERS", "QMAKE_EXTRA_COMPILERS" }, + { "QMAKE_EXTRA_UNIX_COMPILERS", "QMAKE_EXTRA_COMPILERS" }, + { "QMAKE_EXTRA_WIN_TARGETS", "QMAKE_EXTRA_TARGETS" }, + { "QMAKE_EXTRA_UNIX_TARGETS", "QMAKE_EXTRA_TARGETS" }, + { "QMAKE_EXTRA_UNIX_INCLUDES", "QMAKE_EXTRA_INCLUDES" }, + { "QMAKE_EXTRA_UNIX_VARIABLES", "QMAKE_EXTRA_VARIABLES" }, + { "QMAKE_RPATH", "QMAKE_LFLAGS_RPATH" }, + { "QMAKE_FRAMEWORKDIR", "QMAKE_FRAMEWORKPATH" }, + { "QMAKE_FRAMEWORKDIR_FLAGS", "QMAKE_FRAMEWORKPATH_FLAGS" } + }; + for (unsigned i = 0; i < sizeof(mapInits)/sizeof(mapInits[0]); ++i) + statics.varMap.insert(ProString(mapInits[i].oldname), + ProString(mapInits[i].newname)); +} + +const ProString &ProFileEvaluator::Private::map(const ProString &var) +{ + QHash<ProString, ProString>::ConstIterator it = statics.varMap.constFind(var); + return (it != statics.varMap.constEnd()) ? it.value() : var; +} + -ProFileEvaluator::Private::Private(ProFileEvaluator *q_) - : q(q_) +ProFileEvaluator::Private::Private(ProFileEvaluator *q_, ProFileOption *option, + ProFileParser *parser, ProFileEvaluatorHandler *handler) + : q(q_), m_option(option), m_parser(parser), m_handler(handler) { - // Global parser state - m_prevLineNo = 0; - m_prevProFile = 0; + // So that single-threaded apps don't have to call initialize() for now. + initStatics(); // Configuration, more or less - m_verbose = true; +#ifdef PROEVALUATOR_CUMULATIVE m_cumulative = true; +#endif // Evaluator state - m_sts.condition = false; - m_sts.prevCondition = false; - m_invertNext = false; m_skipLevel = 0; - m_isFirstVariableValue = true; - m_definingFunc.clear(); + m_loopLevel = 0; + m_listCount = 0; + m_valuemapStack.push(QHash<ProString, ProStringList>()); } -bool ProFileEvaluator::Private::read(ProFile *pro) +ProFileEvaluator::Private::~Private() { - QFile file(pro->fileName()); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - q->errorMessage(format("%1 not readable.").arg(pro->fileName())); - return false; - } - - // Parser state - m_block = 0; - m_commentItem = 0; - m_inQuote = false; - m_parens = 0; - m_contNextLine = false; - m_syntaxError = false; - m_lineNo = 1; - m_blockstack.clear(); - m_blockstack.push(pro); - - QTextStream ts(&file); - while (!ts.atEnd()) { - QString line = ts.readLine(); - if (!parseLine(line)) { - q->errorMessage(format(".pro parse failure.")); - return false; - } - ++m_lineNo; - } - return true; } -bool ProFileEvaluator::Private::parseLine(const QString &line0) -{ - if (m_blockstack.isEmpty()) - return false; - - int parens = m_parens; - bool inQuote = m_inQuote; - bool escaped = false; - QString line = line0.simplified(); +//////// Evaluator tools ///////// - for (int i = 0; !m_syntaxError && i < line.length(); ++i) { - ushort c = line.at(i).unicode(); - if (c == '#') { // Yep - no escaping possible - insertComment(line.mid(i + 1)); - escaped = m_contNextLine; - break; - } - if (!escaped) { - if (c == '\\') { - escaped = true; - m_proitem += c; - continue; - } else if (c == '"') { - inQuote = !inQuote; - m_proitem += c; - continue; - } - } else { - escaped = false; - } - if (!inQuote) { - if (c == '(') { - ++parens; - } else if (c == ')') { - --parens; - } else if (!parens) { - if (m_block && (m_block->blockKind() & ProBlock::VariableKind)) { - if (c == ' ') - updateItem(); - else - m_proitem += c; - continue; - } - if (c == ':') { - enterScope(false); - continue; - } - if (c == '{') { - enterScope(true); - continue; - } - if (c == '}') { - leaveScope(); - continue; - } - if (c == '=') { - insertVariable(line, &i); - continue; - } - if (c == '|' || c == '!') { - insertOperator(c); - continue; - } - } - } - - m_proitem += c; - } - m_inQuote = inQuote; - m_parens = parens; - m_contNextLine = escaped; - if (escaped) { - m_proitem.chop(1); - updateItem(); - return true; - } else { - if (!m_syntaxError) { - updateItem(); - finalizeBlock(); - return true; - } - return false; - } +uint ProFileEvaluator::Private::getBlockLen(const ushort *&tokPtr) +{ + uint len = *tokPtr++; + len |= (uint)*tokPtr++ << 16; + return len; } -void ProFileEvaluator::Private::finalizeBlock() +ProString ProFileEvaluator::Private::getStr(const ushort *&tokPtr) { - if (m_blockstack.isEmpty()) { - m_syntaxError = true; - } else { - if (m_blockstack.top()->blockKind() & ProBlock::SingleLine) - leaveScope(); - m_block = 0; - m_commentItem = 0; - } + uint len = *tokPtr++; + ProString ret(m_current.pro->items(), tokPtr - m_current.pro->tokPtr(), len, NoHash); + ret.setSource(m_current.pro); + tokPtr += len; + return ret; } -void ProFileEvaluator::Private::insertVariable(const QString &line, int *i) +ProString ProFileEvaluator::Private::getHashStr(const ushort *&tokPtr) { - ProVariable::VariableOperator opkind; - - if (m_proitem.isEmpty()) // Line starting with '=', like a conflict marker - return; - - switch (m_proitem.at(m_proitem.length() - 1).unicode()) { - case '+': - m_proitem.chop(1); - opkind = ProVariable::AddOperator; - break; - case '-': - m_proitem.chop(1); - opkind = ProVariable::RemoveOperator; - break; - case '*': - m_proitem.chop(1); - opkind = ProVariable::UniqueAddOperator; - break; - case '~': - m_proitem.chop(1); - opkind = ProVariable::ReplaceOperator; - break; - default: - opkind = ProVariable::SetOperator; - } + uint hash = getBlockLen(tokPtr); + uint len = *tokPtr++; + ProString ret(m_current.pro->items(), tokPtr - m_current.pro->tokPtr(), len, hash); + tokPtr += len; + return ret; +} - ProBlock *block = m_blockstack.top(); - m_proitem = m_proitem.trimmed(); - ProVariable *variable = new ProVariable(m_proitem, block); - variable->setLineNumber(m_lineNo); - variable->setVariableOperator(opkind); - block->appendItem(variable); - m_block = variable; - - if (!m_pendingComment.isEmpty()) { - m_block->setComment(m_pendingComment); - m_pendingComment.clear(); - } - m_commentItem = variable; +void ProFileEvaluator::Private::skipStr(const ushort *&tokPtr) +{ + uint len = *tokPtr++; + tokPtr += len; +} - m_proitem.clear(); +void ProFileEvaluator::Private::skipHashStr(const ushort *&tokPtr) +{ + tokPtr += 2; + uint len = *tokPtr++; + tokPtr += len; +} - if (opkind == ProVariable::ReplaceOperator) { - // skip util end of line or comment - while (1) { - ++(*i); +// FIXME: this should not build new strings for direct sections. +// Note that the E_SPRINTF and E_LIST implementations rely on the deep copy. +ProStringList ProFileEvaluator::Private::split_value_list(const QString &vals, const ProFile *source) +{ + QString build; + ProStringList ret; + QStack<char> quote; - // end of line? - if (*i >= line.count()) - break; + const ushort SPACE = ' '; + const ushort LPAREN = '('; + const ushort RPAREN = ')'; + const ushort SINGLEQUOTE = '\''; + const ushort DOUBLEQUOTE = '"'; + const ushort BACKSLASH = '\\'; - // comment? - if (line.at(*i).unicode() == '#') { - --(*i); - break; - } + if (!source) + source = currentProFile(); + + ushort unicode; + const QChar *vals_data = vals.data(); + const int vals_len = vals.length(); + for (int x = 0, parens = 0; x < vals_len; x++) { + unicode = vals_data[x].unicode(); + if (x != (int)vals_len-1 && unicode == BACKSLASH && + (vals_data[x+1].unicode() == SINGLEQUOTE || vals_data[x+1].unicode() == DOUBLEQUOTE)) { + build += vals_data[x++]; //get that 'escape' + } else if (!quote.isEmpty() && unicode == quote.top()) { + quote.pop(); + } else if (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE) { + quote.push(unicode); + } else if (unicode == RPAREN) { + --parens; + } else if (unicode == LPAREN) { + ++parens; + } - m_proitem += line.at(*i); + if (!parens && quote.isEmpty() && vals_data[x] == SPACE) { + ret << ProString(build, NoHash).setSource(source); + build.clear(); + } else { + build += vals_data[x]; } - m_proitem = m_proitem.trimmed(); } + if (!build.isEmpty()) + ret << ProString(build, NoHash).setSource(source); + return ret; } -void ProFileEvaluator::Private::insertOperator(const char op) +static void zipEmpty(ProStringList *value) { - updateItem(); - - ProOperator::OperatorKind opkind; - switch(op) { - case '!': - opkind = ProOperator::NotOperator; - break; - case '|': - opkind = ProOperator::OrOperator; - break; - default: - opkind = ProOperator::OrOperator; - } - - ProBlock * const block = currentBlock(); - ProOperator * const proOp = new ProOperator(opkind); - proOp->setLineNumber(m_lineNo); - block->appendItem(proOp); - m_commentItem = proOp; + for (int i = value->size(); --i >= 0;) + if (value->at(i).isEmpty()) + value->remove(i); } -void ProFileEvaluator::Private::insertComment(const QString &comment) +static void insertUnique(ProStringList *varlist, const ProStringList &value) { - updateItem(); - - QString strComment; - if (!m_commentItem) - strComment = m_pendingComment; - else - strComment = m_commentItem->comment(); - - if (strComment.isEmpty()) - strComment = comment; - else { - strComment += QLatin1Char('\n'); - strComment += comment.trimmed(); - } - - strComment = strComment.trimmed(); - - if (!m_commentItem) - m_pendingComment = strComment; - else - m_commentItem->setComment(strComment); + foreach (const ProString &str, value) + if (!str.isEmpty() && !varlist->contains(str)) + varlist->append(str); } -void ProFileEvaluator::Private::enterScope(bool multiLine) +static void removeAll(ProStringList *varlist, const ProString &value) { - updateItem(); - - ProBlock *parent = currentBlock(); - ProBlock *block = new ProBlock(parent); - block->setLineNumber(m_lineNo); - parent->setBlockKind(ProBlock::ScopeKind); - - parent->appendItem(block); - - if (multiLine) - block->setBlockKind(ProBlock::ScopeContentsKind); - else - block->setBlockKind(ProBlock::ScopeContentsKind|ProBlock::SingleLine); - - m_blockstack.push(block); - m_block = 0; + for (int i = varlist->size(); --i >= 0; ) + if (varlist->at(i) == value) + varlist->remove(i); } -void ProFileEvaluator::Private::leaveScope() +static void removeEach(ProStringList *varlist, const ProStringList &value) { - updateItem(); - m_blockstack.pop(); - finalizeBlock(); + foreach (const ProString &str, value) + if (!str.isEmpty()) + removeAll(varlist, str); } -ProBlock *ProFileEvaluator::Private::currentBlock() +static void replaceInList(ProStringList *varlist, + const QRegExp ®exp, const QString &replace, bool global, QString &tmp) { - if (m_block) - return m_block; - - ProBlock *parent = m_blockstack.top(); - m_block = new ProBlock(parent); - m_block->setLineNumber(m_lineNo); - parent->appendItem(m_block); - - if (!m_pendingComment.isEmpty()) { - m_block->setComment(m_pendingComment); - m_pendingComment.clear(); + for (ProStringList::Iterator varit = varlist->begin(); varit != varlist->end(); ) { + QString val = varit->toQString(tmp); + QString copy = val; // Force detach and have a reference value + val.replace(regexp, replace); + if (!val.isSharedWith(copy)) { + if (val.isEmpty()) { + varit = varlist->erase(varit); + } else { + (*varit).setValue(val, NoHash); + ++varit; + } + if (!global) + break; + } else { + ++varit; + } } +} - m_commentItem = m_block; - - return m_block; +QString ProFileEvaluator::Private::expandEnvVars(const QString &str) const +{ + QString string = str; + int rep; + QRegExp reg_variableName = statics.reg_variableName; // Copy for thread safety + while ((rep = reg_variableName.indexIn(string)) != -1) + string.replace(rep, reg_variableName.matchedLength(), + m_option->getEnv(string.mid(rep + 2, reg_variableName.matchedLength() - 3))); + return string; } -void ProFileEvaluator::Private::updateItem() +// This is braindead, but we want qmake compat +QString ProFileEvaluator::Private::fixPathToLocalOS(const QString &str) const { - m_proitem = m_proitem.trimmed(); - if (m_proitem.isEmpty()) - return; + QString string = expandEnvVars(str); - ProBlock *block = currentBlock(); - if (block->blockKind() & ProBlock::VariableKind) { - m_commentItem = new ProValue(m_proitem, static_cast<ProVariable*>(block)); - } else if (m_proitem.endsWith(QLatin1Char(')'))) { - m_commentItem = new ProFunction(m_proitem); - } else { - m_commentItem = new ProCondition(m_proitem); - } - m_commentItem->setLineNumber(m_lineNo); - block->appendItem(m_commentItem); + if (string.length() > 2 && string.at(0).isLetter() && string.at(1) == QLatin1Char(':')) + string[0] = string[0].toLower(); - m_proitem.clear(); +#if defined(Q_OS_WIN32) + string.replace(QLatin1Char('/'), QLatin1Char('\\')); +#else + string.replace(QLatin1Char('\\'), QLatin1Char('/')); +#endif + return string; +} + +static bool isTrue(const ProString &_str, QString &tmp) +{ + const QString &str = _str.toQString(tmp); + return !str.compare(statics.strtrue, Qt::CaseInsensitive) || str.toInt(); } +//////// Evaluator ///////// -ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block) +static ALWAYS_INLINE void addStr( + const ProString &str, ProStringList *ret, bool &pending, bool joined) { - if (block->blockKind() & ProBlock::ScopeContentsKind) { - if (!m_definingFunc.isEmpty()) { - if (!m_skipLevel || m_cumulative) { - QHash<QString, ProBlock *> *hash = - (m_definingTest ? &m_testFunctions : &m_replaceFunctions); - if (ProBlock *def = hash->value(m_definingFunc)) - def->deref(); - hash->insert(m_definingFunc, block); - block->ref(); - block->setBlockKind(block->blockKind() | ProBlock::FunctionBodyKind); - } - m_definingFunc.clear(); - return ProItem::ReturnSkip; - } else if (!(block->blockKind() & ProBlock::FunctionBodyKind)) { - if (!m_sts.condition) - ++m_skipLevel; - else - Q_ASSERT(!m_skipLevel); - } + if (joined) { + ret->last().append(str, &pending); } else { - if (!m_skipLevel) { - if (m_sts.condition) { - m_sts.prevCondition = true; - m_sts.condition = false; - } + if (!pending) { + pending = true; + *ret << str; } else { - Q_ASSERT(!m_sts.condition); + ret->last().append(str); } } - return ProItem::ReturnTrue; } -void ProFileEvaluator::Private::visitEndProBlock(ProBlock *block) +static ALWAYS_INLINE void addStrList( + const ProStringList &list, ushort tok, ProStringList *ret, bool &pending, bool joined) { - if ((block->blockKind() & ProBlock::ScopeContentsKind) - && !(block->blockKind() & ProBlock::FunctionBodyKind)) { - if (m_skipLevel) { - Q_ASSERT(!m_sts.condition); - --m_skipLevel; - } else if (!(block->blockKind() & ProBlock::SingleLine)) { - // Conditionals contained inside this block may have changed the state. - // So we reset it here to make an else following us do the right thing. - m_sts.condition = true; + if (!list.isEmpty()) { + if (joined) { + ret->last().append(list, &pending, !(tok & TokQuoted)); + } else { + if (tok & TokQuoted) { + if (!pending) { + pending = true; + *ret << ProString(); + } + ret->last().append(list); + } else { + if (!pending) { + // Another qmake bizzarity: if nothing is pending and the + // first element is empty, it will be eaten + if (!list.at(0).isEmpty()) { + // The common case + pending = true; + *ret += list; + return; + } + } else { + ret->last().append(list.at(0)); + } + // This is somewhat slow, but a corner case + for (int j = 1; j < list.size(); ++j) { + pending = true; + *ret << list.at(j); + } + } } } } -ProItem::ProItemReturn ProFileEvaluator::Private::visitProLoopIteration() -{ - ProLoop &loop = m_loopStack.top(); - - if (loop.infinite) { - if (!loop.variable.isEmpty()) - m_valuemap[loop.variable] = QStringList(QString::number(loop.index++)); - if (loop.index > 1000) { - q->errorMessage(format("ran into infinite loop (> 1000 iterations).")); - return ProItem::ReturnFalse; +void ProFileEvaluator::Private::evaluateExpression( + const ushort *&tokPtr, ProStringList *ret, bool joined) +{ + if (joined) + *ret << ProString(); + bool pending = false; + forever { + ushort tok = *tokPtr++; + if (tok & TokNewStr) + pending = false; + ushort maskedTok = tok & TokMask; + switch (maskedTok) { + case TokLine: + m_current.line = *tokPtr++; + break; + case TokLiteral: + addStr(getStr(tokPtr), ret, pending, joined); + break; + case TokHashLiteral: + addStr(getHashStr(tokPtr), ret, pending, joined); + break; + case TokVariable: + addStrList(values(map(getHashStr(tokPtr))), tok, ret, pending, joined); + break; + case TokProperty: + addStr(ProString(propertyValue( + getStr(tokPtr).toQString(m_tmp1), true), NoHash).setSource(currentProFile()), + ret, pending, joined); + break; + case TokEnvVar: + addStrList(split_value_list(m_option->getEnv(getStr(tokPtr).toQString(m_tmp1))), + tok, ret, pending, joined); + break; + case TokFuncName: { + ProString func = getHashStr(tokPtr); + addStrList(evaluateExpandFunction(func, tokPtr), tok, ret, pending, joined); + break; } + default: + tokPtr--; + return; } - } else { - QString val; - do { - if (loop.index >= loop.list.count()) - return ProItem::ReturnFalse; - val = loop.list.at(loop.index++); - } while (val.isEmpty()); // stupid, but qmake is like that - m_valuemap[loop.variable] = QStringList(val); } - return ProItem::ReturnTrue; -} - -void ProFileEvaluator::Private::visitProLoopCleanup() -{ - ProLoop &loop = m_loopStack.top(); - m_valuemap[loop.variable] = loop.oldVarVal; - m_loopStack.pop_back(); } -void ProFileEvaluator::Private::visitBeginProVariable(ProVariable *variable) +void ProFileEvaluator::Private::skipExpression(const ushort *&pTokPtr) { - m_lastVarName = variable->variable(); - m_variableOperator = variable->variableOperator(); - m_isFirstVariableValue = true; - m_tempValuemap = m_valuemap; - m_tempFilevaluemap = m_filevaluemap; + const ushort *tokPtr = pTokPtr; + forever { + ushort tok = *tokPtr++; + switch (tok) { + case TokLine: + m_current.line = *tokPtr++; + break; + case TokValueTerminator: + case TokFuncTerminator: + pTokPtr = tokPtr; + return; + case TokArgSeparator: + break; + default: + switch (tok & TokMask) { + case TokLiteral: + case TokProperty: + case TokEnvVar: + skipStr(tokPtr); + break; + case TokHashLiteral: + case TokVariable: + skipHashStr(tokPtr); + break; + case TokFuncName: + skipHashStr(tokPtr); + pTokPtr = tokPtr; + skipExpression(pTokPtr); + tokPtr = pTokPtr; + break; + default: + Q_ASSERT_X(false, "skipExpression", "Unrecognized token"); + break; + } + } + } } -void ProFileEvaluator::Private::visitEndProVariable(ProVariable *variable) -{ - Q_UNUSED(variable); - m_valuemap = m_tempValuemap; - m_filevaluemap = m_tempFilevaluemap; - m_lastVarName.clear(); +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProBlock( + ProFile *pro, const ushort *tokPtr) +{ + m_current.pro = pro; + m_current.line = 0; + return visitProBlock(tokPtr); +} + +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProBlock( + const ushort *tokPtr) +{ + ProStringList curr; + bool okey = true, or_op = false, invert = false; + uint blockLen; + VisitReturn ret = ReturnTrue; + while (ushort tok = *tokPtr++) { + switch (tok) { + case TokLine: + m_current.line = *tokPtr++; + continue; + case TokAssign: + case TokAppend: + case TokAppendUnique: + case TokRemove: + case TokReplace: + visitProVariable(tok, curr, tokPtr); + curr.clear(); + continue; + case TokBranch: + blockLen = getBlockLen(tokPtr); + if (m_cumulative) { + if (!okey) + m_skipLevel++; + ret = blockLen ? visitProBlock(tokPtr) : ReturnTrue; + tokPtr += blockLen; + blockLen = getBlockLen(tokPtr); + if (!okey) + m_skipLevel--; + else + m_skipLevel++; + if ((ret == ReturnTrue || ret == ReturnFalse) && blockLen) + ret = visitProBlock(tokPtr); + if (okey) + m_skipLevel--; + } else { + if (okey) + ret = blockLen ? visitProBlock(tokPtr) : ReturnTrue; + tokPtr += blockLen; + blockLen = getBlockLen(tokPtr); + if (!okey) + ret = blockLen ? visitProBlock(tokPtr) : ReturnTrue; + } + tokPtr += blockLen; + okey = true, or_op = false; // force next evaluation + break; + case TokForLoop: + if (m_cumulative) { // This is a no-win situation, so just pretend it's no loop + skipHashStr(tokPtr); + uint exprLen = getBlockLen(tokPtr); + tokPtr += exprLen; + blockLen = getBlockLen(tokPtr); + ret = visitProBlock(tokPtr); + } else if (okey != or_op) { + const ProString &variable = getHashStr(tokPtr); + uint exprLen = getBlockLen(tokPtr); + const ushort *exprPtr = tokPtr; + tokPtr += exprLen; + blockLen = getBlockLen(tokPtr); + ret = visitProLoop(variable, exprPtr, tokPtr); + } else { + skipHashStr(tokPtr); + uint exprLen = getBlockLen(tokPtr); + tokPtr += exprLen; + blockLen = getBlockLen(tokPtr); + ret = ReturnTrue; + } + tokPtr += blockLen; + okey = true, or_op = false; // force next evaluation + break; + case TokTestDef: + case TokReplaceDef: + if (m_cumulative || okey != or_op) { + const ProString &name = getHashStr(tokPtr); + blockLen = getBlockLen(tokPtr); + visitProFunctionDef(tok, name, tokPtr); + } else { + skipHashStr(tokPtr); + blockLen = getBlockLen(tokPtr); + } + tokPtr += blockLen; + okey = true, or_op = false; // force next evaluation + continue; + case TokNot: + invert ^= true; + continue; + case TokAnd: + or_op = false; + continue; + case TokOr: + or_op = true; + continue; + case TokCondition: + if (!m_skipLevel && okey != or_op) { + if (curr.size() != 1) { + if (!m_cumulative || !curr.isEmpty()) + evalError(fL1S("Conditional must expand to exactly one word.")); + okey = false; + } else { + okey = isActiveConfig(curr.at(0).toQString(m_tmp2), true) ^ invert; + } + } + or_op = !okey; // tentatively force next evaluation + invert = false; + curr.clear(); + continue; + case TokTestCall: + if (!m_skipLevel && okey != or_op) { + if (curr.size() != 1) { + if (!m_cumulative || !curr.isEmpty()) + evalError(fL1S("Test name must expand to exactly one word.")); + skipExpression(tokPtr); + okey = false; + } else { + ret = evaluateConditionalFunction(curr.at(0), tokPtr); + switch (ret) { + case ReturnTrue: okey = true; break; + case ReturnFalse: okey = false; break; + default: return ret; + } + okey ^= invert; + } + } else if (m_cumulative) { + m_skipLevel++; + if (curr.size() != 1) + skipExpression(tokPtr); + else + evaluateConditionalFunction(curr.at(0), tokPtr); + m_skipLevel--; + } else { + skipExpression(tokPtr); + } + or_op = !okey; // tentatively force next evaluation + invert = false; + curr.clear(); + continue; + default: { + const ushort *oTokPtr = --tokPtr; + evaluateExpression(tokPtr, &curr, false); + if (tokPtr != oTokPtr) + continue; + } + Q_ASSERT_X(false, "visitProBlock", "unexpected item type"); + } + if (ret != ReturnTrue && ret != ReturnFalse) + break; + } + return ret; } -void ProFileEvaluator::Private::visitProOperator(ProOperator *oper) -{ - m_invertNext = (oper->operatorKind() == ProOperator::NotOperator); -} -void ProFileEvaluator::Private::visitProCondition(ProCondition *cond) +void ProFileEvaluator::Private::visitProFunctionDef( + ushort tok, const ProString &name, const ushort *tokPtr) { - if (!m_skipLevel) { - if (!cond->text().compare(QLatin1String("else"), Qt::CaseInsensitive)) { - m_sts.condition = !m_sts.prevCondition; - } else { - m_sts.prevCondition = false; - if (!m_sts.condition && isActiveConfig(cond->text(), true) ^ m_invertNext) - m_sts.condition = true; - } - } - m_invertNext = false; + QHash<ProString, FunctionDef> *hash = + (tok == TokTestDef + ? &m_functionDefs.testFunctions + : &m_functionDefs.replaceFunctions); + hash->insert(name, FunctionDef(m_current.pro, tokPtr - m_current.pro->tokPtr())); } -ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProFile(ProFile * pro) +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProLoop( + const ProString &_variable, const ushort *exprPtr, const ushort *tokPtr) { - PRE(pro); - m_lineNo = pro->lineNumber(); - if (m_origfile.isEmpty()) - m_origfile = pro->fileName(); - if (m_oldPath.isEmpty()) { - // change the working directory for the initial profile we visit, since - // that is *the* profile. All the other times we reach this function will be due to - // include(file) or load(file) - - m_oldPath = QDir::currentPath(); - - m_profileStack.push(pro); - - const QString mkspecDirectory = propertyValue(QLatin1String("QMAKE_MKSPECS")); - if (!mkspecDirectory.isEmpty()) { - bool cumulative = m_cumulative; - m_cumulative = false; - // This is what qmake does, everything set in the mkspec is also set - // But this also creates a lot of problems - evaluateFile(mkspecDirectory + QLatin1String("/default/qmake.conf")); - evaluateFile(mkspecDirectory + QLatin1String("/features/default_pre.prf")); - m_cumulative = cumulative; + VisitReturn ret = ReturnTrue; + bool infinite = false; + int index = 0; + ProString variable; + ProStringList oldVarVal; + ProString it_list = expandVariableReferences(exprPtr, 0, true).at(0); + if (_variable.isEmpty()) { + if (it_list != statics.strever) { + evalError(fL1S("Invalid loop expression.")); + return ReturnFalse; } - - return returnBool(QDir::setCurrent(pro->directoryName())); + it_list = ProString(statics.strforever); + } else { + variable = map(_variable); + oldVarVal = valuesDirect(variable); } - - return ProItem::ReturnTrue; -} - -ProItem::ProItemReturn ProFileEvaluator::Private::visitEndProFile(ProFile * pro) -{ - PRE(pro); - m_lineNo = pro->lineNumber(); - if (m_profileStack.count() == 1 && !m_oldPath.isEmpty()) { - const QString &mkspecDirectory = propertyValue(QLatin1String("QMAKE_MKSPECS")); - if (!mkspecDirectory.isEmpty()) { - bool cumulative = m_cumulative; - m_cumulative = false; - - evaluateFile(mkspecDirectory + QLatin1String("/features/default_post.prf")); - - QSet<QString> processed; - forever { - bool finished = true; - QStringList configs = valuesDirect(QLatin1String("CONFIG")); - for (int i = configs.size() - 1; i >= 0; --i) { - const QString config = configs[i].toLower(); - if (!processed.contains(config)) { - processed.insert(config); - if (evaluateFile(mkspecDirectory + QLatin1String("/features/") - + config + QLatin1String(".prf"))) { - finished = false; - break; + ProStringList list = valuesDirect(it_list); + if (list.isEmpty()) { + if (it_list == statics.strforever) { + infinite = true; + } else { + const QString &itl = it_list.toQString(m_tmp1); + int dotdot = itl.indexOf(statics.strDotDot); + if (dotdot != -1) { + bool ok; + int start = itl.left(dotdot).toInt(&ok); + if (ok) { + int end = itl.mid(dotdot+2).toInt(&ok); + if (ok) { + if (start < end) { + for (int i = start; i <= end; i++) + list << ProString(QString::number(i), NoHash); + } else { + for (int i = start; i >= end; i--) + list << ProString(QString::number(i), NoHash); } } } - if (finished) - break; } - - foreach (ProBlock *itm, m_replaceFunctions) - itm->deref(); - m_replaceFunctions.clear(); - foreach (ProBlock *itm, m_testFunctions) - itm->deref(); - m_testFunctions.clear(); - - m_cumulative = cumulative; } - - m_profileStack.pop(); - return returnBool(QDir::setCurrent(m_oldPath)); } - return ProItem::ReturnTrue; -} - -static void replaceInList(QStringList *varlist, - const QRegExp ®exp, const QString &replace, bool global) -{ - for (QStringList::Iterator varit = varlist->begin(); varit != varlist->end(); ) { - if ((*varit).contains(regexp)) { - (*varit).replace(regexp, replace); - if ((*varit).isEmpty()) - varit = varlist->erase(varit); - else - ++varit; - if(!global) + m_loopLevel++; + forever { + if (infinite) { + if (!variable.isEmpty()) + m_valuemapStack.top()[variable] = ProStringList(ProString(QString::number(index++), NoHash)); + if (index > 1000) { + evalError(fL1S("ran into infinite loop (> 1000 iterations).")); break; + } } else { - ++varit; + ProString val; + do { + if (index >= list.count()) + goto do_break; + val = list.at(index++); + } while (val.isEmpty()); // stupid, but qmake is like that + m_valuemapStack.top()[variable] = ProStringList(val); + } + + ret = visitProBlock(tokPtr); + switch (ret) { + case ReturnTrue: + case ReturnFalse: + break; + case ReturnNext: + ret = ReturnTrue; + break; + case ReturnBreak: + ret = ReturnTrue; + goto do_break; + default: + goto do_break; } } + do_break: + m_loopLevel--; + + if (!variable.isEmpty()) + m_valuemapStack.top()[variable] = oldVarVal; + return ret; } -void ProFileEvaluator::Private::visitProValue(ProValue *value) +void ProFileEvaluator::Private::visitProVariable( + ushort tok, const ProStringList &curr, const ushort *&tokPtr) { - PRE(value); - m_lineNo = value->lineNumber(); - QString val = value->value(); + int sizeHint = *tokPtr++; - QString varName = m_lastVarName; + if (curr.size() != 1) { + skipExpression(tokPtr); + if (!m_cumulative || !curr.isEmpty()) + evalError(fL1S("Left hand side of assignment must expand to exactly one word.")); + return; + } + const ProString &varName = map(curr.first()); - QStringList v = expandVariableReferences(val); + if (tok == TokReplace) { // ~= + // DEFINES ~= s/a/b/?[gqi] - // Since qmake combines different values for the TARGET variable, we join - // TARGET values that are on the same line. We can't do this later with all - // values because this parser isn't scope-aware, so we'd risk joining - // scope-specific targets together. - if (varName == QLatin1String("TARGET") - && m_lineNo == m_prevLineNo - && currentProFile() == m_prevProFile) { - QStringList targets = m_tempValuemap.value(QLatin1String("TARGET")); - m_tempValuemap.remove(QLatin1String("TARGET")); - QStringList lastTarget(targets.takeLast()); - lastTarget << v.join(QLatin1String(" ")); - targets.push_back(lastTarget.join(QLatin1String(" "))); - v = targets; - } - m_prevLineNo = m_lineNo; - m_prevProFile = currentProFile(); + const ProStringList &varVal = expandVariableReferences(tokPtr, sizeHint, true); + const QString &val = varVal.at(0).toQString(m_tmp1); + if (val.length() < 4 || val.at(0) != QLatin1Char('s')) { + evalError(fL1S("the ~= operator can handle only the s/// function.")); + return; + } + QChar sep = val.at(1); + QStringList func = val.split(sep); + if (func.count() < 3 || func.count() > 4) { + evalError(fL1S("the s/// function expects 3 or 4 arguments.")); + return; + } + + bool global = false, quote = false, case_sense = false; + if (func.count() == 4) { + global = func[3].indexOf(QLatin1Char('g')) != -1; + case_sense = func[3].indexOf(QLatin1Char('i')) == -1; + quote = func[3].indexOf(QLatin1Char('q')) != -1; + } + QString pattern = func[1]; + QString replace = func[2]; + if (quote) + pattern = QRegExp::escape(pattern); + + QRegExp regexp(pattern, case_sense ? Qt::CaseSensitive : Qt::CaseInsensitive); - switch (m_variableOperator) { - case ProVariable::SetOperator: // = + if (!m_skipLevel || m_cumulative) { + // We could make a union of modified and unmodified values, + // but this will break just as much as it fixes, so leave it as is. + replaceInList(&valuesRef(varName), regexp, replace, global, m_tmp2); + } + } else { + ProStringList varVal = expandVariableReferences(tokPtr, sizeHint); + switch (tok) { + default: // whatever - cannot happen + case TokAssign: // = if (!m_cumulative) { if (!m_skipLevel) { - if (m_isFirstVariableValue) { - m_tempValuemap[varName] = v; - m_tempFilevaluemap[currentProFile()][varName] = v; - } else { // handle lines "CONFIG = foo bar" - m_tempValuemap[varName] += v; - m_tempFilevaluemap[currentProFile()][varName] += v; - } + zipEmpty(&varVal); + m_valuemapStack.top()[varName] = varVal; } } else { - // We are greedy for values. - m_tempValuemap[varName] += v; - m_tempFilevaluemap[currentProFile()][varName] += v; + zipEmpty(&varVal); + if (!varVal.isEmpty()) { + // We are greedy for values. But avoid exponential growth. + ProStringList &v = valuesRef(varName); + if (v.isEmpty()) { + v = varVal; + } else { + ProStringList old = v; + v = varVal; + QSet<ProString> has; + has.reserve(v.size()); + foreach (const ProString &s, v) + has.insert(s); + v.reserve(v.size() + old.size()); + foreach (const ProString &s, old) + if (!has.contains(s)) + v << s; + } + } } break; - case ProVariable::UniqueAddOperator: // *= - if (!m_skipLevel || m_cumulative) { - insertUnique(&m_tempValuemap, varName, v); - insertUnique(&m_tempFilevaluemap[currentProFile()], varName, v); - } + case TokAppendUnique: // *= + if (!m_skipLevel || m_cumulative) + insertUnique(&valuesRef(varName), varVal); break; - case ProVariable::AddOperator: // += + case TokAppend: // += if (!m_skipLevel || m_cumulative) { - m_tempValuemap[varName] += v; - m_tempFilevaluemap[currentProFile()][varName] += v; + zipEmpty(&varVal); + valuesRef(varName) += varVal; } break; - case ProVariable::RemoveOperator: // -= + case TokRemove: // -= if (!m_cumulative) { - if (!m_skipLevel) { - removeEach(&m_tempValuemap, varName, v); - removeEach(&m_tempFilevaluemap[currentProFile()], varName, v); - } + if (!m_skipLevel) + removeEach(&valuesRef(varName), varVal); } else { // We are stingy with our values, too. } break; - case ProVariable::ReplaceOperator: // ~= - { - // DEFINES ~= s/a/b/?[gqi] + } + } +} - doVariableReplace(&val); - if (val.length() < 4 || val[0] != QLatin1Char('s')) { - q->logMessage(format("the ~= operator can handle only the s/// function.")); - break; +void ProFileEvaluator::Private::visitCmdLine(const QString &cmds) +{ + if (!cmds.isEmpty()) { + if (ProFile *pro = m_parser->parsedProBlock(fL1S("(command line)"), cmds)) { + m_locationStack.push(m_current); + visitProBlock(pro, pro->tokPtr()); + m_current = m_locationStack.pop(); + pro->deref(); + } + } +} + +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile( + ProFile *pro, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) +{ + if (!m_cumulative && !pro->isOk()) + return ReturnFalse; + + m_handler->aboutToEval(currentProFile(), pro, type); + m_profileStack.push(pro); + if (flags & LoadPreFiles) { +#ifdef PROEVALUATOR_THREAD_SAFE + { + QMutexLocker locker(&m_option->mutex); + if (m_option->base_inProgress) { + QThreadPool::globalInstance()->releaseThread(); + m_option->cond.wait(&m_option->mutex); + QThreadPool::globalInstance()->reserveThread(); + } else +#endif + if (m_option->base_valuemap.isEmpty()) { +#ifdef PROEVALUATOR_THREAD_SAFE + m_option->base_inProgress = true; + locker.unlock(); +#endif + +#ifdef PROEVALUATOR_CUMULATIVE + bool cumulative = m_cumulative; + m_cumulative = false; +#endif + + // ### init QMAKE_QMAKE, QMAKE_SH + // ### init QMAKE_EXT_{C,H,CPP,OBJ} + // ### init TEMPLATE_PREFIX + + QString qmake_cache = m_option->cachefile; + if (qmake_cache.isEmpty() && !m_outputDir.isEmpty()) { //find it as it has not been specified + QDir dir(m_outputDir); + forever { + qmake_cache = dir.path() + QLatin1String("/.qmake.cache"); + if (IoUtils::exists(qmake_cache)) + break; + if (!dir.cdUp() || dir.isRoot()) { + qmake_cache.clear(); + break; + } + } } - QChar sep = val.at(1); - QStringList func = val.split(sep); - if (func.count() < 3 || func.count() > 4) { - q->logMessage(format("the s/// function expects 3 or 4 arguments.")); - break; + if (!qmake_cache.isEmpty()) { + qmake_cache = resolvePath(qmake_cache); + QHash<ProString, ProStringList> cache_valuemap; + if (evaluateFileInto(qmake_cache, ProFileEvaluatorHandler::EvalConfigFile, + &cache_valuemap, 0, EvalProOnly)) { + if (m_option->qmakespec.isEmpty()) { + const ProStringList &vals = cache_valuemap.value(ProString("QMAKESPEC")); + if (!vals.isEmpty()) + m_option->qmakespec = vals.first().toQString(); + } + } else { + qmake_cache.clear(); + } } + m_option->cachefile = qmake_cache; + + QStringList mkspec_roots = qmakeMkspecPaths(); - bool global = false, quote = false, case_sense = false; - if (func.count() == 4) { - global = func[3].indexOf(QLatin1Char('g')) != -1; - case_sense = func[3].indexOf(QLatin1Char('i')) == -1; - quote = func[3].indexOf(QLatin1Char('q')) != -1; + QString qmakespec = expandEnvVars(m_option->qmakespec); + if (qmakespec.isEmpty()) { + foreach (const QString &root, mkspec_roots) { + QString mkspec = root + QLatin1String("/default"); + if (IoUtils::fileType(mkspec) == IoUtils::FileIsDir) { + qmakespec = mkspec; + break; + } + } + if (qmakespec.isEmpty()) { + m_handler->configError(fL1S("Could not find qmake configuration directory")); + // Unlike in qmake, not finding the spec is not critical ... + } } - QString pattern = func[1]; - QString replace = func[2]; - if (quote) - pattern = QRegExp::escape(pattern); - - QRegExp regexp(pattern, case_sense ? Qt::CaseSensitive : Qt::CaseInsensitive); - - if (!m_skipLevel || m_cumulative) { - // We could make a union of modified and unmodified values, - // but this will break just as much as it fixes, so leave it as is. - replaceInList(&m_tempValuemap[varName], regexp, replace, global); - replaceInList(&m_tempFilevaluemap[currentProFile()][varName], regexp, replace, global); + + if (IoUtils::isRelativePath(qmakespec)) { + if (IoUtils::exists(currentDirectory() + QLatin1Char('/') + qmakespec + + QLatin1String("/qmake.conf"))) { + qmakespec = currentDirectory() + QLatin1Char('/') + qmakespec; + } else if (!m_outputDir.isEmpty() + && IoUtils::exists(m_outputDir + QLatin1Char('/') + qmakespec + + QLatin1String("/qmake.conf"))) { + qmakespec = m_outputDir + QLatin1Char('/') + qmakespec; + } else { + foreach (const QString &root, mkspec_roots) { + QString mkspec = root + QLatin1Char('/') + qmakespec; + if (IoUtils::exists(mkspec)) { + qmakespec = mkspec; + goto cool; + } + } + m_handler->configError(fL1S("Could not find qmake configuration file")); + // Unlike in qmake, a missing config is not critical ... + qmakespec.clear(); + cool: ; + } } + + if (!qmakespec.isEmpty()) { + m_option->qmakespec = QDir::cleanPath(qmakespec); + + QString spec = m_option->qmakespec + QLatin1String("/qmake.conf"); + if (!evaluateFileDirect(spec, ProFileEvaluatorHandler::EvalConfigFile, + ProFileEvaluator::LoadProOnly)) { + m_handler->configError( + fL1S("Could not read qmake configuration file %1").arg(spec)); + } else if (!m_option->cachefile.isEmpty()) { + evaluateFileDirect(m_option->cachefile, + ProFileEvaluatorHandler::EvalConfigFile, + ProFileEvaluator::LoadProOnly); + } + m_option->qmakespec_name = IoUtils::fileName(m_option->qmakespec).toString(); + if (m_option->qmakespec_name == QLatin1String("default")) { +#ifdef Q_OS_UNIX + char buffer[1024]; + int l = ::readlink(m_option->qmakespec.toLocal8Bit().constData(), buffer, 1024); + if (l != -1) + m_option->qmakespec_name = + IoUtils::fileName(QString::fromLocal8Bit(buffer, l)).toString(); +#else + // We can't resolve symlinks as they do on Unix, so configure.exe puts + // the source of the qmake.conf at the end of the default/qmake.conf in + // the QMAKESPEC_ORG variable. + const ProStringList &spec_org = + m_option->base_valuemap.value(ProString("QMAKESPEC_ORIGINAL")); + if (!spec_org.isEmpty()) + m_option->qmakespec_name = + IoUtils::fileName(spec_org.first().toQString()).toString(); +#endif + } + } + + evaluateFeatureFile(QLatin1String("default_pre.prf")); + + m_option->base_valuemap = m_valuemapStack.top(); + m_option->base_functions = m_functionDefs; + +#ifdef PROEVALUATOR_CUMULATIVE + m_cumulative = cumulative; +#endif + +#ifdef PROEVALUATOR_THREAD_SAFE + locker.relock(); + m_option->base_inProgress = false; + m_option->cond.wakeAll(); +#endif + goto fresh; } - break; +#ifdef PROEVALUATOR_THREAD_SAFE + } +#endif + + m_valuemapStack.top() = m_option->base_valuemap; + m_functionDefs = m_option->base_functions; + fresh: + ProStringList &tgt = m_valuemapStack.top()[ProString("TARGET")]; + if (tgt.isEmpty()) + tgt.append(ProString(QFileInfo(pro->fileName()).baseName(), NoHash)); + + visitCmdLine(m_option->precmds); } - m_isFirstVariableValue = false; -} -ProItem::ProItemReturn ProFileEvaluator::Private::visitProFunction(ProFunction *func) -{ - // Make sure that called subblocks don't inherit & destroy the state - bool invertThis = m_invertNext; - m_invertNext = false; - if (!m_skipLevel) - m_sts.prevCondition = false; - if (m_cumulative || !m_sts.condition) { - QString text = func->text(); - int lparen = text.indexOf(QLatin1Char('(')); - int rparen = text.lastIndexOf(QLatin1Char(')')); - Q_ASSERT(lparen < rparen); - QString arguments = text.mid(lparen + 1, rparen - lparen - 1); - QString funcName = text.left(lparen); - m_lineNo = func->lineNumber(); - ProItem::ProItemReturn result = evaluateConditionalFunction(funcName.trimmed(), arguments); - if (result != ProItem::ReturnFalse && result != ProItem::ReturnTrue) - return result; - if (!m_skipLevel && ((result == ProItem::ReturnTrue) ^ invertThis)) - m_sts.condition = true; + visitProBlock(pro, pro->tokPtr()); + + if (flags & LoadPostFiles) { + visitCmdLine(m_option->postcmds); + + evaluateFeatureFile(QLatin1String("default_post.prf")); + + QSet<QString> processed; + forever { + bool finished = true; + ProStringList configs = valuesDirect(statics.strCONFIG); + for (int i = configs.size() - 1; i >= 0; --i) { + QString config = configs.at(i).toQString(m_tmp1).toLower(); + if (!processed.contains(config)) { + config.detach(); + processed.insert(config); + if (evaluateFeatureFile(config)) { + finished = false; + break; + } + } + } + if (finished) + break; + } } - return ProItem::ReturnTrue; + m_profileStack.pop(); + m_handler->doneWithEval(currentProFile()); + + return ReturnTrue; } -QStringList ProFileEvaluator::Private::qmakeFeaturePaths() +QStringList ProFileEvaluator::Private::qmakeMkspecPaths() const +{ + QStringList ret; + const QString concat = QLatin1String("/mkspecs"); + + QString qmakepath = m_option->getEnv(QLatin1String("QMAKEPATH")); + if (!qmakepath.isEmpty()) + foreach (const QString &it, qmakepath.split(m_option->dirlist_sep)) + ret << QDir::cleanPath(it) + concat; + + QString builtIn = propertyValue(QLatin1String("QT_INSTALL_DATA"), false) + concat; + if (!ret.contains(builtIn)) + ret << builtIn; + + return ret; +} + +QStringList ProFileEvaluator::Private::qmakeFeaturePaths() const { + QString mkspecs_concat = QLatin1String("/mkspecs"); + QString features_concat = QLatin1String("/features"); QStringList concat; - { - const QString base_concat = QDir::separator() + QLatin1String("features"); - concat << base_concat + QDir::separator() + QLatin1String("mac"); - concat << base_concat + QDir::separator() + QLatin1String("macx"); - concat << base_concat + QDir::separator() + QLatin1String("unix"); - concat << base_concat + QDir::separator() + QLatin1String("win32"); - concat << base_concat + QDir::separator() + QLatin1String("mac9"); - concat << base_concat + QDir::separator() + QLatin1String("qnx6"); - concat << base_concat; + + validateModes(); + switch (m_option->target_mode) { + case ProFileOption::TARG_MACX_MODE: + concat << QLatin1String("/features/mac"); + concat << QLatin1String("/features/macx"); + concat << QLatin1String("/features/unix"); + break; + default: // Can't happen, just make the compiler shut up + case ProFileOption::TARG_UNIX_MODE: + concat << QLatin1String("/features/unix"); + break; + case ProFileOption::TARG_WIN_MODE: + concat << QLatin1String("/features/win32"); + break; + case ProFileOption::TARG_SYMBIAN_MODE: + concat << QLatin1String("/features/symbian"); + break; } - const QString mkspecs_concat = QDir::separator() + QLatin1String("mkspecs"); + concat << features_concat; + QStringList feature_roots; - QByteArray mkspec_path = qgetenv("QMAKEFEATURES"); - if (!mkspec_path.isNull()) - feature_roots += splitPathList(QString::fromLocal8Bit(mkspec_path)); - /* - if (prop) - feature_roots += splitPathList(prop->value("QMAKEFEATURES")); - if (!Option::mkfile::cachefile.isEmpty()) { - QString path; - int last_slash = Option::mkfile::cachefile.lastIndexOf(Option::dir_sep); - if (last_slash != -1) - path = Option::fixPathToLocalOS(Option::mkfile::cachefile.left(last_slash)); + + QString mkspec_path = m_option->getEnv(QLatin1String("QMAKEFEATURES")); + if (!mkspec_path.isEmpty()) + foreach (const QString &f, mkspec_path.split(m_option->dirlist_sep)) + feature_roots += resolvePath(f); + + feature_roots += propertyValue(QLatin1String("QMAKEFEATURES"), false).split( + m_option->dirlist_sep, QString::SkipEmptyParts); + + if (!m_option->cachefile.isEmpty()) { + QString path = m_option->cachefile.left(m_option->cachefile.lastIndexOf((ushort)'/')); foreach (const QString &concat_it, concat) feature_roots << (path + concat_it); } - */ - QByteArray qmakepath = qgetenv("QMAKEPATH"); + QString qmakepath = m_option->getEnv(QLatin1String("QMAKEPATH")); if (!qmakepath.isNull()) { - const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath)); + const QStringList lst = qmakepath.split(m_option->dirlist_sep); foreach (const QString &item, lst) { + QString citem = resolvePath(item); foreach (const QString &concat_it, concat) - feature_roots << (item + mkspecs_concat + concat_it); + feature_roots << (citem + mkspecs_concat + concat_it); } } - //if (!Option::mkfile::qmakespec.isEmpty()) - // feature_roots << Option::mkfile::qmakespec + QDir::separator() + "features"; - //if (!Option::mkfile::qmakespec.isEmpty()) { - // QFileInfo specfi(Option::mkfile::qmakespec); - // QDir specdir(specfi.absoluteFilePath()); - // while (!specdir.isRoot()) { - // if (!specdir.cdUp() || specdir.isRoot()) - // break; - // if (QFile::exists(specdir.path() + QDir::separator() + "features")) { - // foreach (const QString &concat_it, concat) - // feature_roots << (specdir.path() + concat_it); - // break; - // } - // } - //} + + if (!m_option->qmakespec.isEmpty()) { + QString qmakespec = resolvePath(m_option->qmakespec); + feature_roots << (qmakespec + features_concat); + + QDir specdir(qmakespec); + while (!specdir.isRoot()) { + if (!specdir.cdUp() || specdir.isRoot()) + break; + if (IoUtils::exists(specdir.path() + features_concat)) { + foreach (const QString &concat_it, concat) + feature_roots << (specdir.path() + concat_it); + break; + } + } + } + foreach (const QString &concat_it, concat) - feature_roots << (propertyValue(QLatin1String("QT_INSTALL_PREFIX")) + + feature_roots << (propertyValue(QLatin1String("QT_INSTALL_PREFIX"), false) + mkspecs_concat + concat_it); foreach (const QString &concat_it, concat) - feature_roots << (propertyValue(QLatin1String("QT_INSTALL_DATA")) + + feature_roots << (propertyValue(QLatin1String("QT_INSTALL_DATA"), false) + mkspecs_concat + concat_it); + + for (int i = 0; i < feature_roots.count(); ++i) + if (!feature_roots.at(i).endsWith((ushort)'/')) + feature_roots[i].append((ushort)'/'); + + feature_roots.removeDuplicates(); + return feature_roots; } -QString ProFileEvaluator::Private::propertyValue(const QString &name) const -{ - if (m_properties.contains(name)) - return m_properties.value(name); - if (name == QLatin1String("QT_INSTALL_PREFIX")) - return QLibraryInfo::location(QLibraryInfo::PrefixPath); - if (name == QLatin1String("QT_INSTALL_DATA")) - return QLibraryInfo::location(QLibraryInfo::DataPath); - if (name == QLatin1String("QT_INSTALL_DOCS")) - return QLibraryInfo::location(QLibraryInfo::DocumentationPath); - if (name == QLatin1String("QT_INSTALL_HEADERS")) - return QLibraryInfo::location(QLibraryInfo::HeadersPath); - if (name == QLatin1String("QT_INSTALL_LIBS")) - return QLibraryInfo::location(QLibraryInfo::LibrariesPath); - if (name == QLatin1String("QT_INSTALL_BINS")) - return QLibraryInfo::location(QLibraryInfo::BinariesPath); - if (name == QLatin1String("QT_INSTALL_PLUGINS")) - return QLibraryInfo::location(QLibraryInfo::PluginsPath); - if (name == QLatin1String("QT_INSTALL_TRANSLATIONS")) - return QLibraryInfo::location(QLibraryInfo::TranslationsPath); - if (name == QLatin1String("QT_INSTALL_CONFIGURATION")) - return QLibraryInfo::location(QLibraryInfo::SettingsPath); - if (name == QLatin1String("QT_INSTALL_EXAMPLES")) - return QLibraryInfo::location(QLibraryInfo::ExamplesPath); - if (name == QLatin1String("QT_INSTALL_DEMOS")) - return QLibraryInfo::location(QLibraryInfo::DemosPath); +QString ProFileEvaluator::Private::propertyValue(const QString &name, bool complain) const +{ + if (m_option->properties.contains(name)) + return m_option->properties.value(name); if (name == QLatin1String("QMAKE_MKSPECS")) - return qmake_mkspec_paths().join(Option::dirlist_sep); + return qmakeMkspecPaths().join(m_option->dirlist_sep); if (name == QLatin1String("QMAKE_VERSION")) return QLatin1String("1.0"); //### FIXME - //return qmake_version(); -#ifdef QT_VERSION_STR - if (name == QLatin1String("QT_VERSION")) - return QLatin1String(QT_VERSION_STR); -#endif - return QLatin1String("UNKNOWN"); //### + if (complain) + evalError(fL1S("Querying unknown property %1").arg(name)); + return QString(); } ProFile *ProFileEvaluator::Private::currentProFile() const @@ -1057,17 +1577,114 @@ QString ProFileEvaluator::Private::currentDirectory() const return cur->directoryName(); } -void ProFileEvaluator::Private::doVariableReplace(QString *str) +QString ProFileEvaluator::Private::sysrootify(const QString &path, const QString &baseDir) const { - *str = expandVariableReferences(*str).join(QString(Option::field_sep)); + const bool isHostSystemPath = m_option->sysroot.isEmpty() || path.startsWith(m_option->sysroot) + || path.startsWith(baseDir) || path.startsWith(m_outputDir); + return isHostSystemPath ? path : m_option->sysroot + path; } -QStringList ProFileEvaluator::Private::expandVariableReferences(const QString &str) +#ifndef QT_BOOTSTRAPPED +void ProFileEvaluator::Private::runProcess(QProcess *proc, const QString &command, + QProcess::ProcessChannel chan) const { - QStringList ret; + proc->setWorkingDirectory(currentDirectory()); + if (!m_option->environment.isEmpty()) + proc->setProcessEnvironment(m_option->environment); +# ifdef Q_OS_WIN + proc->setNativeArguments(QLatin1String("/v:off /s /c \"") + command + QLatin1Char('"')); + proc->start(m_option->getEnv(QLatin1String("COMSPEC")), QStringList()); +# else + proc->start(QLatin1String("/bin/sh"), QStringList() << QLatin1String("-c") << command); +# endif + proc->waitForFinished(-1); + proc->setReadChannel(chan); + QByteArray errout = proc->readAll(); + if (errout.endsWith('\n')) + errout.chop(1); + m_handler->evalError(QString(), 0, QString::fromLocal8Bit(errout)); +} +#endif + +// The (QChar*)current->constData() constructs below avoid pointless detach() calls +// FIXME: This is inefficient. Should not make new string if it is a straight subsegment +static ALWAYS_INLINE void appendChar(ushort unicode, + QString *current, QChar **ptr, ProString *pending) +{ + if (!pending->isEmpty()) { + int len = pending->size(); + current->resize(current->size() + len); + ::memcpy((QChar*)current->constData(), pending->constData(), len * 2); + pending->clear(); + *ptr = (QChar*)current->constData() + len; + } + *(*ptr)++ = QChar(unicode); +} + +static void appendString(const ProString &string, + QString *current, QChar **ptr, ProString *pending) +{ + if (string.isEmpty()) + return; + QChar *uc = (QChar*)current->constData(); + int len; + if (*ptr != uc) { + len = *ptr - uc; + current->resize(current->size() + string.size()); + } else if (!pending->isEmpty()) { + len = pending->size(); + current->resize(current->size() + len + string.size()); + ::memcpy((QChar*)current->constData(), pending->constData(), len * 2); + pending->clear(); + } else { + *pending = string; + return; + } + *ptr = (QChar*)current->constData() + len; + ::memcpy(*ptr, string.constData(), string.size() * 2); + *ptr += string.size(); +} + +static void flushCurrent(ProStringList *ret, + QString *current, QChar **ptr, ProString *pending, bool joined) +{ + QChar *uc = (QChar*)current->constData(); + int len = *ptr - uc; + if (len) { + ret->append(ProString(QString(uc, len), NoHash)); + *ptr = uc; + } else if (!pending->isEmpty()) { + ret->append(*pending); + pending->clear(); + } else if (joined) { + ret->append(ProString()); + } +} + +static inline void flushFinal(ProStringList *ret, + const QString ¤t, const QChar *ptr, const ProString &pending, + const ProString &str, bool replaced, bool joined) +{ + int len = ptr - current.data(); + if (len) { + if (!replaced && len == str.size()) + ret->append(str); + else + ret->append(ProString(QString(current.data(), len), NoHash)); + } else if (!pending.isEmpty()) { + ret->append(pending); + } else if (joined) { + ret->append(ProString()); + } +} + +ProStringList ProFileEvaluator::Private::expandVariableReferences( + const ProString &str, int *pos, bool joined) +{ + ProStringList ret; // if (ok) // *ok = true; - if (str.isEmpty()) + if (str.isEmpty() && !pos) return ret; const ushort LSQUARE = '['; @@ -1082,42 +1699,45 @@ QStringList ProFileEvaluator::Private::expandVariableReferences(const QString &s const ushort DOT = '.'; const ushort SPACE = ' '; const ushort TAB = '\t'; + const ushort COMMA = ','; const ushort SINGLEQUOTE = '\''; const ushort DOUBLEQUOTE = '"'; - ushort unicode, quote = 0; - const QChar *str_data = str.data(); - const int str_len = str.length(); - - ushort term; - QString var, args; - - int replaced = 0; - QString current; - for (int i = 0; i < str_len; ++i) { - unicode = str_data[i].unicode(); - const int start_var = i; - if (unicode == DOLLAR && str_len > i+2) { - unicode = str_data[++i].unicode(); - if (unicode == DOLLAR) { - term = 0; - var.clear(); - args.clear(); + ushort unicode, quote = 0, parens = 0; + const ushort *str_data = (const ushort *)str.constData(); + const int str_len = str.size(); + + ProString var, args; + + bool replaced = false; + bool putSpace = false; + QString current; // Buffer for successively assembled string segments + current.resize(str.size()); + QChar *ptr = current.data(); + ProString pending; // Buffer for string segments from variables + // Only one of the above buffers can be filled at a given time. + for (int i = pos ? *pos : 0; i < str_len; ++i) { + unicode = str_data[i]; + if (unicode == DOLLAR) { + if (str_len > i+2 && str_data[i+1] == DOLLAR) { + ++i; + ushort term = 0; enum { VAR, ENVIRON, FUNCTION, PROPERTY } var_type = VAR; - unicode = str_data[++i].unicode(); + unicode = str_data[++i]; if (unicode == LSQUARE) { - unicode = str_data[++i].unicode(); + unicode = str_data[++i]; term = RSQUARE; var_type = PROPERTY; } else if (unicode == LCURLY) { - unicode = str_data[++i].unicode(); + unicode = str_data[++i]; var_type = VAR; term = RCURLY; } else if (unicode == LPAREN) { - unicode = str_data[++i].unicode(); + unicode = str_data[++i]; var_type = ENVIRON; term = RPAREN; } + int name_start = i; forever { if (!(unicode & (0xFF<<8)) && unicode != DOT && unicode != UNDERSCORE && @@ -1125,19 +1745,20 @@ QStringList ProFileEvaluator::Private::expandVariableReferences(const QString &s (unicode < 'a' || unicode > 'z') && (unicode < 'A' || unicode > 'Z') && (unicode < '0' || unicode > '9')) break; - var.append(QChar(unicode)); if (++i == str_len) break; - unicode = str_data[i].unicode(); + unicode = str_data[i]; // at this point, i points to either the 'term' or 'next' character (which is in unicode) } + var = str.mid(name_start, i - name_start); if (var_type == VAR && unicode == LPAREN) { var_type = FUNCTION; + name_start = i + 1; int depth = 0; forever { if (++i == str_len) break; - unicode = str_data[i].unicode(); + unicode = str_data[i]; if (unicode == LPAREN) { depth++; } else if (unicode == RPAREN) { @@ -1145,10 +1766,10 @@ QStringList ProFileEvaluator::Private::expandVariableReferences(const QString &s break; --depth; } - args.append(QChar(unicode)); } + args = str.mid(name_start, i - name_start); if (++i < str_len) - unicode = str_data[i].unicode(); + unicode = str_data[i]; else unicode = 0; // at this point i is pointing to the 'next' character (which is in unicode) @@ -1156,232 +1777,415 @@ QStringList ProFileEvaluator::Private::expandVariableReferences(const QString &s } if (term) { if (unicode != term) { - q->logMessage(format("Missing %1 terminator [found %2]") - .arg(QChar(term)) - .arg(unicode ? QString(unicode) : QString::fromLatin1(("end-of-line")))); + evalError(fL1S("Missing %1 terminator [found %2]") + .arg(QChar(term)) + .arg(unicode ? QString(unicode) : fL1S("end-of-line"))); // if (ok) // *ok = false; - return QStringList(); + if (pos) + *pos = str_len; + return ProStringList(); } } else { // move the 'cursor' back to the last char of the thing we were looking at --i; } - // since i never points to the 'next' character, there is no reason for this to be set - unicode = 0; - QStringList replacement; + ProStringList replacement; if (var_type == ENVIRON) { - replacement = split_value_list(QString::fromLocal8Bit(qgetenv(var.toLatin1().constData()))); + replacement = split_value_list(m_option->getEnv(var.toQString(m_tmp1))); } else if (var_type == PROPERTY) { - replacement << propertyValue(var); + replacement << ProString(propertyValue(var.toQString(m_tmp1), true), NoHash); } else if (var_type == FUNCTION) { - replacement << evaluateExpandFunction(var, args); + replacement += evaluateExpandFunction(var, args); } else if (var_type == VAR) { - replacement = values(var); + replacement = values(map(var)); } - if (!(replaced++) && start_var) - current = str.left(start_var); if (!replacement.isEmpty()) { - if (quote) { - current += replacement.join(QString(Option::field_sep)); + if (quote || joined) { + if (putSpace) { + putSpace = false; + if (!replacement.at(0).isEmpty()) // Bizarre, indeed + appendChar(' ', ¤t, &ptr, &pending); + } + appendString(ProString(replacement.join(statics.field_sep), NoHash), + ¤t, &ptr, &pending); } else { - current += replacement.takeFirst(); - if (!replacement.isEmpty()) { - if (!current.isEmpty()) - ret.append(current); - current = replacement.takeLast(); - if (!replacement.isEmpty()) - ret += replacement; + appendString(replacement.at(0), ¤t, &ptr, &pending); + if (replacement.size() > 1) { + flushCurrent(&ret, ¤t, &ptr, &pending, false); + int j = 1; + if (replacement.size() > 2) { + // FIXME: ret.reserve(ret.size() + replacement.size() - 2); + for (; j < replacement.size() - 1; ++j) + ret << replacement.at(j); + } + pending = replacement.at(j); } } + replaced = true; } - } else { - if (replaced) - current.append(QLatin1Char('$')); + continue; } - } - if (quote && unicode == quote) { - unicode = 0; - quote = 0; } else if (unicode == BACKSLASH) { - bool escape = false; - const char *symbols = "[]{}()$\\'\""; - for (const char *s = symbols; *s; ++s) { - if (str_data[i+1].unicode() == (ushort)*s) { - i++; - escape = true; - if (!(replaced++)) - current = str.left(start_var); - current.append(str.at(i)); - break; - } + static const char symbols[] = "[]{}()$\\'\""; + ushort unicode2 = str_data[i+1]; + if (!(unicode2 & 0xff00) && strchr(symbols, unicode2)) { + unicode = unicode2; + ++i; + } + } else if (quote) { + if (unicode == quote) { + quote = 0; + continue; } - if (escape || !replaced) - unicode =0; - } else if (!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { - quote = unicode; - unicode = 0; - if (!(replaced++) && i) - current = str.left(i); - } else if (!quote && (unicode == SPACE || unicode == TAB)) { - unicode = 0; - if (!current.isEmpty()) { - ret.append(current); - current.clear(); + } else { + if (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE) { + quote = unicode; + continue; + } else if (unicode == SPACE || unicode == TAB) { + if (!joined) + flushCurrent(&ret, ¤t, &ptr, &pending, false); + else if ((ptr - (QChar*)current.constData()) || !pending.isEmpty()) + putSpace = true; + continue; + } else if (pos) { + if (unicode == LPAREN) { + ++parens; + } else if (unicode == RPAREN) { + --parens; + } else if (!parens && unicode == COMMA) { + if (!joined) { + *pos = i + 1; + flushFinal(&ret, current, ptr, pending, str, replaced, false); + return ret; + } + flushCurrent(&ret, ¤t, &ptr, &pending, true); + putSpace = false; + continue; + } } } - if (replaced && unicode) - current.append(QChar(unicode)); + if (putSpace) { + putSpace = false; + appendChar(' ', ¤t, &ptr, &pending); + } + appendChar(unicode, ¤t, &ptr, &pending); } - if (!replaced) - ret = QStringList(str); - else if (!current.isEmpty()) - ret.append(current); + if (pos) + *pos = str_len; + flushFinal(&ret, current, ptr, pending, str, replaced, joined); return ret; } +bool ProFileEvaluator::Private::modesForGenerator(const QString &gen, + ProFileOption::HOST_MODE *host_mode, ProFileOption::TARG_MODE *target_mode) const +{ + if (gen == fL1S("UNIX")) { +#ifdef Q_OS_MAC + *host_mode = ProFileOption::HOST_MACX_MODE; + *target_mode = ProFileOption::TARG_MACX_MODE; +#else + *host_mode = ProFileOption::HOST_UNIX_MODE; + *target_mode = ProFileOption::TARG_UNIX_MODE; +#endif + } else if (gen == fL1S("MSVC.NET") || gen == fL1S("BMAKE") || gen == fL1S("MSBUILD")) { + *host_mode = ProFileOption::HOST_WIN_MODE; + *target_mode = ProFileOption::TARG_WIN_MODE; + } else if (gen == fL1S("MINGW")) { +#if defined(Q_OS_MAC) + *host_mode = ProFileOption::HOST_MACX_MODE; +#elif defined(Q_OS_UNIX) + *host_mode = ProFileOption::HOST_UNIX_MODE; +#else + *host_mode = ProFileOption::HOST_WIN_MODE; +#endif + *target_mode = ProFileOption::TARG_WIN_MODE; + } else if (gen == fL1S("PROJECTBUILDER") || gen == fL1S("XCODE")) { + *host_mode = ProFileOption::HOST_MACX_MODE; + *target_mode = ProFileOption::TARG_MACX_MODE; + } else if (gen == fL1S("SYMBIAN_ABLD") || gen == fL1S("SYMBIAN_SBSV2") + || gen == fL1S("SYMBIAN_UNIX") || gen == fL1S("SYMBIAN_MINGW")) { +#if defined(Q_OS_MAC) + *host_mode = ProFileOption::HOST_MACX_MODE; +#elif defined(Q_OS_UNIX) + *host_mode = ProFileOption::HOST_UNIX_MODE; +#else + *host_mode = ProFileOption::HOST_WIN_MODE; +#endif + *target_mode = ProFileOption::TARG_SYMBIAN_MODE; + } else { + evalError(fL1S("Unknown generator specified: %1").arg(gen)); + return false; + } + return true; +} + +void ProFileEvaluator::Private::validateModes() const +{ + if (m_option->host_mode == ProFileOption::HOST_UNKNOWN_MODE + || m_option->target_mode == ProFileOption::TARG_UNKNOWN_MODE) { + const QHash<ProString, ProStringList> &vals = + m_option->base_valuemap.isEmpty() ? m_valuemapStack[0] : m_option->base_valuemap; + ProFileOption::HOST_MODE host_mode; + ProFileOption::TARG_MODE target_mode; + const ProStringList &gen = vals.value(ProString("MAKEFILE_GENERATOR")); + if (gen.isEmpty()) { + evalError(fL1S("Using OS scope before setting MAKEFILE_GENERATOR")); + } else if (modesForGenerator(gen.at(0).toQString(), &host_mode, &target_mode)) { + if (m_option->host_mode == ProFileOption::HOST_UNKNOWN_MODE) { + m_option->host_mode = host_mode; + m_option->applyHostMode(); + } + + if (m_option->target_mode == ProFileOption::TARG_UNKNOWN_MODE) { + const ProStringList &tgt = vals.value(ProString("TARGET_PLATFORM")); + if (!tgt.isEmpty()) { + const QString &os = tgt.at(0).toQString(); + if (os == statics.strunix) + m_option->target_mode = ProFileOption::TARG_UNIX_MODE; + else if (os == statics.strmacx) + m_option->target_mode = ProFileOption::TARG_MACX_MODE; + else if (os == statics.strsymbian) + m_option->target_mode = ProFileOption::TARG_SYMBIAN_MODE; + else if (os == statics.strwin32) + m_option->target_mode = ProFileOption::TARG_WIN_MODE; + else + evalError(fL1S("Unknown target platform specified: %1").arg(os)); + } else { + m_option->target_mode = target_mode; + } + } + } + } +} + bool ProFileEvaluator::Private::isActiveConfig(const QString &config, bool regex) { // magic types for easy flipping - if (config == QLatin1String("true")) + if (config == statics.strtrue) return true; - if (config == QLatin1String("false")) + if (config == statics.strfalse) return false; - // mkspecs - if ((Option::target_mode == Option::TARG_MACX_MODE - || Option::target_mode == Option::TARG_QNX6_MODE - || Option::target_mode == Option::TARG_UNIX_MODE) - && config == QLatin1String("unix")) - return true; - if (Option::target_mode == Option::TARG_MACX_MODE && config == QLatin1String("macx")) - return true; - if (Option::target_mode == Option::TARG_QNX6_MODE && config == QLatin1String("qnx6")) - return true; - if (Option::target_mode == Option::TARG_MAC9_MODE && config == QLatin1String("mac9")) - return true; - if ((Option::target_mode == Option::TARG_MAC9_MODE - || Option::target_mode == Option::TARG_MACX_MODE) - && config == QLatin1String("mac")) - return true; - if (Option::target_mode == Option::TARG_WIN_MODE && config == QLatin1String("win32")) - return true; + if (config == statics.strunix) { + validateModes(); + return m_option->target_mode == ProFileOption::TARG_UNIX_MODE + || m_option->target_mode == ProFileOption::TARG_MACX_MODE + || m_option->target_mode == ProFileOption::TARG_SYMBIAN_MODE; + } else if (config == statics.strmacx || config == statics.strmac) { + validateModes(); + return m_option->target_mode == ProFileOption::TARG_MACX_MODE; + } else if (config == statics.strsymbian) { + validateModes(); + return m_option->target_mode == ProFileOption::TARG_SYMBIAN_MODE; + } else if (config == statics.strwin32) { + validateModes(); + return m_option->target_mode == ProFileOption::TARG_WIN_MODE; + } - QRegExp re(config, Qt::CaseSensitive, QRegExp::Wildcard); - QString spec = Option::qmakespec; - if ((regex && re.exactMatch(spec)) || (!regex && spec == config)) - return true; + if (regex && (config.contains(QLatin1Char('*')) || config.contains(QLatin1Char('?')))) { + QString cfg = config; + cfg.detach(); // Keep m_tmp out of QRegExp's cache + QRegExp re(cfg, Qt::CaseSensitive, QRegExp::Wildcard); + + // mkspecs + if (re.exactMatch(m_option->qmakespec_name)) + return true; + + // CONFIG variable + int t = 0; + foreach (const ProString &configValue, valuesDirect(statics.strCONFIG)) { + if (re.exactMatch(configValue.toQString(m_tmp[t]))) + return true; + t ^= 1; + } + } else { + // mkspecs + if (m_option->qmakespec_name == config) + return true; + + // CONFIG variable + if (valuesDirect(statics.strCONFIG).contains(ProString(config, NoHash))) + return true; + } return false; } -QStringList ProFileEvaluator::Private::evaluateFunction( - ProBlock *funcPtr, const QStringList &argumentsList, bool *ok) +ProStringList ProFileEvaluator::Private::expandVariableReferences( + const ushort *&tokPtr, int sizeHint, bool joined) +{ + ProStringList ret; + ret.reserve(sizeHint); + forever { + evaluateExpression(tokPtr, &ret, joined); + switch (*tokPtr) { + case TokValueTerminator: + case TokFuncTerminator: + tokPtr++; + return ret; + case TokArgSeparator: + if (joined) { + tokPtr++; + continue; + } + // fallthrough + default: + Q_ASSERT_X(false, "expandVariableReferences", "Unrecognized token"); + break; + } + } +} + +QList<ProStringList> ProFileEvaluator::Private::prepareFunctionArgs(const ushort *&tokPtr) +{ + QList<ProStringList> args_list; + if (*tokPtr != TokFuncTerminator) { + for (;; tokPtr++) { + ProStringList arg; + evaluateExpression(tokPtr, &arg, false); + args_list << arg; + if (*tokPtr == TokFuncTerminator) + break; + Q_ASSERT(*tokPtr == TokArgSeparator); + } + } + tokPtr++; + return args_list; +} + +QList<ProStringList> ProFileEvaluator::Private::prepareFunctionArgs(const ProString &arguments) +{ + QList<ProStringList> args_list; + for (int pos = 0; pos < arguments.size(); ) + args_list << expandVariableReferences(arguments, &pos); + return args_list; +} + +ProStringList ProFileEvaluator::Private::evaluateFunction( + const FunctionDef &func, const QList<ProStringList> &argumentsList, bool *ok) { bool oki; - QStringList ret; + ProStringList ret; if (m_valuemapStack.count() >= 100) { - q->errorMessage(format("ran into infinite recursion (depth > 100).")); + evalError(fL1S("ran into infinite recursion (depth > 100).")); oki = false; } else { - State sts = m_sts; - m_valuemapStack.push(m_valuemap); - m_filevaluemapStack.push(m_filevaluemap); + m_valuemapStack.push(QHash<ProString, ProStringList>()); + m_locationStack.push(m_current); + int loopLevel = m_loopLevel; + m_loopLevel = 0; - QStringList args; + ProStringList args; for (int i = 0; i < argumentsList.count(); ++i) { - QStringList theArgs = expandVariableReferences(argumentsList[i]); - args += theArgs; - m_valuemap[QString::number(i+1)] = theArgs; + args += argumentsList[i]; + m_valuemapStack.top()[ProString(QString::number(i+1))] = argumentsList[i]; } - m_valuemap[QLatin1String("ARGS")] = args; - oki = (funcPtr->Accept(this) != ProItem::ReturnFalse); // True || Return + m_valuemapStack.top()[statics.strARGS] = args; + oki = (visitProBlock(func.pro(), func.tokPtr()) != ReturnFalse); // True || Return ret = m_returnValue; m_returnValue.clear(); - m_valuemap = m_valuemapStack.pop(); - m_filevaluemap = m_filevaluemapStack.pop(); - m_sts = sts; + m_loopLevel = loopLevel; + m_current = m_locationStack.pop(); + m_valuemapStack.pop(); } if (ok) *ok = oki; if (oki) return ret; - return QStringList(); -} - -QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &func, const QString &arguments) -{ - QStringList argumentsList = split_arg_list(arguments); - - if (ProBlock *funcPtr = m_replaceFunctions.value(func, 0)) - return evaluateFunction(funcPtr, argumentsList, 0); - - QStringList args; - for (int i = 0; i < argumentsList.count(); ++i) - args += expandVariableReferences(argumentsList[i]).join(Option::field_sep); - - enum ExpandFunc { E_MEMBER=1, E_FIRST, E_LAST, E_CAT, E_FROMFILE, E_EVAL, E_LIST, - E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION, - E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND, - E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE, - E_REPLACE }; - - static QHash<QString, int> expands; - if (expands.isEmpty()) { - expands.insert(QLatin1String("member"), E_MEMBER); - expands.insert(QLatin1String("first"), E_FIRST); - expands.insert(QLatin1String("last"), E_LAST); - expands.insert(QLatin1String("cat"), E_CAT); - expands.insert(QLatin1String("fromfile"), E_FROMFILE); // implementation disabled (see comment below) - expands.insert(QLatin1String("eval"), E_EVAL); - expands.insert(QLatin1String("list"), E_LIST); - expands.insert(QLatin1String("sprintf"), E_SPRINTF); - expands.insert(QLatin1String("join"), E_JOIN); - expands.insert(QLatin1String("split"), E_SPLIT); - expands.insert(QLatin1String("basename"), E_BASENAME); - expands.insert(QLatin1String("dirname"), E_DIRNAME); - expands.insert(QLatin1String("section"), E_SECTION); - expands.insert(QLatin1String("find"), E_FIND); - expands.insert(QLatin1String("system"), E_SYSTEM); - expands.insert(QLatin1String("unique"), E_UNIQUE); - expands.insert(QLatin1String("quote"), E_QUOTE); - expands.insert(QLatin1String("escape_expand"), E_ESCAPE_EXPAND); - expands.insert(QLatin1String("upper"), E_UPPER); - expands.insert(QLatin1String("lower"), E_LOWER); - expands.insert(QLatin1String("re_escape"), E_RE_ESCAPE); - expands.insert(QLatin1String("files"), E_FILES); - expands.insert(QLatin1String("prompt"), E_PROMPT); // interactive, so cannot be implemented - expands.insert(QLatin1String("replace"), E_REPLACE); + return ProStringList(); +} + +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateBoolFunction( + const FunctionDef &func, const QList<ProStringList> &argumentsList, + const ProString &function) +{ + bool ok; + ProStringList ret = evaluateFunction(func, argumentsList, &ok); + if (ok) { + if (ret.isEmpty()) + return ReturnTrue; + if (ret.at(0) != statics.strfalse) { + if (ret.at(0) == statics.strtrue) + return ReturnTrue; + int val = ret.at(0).toQString(m_tmp1).toInt(&ok); + if (ok) { + if (val) + return ReturnTrue; + } else { + evalError(fL1S("Unexpected return value from test '%1': %2") + .arg(function.toQString(m_tmp1)) + .arg(ret.join(QLatin1String(" :: ")))); + } + } } - ExpandFunc func_t = ExpandFunc(expands.value(func.toLower())); + return ReturnFalse; +} - QStringList ret; +ProStringList ProFileEvaluator::Private::evaluateExpandFunction( + const ProString &func, const ushort *&tokPtr) +{ + QHash<ProString, FunctionDef>::ConstIterator it = + m_functionDefs.replaceFunctions.constFind(func); + if (it != m_functionDefs.replaceFunctions.constEnd()) + return evaluateFunction(*it, prepareFunctionArgs(tokPtr), 0); + + //why don't the builtin functions just use args_list? --Sam + return evaluateExpandFunction(func, expandVariableReferences(tokPtr, 5, true)); +} + +ProStringList ProFileEvaluator::Private::evaluateExpandFunction( + const ProString &func, const ProString &arguments) +{ + QHash<ProString, FunctionDef>::ConstIterator it = + m_functionDefs.replaceFunctions.constFind(func); + if (it != m_functionDefs.replaceFunctions.constEnd()) + return evaluateFunction(*it, prepareFunctionArgs(arguments), 0); + + //why don't the builtin functions just use args_list? --Sam + int pos = 0; + return evaluateExpandFunction(func, expandVariableReferences(arguments, &pos, true)); +} + +ProStringList ProFileEvaluator::Private::evaluateExpandFunction( + const ProString &func, const ProStringList &args) +{ + ExpandFunc func_t = ExpandFunc(statics.expands.value(func)); + if (func_t == 0) { + const QString &fn = func.toQString(m_tmp1); + const QString &lfn = fn.toLower(); + if (!fn.isSharedWith(lfn)) + func_t = ExpandFunc(statics.expands.value(ProString(lfn))); + } + + ProStringList ret; switch (func_t) { case E_BASENAME: case E_DIRNAME: case E_SECTION: { bool regexp = false; - QString sep, var; + QString sep; + ProString var; int beg = 0; int end = -1; if (func_t == E_SECTION) { if (args.count() != 3 && args.count() != 4) { - q->logMessage(format("%1(var) section(var, sep, begin, end) " - "requires three or four arguments.").arg(func)); + evalError(fL1S("%1(var) section(var, sep, begin, end) requires" + " three or four arguments.").arg(func.toQString(m_tmp1))); } else { var = args[0]; - sep = args[1]; - beg = args[2].toInt(); + sep = args.at(1).toQString(); + beg = args.at(2).toQString(m_tmp2).toInt(); if (args.count() == 4) - end = args[3].toInt(); + end = args.at(3).toQString(m_tmp2).toInt(); } } else { if (args.count() != 1) { - q->logMessage(format("%1(var) requires one argument.").arg(func)); + evalError(fL1S("%1(var) requires one argument.").arg(func.toQString(m_tmp1))); } else { var = args[0]; regexp = true; @@ -1392,67 +2196,81 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun beg = -1; } } - if (!var.isNull()) { - foreach (const QString str, values(var)) { - if (regexp) - ret += str.section(QRegExp(sep), beg, end); - else - ret += str.section(sep, beg, end); + if (!var.isEmpty()) { + if (regexp) { + QRegExp sepRx(sep); + foreach (const ProString &str, values(map(var))) { + const QString &rstr = str.toQString(m_tmp1).section(sepRx, beg, end); + ret << (rstr.isSharedWith(m_tmp1) ? str : ProString(rstr, NoHash).setSource(str)); + } + } else { + foreach (const ProString &str, values(map(var))) { + const QString &rstr = str.toQString(m_tmp1).section(sep, beg, end); + ret << (rstr.isSharedWith(m_tmp1) ? str : ProString(rstr, NoHash).setSource(str)); + } } } break; } case E_SPRINTF: if(args.count() < 1) { - q->logMessage(format("sprintf(format, ...) requires at least one argument")); + evalError(fL1S("sprintf(format, ...) requires at least one argument")); } else { - QString tmp = args.at(0); + QString tmp = args.at(0).toQString(m_tmp1); for (int i = 1; i < args.count(); ++i) - tmp = tmp.arg(args.at(i)); + tmp = tmp.arg(args.at(i).toQString(m_tmp2)); + // Note: this depends on split_value_list() making a deep copy ret = split_value_list(tmp); } break; case E_JOIN: { if (args.count() < 1 || args.count() > 4) { - q->logMessage(format("join(var, glue, before, after) requires one to four arguments.")); + evalError(fL1S("join(var, glue, before, after) requires one to four arguments.")); } else { - QString glue, before, after; + QString glue; + ProString before, after; if (args.count() >= 2) - glue = args[1]; + glue = args.at(1).toQString(m_tmp1); if (args.count() >= 3) before = args[2]; if (args.count() == 4) after = args[3]; - const QStringList &var = values(args.first()); - if (!var.isEmpty()) - ret.append(before + var.join(glue) + after); + const ProStringList &var = values(map(args.at(0))); + if (!var.isEmpty()) { + const ProFile *src = currentProFile(); + foreach (const ProString &v, var) + if (const ProFile *s = v.sourceFile()) { + src = s; + break; + } + ret.append(ProString(before + var.join(glue) + after, NoHash).setSource(src)); + } } break; } - case E_SPLIT: { + case E_SPLIT: if (args.count() != 2) { - q->logMessage(format("split(var, sep) requires one or two arguments")); + evalError(fL1S("split(var, sep) requires one or two arguments")); } else { - const QString &sep = (args.count() == 2) ? args[1] : QString(Option::field_sep); - foreach (const QString &var, values(args.first())) - foreach (const QString &splt, var.split(sep)) - ret.append(splt); + const QString &sep = (args.count() == 2) ? args.at(1).toQString(m_tmp1) : statics.field_sep; + foreach (const ProString &var, values(map(args.at(0)))) + foreach (const QString &splt, var.toQString(m_tmp2).split(sep)) + ret << (splt.isSharedWith(m_tmp2) ? var : ProString(splt, NoHash).setSource(var)); } break; - } - case E_MEMBER: { + case E_MEMBER: if (args.count() < 1 || args.count() > 3) { - q->logMessage(format("member(var, start, end) requires one to three arguments.")); + evalError(fL1S("member(var, start, end) requires one to three arguments.")); } else { bool ok = true; - const QStringList var = values(args.first()); + const ProStringList &var = values(map(args.at(0))); int start = 0, end = 0; if (args.count() >= 2) { - QString start_str = args[1]; + const QString &start_str = args.at(1).toQString(m_tmp1); start = start_str.toInt(&ok); if (!ok) { if (args.count() == 2) { - int dotdot = start_str.indexOf(QLatin1String("..")); + int dotdot = start_str.indexOf(statics.strDotDot); if (dotdot != -1) { start = start_str.left(dotdot).toInt(&ok); if (ok) @@ -1460,15 +2278,15 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun } } if (!ok) - q->logMessage(format("member() argument 2 (start) '%2' invalid.") - .arg(start_str)); + evalError(fL1S("member() argument 2 (start) '%2' invalid.") + .arg(start_str)); } else { end = start; if (args.count() == 3) - end = args[2].toInt(&ok); + end = args.at(2).toQString(m_tmp1).toInt(&ok); if (!ok) - q->logMessage(format("member() argument 3 (end) '%2' invalid.\n") - .arg(args[2])); + evalError(fL1S("member() argument 3 (end) '%2' invalid.\n") + .arg(args.at(2).toQString(m_tmp1))); } } if (ok) { @@ -1488,13 +2306,12 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun } } break; - } case E_FIRST: - case E_LAST: { + case E_LAST: if (args.count() != 1) { - q->logMessage(format("%1(var) requires one argument.").arg(func)); + evalError(fL1S("%1(var) requires one argument.").arg(func.toQString(m_tmp1))); } else { - const QStringList var = values(args.first()); + const ProStringList &var = values(map(args.at(0))); if (!var.isEmpty()) { if (func_t == E_FIRST) ret.append(var[0]); @@ -1503,92 +2320,96 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun } } break; - } + case E_SIZE: + if (args.count() != 1) + evalError(fL1S("size(var) requires one argument.")); + else + ret.append(ProString(QString::number(values(map(args.at(0))).size()), NoHash)); + break; case E_CAT: if (args.count() < 1 || args.count() > 2) { - q->logMessage(format("cat(file, singleline=true) requires one or two arguments.")); + evalError(fL1S("cat(file, singleline=true) requires one or two arguments.")); } else { - QString file = args[0]; - file = Option::fixPathToLocalOS(file); + const QString &file = args.at(0).toQString(m_tmp1); bool singleLine = true; if (args.count() > 1) - singleLine = (!args[1].compare(QLatin1String("true"), Qt::CaseInsensitive)); + singleLine = isTrue(args.at(1), m_tmp2); - QFile qfile(file); + QFile qfile(resolvePath(expandEnvVars(file))); if (qfile.open(QIODevice::ReadOnly)) { QTextStream stream(&qfile); while (!stream.atEnd()) { ret += split_value_list(stream.readLine().trimmed()); if (!singleLine) - ret += QLatin1String("\n"); + ret += ProString("\n", NoHash); } qfile.close(); } } break; -#if 0 // Used only by Qt's configure for caching case E_FROMFILE: if (args.count() != 2) { - q->logMessage(format("fromfile(file, variable) requires two arguments.")); + evalError(fL1S("fromfile(file, variable) requires two arguments.")); } else { - QString file = args[0], seek_variableName = args[1]; - - ProFile pro(Option::fixPathToLocalOS(file)); - - ProFileEvaluator visitor; - visitor.setVerbose(m_verbose); - visitor.setCumulative(m_cumulative); - - if (!visitor.queryProFile(&pro)) - break; - - if (!visitor.accept(&pro)) - break; - - ret = visitor.values(seek_variableName); + QHash<ProString, ProStringList> vars; + QString fn = resolvePath(expandEnvVars(args.at(0).toQString(m_tmp1))); + fn.detach(); + if (evaluateFileInto(fn, ProFileEvaluatorHandler::EvalAuxFile, + &vars, &m_functionDefs, EvalWithDefaults)) + ret = vars.value(map(args.at(1))); } break; -#endif - case E_EVAL: { + case E_EVAL: if (args.count() != 1) { - q->logMessage(format("eval(variable) requires one argument")); - + evalError(fL1S("eval(variable) requires one argument")); } else { - ret += values(args.at(0)); + ret += values(map(args.at(0))); } - break; } + break; case E_LIST: { - static int x = 0; QString tmp; - tmp.sprintf(".QMAKE_INTERNAL_TMP_variableName_%d", x++); - ret = QStringList(tmp); - QStringList lst; - foreach (const QString &arg, args) - lst += split_value_list(arg); - m_valuemap[tmp] = lst; + tmp.sprintf(".QMAKE_INTERNAL_TMP_variableName_%d", m_listCount++); + ret = ProStringList(ProString(tmp, NoHash)); + ProStringList lst; + foreach (const ProString &arg, args) + lst += split_value_list(arg.toQString(m_tmp1), arg.sourceFile()); // Relies on deep copy + m_valuemapStack.top()[ret.at(0)] = lst; break; } case E_FIND: if (args.count() != 2) { - q->logMessage(format("find(var, str) requires two arguments.")); + evalError(fL1S("find(var, str) requires two arguments.")); } else { - QRegExp regx(args[1]); - foreach (const QString &val, values(args.first())) - if (regx.indexIn(val) != -1) + QRegExp regx(args.at(1).toQString()); + int t = 0; + foreach (const ProString &val, values(map(args.at(0)))) { + if (regx.indexIn(val.toQString(m_tmp[t])) != -1) ret += val; + t ^= 1; + } } break; case E_SYSTEM: if (!m_skipLevel) { if (args.count() < 1 || args.count() > 2) { - q->logMessage(format("system(execute) requires one or two arguments.")); + evalError(fL1S("system(execute) requires one or two arguments.")); } else { - char buff[256]; - FILE *proc = QT_POPEN(args[0].toLatin1(), "r"); bool singleLine = true; if (args.count() > 1) - singleLine = (!args[1].compare(QLatin1String("true"), Qt::CaseInsensitive)); - QString output; + singleLine = isTrue(args.at(1), m_tmp2); + QByteArray output; +#ifndef QT_BOOTSTRAPPED + QProcess proc; + runProcess(&proc, args.at(0).toQString(m_tmp2), QProcess::StandardError); + output = proc.readAllStandardOutput(); + output.replace('\t', ' '); + if (singleLine) + output.replace('\n', ' '); +#else + char buff[256]; + FILE *proc = QT_POPEN(QString(QLatin1String("cd ") + + IoUtils::shellQuote(currentDirectory()) + + QLatin1String(" && ") + args[0]).toLocal8Bit(), "r"); while (proc && !feof(proc)) { int read_in = int(fread(buff, 1, 255, proc)); if (!read_in) @@ -1597,32 +2418,31 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun if ((singleLine && buff[i] == '\n') || buff[i] == '\t') buff[i] = ' '; } - buff[read_in] = '\0'; - output += QLatin1String(buff); + output.append(buff, read_in); } - ret += split_value_list(output); if (proc) QT_PCLOSE(proc); +#endif + ret += split_value_list(QString::fromLocal8Bit(output)); } } break; case E_UNIQUE: if(args.count() != 1) { - q->logMessage(format("unique(var) requires one argument.")); + evalError(fL1S("unique(var) requires one argument.")); } else { - foreach (const QString &var, values(args.first())) - if (!ret.contains(var)) - ret.append(var); + ret = values(map(args.at(0))); + ret.removeDuplicates(); } break; case E_QUOTE: - for (int i = 0; i < args.count(); ++i) - ret += QStringList(args.at(i)); + ret += args; break; case E_ESCAPE_EXPAND: for (int i = 0; i < args.size(); ++i) { - QChar *i_data = args[i].data(); - int i_len = args[i].length(); + QString str = args.at(i).toQString(); + QChar *i_data = str.data(); + int i_len = str.length(); for (int x = 0; x < i_len; ++x) { if (*(i_data+x) == QLatin1Char('\\') && x < i_len-1) { if (*(i_data+x+1) == QLatin1Char('\\')) { @@ -1648,299 +2468,238 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun } } } - ret.append(QString(i_data, i_len)); + ret.append(ProString(QString(i_data, i_len), NoHash).setSource(args.at(i))); } break; case E_RE_ESCAPE: - for (int i = 0; i < args.size(); ++i) - ret += QRegExp::escape(args[i]); + for (int i = 0; i < args.size(); ++i) { + const QString &rstr = QRegExp::escape(args.at(i).toQString(m_tmp1)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(i) : ProString(rstr, NoHash).setSource(args.at(i))); + } break; case E_UPPER: case E_LOWER: - for (int i = 0; i < args.count(); ++i) - if (func_t == E_UPPER) - ret += args[i].toUpper(); - else - ret += args[i].toLower(); + for (int i = 0; i < args.count(); ++i) { + QString rstr = args.at(i).toQString(m_tmp1); + rstr = (func_t == E_UPPER) ? rstr.toUpper() : rstr.toLower(); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(i) : ProString(rstr, NoHash).setSource(args.at(i))); + } break; case E_FILES: if (args.count() != 1 && args.count() != 2) { - q->logMessage(format("files(pattern, recursive=false) requires one or two arguments")); + evalError(fL1S("files(pattern, recursive=false) requires one or two arguments")); } else { bool recursive = false; if (args.count() == 2) - recursive = (!args[1].compare(QLatin1String("true"), Qt::CaseInsensitive) || args[1].toInt()); + recursive = isTrue(args.at(1), m_tmp2); QStringList dirs; - QString r = Option::fixPathToLocalOS(args[0]); + QString r = fixPathToLocalOS(args.at(0).toQString(m_tmp1)); + QString pfx; + if (IoUtils::isRelativePath(r)) { + pfx = currentDirectory(); + if (!pfx.endsWith(QLatin1Char('/'))) + pfx += QLatin1Char('/'); + } int slash = r.lastIndexOf(QDir::separator()); if (slash != -1) { - dirs.append(r.left(slash)); + dirs.append(r.left(slash+1)); r = r.mid(slash+1); } else { dirs.append(QString()); } + r.detach(); // Keep m_tmp out of QRegExp's cache const QRegExp regex(r, Qt::CaseSensitive, QRegExp::Wildcard); for (int d = 0; d < dirs.count(); d++) { QString dir = dirs[d]; - if (!dir.isEmpty() && !dir.endsWith(Option::dir_sep)) - dir += QLatin1Char('/'); - - QDir qdir(dir); + QDir qdir(pfx + dir); for (int i = 0; i < (int)qdir.count(); ++i) { - if (qdir[i] == QLatin1String(".") || qdir[i] == QLatin1String("..")) + if (qdir[i] == statics.strDot || qdir[i] == statics.strDotDot) continue; QString fname = dir + qdir[i]; - if (QFileInfo(fname).isDir()) { + if (IoUtils::fileType(pfx + fname) == IoUtils::FileIsDir) { if (recursive) - dirs.append(fname); + dirs.append(fname + QDir::separator()); } if (regex.exactMatch(qdir[i])) - ret += fname; + ret += ProString(fname, NoHash).setSource(currentProFile()); } } } break; case E_REPLACE: if(args.count() != 3 ) { - q->logMessage(format("replace(var, before, after) requires three arguments")); + evalError(fL1S("replace(var, before, after) requires three arguments")); } else { - const QRegExp before(args[1]); - const QString after(args[2]); - foreach (QString val, values(args.first())) - ret += val.replace(before, after); + const QRegExp before(args.at(1).toQString()); + const QString &after(args.at(2).toQString(m_tmp2)); + foreach (const ProString &val, values(map(args.at(0)))) { + QString rstr = val.toQString(m_tmp1); + QString copy = rstr; // Force a detach on modify + rstr.replace(before, after); + ret << (rstr.isSharedWith(m_tmp1) ? val : ProString(rstr, NoHash).setSource(val)); + } } break; - case 0: - q->logMessage(format("'%1' is not a recognized replace function").arg(func)); + case E_INVALID: + evalError(fL1S("'%1' is not a recognized replace function") + .arg(func.toQString(m_tmp1))); break; default: - q->logMessage(format("Function '%1' is not implemented").arg(func)); + evalError(fL1S("Function '%1' is not implemented").arg(func.toQString(m_tmp1))); break; } return ret; } -ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( - const QString &function, const QString &arguments) +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateConditionalFunction( + const ProString &function, const ProString &arguments) { - QStringList argumentsList = split_arg_list(arguments); + QHash<ProString, FunctionDef>::ConstIterator it = + m_functionDefs.testFunctions.constFind(function); + if (it != m_functionDefs.testFunctions.constEnd()) + return evaluateBoolFunction(*it, prepareFunctionArgs(arguments), function); - if (ProBlock *funcPtr = m_testFunctions.value(function, 0)) { - bool ok; - QStringList ret = evaluateFunction(funcPtr, argumentsList, &ok); - if (ok) { - if (ret.isEmpty()) { - return ProItem::ReturnTrue; - } else { - if (ret.first() != QLatin1String("false")) { - if (ret.first() == QLatin1String("true")) { - return ProItem::ReturnTrue; - } else { - bool ok; - int val = ret.first().toInt(&ok); - if (ok) { - if (val) - return ProItem::ReturnTrue; - } else { - q->logMessage(format("Unexpected return value from test '%1': %2") - .arg(function).arg(ret.join(QLatin1String(" :: ")))); - } - } - } - } - } - return ProItem::ReturnFalse; - } + //why don't the builtin functions just use args_list? --Sam + int pos = 0; + return evaluateConditionalFunction(function, expandVariableReferences(arguments, &pos, true)); +} - QString sep; - sep.append(Option::field_sep); - QStringList args; - for (int i = 0; i < argumentsList.count(); ++i) - args += expandVariableReferences(argumentsList[i]).join(sep); - - enum TestFunc { T_REQUIRES=1, T_GREATERTHAN, T_LESSTHAN, T_EQUALS, - T_EXISTS, T_EXPORT, T_CLEAR, T_UNSET, T_EVAL, T_CONFIG, T_SYSTEM, - T_RETURN, T_BREAK, T_NEXT, T_DEFINED, T_CONTAINS, T_INFILE, - T_COUNT, T_ISEMPTY, T_INCLUDE, T_LOAD, T_DEBUG, T_MESSAGE, T_IF, - T_FOR, T_DEFINE_TEST, T_DEFINE_REPLACE }; - - static QHash<QString, int> functions; - if (functions.isEmpty()) { - functions.insert(QLatin1String("requires"), T_REQUIRES); - functions.insert(QLatin1String("greaterThan"), T_GREATERTHAN); - functions.insert(QLatin1String("lessThan"), T_LESSTHAN); - functions.insert(QLatin1String("equals"), T_EQUALS); - functions.insert(QLatin1String("isEqual"), T_EQUALS); - functions.insert(QLatin1String("exists"), T_EXISTS); - functions.insert(QLatin1String("export"), T_EXPORT); - functions.insert(QLatin1String("clear"), T_CLEAR); - functions.insert(QLatin1String("unset"), T_UNSET); - functions.insert(QLatin1String("eval"), T_EVAL); - functions.insert(QLatin1String("CONFIG"), T_CONFIG); - functions.insert(QLatin1String("if"), T_IF); - functions.insert(QLatin1String("isActiveConfig"), T_CONFIG); - functions.insert(QLatin1String("system"), T_SYSTEM); - functions.insert(QLatin1String("return"), T_RETURN); - functions.insert(QLatin1String("break"), T_BREAK); - functions.insert(QLatin1String("next"), T_NEXT); - functions.insert(QLatin1String("defined"), T_DEFINED); - functions.insert(QLatin1String("contains"), T_CONTAINS); - functions.insert(QLatin1String("infile"), T_INFILE); - functions.insert(QLatin1String("count"), T_COUNT); - functions.insert(QLatin1String("isEmpty"), T_ISEMPTY); - functions.insert(QLatin1String("load"), T_LOAD); //v - functions.insert(QLatin1String("include"), T_INCLUDE); //v - functions.insert(QLatin1String("debug"), T_DEBUG); - functions.insert(QLatin1String("message"), T_MESSAGE); //v - functions.insert(QLatin1String("warning"), T_MESSAGE); //v - functions.insert(QLatin1String("error"), T_MESSAGE); //v - functions.insert(QLatin1String("for"), T_FOR); //v - functions.insert(QLatin1String("defineTest"), T_DEFINE_TEST); //v - functions.insert(QLatin1String("defineReplace"), T_DEFINE_REPLACE); //v - } +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateConditionalFunction( + const ProString &function, const ushort *&tokPtr) +{ + QHash<ProString, FunctionDef>::ConstIterator it = + m_functionDefs.testFunctions.constFind(function); + if (it != m_functionDefs.testFunctions.constEnd()) + return evaluateBoolFunction(*it, prepareFunctionArgs(tokPtr), function); + + //why don't the builtin functions just use args_list? --Sam + return evaluateConditionalFunction(function, expandVariableReferences(tokPtr, 5, true)); +} - TestFunc func_t = (TestFunc)functions.value(function); +ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateConditionalFunction( + const ProString &function, const ProStringList &args) +{ + TestFunc func_t = (TestFunc)statics.functions.value(function); switch (func_t) { - case T_DEFINE_TEST: - m_definingTest = true; - goto defineFunc; - case T_DEFINE_REPLACE: - m_definingTest = false; - defineFunc: - if (args.count() != 1) { - q->logMessage(format("%s(function) requires one argument.").arg(function)); - return ProItem::ReturnFalse; - } - m_definingFunc = args.first(); - return ProItem::ReturnTrue; case T_DEFINED: if (args.count() < 1 || args.count() > 2) { - q->logMessage(format("defined(function, [\"test\"|\"replace\"])" - " requires one or two arguments.")); - return ProItem::ReturnFalse; + evalError(fL1S("defined(function, [\"test\"|\"replace\"])" + " requires one or two arguments.")); + return ReturnFalse; } if (args.count() > 1) { if (args[1] == QLatin1String("test")) - return returnBool(m_testFunctions.contains(args[0])); + return returnBool(m_functionDefs.testFunctions.contains(args[0])); else if (args[1] == QLatin1String("replace")) - return returnBool(m_replaceFunctions.contains(args[0])); - q->logMessage(format("defined(function, type):" - " unexpected type [%1].\n").arg(args[1])); - return ProItem::ReturnFalse; + return returnBool(m_functionDefs.replaceFunctions.contains(args[0])); + evalError(fL1S("defined(function, type): unexpected type [%1].\n") + .arg(args.at(1).toQString(m_tmp1))); + return ReturnFalse; } - return returnBool(m_replaceFunctions.contains(args[0]) - || m_testFunctions.contains(args[0])); + return returnBool(m_functionDefs.replaceFunctions.contains(args[0]) + || m_functionDefs.testFunctions.contains(args[0])); case T_RETURN: m_returnValue = args; // It is "safe" to ignore returns - due to qmake brokeness // they cannot be used to terminate loops anyway. if (m_skipLevel || m_cumulative) - return ProItem::ReturnTrue; + return ReturnTrue; if (m_valuemapStack.isEmpty()) { - q->logMessage(format("unexpected return().")); - return ProItem::ReturnFalse; + evalError(fL1S("unexpected return().")); + return ReturnFalse; } - return ProItem::ReturnReturn; - case T_EXPORT: + return ReturnReturn; + case T_EXPORT: { if (m_skipLevel && !m_cumulative) - return ProItem::ReturnTrue; + return ReturnTrue; if (args.count() != 1) { - q->logMessage(format("export(variable) requires one argument.")); - return ProItem::ReturnFalse; + evalError(fL1S("export(variable) requires one argument.")); + return ReturnFalse; + } + const ProString &var = map(args.at(0)); + for (int i = m_valuemapStack.size(); --i > 0; ) { + QHash<ProString, ProStringList>::Iterator it = m_valuemapStack[i].find(var); + if (it != m_valuemapStack.at(i).end()) { + if (it->constBegin() == statics.fakeValue.constBegin()) { + // This is stupid, but qmake doesn't propagate deletions + m_valuemapStack[0][var] = ProStringList(); + } else { + m_valuemapStack[0][var] = *it; + } + m_valuemapStack[i].erase(it); + while (--i) + m_valuemapStack[i].remove(var); + break; + } } - for (int i = 0; i < m_valuemapStack.size(); ++i) { - m_valuemapStack[i][args[0]] = m_valuemap[args[0]]; - m_filevaluemapStack[i][currentProFile()][args[0]] = - m_filevaluemap[currentProFile()][args[0]]; + return ReturnTrue; + } + case T_INFILE: + if (args.count() < 2 || args.count() > 3) { + evalError(fL1S("infile(file, var, [values]) requires two or three arguments.")); + } else { + QHash<ProString, ProStringList> vars; + QString fn = resolvePath(expandEnvVars(args.at(0).toQString(m_tmp1))); + fn.detach(); + if (!evaluateFileInto(fn, ProFileEvaluatorHandler::EvalAuxFile, + &vars, &m_functionDefs, EvalWithDefaults)) + return ReturnFalse; + if (args.count() == 2) + return returnBool(vars.contains(args.at(1))); + QRegExp regx; + const QString &qry = args.at(2).toQString(m_tmp1); + if (qry != QRegExp::escape(qry)) { + QString copy = qry; + copy.detach(); + regx.setPattern(copy); + } + int t = 0; + foreach (const ProString &s, vars.value(map(args.at(1)))) { + if ((!regx.isEmpty() && regx.exactMatch(s.toQString(m_tmp[t]))) || s == qry) + return ReturnTrue; + t ^= 1; + } } - return ProItem::ReturnTrue; + return ReturnFalse; #if 0 - case T_INFILE: case T_REQUIRES: - case T_EVAL: #endif - case T_FOR: { - if (m_cumulative) // This is a no-win situation, so just pretend it's no loop - return ProItem::ReturnTrue; - if (m_skipLevel) - return ProItem::ReturnFalse; - if (args.count() > 2 || args.count() < 1) { - q->logMessage(format("for({var, list|var, forever|ever})" - " requires one or two arguments.")); - return ProItem::ReturnFalse; - } - ProLoop loop; - loop.infinite = false; - loop.index = 0; - QString it_list; - if (args.count() == 1) { - doVariableReplace(&args[0]); - it_list = args[0]; - if (args[0] != QLatin1String("ever")) { - q->logMessage(format("for({var, list|var, forever|ever})" - " requires one or two arguments.")); - return ProItem::ReturnFalse; - } - it_list = QLatin1String("forever"); - } else { - loop.variable = args[0]; - loop.oldVarVal = m_valuemap.value(loop.variable); - doVariableReplace(&args[1]); - it_list = args[1]; - } - loop.list = m_valuemap[it_list]; - if (loop.list.isEmpty()) { - if (it_list == QLatin1String("forever")) { - loop.infinite = true; - } else { - int dotdot = it_list.indexOf(QLatin1String("..")); - if (dotdot != -1) { - bool ok; - int start = it_list.left(dotdot).toInt(&ok); - if (ok) { - int end = it_list.mid(dotdot+2).toInt(&ok); - if (ok) { - if (start < end) { - for (int i = start; i <= end; i++) - loop.list << QString::number(i); - } else { - for (int i = start; i >= end; i--) - loop.list << QString::number(i); - } - } - } - } - } + case T_EVAL: { + ProFile *pro = m_parser->parsedProBlock(fL1S("(eval)"), + args.join(statics.field_sep)); + if (!pro) + return ReturnFalse; + m_locationStack.push(m_current); + VisitReturn ret = visitProBlock(pro, pro->tokPtr()); + m_current = m_locationStack.pop(); + pro->deref(); + return ret; } - m_loopStack.push(loop); - m_sts.condition = true; - return ProItem::ReturnLoop; - } case T_BREAK: if (m_skipLevel) - return ProItem::ReturnFalse; - if (!m_loopStack.isEmpty()) - return ProItem::ReturnBreak; - // ### missing: breaking out of multiline blocks - q->logMessage(format("unexpected break().")); - return ProItem::ReturnFalse; + return ReturnFalse; + if (m_loopLevel) + return ReturnBreak; + evalError(fL1S("unexpected break().")); + return ReturnFalse; case T_NEXT: if (m_skipLevel) - return ProItem::ReturnFalse; - if (!m_loopStack.isEmpty()) - return ProItem::ReturnNext; - q->logMessage(format("unexpected next().")); - return ProItem::ReturnFalse; + return ReturnFalse; + if (m_loopLevel) + return ReturnNext; + evalError(fL1S("unexpected next().")); + return ReturnFalse; case T_IF: { + if (m_skipLevel && !m_cumulative) + return ReturnFalse; if (args.count() != 1) { - q->logMessage(format("if(condition) requires one argument.")); - return ProItem::ReturnFalse; + evalError(fL1S("if(condition) requires one argument.")); + return ReturnFalse; } - QString cond = args.first(); - bool escaped = false; // This is more than qmake does + const ProString &cond = args.at(0); bool quoted = false; bool ret = true; bool orOp = false; @@ -1949,83 +2708,69 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( int parens = 0; QString test; test.reserve(20); - QString args; - args.reserve(50); - const QChar *d = cond.unicode(); - const QChar *ed = d + cond.length(); + QString argsString; + argsString.reserve(50); + const QChar *d = cond.constData(); + const QChar *ed = d + cond.size(); while (d < ed) { ushort c = (d++)->unicode(); - if (!escaped) { - if (c == '\\') { - escaped = true; - args += c; // Assume no-one quotes the test name - continue; - } else if (c == '"') { - quoted = !quoted; - args += c; // Ditto - continue; - } - } else { - escaped = false; - } + bool isOp = false; if (quoted) { - args += c; // Ditto + if (c == '"') + quoted = false; + else if (c == '!' && test.isEmpty()) + invert = true; + else + test += c; + } else if (c == '(') { + isFunc = true; + if (parens) + argsString += c; + ++parens; + } else if (c == ')') { + --parens; + if (parens) + argsString += c; + } else if (!parens) { + if (c == '"') + quoted = true; + else if (c == ':' || c == '|') + isOp = true; + else if (c == '!' && test.isEmpty()) + invert = true; + else + test += c; } else { - bool isOp = false; - if (c == '(') { - isFunc = true; - if (parens) - args += c; - ++parens; - } else if (c == ')') { - --parens; - if (parens) - args += c; - } else if (!parens) { - if (c == ':' || c == '|') - isOp = true; - else if (c == '!') - invert = true; - else - test += c; - } else { - args += c; - } - if (!parens && (isOp || d == ed)) { - // Yes, qmake doesn't shortcut evaluations here. We can't, either, - // as some test functions have side effects. - bool success; - if (isFunc) { - success = evaluateConditionalFunction(test, args); - } else { - success = isActiveConfig(test, true); - } - success ^= invert; - if (orOp) - ret |= success; + argsString += c; + } + if (!quoted && !parens && (isOp || d == ed)) { + if (m_cumulative || (orOp != ret)) { + test = test.trimmed(); + if (isFunc) + ret = evaluateConditionalFunction(ProString(test), ProString(argsString, NoHash)); else - ret &= success; - orOp = (c == '|'); - invert = false; - isFunc = false; - test.clear(); - args.clear(); + ret = isActiveConfig(test, true); + ret ^= invert; } + orOp = (c == '|'); + invert = false; + isFunc = false; + test.clear(); + argsString.clear(); } } return returnBool(ret); } case T_CONFIG: { if (args.count() < 1 || args.count() > 2) { - q->logMessage(format("CONFIG(config) requires one or two arguments.")); - return ProItem::ReturnFalse; - } - if (args.count() == 1) { - //cond = isActiveConfig(args.first()); XXX - return ProItem::ReturnFalse; + evalError(fL1S("CONFIG(config) requires one or two arguments.")); + return ReturnFalse; } - const QStringList mutuals = args[1].split(QLatin1Char('|')); - const QStringList &configs = valuesDirect(QLatin1String("CONFIG")); + if (args.count() == 1) + return returnBool(isActiveConfig(args.at(0).toQString(m_tmp2))); + const QStringList &mutuals = args.at(1).toQString(m_tmp2).split(QLatin1Char('|')); + const ProStringList &configs = valuesDirect(statics.strCONFIG); + for (int i = configs.size() - 1; i >= 0; i--) { for (int mut = 0; mut < mutuals.count(); mut++) { if (configs[i] == mutuals[mut].trimmed()) { @@ -2033,68 +2778,81 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( } } } - return ProItem::ReturnFalse; + return ReturnFalse; } case T_CONTAINS: { if (args.count() < 2 || args.count() > 3) { - q->logMessage(format("contains(var, val) requires two or three arguments.")); - return ProItem::ReturnFalse; + evalError(fL1S("contains(var, val) requires two or three arguments.")); + return ReturnFalse; } - QRegExp regx(args[1]); - const QStringList &l = values(args.first()); + const QString &qry = args.at(1).toQString(m_tmp1); + QRegExp regx; + if (qry != QRegExp::escape(qry)) { + QString copy = qry; + copy.detach(); + regx.setPattern(copy); + } + const ProStringList &l = values(map(args.at(0))); if (args.count() == 2) { + int t = 0; for (int i = 0; i < l.size(); ++i) { - const QString val = l[i]; - if (regx.exactMatch(val) || val == args[1]) { - return ProItem::ReturnTrue; - } + const ProString &val = l[i]; + if ((!regx.isEmpty() && regx.exactMatch(val.toQString(m_tmp[t]))) || val == qry) + return ReturnTrue; + t ^= 1; } } else { - const QStringList mutuals = args[2].split(QLatin1Char('|')); + const QStringList &mutuals = args.at(2).toQString(m_tmp3).split(QLatin1Char('|')); for (int i = l.size() - 1; i >= 0; i--) { - const QString val = l[i]; + const ProString val = l[i]; for (int mut = 0; mut < mutuals.count(); mut++) { if (val == mutuals[mut].trimmed()) { - return returnBool(regx.exactMatch(val) || val == args[1]); + return returnBool((!regx.isEmpty() + && regx.exactMatch(val.toQString(m_tmp2))) + || val == qry); } } } } - return ProItem::ReturnFalse; + return ReturnFalse; } case T_COUNT: { if (args.count() != 2 && args.count() != 3) { - q->logMessage(format("count(var, count, op=\"equals\") requires two or three arguments.")); - return ProItem::ReturnFalse; + evalError(fL1S("count(var, count, op=\"equals\") requires two or three arguments.")); + return ReturnFalse; } + int cnt = values(map(args.at(0))).count(); if (args.count() == 3) { - QString comp = args[2]; + const ProString &comp = args.at(2); + const int val = args.at(1).toQString(m_tmp1).toInt(); if (comp == QLatin1String(">") || comp == QLatin1String("greaterThan")) { - return returnBool(values(args.first()).count() > args[1].toInt()); + return returnBool(cnt > val); } else if (comp == QLatin1String(">=")) { - return returnBool(values(args.first()).count() >= args[1].toInt()); + return returnBool(cnt >= val); } else if (comp == QLatin1String("<") || comp == QLatin1String("lessThan")) { - return returnBool(values(args.first()).count() < args[1].toInt()); + return returnBool(cnt < val); } else if (comp == QLatin1String("<=")) { - return returnBool(values(args.first()).count() <= args[1].toInt()); + return returnBool(cnt <= val); } else if (comp == QLatin1String("equals") || comp == QLatin1String("isEqual") || comp == QLatin1String("=") || comp == QLatin1String("==")) { - return returnBool(values(args.first()).count() == args[1].toInt()); + return returnBool(cnt == val); } else { - q->logMessage(format("unexpected modifier to count(%2)").arg(comp)); - return ProItem::ReturnFalse; + evalError(fL1S("unexpected modifier to count(%2)").arg(comp.toQString(m_tmp1))); + return ReturnFalse; } } - return returnBool(values(args.first()).count() == args[1].toInt()); + return returnBool(cnt == args.at(1).toQString(m_tmp1).toInt()); } case T_GREATERTHAN: case T_LESSTHAN: { if (args.count() != 2) { - q->logMessage(format("%1(variable, value) requires two arguments.").arg(function)); - return ProItem::ReturnFalse; + evalError(fL1S("%1(variable, value) requires two arguments.") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; } - QString rhs(args[1]), lhs(values(args[0]).join(QString(Option::field_sep))); + const QString &rhs(args.at(1).toQString(m_tmp1)), + &lhs(values(map(args.at(0))).join(statics.field_sep)); bool ok; int rhs_int = rhs.toInt(&ok); if (ok) { // do integer compare @@ -2111,206 +2869,300 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( } case T_EQUALS: if (args.count() != 2) { - q->logMessage(format("%1(variable, value) requires two arguments.").arg(function)); - return ProItem::ReturnFalse; + evalError(fL1S("%1(variable, value) requires two arguments.") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; } - return returnBool(values(args[0]).join(QString(Option::field_sep)) == args[1]); + return returnBool(values(map(args.at(0))).join(statics.field_sep) + == args.at(1).toQString(m_tmp1)); case T_CLEAR: { if (m_skipLevel && !m_cumulative) - return ProItem::ReturnFalse; + return ReturnFalse; if (args.count() != 1) { - q->logMessage(format("%1(variable) requires one argument.").arg(function)); - return ProItem::ReturnFalse; - } - QHash<QString, QStringList>::Iterator it = m_valuemap.find(args[0]); - if (it == m_valuemap.end()) - return ProItem::ReturnFalse; - it->clear(); - return ProItem::ReturnTrue; + evalError(fL1S("%1(variable) requires one argument.") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; + } + QHash<ProString, ProStringList> *hsh; + QHash<ProString, ProStringList>::Iterator it; + const ProString &var = map(args.at(0)); + if (!(hsh = findValues(var, &it))) + return ReturnFalse; + if (hsh == &m_valuemapStack.top()) + it->clear(); + else + m_valuemapStack.top()[var].clear(); + return ReturnTrue; } case T_UNSET: { if (m_skipLevel && !m_cumulative) - return ProItem::ReturnFalse; + return ReturnFalse; if (args.count() != 1) { - q->logMessage(format("%1(variable) requires one argument.").arg(function)); - return ProItem::ReturnFalse; - } - QHash<QString, QStringList>::Iterator it = m_valuemap.find(args[0]); - if (it == m_valuemap.end()) - return ProItem::ReturnFalse; - m_valuemap.erase(it); - return ProItem::ReturnTrue; + evalError(fL1S("%1(variable) requires one argument.") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; + } + QHash<ProString, ProStringList> *hsh; + QHash<ProString, ProStringList>::Iterator it; + const ProString &var = map(args.at(0)); + if (!(hsh = findValues(var, &it))) + return ReturnFalse; + if (m_valuemapStack.size() == 1) + hsh->erase(it); + else if (hsh == &m_valuemapStack.top()) + *it = statics.fakeValue; + else + m_valuemapStack.top()[var] = statics.fakeValue; + return ReturnTrue; } case T_INCLUDE: { if (m_skipLevel && !m_cumulative) - return ProItem::ReturnFalse; + return ReturnFalse; QString parseInto; // the third optional argument to include() controls warnings // and is not used here - if ((args.count() == 2) || (args.count() == 3)) { - parseInto = args[1]; + if ((args.count() == 2) || (args.count() == 3) ) { + parseInto = args.at(1).toQString(m_tmp2); } else if (args.count() != 1) { - q->logMessage(format("include(file) requires one, two or three arguments.")); - return ProItem::ReturnFalse; - } - QString fileName = args.first(); - // ### this breaks if we have include(c:/reallystupid.pri) but IMHO that's really bad style. - QDir currentProPath(currentDirectory()); - fileName = QDir::cleanPath(currentProPath.absoluteFilePath(fileName)); - State sts = m_sts; - bool ok = evaluateFile(fileName); - m_sts = sts; + evalError(fL1S("include(file, into, silent) requires one, two or three arguments.")); + return ReturnFalse; + } + QString fn = resolvePath(expandEnvVars(args.at(0).toQString(m_tmp1))); + fn.detach(); + bool ok; + if (parseInto.isEmpty()) { + ok = evaluateFile(fn, ProFileEvaluatorHandler::EvalIncludeFile, + ProFileEvaluator::LoadProOnly); + } else { + QHash<ProString, ProStringList> symbols; + if ((ok = evaluateFileInto(fn, ProFileEvaluatorHandler::EvalAuxFile, + &symbols, 0, EvalWithSetup))) { + QHash<ProString, ProStringList> newMap; + for (QHash<ProString, ProStringList>::ConstIterator + it = m_valuemapStack.top().constBegin(), + end = m_valuemapStack.top().constEnd(); + it != end; ++it) { + const QString &ky = it.key().toQString(m_tmp1); + if (!(ky.startsWith(parseInto) && + (ky.length() == parseInto.length() + || ky.at(parseInto.length()) == QLatin1Char('.')))) + newMap[it.key()] = it.value(); + } + for (QHash<ProString, ProStringList>::ConstIterator it = symbols.constBegin(); + it != symbols.constEnd(); ++it) { + const QString &ky = it.key().toQString(m_tmp1); + if (!ky.startsWith(QLatin1Char('.'))) + newMap.insert(ProString(parseInto + QLatin1Char('.') + ky), it.value()); + } + m_valuemapStack.top() = newMap; + } + } return returnBool(ok); } case T_LOAD: { if (m_skipLevel && !m_cumulative) - return ProItem::ReturnFalse; - QString parseInto; + return ReturnFalse; bool ignore_error = false; if (args.count() == 2) { - QString sarg = args[1]; - ignore_error = (!sarg.compare(QLatin1String("true"), Qt::CaseInsensitive) || sarg.toInt()); + ignore_error = isTrue(args.at(1), m_tmp2); } else if (args.count() != 1) { - q->logMessage(format("load(feature) requires one or two arguments.")); - return ProItem::ReturnFalse; + evalError(fL1S("load(feature) requires one or two arguments.")); + return ReturnFalse; } // XXX ignore_error unused - return returnBool(evaluateFeatureFile(args.first())); + return returnBool(evaluateFeatureFile(expandEnvVars(args.at(0).toQString()))); } case T_DEBUG: // Yup - do nothing. Nothing is going to enable debug output anyway. - return ProItem::ReturnFalse; + return ReturnFalse; case T_MESSAGE: { if (args.count() != 1) { - q->logMessage(format("%1(message) requires one argument.").arg(function)); - return ProItem::ReturnFalse; - } - QString msg = fixEnvVariables(args.first()); - q->fileMessage(QString::fromLatin1("Project %1: %2").arg(function.toUpper(), msg)); + evalError(fL1S("%1(message) requires one argument.") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; + } + const QString &msg = expandEnvVars(args.at(0).toQString(m_tmp2)); + if (!m_skipLevel) + m_handler->fileMessage(fL1S("Project %1: %2") + .arg(function.toQString(m_tmp1).toUpper(), msg)); // ### Consider real termination in non-cumulative mode return returnBool(function != QLatin1String("error")); } #if 0 // Way too dangerous to enable. case T_SYSTEM: { if (args.count() != 1) { - q->logMessage(format("system(exec) requires one argument.")); - ProItem::ReturnFalse; - } - return returnBool(system(args.first().toLatin1().constData()) == 0); + evalError(fL1S("system(exec) requires one argument.")); + return ReturnFalse; + } +#ifndef QT_BOOTSTRAPPED + QProcess proc; + proc.setProcessChannelMode(QProcess::MergedChannels); + runProcess(&proc, args.at(0).toQString(m_tmp2), QProcess::StandardOutput); + return returnBool(proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0); +#else + return returnBool(system((QLatin1String("cd ") + + IoUtils::shellQuote(currentDirectory()) + + QLatin1String(" && ") + args.at(0)).toLocal8Bit().constData()) == 0); +#endif } #endif case T_ISEMPTY: { if (args.count() != 1) { - q->logMessage(format("isEmpty(var) requires one argument.")); - return ProItem::ReturnFalse; + evalError(fL1S("isEmpty(var) requires one argument.")); + return ReturnFalse; } - QStringList sl = values(args.first()); + const ProStringList &sl = values(map(args.at(0))); if (sl.count() == 0) { - return ProItem::ReturnTrue; + return ReturnTrue; } else if (sl.count() > 0) { - QString var = sl.first(); + const ProString &var = sl.first(); if (var.isEmpty()) - return ProItem::ReturnTrue; + return ReturnTrue; } - return ProItem::ReturnFalse; + return ReturnFalse; } case T_EXISTS: { if (args.count() != 1) { - q->logMessage(format("exists(file) requires one argument.")); - return ProItem::ReturnFalse; + evalError(fL1S("exists(file) requires one argument.")); + return ReturnFalse; } - QString file = args.first(); - file = Option::fixPathToLocalOS(file); + const QString &file = resolvePath(expandEnvVars(args.at(0).toQString(m_tmp1))); - if (QFile::exists(file)) { - return ProItem::ReturnTrue; + if (IoUtils::exists(file)) { + return ReturnTrue; } - //regular expression I guess - QString dirstr = currentDirectory(); - int slsh = file.lastIndexOf(Option::dir_sep); - if (slsh != -1) { - dirstr = file.left(slsh+1); - file = file.right(file.length() - slsh - 1); + int slsh = file.lastIndexOf(QLatin1Char('/')); + QString fn = file.mid(slsh+1); + if (fn.contains(QLatin1Char('*')) || fn.contains(QLatin1Char('?'))) { + QString dirstr = file.left(slsh+1); + if (!QDir(dirstr).entryList(QStringList(fn)).isEmpty()) + return ReturnTrue; } - if (file.contains(QLatin1Char('*')) || file.contains(QLatin1Char('?'))) - if (!QDir(dirstr).entryList(QStringList(file)).isEmpty()) - return ProItem::ReturnTrue; - return ProItem::ReturnFalse; + return ReturnFalse; } - case 0: - q->logMessage(format("'%1' is not a recognized test function").arg(function)); - return ProItem::ReturnFalse; + case T_INVALID: + evalError(fL1S("'%1' is not a recognized test function") + .arg(function.toQString(m_tmp1))); + return ReturnFalse; default: - q->logMessage(format("Function '%1' is not implemented").arg(function)); - return ProItem::ReturnFalse; + evalError(fL1S("Function '%1' is not implemented").arg(function.toQString(m_tmp1))); + return ReturnFalse; + } +} + +QHash<ProString, ProStringList> *ProFileEvaluator::Private::findValues( + const ProString &variableName, QHash<ProString, ProStringList>::Iterator *rit) +{ + for (int i = m_valuemapStack.size(); --i >= 0; ) { + QHash<ProString, ProStringList>::Iterator it = m_valuemapStack[i].find(variableName); + if (it != m_valuemapStack[i].end()) { + if (it->constBegin() == statics.fakeValue.constBegin()) + return 0; + *rit = it; + return &m_valuemapStack[i]; + } + } + return 0; +} + +ProStringList &ProFileEvaluator::Private::valuesRef(const ProString &variableName) +{ + QHash<ProString, ProStringList>::Iterator it = m_valuemapStack.top().find(variableName); + if (it != m_valuemapStack.top().end()) + return *it; + for (int i = m_valuemapStack.size() - 1; --i >= 0; ) { + QHash<ProString, ProStringList>::ConstIterator it = m_valuemapStack.at(i).constFind(variableName); + if (it != m_valuemapStack.at(i).constEnd()) { + ProStringList &ret = m_valuemapStack.top()[variableName]; + ret = *it; + return ret; + } + } + return m_valuemapStack.top()[variableName]; +} + +ProStringList ProFileEvaluator::Private::valuesDirect(const ProString &variableName) const +{ + for (int i = m_valuemapStack.size(); --i >= 0; ) { + QHash<ProString, ProStringList>::ConstIterator it = m_valuemapStack.at(i).constFind(variableName); + if (it != m_valuemapStack.at(i).constEnd()) { + if (it->constBegin() == statics.fakeValue.constBegin()) + break; + return *it; + } } + return ProStringList(); } -QStringList ProFileEvaluator::Private::values(const QString &variableName, - const QHash<QString, QStringList> &place, - const ProFile *pro) const -{ - if (variableName == QLatin1String("LITERAL_WHITESPACE")) //a real space in a token - return QStringList(QLatin1String("\t")); - if (variableName == QLatin1String("LITERAL_DOLLAR")) //a real $ - return QStringList(QLatin1String("$")); - if (variableName == QLatin1String("LITERAL_HASH")) //a real # - return QStringList(QLatin1String("#")); - if (variableName == QLatin1String("OUT_PWD")) //the out going dir - return QStringList(m_outputDir); - if (variableName == QLatin1String("PWD") || //current working dir (of _FILE_) - variableName == QLatin1String("IN_PWD")) - return QStringList(currentDirectory()); - if (variableName == QLatin1String("DIR_SEPARATOR")) - return QStringList(Option::dir_sep); - if (variableName == QLatin1String("DIRLIST_SEPARATOR")) - return QStringList(Option::dirlist_sep); - if (variableName == QLatin1String("_LINE_")) //parser line number - return QStringList(QString::number(m_lineNo)); - if (variableName == QLatin1String("_FILE_")) //parser file; qmake is a bit weird here - return QStringList(m_profileStack.size() == 1 ? pro->fileName() : QFileInfo(pro->fileName()).fileName()); - if (variableName == QLatin1String("_DATE_")) //current date/time - return QStringList(QDateTime::currentDateTime().toString()); - if (variableName == QLatin1String("_PRO_FILE_")) - return QStringList(m_origfile); - if (variableName == QLatin1String("_PRO_FILE_PWD_")) - return QStringList(QFileInfo(m_origfile).absolutePath()); - if (variableName == QLatin1String("_QMAKE_CACHE_")) - return QStringList(); // FIXME? - if (variableName.startsWith(QLatin1String("QMAKE_HOST."))) { - QString ret, type = variableName.mid(11); +ProStringList ProFileEvaluator::Private::values(const ProString &variableName) const +{ + QHash<ProString, int>::ConstIterator vli = statics.varList.find(variableName); + if (vli != statics.varList.constEnd()) { + int vlidx = *vli; + QString ret; + switch ((VarName)vlidx) { + case V_LITERAL_WHITESPACE: ret = QLatin1String("\t"); break; + case V_LITERAL_DOLLAR: ret = QLatin1String("$"); break; + case V_LITERAL_HASH: ret = QLatin1String("#"); break; + case V_OUT_PWD: // the outgoing dir (shadow of _PRO_FILE_PWD_) + ret = m_outputDir; + break; + case V_PWD: // containing directory of most nested project/include file + case V_IN_PWD: + ret = currentDirectory(); + break; + case V_DIR_SEPARATOR: + validateModes(); + ret = m_option->dir_sep; + break; + case V_DIRLIST_SEPARATOR: + ret = m_option->dirlist_sep; + break; + case V__LINE_: // currently executed line number + ret = QString::number(m_current.line); + break; + case V__FILE_: // currently executed file + ret = m_current.pro->fileName(); + break; + case V__DATE_: //current date/time + ret = QDateTime::currentDateTime().toString(); + break; + case V__PRO_FILE_: + ret = m_profileStack.first()->fileName(); + break; + case V__PRO_FILE_PWD_: + ret = m_profileStack.first()->directoryName(); + break; + case V__QMAKE_CACHE_: + ret = m_option->cachefile; + break; #if defined(Q_OS_WIN32) - if (type == QLatin1String("os")) { - ret = QLatin1String("Windows"); - } else if (type == QLatin1String("name")) { + case V_QMAKE_HOST_os: ret = QLatin1String("Windows"); break; + case V_QMAKE_HOST_name: { DWORD name_length = 1024; - wchar_t name[1024]; + TCHAR name[1024]; if (GetComputerName(name, &name_length)) - ret = QString::fromWCharArray(name); - } else if (type == QLatin1String("version") || type == QLatin1String("version_string")) { - QSysInfo::WinVersion ver = QSysInfo::WindowsVersion; - if (type == QLatin1String("version")) - ret = QString::number(ver); - else if (ver == QSysInfo::WV_Me) - ret = QLatin1String("WinMe"); - else if (ver == QSysInfo::WV_95) - ret = QLatin1String("Win95"); - else if (ver == QSysInfo::WV_98) - ret = QLatin1String("Win98"); - else if (ver == QSysInfo::WV_NT) - ret = QLatin1String("WinNT"); - else if (ver == QSysInfo::WV_2000) - ret = QLatin1String("Win2000"); - else if (ver == QSysInfo::WV_2000) - ret = QLatin1String("Win2003"); - else if (ver == QSysInfo::WV_XP) - ret = QLatin1String("WinXP"); - else if (ver == QSysInfo::WV_VISTA) - ret = QLatin1String("WinVista"); - else - ret = QLatin1String("Unknown"); - } else if (type == QLatin1String("arch")) { + ret = QString::fromUtf16((ushort*)name, name_length); + break; + } + case V_QMAKE_HOST_version: + ret = QString::number(QSysInfo::WindowsVersion); + break; + case V_QMAKE_HOST_version_string: + switch (QSysInfo::WindowsVersion) { + case QSysInfo::WV_Me: ret = QLatin1String("WinMe"); break; + case QSysInfo::WV_95: ret = QLatin1String("Win95"); break; + case QSysInfo::WV_98: ret = QLatin1String("Win98"); break; + case QSysInfo::WV_NT: ret = QLatin1String("WinNT"); break; + case QSysInfo::WV_2000: ret = QLatin1String("Win2000"); break; + case QSysInfo::WV_2003: ret = QLatin1String("Win2003"); break; + case QSysInfo::WV_XP: ret = QLatin1String("WinXP"); break; + case QSysInfo::WV_VISTA: ret = QLatin1String("WinVista"); break; + default: ret = QLatin1String("Unknown"); break; + } + break; + case V_QMAKE_HOST_arch: SYSTEM_INFO info; GetSystemInfo(&info); switch(info.wProcessorArchitecture) { @@ -2332,115 +3184,154 @@ QStringList ProFileEvaluator::Private::values(const QString &variableName, ret = QLatin1String("Unknown"); break; } - } + break; #elif defined(Q_OS_UNIX) - struct utsname name; - if (!uname(&name)) { - if (type == QLatin1String("os")) - ret = QString::fromLatin1(name.sysname); - else if (type == QLatin1String("name")) - ret = QString::fromLatin1(name.nodename); - else if (type == QLatin1String("version")) - ret = QString::fromLatin1(name.release); - else if (type == QLatin1String("version_string")) - ret = QString::fromLatin1(name.version); - else if (type == QLatin1String("arch")) - ret = QString::fromLatin1(name.machine); - } + case V_QMAKE_HOST_os: + case V_QMAKE_HOST_name: + case V_QMAKE_HOST_version: + case V_QMAKE_HOST_version_string: + case V_QMAKE_HOST_arch: + { + struct utsname name; + const char *what; + if (!uname(&name)) { + switch (vlidx) { + case V_QMAKE_HOST_os: what = name.sysname; break; + case V_QMAKE_HOST_name: what = name.nodename; break; + case V_QMAKE_HOST_version: what = name.release; break; + case V_QMAKE_HOST_version_string: what = name.version; break; + case V_QMAKE_HOST_arch: what = name.machine; break; + } + ret = QString::fromLocal8Bit(what); + } + } #endif - return QStringList(ret); + } + return ProStringList(ProString(ret, NoHash)); } - QStringList result = place[variableName]; + ProStringList result = valuesDirect(variableName); if (result.isEmpty()) { - if (variableName == QLatin1String("TARGET")) { - result.append(QFileInfo(m_origfile).baseName()); - } else if (variableName == QLatin1String("TEMPLATE")) { - result.append(QLatin1String("app")); - } else if (variableName == QLatin1String("QMAKE_DIR_SEP")) { - result.append(Option::dirlist_sep); + if (variableName == statics.strTEMPLATE) { + result.append(ProString("app", NoHash)); + } else if (variableName == statics.strQMAKE_DIR_SEP) { + result.append(ProString(m_option->dirlist_sep, NoHash)); } } return result; } -QStringList ProFileEvaluator::Private::values(const QString &variableName) const +bool ProFileEvaluator::Private::evaluateFileDirect( + const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) { - return values(variableName, m_valuemap, currentProFile()); -} - -QStringList ProFileEvaluator::Private::values(const QString &variableName, const ProFile *pro) const -{ - return values(variableName, m_filevaluemap[pro], pro); -} - -ProFile *ProFileEvaluator::parsedProFile(const QString &fileName) -{ - QFileInfo fi(fileName); - if (fi.exists()) { - QString fn = QDir::cleanPath(fi.absoluteFilePath()); - foreach (const ProFile *pf, d->m_profileStack) - if (pf->fileName() == fn) { - errorMessage(d->format("circular inclusion of %1").arg(fn)); - return 0; - } - ProFile *pro = new ProFile(fn); - if (d->read(pro)) - return pro; - delete pro; + if (ProFile *pro = m_parser->parsedProFile(fileName, true)) { + m_locationStack.push(m_current); + bool ok = (visitProFile(pro, type, flags) == ReturnTrue); + m_current = m_locationStack.pop(); + pro->deref(); + return ok; + } else { + return false; } - return 0; } -void ProFileEvaluator::releaseParsedProFile(ProFile *proFile) +bool ProFileEvaluator::Private::evaluateFile( + const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + ProFileEvaluator::LoadFlags flags) { - delete proFile; -} - -bool ProFileEvaluator::Private::evaluateFile(const QString &fileName) -{ - ProFile *pro = q->parsedProFile(fileName); - if (pro) { - m_profileStack.push(pro); - bool ok = (pro->Accept(this) == ProItem::ReturnTrue); - m_profileStack.pop(); - q->releaseParsedProFile(pro); - return ok; - } else { + if (fileName.isEmpty()) return false; - } + foreach (const ProFile *pf, m_profileStack) + if (pf->fileName() == fileName) { + evalError(fL1S("circular inclusion of %1").arg(fileName)); + return false; + } + return evaluateFileDirect(fileName, type, flags); } bool ProFileEvaluator::Private::evaluateFeatureFile(const QString &fileName) { - QString fn; - foreach (const QString &path, qmakeFeaturePaths()) { - QString fname = path + QLatin1Char('/') + fileName; - if (QFileInfo(fname).exists()) { - fn = fname; - break; + QString fn = fileName; + if (!fn.endsWith(QLatin1String(".prf"))) + fn += QLatin1String(".prf"); + + if ((!fileName.contains((ushort)'/') && !fileName.contains((ushort)'\\')) + || !IoUtils::exists(resolvePath(fn))) { + if (m_option->feature_roots.isEmpty()) + m_option->feature_roots = qmakeFeaturePaths(); + int start_root = 0; + QString currFn = currentFileName(); + if (IoUtils::fileName(currFn) == IoUtils::fileName(fn)) { + for (int root = 0; root < m_option->feature_roots.size(); ++root) + if (currFn == m_option->feature_roots.at(root) + fn) { + start_root = root + 1; + break; + } } - fname += QLatin1String(".prf"); - if (QFileInfo(fname).exists()) { - fn = fname; - break; + for (int root = start_root; root < m_option->feature_roots.size(); ++root) { + QString fname = m_option->feature_roots.at(root) + fn; + if (IoUtils::exists(fname)) { + fn = fname; + goto cool; + } } - } - if (fn.isEmpty()) return false; + + cool: + // It's beyond me why qmake has this inside this if ... + ProStringList &already = valuesRef(ProString("QMAKE_INTERNAL_INCLUDED_FEATURES")); + ProString afn(fn, NoHash); + if (already.contains(afn)) + return true; + already.append(afn); + } else { + fn = resolvePath(fn); + } + +#ifdef PROEVALUATOR_CUMULATIVE bool cumulative = m_cumulative; m_cumulative = false; - bool ok = evaluateFile(fn); +#endif + + // The path is fully normalized already. + bool ok = evaluateFileDirect(fn, ProFileEvaluatorHandler::EvalFeatureFile, + ProFileEvaluator::LoadProOnly); + +#ifdef PROEVALUATOR_CUMULATIVE m_cumulative = cumulative; +#endif return ok; } -QString ProFileEvaluator::Private::format(const char *fmt) const +bool ProFileEvaluator::Private::evaluateFileInto( + const QString &fileName, ProFileEvaluatorHandler::EvalFileType type, + QHash<ProString, ProStringList> *values, FunctionDefs *funcs, EvalIntoMode mode) { - ProFile *pro = currentProFile(); - QString fileName = pro ? pro->fileName() : QLatin1String("Not a file"); - int lineNumber = pro ? m_lineNo : 0; - return QString::fromLatin1("%1(%2):").arg(fileName).arg(lineNumber) + QString::fromAscii(fmt); + ProFileEvaluator visitor(m_option, m_parser, m_handler); +#ifdef PROEVALUATOR_CUMULATIVE + visitor.d->m_cumulative = false; +#endif + visitor.d->m_outputDir = m_outputDir; +// visitor.d->m_valuemapStack.top() = *values; + if (funcs) + visitor.d->m_functionDefs = *funcs; + if (mode == EvalWithDefaults) + visitor.d->evaluateFeatureFile(QLatin1String("default_pre.prf")); + if (!visitor.d->evaluateFile(fileName, type, + (mode == EvalWithSetup) ? ProFileEvaluator::LoadAll : ProFileEvaluator::LoadProOnly)) + return false; + *values = visitor.d->m_valuemapStack.top(); +// if (funcs) +// *funcs = visitor.d->m_functionDefs; + return true; +} + +void ProFileEvaluator::Private::evalError(const QString &message) const +{ + if (!m_skipLevel) + m_handler->evalError(m_current.line ? m_current.pro->fileName() : QString(), + m_current.line, message); } @@ -2450,10 +3341,15 @@ QString ProFileEvaluator::Private::format(const char *fmt) const // /////////////////////////////////////////////////////////////////////// -ProFileEvaluator::ProFileEvaluator() - : d(new Private(this)) +void ProFileEvaluator::initialize() +{ + Private::initStatics(); +} + +ProFileEvaluator::ProFileEvaluator(ProFileOption *option, ProFileParser *parser, + ProFileEvaluatorHandler *handler) + : d(new Private(this, option, parser, handler)) { - Option::init(); } ProFileEvaluator::~ProFileEvaluator() @@ -2463,26 +3359,38 @@ ProFileEvaluator::~ProFileEvaluator() bool ProFileEvaluator::contains(const QString &variableName) const { - return d->m_valuemap.contains(variableName); + return d->m_valuemapStack.top().contains(ProString(variableName)); } -inline QStringList fixEnvVariables(const QStringList &x) +QString ProFileEvaluator::value(const QString &variable) const { - QStringList ret; - foreach (const QString &str, x) - ret << Option::fixString(str, Option::FixEnvVars); - return ret; -} + const QStringList &vals = values(variable); + if (!vals.isEmpty()) + return vals.first(); + return QString(); +} QStringList ProFileEvaluator::values(const QString &variableName) const { - return fixEnvVariables(d->values(variableName)); + const ProStringList &values = d->values(ProString(variableName)); + QStringList ret; + ret.reserve(values.size()); + foreach (const ProString &str, values) + ret << d->expandEnvVars(str.toQString()); + return ret; } QStringList ProFileEvaluator::values(const QString &variableName, const ProFile *pro) const { - return fixEnvVariables(d->values(variableName, pro)); + // It makes no sense to put any kind of magic into expanding these + const ProStringList &values = d->m_valuemapStack.at(0).value(ProString(variableName)); + QStringList ret; + ret.reserve(values.size()); + foreach (const ProString &str, values) + if (str.sourceFile() == pro) + ret << d->expandEnvVars(str.toQString()); + return ret; } QStringList ProFileEvaluator::absolutePathValues( @@ -2490,9 +3398,10 @@ QStringList ProFileEvaluator::absolutePathValues( { QStringList result; foreach (const QString &el, values(variable)) { - const QFileInfo info = QFileInfo(baseDirectory, el); - if (info.isDir()) - result << QDir::cleanPath(info.absoluteFilePath()); + QString absEl = IoUtils::isAbsolutePath(el) + ? d->sysrootify(el, baseDirectory) : IoUtils::resolvePath(baseDirectory, el); + if (IoUtils::fileType(absEl) == IoUtils::FileIsDir) + result << QDir::cleanPath(absEl); } return result; } @@ -2503,34 +3412,40 @@ QStringList ProFileEvaluator::absoluteFileValues( { QStringList result; foreach (const QString &el, pro ? values(variable, pro) : values(variable)) { - QFileInfo info(el); - if (info.isAbsolute()) { - if (info.exists()) { - result << QDir::cleanPath(el); + QString absEl; + if (IoUtils::isAbsolutePath(el)) { + const QString elWithSysroot = d->sysrootify(el, baseDirectory); + if (IoUtils::exists(elWithSysroot)) { + result << QDir::cleanPath(elWithSysroot); goto next; } + absEl = elWithSysroot; } else { foreach (const QString &dir, searchDirs) { - QFileInfo info(dir, el); - if (info.isFile()) { - result << QDir::cleanPath(info.filePath()); + QString fn = dir + QLatin1Char('/') + el; + if (IoUtils::exists(fn)) { + result << QDir::cleanPath(fn); goto next; } } if (baseDirectory.isEmpty()) goto next; - info = QFileInfo(baseDirectory, el); + absEl = baseDirectory + QLatin1Char('/') + el; } { - QFileInfo baseInfo(info.absolutePath()); - if (baseInfo.exists()) { - QString wildcard = info.fileName(); + absEl = QDir::cleanPath(absEl); + int nameOff = absEl.lastIndexOf(QLatin1Char('/')); + QString absDir = d->m_tmp1.setRawData(absEl.constData(), nameOff); + if (IoUtils::exists(absDir)) { + QString wildcard = d->m_tmp2.setRawData(absEl.constData() + nameOff + 1, + absEl.length() - nameOff - 1); if (wildcard.contains(QLatin1Char('*')) || wildcard.contains(QLatin1Char('?'))) { - QDir theDir(QDir::cleanPath(baseInfo.filePath())); + wildcard.detach(); // Keep m_tmp out of QRegExp's cache + QDir theDir(absDir); foreach (const QString &fn, theDir.entryList(QStringList(wildcard))) - if (fn != QLatin1String(".") && fn != QLatin1String("..")) - result << theDir.absoluteFilePath(fn); - } + if (fn != statics.strDot && fn != statics.strDotDot) + result << absDir + QLatin1Char('/') + fn; + } // else if (acceptMissing) } } next: ; @@ -2538,86 +3453,41 @@ QStringList ProFileEvaluator::absoluteFileValues( return result; } -ProFileEvaluator::TemplateType ProFileEvaluator::templateType() +ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const { - QStringList templ = values(QLatin1String("TEMPLATE")); + const ProStringList &templ = d->values(statics.strTEMPLATE); if (templ.count() >= 1) { - const QString &t = templ.last(); + const QString &t = templ.at(0).toQString(); if (!t.compare(QLatin1String("app"), Qt::CaseInsensitive)) return TT_Application; if (!t.compare(QLatin1String("lib"), Qt::CaseInsensitive)) return TT_Library; if (!t.compare(QLatin1String("script"), Qt::CaseInsensitive)) return TT_Script; + if (!t.compare(QLatin1String("aux"), Qt::CaseInsensitive)) + return TT_Aux; if (!t.compare(QLatin1String("subdirs"), Qt::CaseInsensitive)) return TT_Subdirs; } return TT_Unknown; } -bool ProFileEvaluator::queryProFile(ProFile *pro) -{ - return d->read(pro); -} - -bool ProFileEvaluator::accept(ProFile *pro) +bool ProFileEvaluator::accept(ProFile *pro, LoadFlags flags) { - return pro->Accept(d); + return d->visitProFile(pro, ProFileEvaluatorHandler::EvalProjectFile, flags) == Private::ReturnTrue; } QString ProFileEvaluator::propertyValue(const QString &name) const { - return d->propertyValue(name); -} - -namespace { - template<class K, class T> void insert(QHash<K,T> *out, const QHash<K,T> &in) - { - typename QHash<K,T>::const_iterator i = in.begin(); - while (i != in.end()) { - out->insert(i.key(), i.value()); - ++i; - } - } -} // anon namespace - -void ProFileEvaluator::addVariables(const QHash<QString, QStringList> &variables) -{ - insert(&(d->m_valuemap), variables); -} - -void ProFileEvaluator::addProperties(const QHash<QString, QString> &properties) -{ - insert(&(d->m_properties), properties); -} - -void ProFileEvaluator::logMessage(const QString &message) -{ - if (d->m_verbose && !d->m_skipLevel) - fprintf(stderr, "%s\n", qPrintable(message)); -} - -void ProFileEvaluator::fileMessage(const QString &message) -{ - if (!d->m_skipLevel) - fprintf(stderr, "%s\n", qPrintable(message)); -} - -void ProFileEvaluator::errorMessage(const QString &message) -{ - if (!d->m_skipLevel) - fprintf(stderr, "%s\n", qPrintable(message)); -} - -void ProFileEvaluator::setVerbose(bool on) -{ - d->m_verbose = on; + return d->propertyValue(name, false); } +#ifdef PROEVALUATOR_CUMULATIVE void ProFileEvaluator::setCumulative(bool on) { d->m_cumulative = on; } +#endif void ProFileEvaluator::setOutputDir(const QString &dir) { diff --git a/tools/linguist/shared/profileevaluator.h b/tools/linguist/shared/profileevaluator.h index d4cdbcd..b3086bf 100644 --- a/tools/linguist/shared/profileevaluator.h +++ b/tools/linguist/shared/profileevaluator.h @@ -42,52 +42,104 @@ #ifndef PROFILEEVALUATOR_H #define PROFILEEVALUATOR_H +#include "proparser_global.h" #include "proitems.h" -#include "abstractproitemvisitor.h" -#include <QtCore/QIODevice> #include <QtCore/QHash> #include <QtCore/QStringList> -#include <QtCore/QStack> - -#if (!defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)) && !defined(__SUNPRO_CC) -# define HAVE_TEMPLATE_CLASS_FRIENDS +#ifndef QT_BOOTSTRAPPED +# include <QtCore/QProcess> +#endif +#ifdef PROEVALUATOR_THREAD_SAFE +# include <QtCore/QMutex> +# include <QtCore/QWaitCondition> #endif QT_BEGIN_NAMESPACE -class ProFileEvaluator +struct ProFileOption; +class ProFileParser; + +class PROPARSER_EXPORT ProFileEvaluatorHandler { -#ifdef HAVE_TEMPLATE_CLASS_FRIENDS -private: -#else public: -#endif + // qmake/project configuration error + virtual void configError(const QString &msg) = 0; + // Some error during evaluation + virtual void evalError(const QString &filename, int lineNo, const QString &msg) = 0; + // error() and message() from .pro file + virtual void fileMessage(const QString &msg) = 0; + + enum EvalFileType { EvalProjectFile, EvalIncludeFile, EvalConfigFile, EvalFeatureFile, EvalAuxFile }; + virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type) = 0; + virtual void doneWithEval(ProFile *parent) = 0; +}; + + +class PROPARSER_EXPORT ProFileEvaluator +{ class Private; public: + class FunctionDef { + public: + FunctionDef(ProFile *pro, int offset) : m_pro(pro), m_offset(offset) { m_pro->ref(); } + FunctionDef(const FunctionDef &o) : m_pro(o.m_pro), m_offset(o.m_offset) { m_pro->ref(); } + ~FunctionDef() { m_pro->deref(); } + FunctionDef &operator=(const FunctionDef &o) + { + if (this != &o) { + m_pro->deref(); + m_pro = o.m_pro; + m_pro->ref(); + m_offset = o.m_offset; + } + return *this; + } + ProFile *pro() const { return m_pro; } + const ushort *tokPtr() const { return m_pro->tokPtr() + m_offset; } + private: + ProFile *m_pro; + int m_offset; + }; + + struct FunctionDefs { + QHash<ProString, FunctionDef> testFunctions; + QHash<ProString, FunctionDef> replaceFunctions; + }; + enum TemplateType { TT_Unknown = 0, TT_Application, TT_Library, TT_Script, + TT_Aux, TT_Subdirs }; - ProFileEvaluator(); - virtual ~ProFileEvaluator(); + // Call this from a concurrency-free context + static void initialize(); + + ProFileEvaluator(ProFileOption *option, ProFileParser *parser, ProFileEvaluatorHandler *handler); + ~ProFileEvaluator(); - ProFileEvaluator::TemplateType templateType(); - virtual bool contains(const QString &variableName) const; - void setVerbose(bool on); // Default is false + ProFileEvaluator::TemplateType templateType() const; +#ifdef PROEVALUATOR_CUMULATIVE void setCumulative(bool on); // Default is true! +#endif void setOutputDir(const QString &dir); // Default is empty - bool queryProFile(ProFile *pro); - bool accept(ProFile *pro); + enum LoadFlag { + LoadProOnly = 0, + LoadPreFiles = 1, + LoadPostFiles = 2, + LoadAll = LoadPreFiles|LoadPostFiles + }; + Q_DECLARE_FLAGS(LoadFlags, LoadFlag) + bool accept(ProFile *pro, LoadFlags flags = LoadAll); - void addVariables(const QHash<QString, QStringList> &variables); - void addProperties(const QHash<QString, QString> &properties); + bool contains(const QString &variableName) const; + QString value(const QString &variableName) const; QStringList values(const QString &variableName) const; QStringList values(const QString &variableName, const ProFile *pro) const; QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const; @@ -96,21 +148,83 @@ public: const ProFile *pro) const; QString propertyValue(const QString &val) const; - // for our descendents - virtual ProFile *parsedProFile(const QString &fileName); - virtual void releaseParsedProFile(ProFile *proFile); - virtual void logMessage(const QString &msg); - virtual void errorMessage(const QString &msg); // .pro parse errors - virtual void fileMessage(const QString &msg); // error() and message() from .pro file - private: Private *d; -#ifdef HAVE_TEMPLATE_CLASS_FRIENDS - template<typename T> friend class QTypeInfo; + friend struct ProFileOption; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(ProFileEvaluator::LoadFlags) + +// This struct is from qmake, but we are not using everything. +struct PROPARSER_EXPORT ProFileOption +{ + ProFileOption(); + ~ProFileOption(); + + //simply global convenience + //QString libtool_ext; + //QString pkgcfg_ext; + //QString prf_ext; + //QString prl_ext; + //QString ui_ext; + //QStringList h_ext; + //QStringList cpp_ext; + //QString h_moc_ext; + //QString cpp_moc_ext; + //QString obj_ext; + //QString lex_ext; + //QString yacc_ext; + //QString h_moc_mod; + //QString cpp_moc_mod; + //QString lex_mod; + //QString yacc_mod; + QString dir_sep; + QString dirlist_sep; + QString qmakespec; + QString cachefile; + QHash<QString, QString> properties; +#ifndef QT_BOOTSTRAPPED + QProcessEnvironment environment; +#endif + QString sysroot; + + //QString pro_ext; + //QString res_ext; + + // -nocache, -cache, -spec, QMAKESPEC + // -set persistent value + void setCommandLineArguments(const QStringList &args); +#ifdef PROEVALUATOR_INIT_PROPS + bool initProperties(const QString &qmake); +#endif + + private: + friend class ProFileEvaluator; + friend class ProFileEvaluator::Private; + + void applyHostMode(); + QString getEnv(const QString &) const; + + QHash<ProString, ProStringList> base_valuemap; // Cached results of qmake.conf, .qmake.cache & default_pre.prf + ProFileEvaluator::FunctionDefs base_functions; + QStringList feature_roots; + QString qmakespec_name; + QString precmds, postcmds; + enum HOST_MODE { HOST_UNKNOWN_MODE, HOST_UNIX_MODE, HOST_WIN_MODE, HOST_MACX_MODE }; + HOST_MODE host_mode; + enum TARG_MODE { TARG_UNKNOWN_MODE, TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE, + TARG_SYMBIAN_MODE }; + TARG_MODE target_mode; +#ifdef PROEVALUATOR_THREAD_SAFE + QMutex mutex; + QWaitCondition cond; + bool base_inProgress; #endif }; +Q_DECLARE_TYPEINFO(ProFileEvaluator::FunctionDef, Q_MOVABLE_TYPE); + QT_END_NAMESPACE #endif // PROFILEEVALUATOR_H diff --git a/tools/linguist/shared/profileparser.cpp b/tools/linguist/shared/profileparser.cpp new file mode 100644 index 0000000..5ba33fc --- /dev/null +++ b/tools/linguist/shared/profileparser.cpp @@ -0,0 +1,1037 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Linguist 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 "profileparser.h" + +#include "ioutils.h" +using namespace ProFileEvaluatorInternal; + +#include <QtCore/QFile> +#ifdef PROPARSER_THREAD_SAFE +# include <QtCore/QThreadPool> +#endif + +QT_BEGIN_NAMESPACE + +/////////////////////////////////////////////////////////////////////// +// +// ProFileCache +// +/////////////////////////////////////////////////////////////////////// + +ProFileCache::~ProFileCache() +{ + foreach (const Entry &ent, parsed_files) + if (ent.pro) + ent.pro->deref(); +} + +void ProFileCache::discardFile(const QString &fileName) +{ +#ifdef PROPARSER_THREAD_SAFE + QMutexLocker lck(&mutex); +#endif + QHash<QString, Entry>::Iterator it = parsed_files.find(fileName); + if (it != parsed_files.end()) { + if (it->pro) + it->pro->deref(); + parsed_files.erase(it); + } +} + +void ProFileCache::discardFiles(const QString &prefix) +{ +#ifdef PROPARSER_THREAD_SAFE + QMutexLocker lck(&mutex); +#endif + QHash<QString, Entry>::Iterator + it = parsed_files.begin(), + end = parsed_files.end(); + while (it != end) + if (it.key().startsWith(prefix)) { + if (it->pro) + it->pro->deref(); + it = parsed_files.erase(it); + } else { + ++it; + } +} + + +////////// Parser /////////// + +#define fL1S(s) QString::fromLatin1(s) + +namespace { // MSVC2010 doesn't seem to know the semantics of "static" ... + +static struct { + QString strelse; + QString strfor; + QString strdefineTest; + QString strdefineReplace; +} statics; + +} + +void ProFileParser::initialize() +{ + if (!statics.strelse.isNull()) + return; + + statics.strelse = QLatin1String("else"); + statics.strfor = QLatin1String("for"); + statics.strdefineTest = QLatin1String("defineTest"); + statics.strdefineReplace = QLatin1String("defineReplace"); +} + +ProFileParser::ProFileParser(ProFileCache *cache, ProFileParserHandler *handler) + : m_cache(cache) + , m_handler(handler) +{ + // So that single-threaded apps don't have to call initialize() for now. + initialize(); +} + +ProFile *ProFileParser::parsedProFile(const QString &fileName, bool cache, const QString *contents) +{ + ProFile *pro; + if (cache && m_cache) { + ProFileCache::Entry *ent; +#ifdef PROPARSER_THREAD_SAFE + QMutexLocker locker(&m_cache->mutex); +#endif + QHash<QString, ProFileCache::Entry>::Iterator it = m_cache->parsed_files.find(fileName); + if (it != m_cache->parsed_files.end()) { + ent = &*it; +#ifdef PROPARSER_THREAD_SAFE + if (ent->locker && !ent->locker->done) { + ++ent->locker->waiters; + QThreadPool::globalInstance()->releaseThread(); + ent->locker->cond.wait(locker.mutex()); + QThreadPool::globalInstance()->reserveThread(); + if (!--ent->locker->waiters) { + delete ent->locker; + ent->locker = 0; + } + } +#endif + if ((pro = ent->pro)) + pro->ref(); + } else { + ent = &m_cache->parsed_files[fileName]; +#ifdef PROPARSER_THREAD_SAFE + ent->locker = new ProFileCache::Entry::Locker; + locker.unlock(); +#endif + pro = new ProFile(fileName); + if (!(!contents ? read(pro) : read(pro, *contents))) { + delete pro; + pro = 0; + } else { + pro->ref(); + } + ent->pro = pro; +#ifdef PROPARSER_THREAD_SAFE + locker.relock(); + if (ent->locker->waiters) { + ent->locker->done = true; + ent->locker->cond.wakeAll(); + } else { + delete ent->locker; + ent->locker = 0; + } +#endif + } + } else { + pro = new ProFile(fileName); + if (!(!contents ? read(pro) : read(pro, *contents))) { + delete pro; + pro = 0; + } + } + return pro; +} + +bool ProFileParser::read(ProFile *pro) +{ + QFile file(pro->fileName()); + if (!file.open(QIODevice::ReadOnly)) { + if (m_handler && IoUtils::exists(pro->fileName())) + m_handler->parseError(QString(), 0, fL1S("%1 not readable.").arg(pro->fileName())); + return false; + } + + QString content(QString::fromLocal8Bit(file.readAll())); + file.close(); + return read(pro, content); +} + +void ProFileParser::putTok(ushort *&tokPtr, ushort tok) +{ + *tokPtr++ = tok; +} + +void ProFileParser::putBlockLen(ushort *&tokPtr, uint len) +{ + *tokPtr++ = (ushort)len; + *tokPtr++ = (ushort)(len >> 16); +} + +void ProFileParser::putBlock(ushort *&tokPtr, const ushort *buf, uint len) +{ + memcpy(tokPtr, buf, len * 2); + tokPtr += len; +} + +void ProFileParser::putHashStr(ushort *&pTokPtr, const ushort *buf, uint len) +{ + uint hash = ProString::hash((const QChar *)buf, len); + ushort *tokPtr = pTokPtr; + *tokPtr++ = (ushort)hash; + *tokPtr++ = (ushort)(hash >> 16); + *tokPtr++ = (ushort)len; + memcpy(tokPtr, buf, len * 2); + pTokPtr = tokPtr + len; +} + +void ProFileParser::finalizeHashStr(ushort *buf, uint len) +{ + buf[-4] = TokHashLiteral; + buf[-1] = len; + uint hash = ProString::hash((const QChar *)buf, len); + buf[-3] = (ushort)hash; + buf[-2] = (ushort)(hash >> 16); +} + +bool ProFileParser::read(ProFile *pro, const QString &in) +{ + m_proFile = pro; + m_lineNo = 1; + + // Final precompiled token stream buffer + QString tokBuff; + // Worst-case size calculations: + // - line marker adds 1 (2-nl) to 1st token of each line + // - empty assignment "A=":2 => + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + + // TokValueTerminator(1) == 7 (8) + // - non-empty assignment "A=B C":5 => + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + + // TokLiteral(1) + len(1) + "B"(1) + + // TokLiteral(1) + len(1) + "C"(1) + TokValueTerminator(1) == 13 (14) + // - variable expansion: "$$f":3 => + // TokVariable(1) + hash(2) + len(1) + "f"(1) = 5 + // - function expansion: "$$f()":5 => + // TokFuncName(1) + hash(2) + len(1) + "f"(1) + TokFuncTerminator(1) = 6 + // - scope: "X:":2 => + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokCondition(1) + + // TokBranch(1) + len(2) + ... + len(2) + ... == 10 + // - test: "X():":4 => + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokTestCall(1) + TokFuncTerminator(1) + + // TokBranch(1) + len(2) + ... + len(2) + ... == 11 + // - "for(A,B):":9 => + // TokForLoop(1) + hash(2) + len(1) + "A"(1) + + // len(2) + TokLiteral(1) + len(1) + "B"(1) + TokValueTerminator(1) + + // len(2) + ... + TokTerminator(1) == 14 (15) + tokBuff.reserve((in.size() + 1) * 5); + ushort *tokPtr = (ushort *)tokBuff.constData(); // Current writing position + + // Expression precompiler buffer. + QString xprBuff; + xprBuff.reserve(tokBuff.capacity()); // Excessive, but simple + ushort * const buf = (ushort *)xprBuff.constData(); + + // Parser state + m_blockstack.clear(); + m_blockstack.resize(1); + + QStack<ParseCtx> xprStack; + xprStack.reserve(10); + + // We rely on QStrings being null-terminated, so don't maintain a global end pointer. + const ushort *cur = (const ushort *)in.unicode(); + m_canElse = false; + freshLine: + m_state = StNew; + m_invert = false; + m_operator = NoOperator; + m_markLine = m_lineNo; + m_inError = false; + Context context = CtxTest; + int parens = 0; // Braces in value context + int argc = 0; + int wordCount = 0; // Number of words in currently accumulated expression + bool putSpace = false; // Only ever true inside quoted string + bool lineMarked = true; // For in-expression markers + ushort needSep = TokNewStr; // Complementary to putSpace: separator outside quotes + ushort quote = 0; + ushort term = 0; + + ushort *ptr = buf; + ptr += 4; + ushort *xprPtr = ptr; + +#define FLUSH_LHS_LITERAL() \ + do { \ + if ((tlen = ptr - xprPtr)) { \ + finalizeHashStr(xprPtr, tlen); \ + if (needSep) { \ + wordCount++; \ + needSep = 0; \ + } \ + } else { \ + ptr -= 4; \ + } \ + } while (0) + +#define FLUSH_RHS_LITERAL() \ + do { \ + if ((tlen = ptr - xprPtr)) { \ + xprPtr[-2] = TokLiteral | needSep; \ + xprPtr[-1] = tlen; \ + if (needSep) { \ + wordCount++; \ + needSep = 0; \ + } \ + } else { \ + ptr -= 2; \ + } \ + } while (0) + +#define FLUSH_LITERAL() \ + do { \ + if (context == CtxTest) \ + FLUSH_LHS_LITERAL(); \ + else \ + FLUSH_RHS_LITERAL(); \ + } while (0) + +#define FLUSH_VALUE_LIST() \ + do { \ + if (wordCount > 1) { \ + xprPtr = tokPtr; \ + if (*xprPtr == TokLine) \ + xprPtr += 2; \ + tokPtr[-1] = ((*xprPtr & TokMask) == TokLiteral) ? wordCount : 0; \ + } else { \ + tokPtr[-1] = 0; \ + } \ + tokPtr = ptr; \ + putTok(tokPtr, TokValueTerminator); \ + } while (0) + + forever { + ushort c; + + // First, skip leading whitespace + for (;; ++cur) { + c = *cur; + if (c == '\n') { + ++cur; + goto flushLine; + } else if (!c) { + goto flushLine; + } else if (c != ' ' && c != '\t' && c != '\r') { + break; + } + } + + // Then strip comments. Yep - no escaping is possible. + const ushort *end; // End of this line + const ushort *cptr; // Start of next line + for (cptr = cur;; ++cptr) { + c = *cptr; + if (c == '#') { + for (end = cptr; (c = *++cptr);) { + if (c == '\n') { + ++cptr; + break; + } + } + if (end == cur) { // Line with only a comment (sans whitespace) + if (m_markLine == m_lineNo) + m_markLine++; + // Qmake bizarreness: such lines do not affect line continuations + goto ignore; + } + break; + } + if (!c) { + end = cptr; + break; + } + if (c == '\n') { + end = cptr++; + break; + } + } + + // Then look for line continuations. Yep - no escaping here as well. + bool lineCont; + forever { + // We don't have to check for underrun here, as we already determined + // that the line is non-empty. + ushort ec = *(end - 1); + if (ec == '\\') { + --end; + lineCont = true; + break; + } + if (ec != ' ' && ec != '\t' && ec != '\r') { + lineCont = false; + break; + } + --end; + } + + // Finally, do the tokenization + ushort tok, rtok; + int tlen; + newWord: + do { + if (cur == end) + goto lineEnd; + c = *cur++; + } while (c == ' ' || c == '\t'); + forever { + if (c == '$') { + if (*cur == '$') { // may be EOF, EOL, WS, '#' or '\\' if past end + cur++; + if (putSpace) { + putSpace = false; + *ptr++ = ' '; + } + FLUSH_LITERAL(); + if (!lineMarked) { + lineMarked = true; + *ptr++ = TokLine; + *ptr++ = (ushort)m_lineNo; + } + term = 0; + tok = TokVariable; + c = *cur; + if (c == '[') { + ptr += 2; + tok = TokProperty; + term = ']'; + c = *++cur; + } else if (c == '{') { + ptr += 4; + term = '}'; + c = *++cur; + } else if (c == '(') { + // FIXME: could/should expand this immediately + ptr += 2; + tok = TokEnvVar; + term = ')'; + c = *++cur; + } else { + ptr += 4; + } + xprPtr = ptr; + rtok = tok; + while ((c & 0xFF00) || c == '.' || c == '_' || + (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9')) { + *ptr++ = c; + if (++cur == end) { + c = 0; + goto notfunc; + } + c = *cur; + } + if (tok == TokVariable && c == '(') + tok = TokFuncName; + notfunc: + if (quote) + tok |= TokQuoted; + if (needSep) { + tok |= needSep; + wordCount++; + } + tlen = ptr - xprPtr; + if (rtok == TokVariable) { + xprPtr[-4] = tok; + uint hash = ProString::hash((const QChar *)xprPtr, tlen); + xprPtr[-3] = (ushort)hash; + xprPtr[-2] = (ushort)(hash >> 16); + } else { + xprPtr[-2] = tok; + } + xprPtr[-1] = tlen; + if ((tok & TokMask) == TokFuncName) { + cur++; + funcCall: + { + xprStack.resize(xprStack.size() + 1); + ParseCtx &top = xprStack.top(); + top.parens = parens; + top.quote = quote; + top.terminator = term; + top.context = context; + top.argc = argc; + top.wordCount = wordCount; + } + parens = 0; + quote = 0; + term = 0; + argc = 1; + context = CtxArgs; + nextToken: + wordCount = 0; + nextWord: + ptr += (context == CtxTest) ? 4 : 2; + xprPtr = ptr; + needSep = TokNewStr; + goto newWord; + } + if (term) { + cur++; + checkTerm: + if (c != term) { + parseError(fL1S("Missing %1 terminator [found %2]") + .arg(QChar(term)) + .arg(c ? QString(c) : QString::fromLatin1("end-of-line"))); + pro->setOk(false); + m_inError = true; + if (c) + cur--; + // Just parse on, as if there was a terminator ... + } + } + joinToken: + ptr += (context == CtxTest) ? 4 : 2; + xprPtr = ptr; + needSep = 0; + goto nextChr; + } + } else if (c == '\\' && cur != end) { + static const char symbols[] = "[]{}()$\\'\""; + ushort c2 = *cur; + if (!(c2 & 0xff00) && strchr(symbols, c2)) { + c = c2; + cur++; + } + } else if (quote) { + if (c == quote) { + quote = 0; + if (putSpace) { + putSpace = false; + *ptr++ = ' '; + } + goto nextChr; + } else if (c == ' ' || c == '\t') { + putSpace = true; + goto nextChr; + } else if (c == '!' && ptr == xprPtr && context == CtxTest) { + m_invert ^= true; + goto nextChr; + } + } else if (c == '\'' || c == '"') { + quote = c; + goto nextChr; + } else if (c == ' ' || c == '\t') { + FLUSH_LITERAL(); + goto nextWord; + } else if (context == CtxArgs) { + // Function arg context + if (c == '(') { + ++parens; + } else if (c == ')') { + if (--parens < 0) { + FLUSH_RHS_LITERAL(); + *ptr++ = TokFuncTerminator; + int theargc = argc; + { + ParseCtx &top = xprStack.top(); + parens = top.parens; + quote = top.quote; + term = top.terminator; + context = top.context; + argc = top.argc; + wordCount = top.wordCount; + xprStack.resize(xprStack.size() - 1); + } + if (term == ':') { + finalizeCall(tokPtr, buf, ptr, theargc); + goto nextItem; + } else if (term == '}') { + c = (cur == end) ? 0 : *cur++; + goto checkTerm; + } else { + Q_ASSERT(!term); + goto joinToken; + } + } + } else if (!parens && c == ',') { + FLUSH_RHS_LITERAL(); + *ptr++ = TokArgSeparator; + argc++; + goto nextToken; + } + } else if (context == CtxTest) { + // Test or LHS context + if (c == '(') { + FLUSH_LHS_LITERAL(); + if (wordCount != 1) { + if (wordCount) + parseError(fL1S("Extra characters after test expression.")); + else + parseError(fL1S("Opening parenthesis without prior test name.")); + pro->setOk(false); + ptr = buf; // Put empty function name + } + *ptr++ = TokTestCall; + term = ':'; + goto funcCall; + } else if (c == '!' && ptr == xprPtr) { + m_invert ^= true; + goto nextChr; + } else if (c == ':') { + FLUSH_LHS_LITERAL(); + finalizeCond(tokPtr, buf, ptr, wordCount); + if (m_state == StNew) + parseError(fL1S("And operator without prior condition.")); + else + m_operator = AndOperator; + nextItem: + ptr = buf; + goto nextToken; + } else if (c == '|') { + FLUSH_LHS_LITERAL(); + finalizeCond(tokPtr, buf, ptr, wordCount); + if (m_state != StCond) + parseError(fL1S("Or operator without prior condition.")); + else + m_operator = OrOperator; + goto nextItem; + } else if (c == '{') { + FLUSH_LHS_LITERAL(); + finalizeCond(tokPtr, buf, ptr, wordCount); + flushCond(tokPtr); + ++m_blockstack.top().braceLevel; + goto nextItem; + } else if (c == '}') { + FLUSH_LHS_LITERAL(); + finalizeCond(tokPtr, buf, ptr, wordCount); + flushScopes(tokPtr); + closeScope: + if (!m_blockstack.top().braceLevel) { + parseError(fL1S("Excess closing brace.")); + } else if (!--m_blockstack.top().braceLevel + && m_blockstack.count() != 1) { + leaveScope(tokPtr); + m_state = StNew; + m_canElse = false; + m_markLine = m_lineNo; + } + goto nextItem; + } else if (c == '+') { + tok = TokAppend; + goto do2Op; + } else if (c == '-') { + tok = TokRemove; + goto do2Op; + } else if (c == '*') { + tok = TokAppendUnique; + goto do2Op; + } else if (c == '~') { + tok = TokReplace; + do2Op: + if (*cur == '=') { + cur++; + goto doOp; + } + } else if (c == '=') { + tok = TokAssign; + doOp: + FLUSH_LHS_LITERAL(); + flushCond(tokPtr); + putLineMarker(tokPtr); + if (wordCount != 1) { + parseError(fL1S("Assignment needs exactly one word on the left hand side.")); + pro->setOk(false); + // Put empty variable name. + } else { + putBlock(tokPtr, buf, ptr - buf); + } + putTok(tokPtr, tok); + context = CtxValue; + ptr = ++tokPtr; + goto nextToken; + } + } else { // context == CtxValue + if (c == '{') { + ++parens; + } else if (c == '}') { + if (!parens) { + FLUSH_RHS_LITERAL(); + FLUSH_VALUE_LIST(); + context = CtxTest; + goto closeScope; + } + --parens; + } + } + if (putSpace) { + putSpace = false; + *ptr++ = ' '; + } + *ptr++ = c; + nextChr: + if (cur == end) + goto lineEnd; + c = *cur++; + } + + lineEnd: + if (lineCont) { + if (quote) { + putSpace = true; + } else { + FLUSH_LITERAL(); + needSep = TokNewStr; + ptr += (context == CtxTest) ? 4 : 2; + xprPtr = ptr; + } + } else { + c = '\n'; + cur = cptr; + flushLine: + FLUSH_LITERAL(); + if (quote) { + parseError(fL1S("Missing closing %1 quote").arg(QChar(quote))); + if (!xprStack.isEmpty()) { + context = xprStack.at(0).context; + xprStack.clear(); + } + goto flErr; + } else if (!xprStack.isEmpty()) { + parseError(fL1S("Missing closing parenthesis in function call")); + context = xprStack.at(0).context; + xprStack.clear(); + flErr: + pro->setOk(false); + if (context == CtxValue) { + tokPtr[-1] = 0; // sizehint + putTok(tokPtr, TokValueTerminator); + } else { + bogusTest(tokPtr); + } + } else if (context == CtxValue) { + FLUSH_VALUE_LIST(); + } else { + finalizeCond(tokPtr, buf, ptr, wordCount); + } + if (!c) + break; + ++m_lineNo; + goto freshLine; + } + + if (!lineCont) { + cur = cptr; + ++m_lineNo; + goto freshLine; + } + lineMarked = false; + ignore: + cur = cptr; + ++m_lineNo; + } + + flushScopes(tokPtr); + if (m_blockstack.size() > 1) { + parseError(fL1S("Missing closing brace(s).")); + pro->setOk(false); + } + while (m_blockstack.size()) + leaveScope(tokPtr); + xprBuff.clear(); + *pro->itemsRef() = QString(tokBuff.constData(), tokPtr - (ushort *)tokBuff.constData()); + return true; + +#undef FLUSH_VALUE_LIST +#undef FLUSH_LITERAL +#undef FLUSH_LHS_LITERAL +#undef FLUSH_RHS_LITERAL +} + +void ProFileParser::putLineMarker(ushort *&tokPtr) +{ + if (m_markLine) { + *tokPtr++ = TokLine; + *tokPtr++ = (ushort)m_markLine; + m_markLine = 0; + } +} + +void ProFileParser::enterScope(ushort *&tokPtr, bool special, ScopeState state) +{ + m_blockstack.resize(m_blockstack.size() + 1); + m_blockstack.top().special = special; + m_blockstack.top().start = tokPtr; + tokPtr += 2; + m_state = state; + m_canElse = false; + if (special) + m_markLine = m_lineNo; +} + +void ProFileParser::leaveScope(ushort *&tokPtr) +{ + if (m_blockstack.top().inBranch) { + // Put empty else block + putBlockLen(tokPtr, 0); + } + if (ushort *start = m_blockstack.top().start) { + putTok(tokPtr, TokTerminator); + uint len = tokPtr - start - 2; + start[0] = (ushort)len; + start[1] = (ushort)(len >> 16); + } + m_blockstack.resize(m_blockstack.size() - 1); +} + +// If we are on a fresh line, close all open one-line scopes. +void ProFileParser::flushScopes(ushort *&tokPtr) +{ + if (m_state == StNew) { + while (!m_blockstack.top().braceLevel && m_blockstack.size() > 1) + leaveScope(tokPtr); + if (m_blockstack.top().inBranch) { + m_blockstack.top().inBranch = false; + // Put empty else block + putBlockLen(tokPtr, 0); + } + m_canElse = false; + } +} + +// If there is a pending conditional, enter a new scope, otherwise flush scopes. +void ProFileParser::flushCond(ushort *&tokPtr) +{ + if (m_state == StCond) { + putTok(tokPtr, TokBranch); + m_blockstack.top().inBranch = true; + enterScope(tokPtr, false, StNew); + } else { + flushScopes(tokPtr); + } +} + +void ProFileParser::finalizeTest(ushort *&tokPtr) +{ + flushScopes(tokPtr); + putLineMarker(tokPtr); + if (m_operator != NoOperator) { + putTok(tokPtr, (m_operator == AndOperator) ? TokAnd : TokOr); + m_operator = NoOperator; + } + if (m_invert) { + putTok(tokPtr, TokNot); + m_invert = false; + } + m_state = StCond; + m_canElse = true; +} + +void ProFileParser::bogusTest(ushort *&tokPtr) +{ + flushScopes(tokPtr); + m_operator = NoOperator; + m_invert = false; + m_state = StCond; + m_canElse = true; + m_proFile->setOk(false); +} + +void ProFileParser::finalizeCond(ushort *&tokPtr, ushort *uc, ushort *ptr, int wordCount) +{ + if (wordCount != 1) { + if (wordCount) { + parseError(fL1S("Extra characters after test expression.")); + bogusTest(tokPtr); + } + return; + } + + // Check for magic tokens + if (*uc == TokHashLiteral) { + uint nlen = uc[3]; + ushort *uce = uc + 4 + nlen; + if (uce == ptr) { + m_tmp.setRawData((QChar *)uc + 4, nlen); + if (!m_tmp.compare(statics.strelse, Qt::CaseInsensitive)) { + if (m_invert || m_operator != NoOperator) { + parseError(fL1S("Unexpected operator in front of else.")); + return; + } + BlockScope &top = m_blockstack.top(); + if (m_canElse && (!top.special || top.braceLevel)) { + // A list of tests (the last one likely with side effects), + // but no assignment, scope, etc. + putTok(tokPtr, TokBranch); + // Put empty then block + putBlockLen(tokPtr, 0); + enterScope(tokPtr, false, StCtrl); + return; + } + forever { + BlockScope &top = m_blockstack.top(); + if (top.inBranch && (!top.special || top.braceLevel)) { + top.inBranch = false; + enterScope(tokPtr, false, StCtrl); + return; + } + if (top.braceLevel || m_blockstack.size() == 1) + break; + leaveScope(tokPtr); + } + parseError(fL1S("Unexpected 'else'.")); + return; + } + } + } + + finalizeTest(tokPtr); + putBlock(tokPtr, uc, ptr - uc); + putTok(tokPtr, TokCondition); +} + +void ProFileParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int argc) +{ + // Check for magic tokens + if (*uc == TokHashLiteral) { + uint nlen = uc[3]; + ushort *uce = uc + 4 + nlen; + if (*uce == TokTestCall) { + uce++; + m_tmp.setRawData((QChar *)uc + 4, nlen); + const QString *defName; + ushort defType; + if (m_tmp == statics.strfor) { + flushCond(tokPtr); + putLineMarker(tokPtr); + if (m_invert || m_operator == OrOperator) { + // '|' could actually work reasonably, but qmake does nonsense here. + parseError(fL1S("Unexpected operator in front of for().")); + return; + } + if (*uce == (TokLiteral|TokNewStr)) { + nlen = uce[1]; + uc = uce + 2 + nlen; + if (*uc == TokFuncTerminator) { + // for(literal) (only "ever" would be legal if qmake was sane) + putTok(tokPtr, TokForLoop); + putHashStr(tokPtr, (ushort *)0, (uint)0); + putBlockLen(tokPtr, 1 + 3 + nlen + 1); + putTok(tokPtr, TokHashLiteral); + putHashStr(tokPtr, uce + 2, nlen); + didFor: + putTok(tokPtr, TokValueTerminator); + enterScope(tokPtr, true, StCtrl); + return; + } else if (*uc == TokArgSeparator && argc == 2) { + // for(var, something) + uc++; + putTok(tokPtr, TokForLoop); + putHashStr(tokPtr, uce + 2, nlen); + doFor: + nlen = ptr - uc; + putBlockLen(tokPtr, nlen + 1); + putBlock(tokPtr, uc, nlen); + goto didFor; + } + } else if (argc == 1) { + // for(non-literal) (this wouldn't be here if qmake was sane) + putTok(tokPtr, TokForLoop); + putHashStr(tokPtr, (ushort *)0, (uint)0); + uc = uce; + goto doFor; + } + parseError(fL1S("Syntax is for(var, list), for(var, forever) or for(ever).")); + return; + } else if (m_tmp == statics.strdefineReplace) { + defName = &statics.strdefineReplace; + defType = TokReplaceDef; + goto deffunc; + } else if (m_tmp == statics.strdefineTest) { + defName = &statics.strdefineTest; + defType = TokTestDef; + deffunc: + flushScopes(tokPtr); + putLineMarker(tokPtr); + if (m_invert) { + parseError(fL1S("Unexpected operator in front of function definition.")); + return; + } + if (*uce == (TokLiteral|TokNewStr)) { + uint nlen = uce[1]; + if (uce[nlen + 2] == TokFuncTerminator) { + if (m_operator != NoOperator) { + putTok(tokPtr, (m_operator == AndOperator) ? TokAnd : TokOr); + m_operator = NoOperator; + } + putTok(tokPtr, defType); + putHashStr(tokPtr, uce + 2, nlen); + uc = uce + 2 + nlen + 1; + enterScope(tokPtr, true, StCtrl); + return; + } + } + parseError(fL1S("%1(function) requires one literal argument.").arg(*defName)); + return; + } + } + } + + finalizeTest(tokPtr); + putBlock(tokPtr, uc, ptr - uc); +} + +void ProFileParser::parseError(const QString &msg) const +{ + if (!m_inError && m_handler) + m_handler->parseError(m_proFile->fileName(), m_lineNo, msg); +} + +QT_END_NAMESPACE diff --git a/tools/linguist/shared/profileparser.h b/tools/linguist/shared/profileparser.h new file mode 100644 index 0000000..643e339 --- /dev/null +++ b/tools/linguist/shared/profileparser.h @@ -0,0 +1,195 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Linguist 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 PROFILEPARSER_H +#define PROFILEPARSER_H + +#include "proparser_global.h" +#include "proitems.h" +#include <QtCore/QHash> +#include <QtCore/QStack> +#ifdef PROPARSER_THREAD_SAFE +# include <QtCore/QMutex> +# include <QtCore/QWaitCondition> +#endif + +// Be fast even for debug builds +#ifdef __GNUC__ +# define ALWAYS_INLINE inline __attribute__((always_inline)) +#elif defined(_MSC_VER) +# define ALWAYS_INLINE __forceinline +#else +# define ALWAYS_INLINE inline +#endif + +QT_BEGIN_NAMESPACE +class PROPARSER_EXPORT ProFileParserHandler +{ +public: + // Some error during parsing + virtual void parseError(const QString &filename, int lineNo, const QString &msg) = 0; +}; + +class ProFileCache; + +class PROPARSER_EXPORT ProFileParser +{ +public: + // Call this from a concurrency-free context + static void initialize(); + + ProFileParser(ProFileCache *cache, ProFileParserHandler *handler); + + // fileName is expected to be absolute and cleanPath()ed. + // If contents is non-null, it will be used instead of the file's actual content + ProFile *parsedProFile(const QString &fileName, bool cache = false, + const QString *contents = 0); + ProFile *parsedProBlock(const QString &name, const QString &contents) + { return parsedProFile(name, false, &contents); } + +private: + struct BlockScope { + BlockScope() : start(0), braceLevel(0), special(false), inBranch(false) {} + BlockScope(const BlockScope &other) { *this = other; } + ushort *start; // Where this block started; store length here + int braceLevel; // Nesting of braces in scope + bool special; // Single-line conditionals inside loops, etc. cannot have else branches + bool inBranch; // The 'else' branch of the previous TokBranch is still open + }; + + enum ScopeState { + StNew, // Fresh scope + StCtrl, // Control statement (for or else) met on current line + StCond // Conditionals met on current line + }; + + enum Context { CtxTest, CtxValue, CtxArgs }; + struct ParseCtx { + int parens; // Nesting of non-functional parentheses + int argc; // Number of arguments in current function call + int wordCount; // Number of words in current expression + Context context; + ushort quote; // Enclosing quote type + ushort terminator; // '}' if replace function call is braced, ':' if test function + }; + + bool read(ProFile *pro); + bool read(ProFile *pro, const QString &content); + + ALWAYS_INLINE void putTok(ushort *&tokPtr, ushort tok); + ALWAYS_INLINE void putBlockLen(ushort *&tokPtr, uint len); + ALWAYS_INLINE void putBlock(ushort *&tokPtr, const ushort *buf, uint len); + void putHashStr(ushort *&pTokPtr, const ushort *buf, uint len); + void finalizeHashStr(ushort *buf, uint len); + void putLineMarker(ushort *&tokPtr); + void finalizeCond(ushort *&tokPtr, ushort *uc, ushort *ptr, int wordCount); + void finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int argc); + void finalizeTest(ushort *&tokPtr); + void bogusTest(ushort *&tokPtr); + void enterScope(ushort *&tokPtr, bool special, ScopeState state); + void leaveScope(ushort *&tokPtr); + void flushCond(ushort *&tokPtr); + void flushScopes(ushort *&tokPtr); + + void parseError(const QString &msg) const; + + // Current location + ProFile *m_proFile; + int m_lineNo; + + QStack<BlockScope> m_blockstack; + ScopeState m_state; + int m_markLine; // Put marker for this line + bool m_inError; // Current line had a parsing error; suppress followup error messages + bool m_canElse; // Conditionals met on previous line, but no scope was opened + bool m_invert; // Pending conditional is negated + enum { NoOperator, AndOperator, OrOperator } m_operator; // Pending conditional is ORed/ANDed + + QString m_tmp; // Temporary for efficient toQString + + ProFileCache *m_cache; + ProFileParserHandler *m_handler; + + // This doesn't help gcc 3.3 ... + template<typename T> friend class QTypeInfo; + + friend class ProFileCache; +}; + +class PROPARSER_EXPORT ProFileCache +{ +public: + ProFileCache() {} + ~ProFileCache(); + + void discardFile(const QString &fileName); + void discardFiles(const QString &prefix); + +private: + struct Entry { + ProFile *pro; +#ifdef PROPARSER_THREAD_SAFE + struct Locker { + Locker() : waiters(0), done(false) {} + QWaitCondition cond; + int waiters; + bool done; + }; + Locker *locker; +#endif + }; + + QHash<QString, Entry> parsed_files; +#ifdef PROPARSER_THREAD_SAFE + QMutex mutex; +#endif + + friend class ProFileParser; +}; + +#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) +Q_DECLARE_TYPEINFO(ProFileParser::BlockScope, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(ProFileParser::Context, Q_PRIMITIVE_TYPE); +#endif + +QT_END_NAMESPACE + +#endif // PROFILEPARSER_H diff --git a/tools/linguist/shared/proitems.cpp b/tools/linguist/shared/proitems.cpp index 5c88686..103a788 100644 --- a/tools/linguist/shared/proitems.cpp +++ b/tools/linguist/shared/proitems.cpp @@ -40,319 +40,335 @@ ****************************************************************************/ #include "proitems.h" -#include "abstractproitemvisitor.h" #include <QtCore/QFileInfo> +#include <QtCore/QSet> QT_BEGIN_NAMESPACE -// --------------- ProItem ------------ -void ProItem::setComment(const QString &comment) -{ - m_comment = comment; -} - -QString ProItem::comment() const -{ - return m_comment; -} - -// --------------- ProBlock ---------------- - -ProBlock::ProBlock(ProBlock *parent) -{ - m_blockKind = 0; - m_parent = parent; - m_refCount = 1; -} - -ProBlock::~ProBlock() -{ - foreach (ProItem *itm, m_proitems) - if (itm->kind() == BlockKind) - static_cast<ProBlock *>(itm)->deref(); - else - delete itm; -} - -void ProBlock::appendItem(ProItem *proitem) -{ - m_proitems << proitem; -} +using namespace ProStringConstants; -void ProBlock::setItems(const QList<ProItem *> &proitems) +// from qhash.cpp +uint ProString::hash(const QChar *p, int n) { - m_proitems = proitems; -} + uint h = 0; -QList<ProItem *> ProBlock::items() const -{ - return m_proitems; -} - -void ProBlock::setBlockKind(int blockKind) -{ - m_blockKind = blockKind; + while (n--) { + h = (h << 4) + (*p++).unicode(); + h ^= (h & 0xf0000000) >> 23; + h &= 0x0fffffff; + } + return h; } -int ProBlock::blockKind() const +ProString::ProString() : + m_offset(0), m_length(0), m_file(0), m_hash(0x80000000) { - return m_blockKind; } -void ProBlock::setParent(ProBlock *parent) +ProString::ProString(const ProString &other) : + m_string(other.m_string), m_offset(other.m_offset), m_length(other.m_length), m_file(other.m_file), m_hash(other.m_hash) { - m_parent = parent; } -ProBlock *ProBlock::parent() const +ProString::ProString(const ProString &other, OmitPreHashing) : + m_string(other.m_string), m_offset(other.m_offset), m_length(other.m_length), m_file(other.m_file), m_hash(0x80000000) { - return m_parent; } -ProItem::ProItemKind ProBlock::kind() const +ProString::ProString(const QString &str) : + m_string(str), m_offset(0), m_length(str.length()), m_file(0) { - return ProItem::BlockKind; + updatedHash(); } -ProItem::ProItemReturn ProBlock::Accept(AbstractProItemVisitor *visitor) +ProString::ProString(const QString &str, OmitPreHashing) : + m_string(str), m_offset(0), m_length(str.length()), m_file(0), m_hash(0x80000000) { - if (visitor->visitBeginProBlock(this) == ReturnSkip) - return ReturnTrue; - ProItemReturn rt = ReturnTrue; - for (int i = 0; i < m_proitems.count(); ++i) { - rt = m_proitems.at(i)->Accept(visitor); - if (rt != ReturnTrue && rt != ReturnFalse) { - if (rt == ReturnLoop) { - rt = ReturnTrue; - while (visitor->visitProLoopIteration()) - for (int j = i; ++j < m_proitems.count(); ) { - rt = m_proitems.at(j)->Accept(visitor); - if (rt != ReturnTrue && rt != ReturnFalse) { - if (rt == ReturnNext) { - rt = ReturnTrue; - break; - } - if (rt == ReturnBreak) - rt = ReturnTrue; - goto do_break; - } - } - do_break: - visitor->visitProLoopCleanup(); - } - break; - } - } - visitor->visitEndProBlock(this); - return rt; } -// --------------- ProVariable ---------------- -ProVariable::ProVariable(const QString &name, ProBlock *parent) - : ProBlock(parent) +ProString::ProString(const char *str) : + m_string(QString::fromLatin1(str)), m_offset(0), m_length(qstrlen(str)), m_file(0) { - setBlockKind(ProBlock::VariableKind); - m_variable = name; - m_variableKind = SetOperator; + updatedHash(); } -void ProVariable::setVariableOperator(VariableOperator variableKind) +ProString::ProString(const char *str, OmitPreHashing) : + m_string(QString::fromLatin1(str)), m_offset(0), m_length(qstrlen(str)), m_file(0), m_hash(0x80000000) { - m_variableKind = variableKind; } -ProVariable::VariableOperator ProVariable::variableOperator() const +ProString::ProString(const QString &str, int offset, int length) : + m_string(str), m_offset(offset), m_length(length), m_file(0) { - return m_variableKind; + updatedHash(); } -void ProVariable::setVariable(const QString &name) +ProString::ProString(const QString &str, int offset, int length, uint hash) : + m_string(str), m_offset(offset), m_length(length), m_file(0), m_hash(hash) { - m_variable = name; } -QString ProVariable::variable() const +ProString::ProString(const QString &str, int offset, int length, ProStringConstants::OmitPreHashing) : + m_string(str), m_offset(offset), m_length(length), m_file(0), m_hash(0x80000000) { - return m_variable; } -ProItem::ProItemReturn ProVariable::Accept(AbstractProItemVisitor *visitor) +void ProString::setValue(const QString &str) { - visitor->visitBeginProVariable(this); - foreach (ProItem *item, m_proitems) - item->Accept(visitor); // cannot fail - visitor->visitEndProVariable(this); - return ReturnTrue; + m_string = str, m_offset = 0, m_length = str.length(); + updatedHash(); } -// --------------- ProValue ---------------- -ProValue::ProValue(const QString &value, ProVariable *variable) +void ProString::setValue(const QString &str, OmitPreHashing) { - m_variable = variable; - m_value = value; + m_string = str, m_offset = 0, m_length = str.length(), m_hash = 0x80000000; } -void ProValue::setValue(const QString &value) +uint ProString::updatedHash() const { - m_value = value; + return (m_hash = hash(m_string.constData() + m_offset, m_length)); } -QString ProValue::value() const +uint qHash(const ProString &str) { - return m_value; + if (!(str.m_hash & 0x80000000)) + return str.m_hash; + return str.updatedHash(); } -void ProValue::setVariable(ProVariable *variable) +QString ProString::toQString() const { - m_variable = variable; + return m_string.mid(m_offset, m_length); } -ProVariable *ProValue::variable() const +QString &ProString::toQString(QString &tmp) const { - return m_variable; + return tmp.setRawData(m_string.constData() + m_offset, m_length); } -ProItem::ProItemKind ProValue::kind() const +bool ProString::operator==(const ProString &other) const { - return ProItem::ValueKind; + if (m_length != other.m_length) + return false; + return !memcmp(m_string.constData() + m_offset, + other.m_string.constData() + other.m_offset, m_length * 2); } -ProItem::ProItemReturn ProValue::Accept(AbstractProItemVisitor *visitor) +bool ProString::operator==(const QString &other) const { - visitor->visitProValue(this); - return ReturnTrue; + if (m_length != other.length()) + return false; + return !memcmp(m_string.constData() + m_offset, other.constData(), m_length * 2); } -// --------------- ProFunction ---------------- -ProFunction::ProFunction(const QString &text) +bool ProString::operator==(const QLatin1String &other) const { - m_text = text; -} + const ushort *uc = (ushort *)m_string.constData() + m_offset; + const ushort *e = uc + m_length; + const uchar *c = (uchar *)other.latin1(); -void ProFunction::setText(const QString &text) -{ - m_text = text; -} + if (!c) + return isEmpty(); -QString ProFunction::text() const -{ - return m_text; -} - -ProItem::ProItemKind ProFunction::kind() const -{ - return ProItem::FunctionKind; -} - -ProItem::ProItemReturn ProFunction::Accept(AbstractProItemVisitor *visitor) -{ - return visitor->visitProFunction(this); + while (*c) { + if (uc == e || *uc != *c) + return false; + ++uc; + ++c; + } + return (uc == e); +} + +QChar *ProString::prepareAppend(int extraLen) +{ + if (m_string.isDetached() && m_length + extraLen <= m_string.capacity()) { + m_string.reserve(0); // Prevent the resize() below from reallocating + QChar *ptr = (QChar *)m_string.constData(); + if (m_offset) + memmove(ptr, ptr + m_offset, m_length * 2); + ptr += m_length; + m_offset = 0; + m_length += extraLen; + m_string.resize(m_length); + m_hash = 0x80000000; + return ptr; + } else { + QString neu(m_length + extraLen, Qt::Uninitialized); + QChar *ptr = (QChar *)neu.constData(); + memcpy(ptr, m_string.constData() + m_offset, m_length * 2); + ptr += m_length; + *this = ProString(neu, NoHash); + return ptr; + } } -// --------------- ProCondition ---------------- -ProCondition::ProCondition(const QString &text) +// If pending != 0, prefix with space if appending to non-empty non-pending +ProString &ProString::append(const ProString &other, bool *pending) { - m_text = text; + if (other.m_length) { + if (!m_length) { + *this = other; + } else { + QChar *ptr; + if (pending && !*pending) { + ptr = prepareAppend(1 + other.m_length); + *ptr++ = 32; + } else { + ptr = prepareAppend(other.m_length); + } + memcpy(ptr, other.m_string.constData() + other.m_offset, other.m_length * 2); + if (other.m_file) + m_file = other.m_file; + } + if (pending) + *pending = true; + } + return *this; } -void ProCondition::setText(const QString &text) +ProString &ProString::append(const ProStringList &other, bool *pending, bool skipEmpty1st) { - m_text = text; + if (const int sz = other.size()) { + int startIdx = 0; + if (pending && !*pending && skipEmpty1st && other.at(0).isEmpty()) { + if (sz == 1) + return *this; + startIdx = 1; + } + if (!m_length && sz == startIdx + 1) { + *this = other.at(startIdx); + } else { + int totalLength = sz - startIdx; + for (int i = startIdx; i < sz; ++i) + totalLength += other.at(i).size(); + bool putSpace = false; + if (pending && !*pending && m_length) + putSpace = true; + else + totalLength--; + + QChar *ptr = prepareAppend(totalLength); + for (int i = startIdx; i < sz; ++i) { + if (putSpace) + *ptr++ = 32; + else + putSpace = true; + const ProString &str = other.at(i); + memcpy(ptr, str.m_string.constData() + str.m_offset, str.m_length * 2); + ptr += str.m_length; + } + if (other.last().m_file) + m_file = other.last().m_file; + } + if (pending) + *pending = true; + } + return *this; } -QString ProCondition::text() const +QString operator+(const ProString &one, const ProString &two) { - return m_text; + if (two.m_length) { + if (!one.m_length) { + return two.toQString(); + } else { + QString neu(one.m_length + two.m_length, Qt::Uninitialized); + ushort *ptr = (ushort *)neu.constData(); + memcpy(ptr, one.m_string.constData() + one.m_offset, one.m_length * 2); + memcpy(ptr + one.m_length, two.m_string.constData() + two.m_offset, two.m_length * 2); + return neu; + } + } + return one.toQString(); } -ProItem::ProItemKind ProCondition::kind() const -{ - return ProItem::ConditionKind; -} -ProItem::ProItemReturn ProCondition::Accept(AbstractProItemVisitor *visitor) +ProString ProString::mid(int off, int len) const { - visitor->visitProCondition(this); - return ReturnTrue; + ProString ret(*this, NoHash); + if (off > m_length) + off = m_length; + ret.m_offset += off; + ret.m_length -= off; + if (ret.m_length > len) + ret.m_length = len; + return ret; } -// --------------- ProOperator ---------------- -ProOperator::ProOperator(OperatorKind operatorKind) +ProString ProString::trimmed() const { - m_operatorKind = operatorKind; + ProString ret(*this, NoHash); + int cur = m_offset; + int end = cur + m_length; + const QChar *data = m_string.constData(); + for (; cur < end; cur++) + if (!data[cur].isSpace()) { + // No underrun check - we know there is at least one non-whitespace + while (data[end - 1].isSpace()) + end--; + break; + } + ret.m_offset = cur; + ret.m_length = end - cur; + return ret; } -void ProOperator::setOperatorKind(OperatorKind operatorKind) +QString ProStringList::join(const QString &sep) const { - m_operatorKind = operatorKind; -} + int totalLength = 0; + const int sz = size(); -ProOperator::OperatorKind ProOperator::operatorKind() const -{ - return m_operatorKind; -} + for (int i = 0; i < sz; ++i) + totalLength += at(i).size(); -ProItem::ProItemKind ProOperator::kind() const -{ - return ProItem::OperatorKind; -} + if (sz) + totalLength += sep.size() * (sz - 1); -ProItem::ProItemReturn ProOperator::Accept(AbstractProItemVisitor *visitor) -{ - visitor->visitProOperator(this); - return ReturnTrue; + QString res(totalLength, Qt::Uninitialized); + QChar *ptr = (QChar *)res.constData(); + for (int i = 0; i < sz; ++i) { + if (i) { + memcpy(ptr, sep.constData(), sep.size() * 2); + ptr += sep.size(); + } + memcpy(ptr, at(i).constData(), at(i).size() * 2); + ptr += at(i).size(); + } + return res; +} + +void ProStringList::removeDuplicates() +{ + int n = size(); + int j = 0; + QSet<ProString> seen; + seen.reserve(n); + for (int i = 0; i < n; ++i) { + const ProString &s = at(i); + if (seen.contains(s)) + continue; + seen.insert(s); + if (j != i) + (*this)[j] = s; + ++j; + } + if (n != j) + erase(begin() + j, end()); } -// --------------- ProFile ---------------- ProFile::ProFile(const QString &fileName) - : ProBlock(0) + : m_refCount(1), + m_fileName(fileName), + m_ok(true) { - m_modified = false; - setBlockKind(ProBlock::ProFileKind); - m_fileName = fileName; - - QFileInfo fi(fileName); - m_displayFileName = fi.fileName(); - m_directoryName = fi.absolutePath(); + if (!fileName.startsWith(QLatin1Char('('))) + m_directoryName = QFileInfo( // qmake sickness: canonicalize only the directory! + fileName.left(fileName.lastIndexOf(QLatin1Char('/')))).canonicalFilePath(); } ProFile::~ProFile() { } -QString ProFile::displayFileName() const -{ - return m_displayFileName; -} - -QString ProFile::fileName() const -{ - return m_fileName; -} - -QString ProFile::directoryName() const -{ - return m_directoryName; -} - -void ProFile::setModified(bool modified) -{ - m_modified = modified; -} - -bool ProFile::isModified() const -{ - return m_modified; -} - -ProItem::ProItemReturn ProFile::Accept(AbstractProItemVisitor *visitor) -{ - ProItemReturn rt; - if ((rt = visitor->visitBeginProFile(this)) != ReturnTrue) - return rt; - ProBlock::Accept(visitor); // cannot fail - return visitor->visitEndProFile(this); -} - QT_END_NAMESPACE diff --git a/tools/linguist/shared/proitems.h b/tools/linguist/shared/proitems.h index f4bf183..a687410 100644 --- a/tools/linguist/shared/proitems.h +++ b/tools/linguist/shared/proitems.h @@ -42,205 +42,188 @@ #ifndef PROITEMS_H #define PROITEMS_H +#include "proparser_global.h" #include <QtCore/QString> -#include <QtCore/QList> +#include <QtCore/QVector> QT_BEGIN_NAMESPACE -struct AbstractProItemVisitor; - -class ProItem -{ +#ifdef PROPARSER_THREAD_SAFE +typedef QAtomicInt ProItemRefCount; +#else +class ProItemRefCount { public: - enum ProItemKind { - ValueKind, - FunctionKind, - ConditionKind, - OperatorKind, - BlockKind - }; - - enum ProItemReturn { - ReturnFalse, - ReturnTrue, - ReturnBreak, - ReturnNext, - ReturnLoop, - ReturnSkip, - ReturnReturn - }; - - ProItem() : m_lineNumber(0) {} - virtual ~ProItem() {} - - virtual ProItemKind kind() const = 0; - - void setComment(const QString &comment); - QString comment() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor) = 0; - int lineNumber() const { return m_lineNumber; } - void setLineNumber(int lineNumber) { m_lineNumber = lineNumber; } - + ProItemRefCount(int cnt = 0) : m_cnt(cnt) {} + bool ref() { return ++m_cnt != 0; } + bool deref() { return --m_cnt != 0; } + ProItemRefCount &operator=(int value) { m_cnt = value; return *this; } private: - QString m_comment; - int m_lineNumber; + int m_cnt; }; +#endif -class ProBlock : public ProItem -{ -public: - enum ProBlockKind { - NormalKind = 0x00, - ScopeKind = 0x01, - ScopeContentsKind = 0x02, - VariableKind = 0x04, - ProFileKind = 0x08, - FunctionBodyKind = 0x10, - SingleLine = 0x80 - }; - - ProBlock(ProBlock *parent); - ~ProBlock(); +namespace ProStringConstants { +enum OmitPreHashing { NoHash }; +} - void appendItem(ProItem *proitem); - void setItems(const QList<ProItem *> &proitems); - QList<ProItem *> items() const; +class ProStringList; +class ProFile; - void setBlockKind(int blockKind); - int blockKind() const; - - void setParent(ProBlock *parent); - ProBlock *parent() const; - - void ref() { ++m_refCount; } - void deref() { if (!--m_refCount) delete this; } - - ProItem::ProItemKind kind() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -protected: - QList<ProItem *> m_proitems; -private: - ProBlock *m_parent; - int m_blockKind; - int m_refCount; -}; - -class ProVariable : public ProBlock -{ +class ProString { public: - enum VariableOperator { - AddOperator = 0, - RemoveOperator = 1, - ReplaceOperator = 2, - SetOperator = 3, - UniqueAddOperator = 4 - }; - - ProVariable(const QString &name, ProBlock *parent); + ProString(); + ProString(const ProString &other); + ProString(const ProString &other, ProStringConstants::OmitPreHashing); + explicit ProString(const QString &str); + ProString(const QString &str, ProStringConstants::OmitPreHashing); + explicit ProString(const char *str); + ProString(const char *str, ProStringConstants::OmitPreHashing); + ProString(const QString &str, int offset, int length); + ProString(const QString &str, int offset, int length, uint hash); + ProString(const QString &str, int offset, int length, ProStringConstants::OmitPreHashing); + void setValue(const QString &str); + void setValue(const QString &str, ProStringConstants::OmitPreHashing); + ProString &setSource(const ProString &other) { m_file = other.m_file; return *this; } + ProString &setSource(const ProFile *pro) { m_file = pro; return *this; } + const ProFile *sourceFile() const { return m_file; } + QString toQString() const; + QString &toQString(QString &tmp) const; + ProString &operator+=(const ProString &other); + ProString &append(const ProString &other, bool *pending = 0); + ProString &append(const ProStringList &other, bool *pending = 0, bool skipEmpty1st = false); + bool operator==(const ProString &other) const; + bool operator==(const QString &other) const; + bool operator==(const QLatin1String &other) const; + bool operator!=(const ProString &other) const { return !(*this == other); } + bool operator!=(const QString &other) const { return !(*this == other); } + bool operator!=(const QLatin1String &other) const { return !(*this == other); } + bool isEmpty() const { return !m_length; } + int size() const { return m_length; } + const QChar *constData() const { return m_string.constData() + m_offset; } + ProString mid(int off, int len = -1) const; + ProString left(int len) const { return mid(0, len); } + ProString right(int len) const { return mid(qMax(0, size() - len)); } + ProString trimmed() const; + void clear() { m_string.clear(); m_length = 0; } + + static uint hash(const QChar *p, int n); - void setVariableOperator(VariableOperator variableKind); - VariableOperator variableOperator() const; - - void setVariable(const QString &name); - QString variable() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); private: - VariableOperator m_variableKind; - QString m_variable; + QString m_string; + int m_offset, m_length; + const ProFile *m_file; + mutable uint m_hash; + QChar *prepareAppend(int extraLen); + uint updatedHash() const; + friend uint qHash(const ProString &str); + friend QString operator+(const ProString &one, const ProString &two); }; +Q_DECLARE_TYPEINFO(ProString, Q_MOVABLE_TYPE); -class ProValue : public ProItem -{ -public: - ProValue(const QString &value, ProVariable *variable); - - void setValue(const QString &value); - QString value() const; - - void setVariable(ProVariable *variable); - ProVariable *variable() const; +uint qHash(const ProString &str); +QString operator+(const ProString &one, const ProString &two); +inline QString operator+(const ProString &one, const QString &two) + { return one + ProString(two, ProStringConstants::NoHash); } +inline QString operator+(const QString &one, const ProString &two) + { return ProString(one, ProStringConstants::NoHash) + two; } - ProItem::ProItemKind kind() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -private: - QString m_value; - ProVariable *m_variable; -}; - -class ProFunction : public ProItem -{ -public: - explicit ProFunction(const QString &text); - - void setText(const QString &text); - QString text() const; - - ProItem::ProItemKind kind() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -private: - QString m_text; -}; - -class ProCondition : public ProItem -{ +class ProStringList : public QVector<ProString> { public: - explicit ProCondition(const QString &text); - - void setText(const QString &text); - QString text() const; - - ProItem::ProItemKind kind() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -private: - QString m_text; + ProStringList() {} + ProStringList(const ProString &str) { *this << str; } + QString join(const QString &sep) const; + void removeDuplicates(); }; -class ProOperator : public ProItem -{ -public: - enum OperatorKind { - OrOperator = 1, - NotOperator = 2 - }; - - explicit ProOperator(OperatorKind operatorKind); - - void setOperatorKind(OperatorKind operatorKind); - OperatorKind operatorKind() const; - - ProItem::ProItemKind kind() const; - - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -private: - OperatorKind m_operatorKind; +// These token definitions affect both ProFileEvaluator and ProWriter +enum ProToken { + TokTerminator = 0, // end of stream (possibly not included in length; must be zero) + TokLine, // line marker: + // - line (1) + TokAssign, // variable = + TokAppend, // variable += + TokAppendUnique, // variable *= + TokRemove, // variable -= + TokReplace, // variable ~= + // previous literal/expansion is a variable manipulation + // - value expression + TokValueTerminator + TokValueTerminator, // assignment value terminator + TokLiteral, // literal string (fully dequoted) + // - length (1) + // - string data (length; unterminated) + TokHashLiteral, // literal string with hash (fully dequoted) + // - hash (2) + // - length (1) + // - string data (length; unterminated) + TokVariable, // qmake variable expansion + // - hash (2) + // - name length (1) + // - name (name length; unterminated) + TokProperty, // qmake property expansion + // - name length (1) + // - name (name length; unterminated) + TokEnvVar, // environment variable expansion + // - name length (1) + // - name (name length; unterminated) + TokFuncName, // replace function expansion + // - hash (2) + // - name length (1) + // - name (name length; unterminated) + // - ((nested expansion + TokArgSeparator)* + nested expansion)? + // - TokFuncTerminator + TokArgSeparator, // function argument separator + TokFuncTerminator, // function argument list terminator + TokCondition, // previous literal/expansion is a conditional + TokTestCall, // previous literal/expansion is a test function call + // - ((nested expansion + TokArgSeparator)* + nested expansion)? + // - TokFuncTerminator + TokNot, // '!' operator + TokAnd, // ':' operator + TokOr, // '|' operator + TokBranch, // branch point: + // - then block length (2) + // - then block + TokTerminator (then block length) + // - else block length (2) + // - else block + TokTerminator (else block length) + TokForLoop, // for loop: + // - variable name: hash (2), length (1), chars (length) + // - expression: length (2), bytes + TokValueTerminator (length) + // - body length (2) + // - body + TokTerminator (body length) + TokTestDef, // test function definition: + TokReplaceDef, // replace function definition: + // - function name: hash (2), length (1), chars (length) + // - body length (2) + // - body + TokTerminator (body length) + TokMask = 0xff, + TokQuoted = 0x100, // The expression is quoted => join expanded stringlist + TokNewStr = 0x200 // Next stringlist element }; -class ProFile : public ProBlock +class PROPARSER_EXPORT ProFile { public: explicit ProFile(const QString &fileName); ~ProFile(); - QString displayFileName() const; - QString fileName() const; - QString directoryName() const; + QString fileName() const { return m_fileName; } + QString directoryName() const { return m_directoryName; } + const QString &items() const { return m_proitems; } + QString *itemsRef() { return &m_proitems; } + const ushort *tokPtr() const { return (const ushort *)m_proitems.constData(); } - void setModified(bool modified); - bool isModified() const; + void ref() { m_refCount.ref(); } + void deref() { if (!m_refCount.deref()) delete this; } - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); + bool isOk() const { return m_ok; } + void setOk(bool ok) { m_ok = ok; } private: + ProItemRefCount m_refCount; + QString m_proitems; QString m_fileName; - QString m_displayFileName; QString m_directoryName; - bool m_modified; + bool m_ok; }; QT_END_NAMESPACE diff --git a/tools/linguist/shared/proparser.pri b/tools/linguist/shared/proparser.pri index 372247e..829c8cd 100644 --- a/tools/linguist/shared/proparser.pri +++ b/tools/linguist/shared/proparser.pri @@ -1,12 +1,17 @@ INCLUDEPATH *= $$PWD +DEFINES += PROEVALUATOR_CUMULATIVE PROEVALUATOR_INIT_PROPS + HEADERS += \ - $$PWD/abstractproitemvisitor.h \ + $$PWD/proparser_global.h \ + $$PWD/ioutils.h \ $$PWD/proitems.h \ - $$PWD/profileevaluator.h \ - $$PWD/proparserutils.h + $$PWD/profileparser.h \ + $$PWD/profileevaluator.h SOURCES += \ + $$PWD/ioutils.cpp \ $$PWD/proitems.cpp \ - $$PWD/profileevaluator.cpp + $$PWD/profileparser.cpp \ + $$PWD/profileevaluator.cpp diff --git a/src/plugins/s60/src/qdesktopservices_3_1.cpp b/tools/linguist/shared/proparser_global.h index 4b04733..2b0b6db 100644 --- a/src/plugins/s60/src/qdesktopservices_3_1.cpp +++ b/tools/linguist/shared/proparser_global.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the plugins of the Qt Toolkit. +** This file is part of the Qt Linguist of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage @@ -39,11 +39,19 @@ ** ****************************************************************************/ -#include <qglobal.h> -#include <qstring.h> +#ifndef PROPARSER_GLOBAL_H +#define PROPARSER_GLOBAL_H -EXPORT_C QString localizedDirectoryName(QString&) -{ - qWarning("QDesktopServices::displayName() not implemented for this platform version"); - return QString(); -} +#include <QtCore/qglobal.h> + +#if defined(PROPARSER_AS_LIBRARY) +# if defined(PROPARSER_LIBRARY) +# define PROPARSER_EXPORT Q_DECL_EXPORT +# else +# define PROPARSER_EXPORT Q_DECL_IMPORT +# endif +#else +# define PROPARSER_EXPORT +#endif + +#endif diff --git a/tools/linguist/shared/proparserutils.h b/tools/linguist/shared/proparserutils.h deleted file mode 100644 index d567a73..0000000 --- a/tools/linguist/shared/proparserutils.h +++ /dev/null @@ -1,324 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Qt Linguist 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 PROPARSERUTILS_H -#define PROPARSERUTILS_H - -#include <QtCore/QDir> -#ifndef QT_BOOTSTRAPPED -#include <QtCore/QLibraryInfo> -#endif - -QT_BEGIN_NAMESPACE - -#ifdef QT_BOOTSTRAPPED -// this is a stripped down version of the one found in QtCore -class QLibraryInfo -{ -public: - enum LibraryLocation - { - PrefixPath, - DocumentationPath, - HeadersPath, - LibrariesPath, - BinariesPath, - PluginsPath, - DataPath, - TranslationsPath, - SettingsPath, - DemosPath, - ExamplesPath - }; - static QString location(LibraryLocation); -}; -#endif - -// Pre- and postcondition macros -#define PRE(cond) do {if (!(cond))qt_assert(#cond,__FILE__,__LINE__);} while (0) -#define POST(cond) do {if (!(cond))qt_assert(#cond,__FILE__,__LINE__);} while (0) - -// This struct is from qmake, but we are not using everything. -struct Option -{ - //simply global convenience - //static QString libtool_ext; - //static QString pkgcfg_ext; - //static QString prf_ext; - //static QString prl_ext; - //static QString ui_ext; - //static QStringList h_ext; - //static QStringList cpp_ext; - //static QString h_moc_ext; - //static QString cpp_moc_ext; - //static QString obj_ext; - //static QString lex_ext; - //static QString yacc_ext; - //static QString h_moc_mod; - //static QString cpp_moc_mod; - //static QString lex_mod; - //static QString yacc_mod; - static QString dir_sep; - static QString dirlist_sep; - static QString qmakespec; - static QChar field_sep; - - enum TARG_MODE { TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE, TARG_MAC9_MODE, TARG_QNX6_MODE }; - static TARG_MODE target_mode; - //static QString pro_ext; - //static QString res_ext; - - static void init() - { -#ifdef Q_OS_WIN - Option::dirlist_sep = QLatin1Char(';'); - Option::dir_sep = QLatin1Char('\\'); -#else - Option::dirlist_sep = QLatin1Char(':'); - Option::dir_sep = QLatin1Char(QLatin1Char('/')); -#endif - Option::qmakespec = QString::fromLatin1(qgetenv("QMAKESPEC").data()); - Option::field_sep = QLatin1Char(' '); - } - - enum StringFixFlags { - FixNone = 0x00, - FixEnvVars = 0x01, - FixPathCanonicalize = 0x02, - FixPathToLocalSeparators = 0x04, - FixPathToTargetSeparators = 0x08 - }; - static QString fixString(QString string, uchar flags); - - inline static QString fixPathToLocalOS(const QString &in, bool fix_env = true, bool canonical = true) - { - uchar flags = FixPathToLocalSeparators; - if (fix_env) - flags |= FixEnvVars; - if (canonical) - flags |= FixPathCanonicalize; - return fixString(in, flags); - } -}; -#if defined(Q_OS_WIN32) -Option::TARG_MODE Option::target_mode = Option::TARG_WIN_MODE; -#elif defined(Q_OS_MAC) -Option::TARG_MODE Option::target_mode = Option::TARG_MACX_MODE; -#elif defined(Q_OS_QNX6) -Option::TARG_MODE Option::target_mode = Option::TARG_QNX6_MODE; -#else -Option::TARG_MODE Option::target_mode = Option::TARG_UNIX_MODE; -#endif - -QString Option::qmakespec; -QString Option::dirlist_sep; -QString Option::dir_sep; -QChar Option::field_sep; - -static void insertUnique(QHash<QString, QStringList> *map, - const QString &key, const QStringList &value) -{ - QStringList &sl = (*map)[key]; - foreach (const QString &str, value) - if (!sl.contains(str)) - sl.append(str); -} - -static void removeEach(QHash<QString, QStringList> *map, - const QString &key, const QStringList &value) -{ - QStringList &sl = (*map)[key]; - foreach (const QString &str, value) - sl.removeAll(str); -} - -/* - See ProFileEvaluator::Private::visitProValue(...) - -static QStringList replaceInList(const QStringList &varList, const QRegExp ®exp, - const QString &replace, bool global) -{ - QStringList resultList = varList; - - for (QStringList::Iterator varit = resultList.begin(); varit != resultList.end();) { - if (varit->contains(regexp)) { - *varit = varit->replace(regexp, replace); - if (varit->isEmpty()) - varit = resultList.erase(varit); - else - ++varit; - if (!global) - break; - } else { - ++varit; - } - } - return resultList; -} -*/ - -inline QString fixEnvVariables(const QString &x) -{ - return Option::fixString(x, Option::FixEnvVars); -} - -inline QStringList splitPathList(const QString &paths) -{ - return paths.split(Option::dirlist_sep); -} - -static QStringList split_arg_list(QString params) -{ - int quote = 0; - QStringList args; - - const ushort LPAREN = '('; - const ushort RPAREN = ')'; - const ushort SINGLEQUOTE = '\''; - const ushort DOUBLEQUOTE = '"'; - const ushort COMMA = ','; - const ushort SPACE = ' '; - //const ushort TAB = '\t'; - - ushort unicode; - const QChar *params_data = params.data(); - const int params_len = params.length(); - int last = 0; - while (last < params_len && ((params_data+last)->unicode() == SPACE - /*|| (params_data+last)->unicode() == TAB*/)) - ++last; - for (int x = last, parens = 0; x <= params_len; x++) { - unicode = (params_data+x)->unicode(); - if (x == params_len) { - while (x && (params_data+(x-1))->unicode() == SPACE) - --x; - QString mid(params_data+last, x-last); - if (quote) { - if (mid[0] == quote && mid[(int)mid.length()-1] == quote) - mid = mid.mid(1, mid.length()-2); - quote = 0; - } - args << mid; - break; - } - if (unicode == LPAREN) { - --parens; - } else if (unicode == RPAREN) { - ++parens; - } else if (quote && unicode == quote) { - quote = 0; - } else if (!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { - quote = unicode; - } - if (!parens && !quote && unicode == COMMA) { - QString mid = params.mid(last, x - last).trimmed(); - args << mid; - last = x+1; - while (last < params_len && ((params_data+last)->unicode() == SPACE - /*|| (params_data+last)->unicode() == TAB*/)) - ++last; - } - } - return args; -} - -static QStringList split_value_list(const QString &vals, bool do_semicolon=false) -{ - QString build; - QStringList ret; - QStack<char> quote; - - const ushort LPAREN = '('; - const ushort RPAREN = ')'; - const ushort SINGLEQUOTE = '\''; - const ushort DOUBLEQUOTE = '"'; - const ushort BACKSLASH = '\\'; - const ushort SEMICOLON = ';'; - - ushort unicode; - const QChar *vals_data = vals.data(); - const int vals_len = vals.length(); - for (int x = 0, parens = 0; x < vals_len; x++) { - unicode = vals_data[x].unicode(); - if (x != (int)vals_len-1 && unicode == BACKSLASH && - (vals_data[x+1].unicode() == SINGLEQUOTE || vals_data[x+1].unicode() == DOUBLEQUOTE)) { - build += vals_data[x++]; //get that 'escape' - } else if (!quote.isEmpty() && unicode == quote.top()) { - quote.pop(); - } else if (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE) { - quote.push(unicode); - } else if (unicode == RPAREN) { - --parens; - } else if (unicode == LPAREN) { - ++parens; - } - - if (!parens && quote.isEmpty() && ((do_semicolon && unicode == SEMICOLON) || - vals_data[x] == Option::field_sep)) { - ret << build; - build.clear(); - } else { - build += vals_data[x]; - } - } - if (!build.isEmpty()) - ret << build; - return ret; -} - -static QStringList qmake_mkspec_paths() -{ - QStringList ret; - const QString concat = QDir::separator() + QLatin1String("mkspecs"); - QByteArray qmakepath = qgetenv("QMAKEPATH"); - if (!qmakepath.isEmpty()) { - const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath)); - for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) - ret << ((*it) + concat); - } - ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat; - - return ret; -} - -QT_END_NAMESPACE - -#endif // PROPARSERUTILS_H diff --git a/tools/linguist/shared/qm.cpp b/tools/linguist/shared/qm.cpp index b8cfeca..85af251 100644 --- a/tools/linguist/shared/qm.cpp +++ b/tools/linguist/shared/qm.cpp @@ -503,12 +503,7 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) // for squeezed but non-file data, this is what needs to be deleted const uchar *messageArray = 0; const uchar *offsetArray = 0; - const uchar *contextArray = 0; - const uchar *numerusRulesArray = 0; - uint messageLength = 0; uint offsetLength = 0; - uint contextLength = 0; - uint numerusRulesLength = 0; bool ok = true; const uchar *end = data + len; @@ -527,22 +522,13 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) break; } - if (tag == Contexts) { - contextArray = data; - contextLength = blockLen; - //qDebug() << "CONTEXTS: " << contextLength << QByteArray((const char *)contextArray, contextLength).toHex(); - } else if (tag == Hashes) { + if (tag == Hashes) { offsetArray = data; offsetLength = blockLen; - //qDebug() << "HASHES: " << offsetLength << QByteArray((const char *)offsetArray, offsetLength).toHex(); + //qDebug() << "HASHES: " << blockLen << QByteArray((const char *)data, blockLen).toHex(); } else if (tag == Messages) { messageArray = data; - messageLength = blockLen; - //qDebug() << "MESSAGES: " << messageLength << QByteArray((const char *)messageArray, messageLength).toHex(); - } else if (tag == NumerusRules) { - numerusRulesArray = data; - numerusRulesLength = blockLen; - //qDebug() << "NUMERUSRULES: " << numerusRulesLength << QByteArray((const char *)numerusRulesArray, numerusRulesLength).toHex(); + //qDebug() << "MESSAGES: " << blockLen << QByteArray((const char *)data, blockLen).toHex(); } data += blockLen; @@ -697,7 +683,7 @@ static bool containsStripped(const Translator &translator, const TranslatorMessa return false; } -static bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd) +bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd) { Releaser releaser; QLocale::Language l; diff --git a/tools/linguist/shared/simtexth.cpp b/tools/linguist/shared/simtexth.cpp index 31253d6..8933507 100644 --- a/tools/linguist/shared/simtexth.cpp +++ b/tools/linguist/shared/simtexth.cpp @@ -238,9 +238,7 @@ CandidateList similarTextHeuristicCandidates(const Translator *tor, QList<int> scores; CandidateList candidates; - TML all = tor->translatedMessages(); - - foreach (const TranslatorMessage &mtm, all) { + foreach (const TranslatorMessage &mtm, tor->messages()) { if (mtm.type() == TranslatorMessage::Unfinished || mtm.translation().isEmpty()) continue; diff --git a/tools/linguist/shared/translator.cpp b/tools/linguist/shared/translator.cpp index a29372a..bd13bf7 100644 --- a/tools/linguist/shared/translator.cpp +++ b/tools/linguist/shared/translator.cpp @@ -79,7 +79,8 @@ QString QObject::tr(const char *sourceText, const char *, int n) Translator::Translator() : m_codec(QTextCodec::codecForName("ISO-8859-1")), - m_locationsType(AbsoluteLocations) + m_locationsType(AbsoluteLocations), + m_indexOk(true) { } @@ -101,20 +102,58 @@ QList<Translator::FileFormat> &Translator::registeredFileFormats() return theFormats; } +void Translator::addIndex(int idx, const TranslatorMessage &msg) const +{ + if (msg.sourceText().isEmpty() && msg.id().isEmpty()) { + m_ctxCmtIdx[msg.context()] = idx; + } else { + m_msgIdx[TMMKey(msg)] = idx; + if (!msg.id().isEmpty()) + m_idMsgIdx[msg.id()] = idx; + } +} + +void Translator::delIndex(int idx) const +{ + const TranslatorMessage &msg = m_messages.at(idx); + if (msg.sourceText().isEmpty() && msg.id().isEmpty()) { + m_ctxCmtIdx.remove(msg.context()); + } else { + m_msgIdx.remove(TMMKey(msg)); + if (!msg.id().isEmpty()) + m_idMsgIdx.remove(msg.id()); + } +} + +void Translator::ensureIndexed() const +{ + if (!m_indexOk) { + m_indexOk = true; + m_ctxCmtIdx.clear(); + m_idMsgIdx.clear(); + m_msgIdx.clear(); + for (int i = 0; i < m_messages.count(); i++) + addIndex(i, m_messages.at(i)); + } +} + void Translator::replaceSorted(const TranslatorMessage &msg) { int index = find(msg); - if (index == -1) + if (index == -1) { appendSorted(msg); - else + } else { + delIndex(index); m_messages[index] = msg; + addIndex(index, msg); + } } void Translator::extend(const TranslatorMessage &msg) { int index = find(msg); if (index == -1) { - m_messages.append(msg); + append(msg); } else { TranslatorMessage &emsg = m_messages[index]; emsg.addReferenceUniq(msg.fileName(), msg.lineNumber()); @@ -132,16 +171,22 @@ void Translator::extend(const TranslatorMessage &msg) } } +void Translator::insert(int idx, const TranslatorMessage &msg) +{ + addIndex(idx, msg); + m_messages.insert(idx, msg); +} + void Translator::append(const TranslatorMessage &msg) { - m_messages.append(msg); + insert(m_messages.count(), msg); } void Translator::appendSorted(const TranslatorMessage &msg) { int msgLine = msg.lineNumber(); if (msgLine < 0) { - m_messages.append(msg); + append(msg); return; } @@ -189,11 +234,11 @@ void Translator::appendSorted(const TranslatorMessage &msg) thisScore = 1; } if (thisScore > bestScore || (thisScore == bestScore && thisSize > bestSize)) - m_messages.insert(thisIdx, msg); + insert(thisIdx, msg); else if (bestScore) - m_messages.insert(bestIdx, msg); + insert(bestIdx, msg); else - m_messages.append(msg); + append(msg); } static QString guessFormat(const QString &filename, const QString &format) @@ -329,34 +374,20 @@ void Translator::languageAndCountry(const QString &languageCode, } } -bool Translator::release(QFile *iod, ConversionData &cd) const -{ - foreach (const FileFormat &format, registeredFileFormats()) { - if (format.extension == QLatin1String("qm")) - return (*format.saver)(*this, *iod, cd); - } - cd.appendError(QLatin1String("No .qm saver available.")); - return false; -} - int Translator::find(const TranslatorMessage &msg) const { - for (int i = 0; i < m_messages.count(); ++i) { - const TranslatorMessage &tmsg = m_messages.at(i); - if (msg.id().isEmpty() || tmsg.id().isEmpty()) { - if (msg.context() == tmsg.context() - && msg.sourceText() == tmsg.sourceText() - && msg.comment() == tmsg.comment()) - return i; - } else { - if (msg.id() == tmsg.id()) - return i; - } - } - return -1; + ensureIndexed(); + if (msg.id().isEmpty()) + return m_msgIdx.value(TMMKey(msg), -1); + int i = m_idMsgIdx.value(msg.id(), -1); + if (i >= 0) + return i; + i = m_msgIdx.value(TMMKey(msg), -1); + // If both have an id, then find only by id. + return i >= 0 && m_messages.at(i).id().isEmpty() ? i : -1; } -TranslatorMessage Translator::find(const QString &context, +int Translator::find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const { if (!refs.isEmpty()) { @@ -365,75 +396,68 @@ TranslatorMessage Translator::find(const QString &context, foreach (const TranslatorMessage::Reference &itref, it->allReferences()) foreach (const TranslatorMessage::Reference &ref, refs) if (itref == ref) - return *it; + return it - m_messages.constBegin(); } } - return TranslatorMessage(); -} - -bool Translator::contains(const QString &context) const -{ - foreach (const TranslatorMessage &msg, m_messages) - if (msg.context() == context && msg.sourceText().isEmpty() && msg.id().isEmpty()) - return true; - return false; + return -1; } -TranslatorMessage Translator::find(const QString &context) const +int Translator::find(const QString &context) const { - foreach (const TranslatorMessage &msg, m_messages) - if (msg.context() == context && msg.sourceText().isEmpty() && msg.id().isEmpty()) - return msg; - return TranslatorMessage(); + ensureIndexed(); + return m_ctxCmtIdx.value(context, -1); } void Translator::stripObsoleteMessages() { - TMM newmm; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) - if (it->type() != TranslatorMessage::Obsolete) - newmm.append(*it); - m_messages = newmm; + for (TMM::Iterator it = m_messages.begin(); it != m_messages.end(); ) + if (it->type() == TranslatorMessage::Obsolete) + it = m_messages.erase(it); + else + ++it; + m_indexOk = false; } void Translator::stripFinishedMessages() { - TMM newmm; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) - if (it->type() != TranslatorMessage::Finished) - newmm.append(*it); - m_messages = newmm; + for (TMM::Iterator it = m_messages.begin(); it != m_messages.end(); ) + if (it->type() == TranslatorMessage::Finished) + it = m_messages.erase(it); + else + ++it; + m_indexOk = false; } void Translator::stripEmptyContexts() { - TMM newmm; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) - if (it->sourceText() != QLatin1String(ContextComment)) - newmm.append(*it); - m_messages = newmm; + for (TMM::Iterator it = m_messages.begin(); it != m_messages.end();) + if (it->sourceText() == QLatin1String(ContextComment)) + it = m_messages.erase(it); + else + ++it; + m_indexOk = false; } void Translator::stripNonPluralForms() { - TMM newmm; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) - if (it->isPlural()) - newmm.append(*it); - m_messages = newmm; + for (TMM::Iterator it = m_messages.begin(); it != m_messages.end(); ) + if (!it->isPlural()) + it = m_messages.erase(it); + else + ++it; + m_indexOk = false; } void Translator::stripIdenticalSourceTranslations() { - TMM newmm; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) { + for (TMM::Iterator it = m_messages.begin(); it != m_messages.end(); ) { // we need to have just one translation, and it be equal to the source - if (it->translations().count() != 1) - newmm.append(*it); - else if (it->translation() != it->sourceText()) - newmm.append(*it); + if (it->translations().count() == 1 && it->translation() == it->sourceText()) + it = m_messages.erase(it); + else + ++it; } - m_messages = newmm; + m_indexOk = false; } void Translator::dropTranslations() @@ -579,6 +603,7 @@ Translator::Duplicates Translator::resolveDuplicates() } if (!omsg->isTranslated() && msg.isTranslated()) omsg->setTranslations(msg.translations()); + m_indexOk = false; m_messages.removeAt(i); } return dups; @@ -610,20 +635,18 @@ void Translator::reportDuplicates(const Duplicates &dupes, // Used by lupdate to be able to search using absolute paths during merging void Translator::makeFileNamesAbsolute(const QDir &originalPath) { - TMM newmm; for (TMM::iterator it = m_messages.begin(); it != m_messages.end(); ++it) { - TranslatorMessage msg = *it; + TranslatorMessage &msg = *it; + TranslatorMessage::References refs = msg.allReferences(); msg.setReferences(TranslatorMessage::References()); - foreach (const TranslatorMessage::Reference &ref, it->allReferences()) { + foreach (const TranslatorMessage::Reference &ref, refs) { QString fileName = ref.fileName(); QFileInfo fi (fileName); if (fi.isRelative()) fileName = originalPath.absoluteFilePath(fileName); msg.addReference(fileName, ref.lineNumber()); } - newmm.append(msg); } - m_messages = newmm; } QList<TranslatorMessage> Translator::messages() const @@ -631,15 +654,6 @@ QList<TranslatorMessage> Translator::messages() const return m_messages; } -QList<TranslatorMessage> Translator::translatedMessages() const -{ - TMM result; - for (TMM::ConstIterator it = m_messages.begin(); it != m_messages.end(); ++it) - if (it->type() == TranslatorMessage::Finished) - result.append(*it); - return result; -} - QStringList Translator::normalizedTranslations(const TranslatorMessage &msg, int numPlurals) { QStringList translations = msg.translations(); @@ -680,9 +694,7 @@ void Translator::normalizeTranslations(ConversionData &cd) tlns.removeLast(); truncated = true; } - TranslatorMessage msg2(msg); - msg2.setTranslations(tlns); - m_messages[i] = msg2; + m_messages[i].setTranslations(tlns); } } if (truncated) diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index fb9bd2d..3b7bd64 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -118,6 +118,17 @@ public: TranslatorSaveMode m_saveMode; }; +class TMMKey { +public: + TMMKey(const TranslatorMessage &msg) + { context = msg.context(); source = msg.sourceText(); comment = msg.comment(); } + bool operator==(const TMMKey &o) const + { return context == o.context && source == o.source && comment == o.comment; } + QString context, source, comment; +}; +Q_DECLARE_TYPEINFO(TMMKey, Q_MOVABLE_TYPE); +inline uint qHash(const TMMKey &key) { return qHash(key.context) ^ qHash(key.source) ^ qHash(key.comment); } + class Translator { public: @@ -125,14 +136,12 @@ public: bool load(const QString &filename, ConversionData &err, const QString &format /* = "auto" */); bool save(const QString &filename, ConversionData &err, const QString &format /* = "auto" */) const; - bool release(QFile *iod, ConversionData &cd) const; int find(const TranslatorMessage &msg) const; - TranslatorMessage find(const QString &context, + int find(const QString &context, const QString &comment, const TranslatorMessage::References &refs) const; - bool contains(const QString &context) const; - TranslatorMessage find(const QString &context) const; + int find(const QString &context) const; void replaceSorted(const TranslatorMessage &msg); void extend(const TranslatorMessage &msg); // Only for single-location messages @@ -171,7 +180,6 @@ public: void setSourceLanguageCode(const QString &languageCode) { m_sourceLanguage = languageCode; } static QString guessLanguageCodeFromFileName(const QString &fileName); QList<TranslatorMessage> messages() const; - QList<TranslatorMessage> translatedMessages() const; static QStringList normalizedTranslations(const TranslatorMessage &m, int numPlurals); void normalizeTranslations(ConversionData &cd); QStringList normalizedTranslations(const TranslatorMessage &m, ConversionData &cd, bool *ok) const; @@ -179,6 +187,7 @@ public: int messageCount() const { return m_messages.size(); } TranslatorMessage &message(int i) { return m_messages[i]; } const TranslatorMessage &message(int i) const { return m_messages.at(i); } + const TranslatorMessage &constMessage(int i) const { return m_messages.at(i); } void dump() const; // additional file format specific data @@ -212,6 +221,11 @@ public: }; private: + void insert(int idx, const TranslatorMessage &msg); + void addIndex(int idx, const TranslatorMessage &msg) const; + void delIndex(int idx) const; + void ensureIndexed() const; + typedef QList<TranslatorMessage> TMM; // int stores the sequence position. TMM m_messages; @@ -230,11 +244,18 @@ private: QString m_language; QString m_sourceLanguage; ExtraData m_extra; + + mutable bool m_indexOk; + mutable QHash<QString, int> m_ctxCmtIdx; + mutable QHash<QString, int> m_idMsgIdx; + mutable QHash<TMMKey, int> m_msgIdx; }; bool getNumerusInfo(QLocale::Language language, QLocale::Country country, QByteArray *rules, QStringList *forms, const char **gettextRules); +bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd); + /* This is a quick hack. The proper way to handle this would be to extend Translator's interface. diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp index 5667c7a..f398358 100644 --- a/tools/qmlplugindump/main.cpp +++ b/tools/qmlplugindump/main.cpp @@ -65,6 +65,8 @@ #include <signal.h> #endif +QString pluginImportPath; + void collectReachableMetaObjects(const QMetaObject *meta, QSet<const QMetaObject *> *metas) { if (! meta || metas->contains(meta)) @@ -194,7 +196,7 @@ QSet<const QMetaObject *> collectReachableMetaObjects(const QString &importCode, code += " {}\n"; QDeclarativeComponent c(engine); - c.setData(code, QUrl("typeinstance")); + c.setData(code, QUrl::fromLocalFile(pluginImportPath + "/typeinstance.qml")); QObject *object = c.create(); if (object) @@ -334,6 +336,10 @@ private: qml->writeStartObject("Property"); qml->writeScriptBinding(QLatin1String("name"), enquote(QString::fromUtf8(prop.name()))); +#if (QT_VERSION >= QT_VERSION_CHECK(4, 7, 4)) + if (int revision = prop.revision()) + qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision)); +#endif writeTypeProperties(prop.typeName(), prop.isWritable()); qml->writeEndObject(); @@ -362,6 +368,11 @@ private: qml->writeScriptBinding(QLatin1String("name"), enquote(name)); +#if (QT_VERSION >= QT_VERSION_CHECK(4, 7, 4)) + if (int revision = meth.revision()) + qml->writeScriptBinding(QLatin1String("revision"), QString::number(revision)); +#endif + const QString typeName = convertToId(meth.typeName()); if (! typeName.isEmpty()) qml->writeScriptBinding(QLatin1String("type"), enquote(typeName)); @@ -451,7 +462,6 @@ int main(int argc, char *argv[]) QString pluginImportUri; QString pluginImportVersion; - QString pluginImportPath; bool relocatable = true; bool pathImport = false; if (args.size() >= 3) { @@ -488,7 +498,7 @@ int main(int argc, char *argv[]) qWarning() << "Incorrect number of positional arguments"; return EXIT_INVALIDARGUMENTS; } - pluginImportPath = positionalArgs[1]; + pluginImportPath = QDir::fromNativeSeparators(positionalArgs[1]); if (positionalArgs.size() == 3) pluginImportVersion = positionalArgs[2]; } @@ -500,7 +510,7 @@ int main(int argc, char *argv[]) engine->addImportPath(pluginImportPath); // find all QMetaObjects reachable from the builtin module - QByteArray importCode("import QtQuick 1.0\n"); + QByteArray importCode("import QtQuick 1.1\n"); QSet<const QMetaObject *> defaultReachable = collectReachableMetaObjects(importCode, engine); // this will hold the meta objects we want to dump information of @@ -514,7 +524,7 @@ int main(int argc, char *argv[]) importCode += QString("import %0 %1\n").arg(pluginImportUri, pluginImportVersion).toAscii(); } else { // pluginImportVersion can be empty - importCode += QString("import \"%1\" %2\n").arg(pluginImportPath, pluginImportVersion).toAscii(); + importCode += QString("import \".\" %2\n").arg(pluginImportVersion).toAscii(); } // create a component with these imports to make sure the imports are valid @@ -524,7 +534,7 @@ int main(int argc, char *argv[]) code += "QtObject {}"; QDeclarativeComponent c(engine); - c.setData(code, QUrl("typelist")); + c.setData(code, QUrl::fromLocalFile(pluginImportPath + "/typelist.qml")); c.create(); if (!c.errors().isEmpty()) { foreach (const QDeclarativeError &error, c.errors()) diff --git a/tools/qtconfig/mainwindow.cpp b/tools/qtconfig/mainwindow.cpp index d5a0bde..a677a04 100644 --- a/tools/qtconfig/mainwindow.cpp +++ b/tools/qtconfig/mainwindow.cpp @@ -75,7 +75,9 @@ #include <phonon/phononnamespace.h> #endif +#ifdef Q_WS_X11 #include <QtGui/private/qt_x11_p.h> +#endif QT_BEGIN_NAMESPACE @@ -263,10 +265,15 @@ MainWindow::MainWindow() connect(ui->buttonMainColor, SIGNAL(colorChanged(QColor)), SLOT(buildPalette())); connect(ui->buttonWindowColor, SIGNAL(colorChanged(QColor)), SLOT(buildPalette())); +#ifdef Q_WS_X11 if (X11->desktopEnvironment == DE_KDE) ui->colorConfig->hide(); else ui->kdeNoteLabel->hide(); +#else + ui->colorConfig->hide(); + ui->kdeNoteLabel->hide(); +#endif QFontDatabase db; QStringList families = db.families(); @@ -384,7 +391,7 @@ MainWindow::MainWindow() ui->inputStyleCombo->setCurrentIndex(ui->inputStyleCombo->findText(settingsInputStyle)); #else ui->inputStyleCombo->hide(); - ui->inputStyleComboLabel->hide(); + ui->inputStyleLabel->hide(); #endif #if defined(Q_WS_X11) && !defined(QT_NO_XIM) @@ -407,7 +414,7 @@ MainWindow::MainWindow() ui->inputMethodCombo->setCurrentIndex(inputMethodComboIndex); #else ui->inputMethodCombo->hide(); - ui->inputMethodComboLabel->hide(); + ui->inputMethodLabel->hide(); #endif ui->fontEmbeddingCheckBox->setChecked(settings.value(QLatin1String("embedFonts"), true) diff --git a/translations/assistant_ja.ts b/translations/assistant_ja.ts index a3169ab..5c990de 100644 --- a/translations/assistant_ja.ts +++ b/translations/assistant_ja.ts @@ -610,7 +610,7 @@ Reason: </message> <message> <source>Next</source> - <translation>進む</translation> + <translation>次へ</translation> </message> <message> <source>Case Sensitive</source> diff --git a/translations/designer_ja.ts b/translations/designer_ja.ts index ab87644..7fcc66d 100644 --- a/translations/designer_ja.ts +++ b/translations/designer_ja.ts @@ -764,7 +764,7 @@ </message> <message> <source>The skin configuration file '%1' could not be opened.</source> - <translation>スキンの設定ファイル '%1' がオープンできませんでした。</translation> + <translation>スキンの設定ファイル '%1' を開けませんでした。</translation> </message> <message> <source>Syntax error: %1</source> @@ -1060,7 +1060,7 @@ Parsing grid layout minimum size values</extracomment> </message> <message> <source>&Open...</source> - <translation>オープン(&O)...</translation> + <translation>開く(&O)...</translation> </message> <message> <source>&Recent Forms</source> @@ -1304,7 +1304,7 @@ UI ファイルの記述が矛盾しています。</translation> </message> <message> <source>Unknown error</source> - <translation>不明なエラー</translation> + <translation>未知のエラー</translation> </message> <message> <source>An error occurred while running the script for %1: %2 @@ -1451,7 +1451,7 @@ Do you want to update the file location or generate a new form?</source> </message> <message> <source>Could not open file</source> - <translation>ファイルをオープンできませんでした</translation> + <translation>ファイルを開けませんでした</translation> </message> <message> <source>Saved image %1.</source> @@ -1471,7 +1471,7 @@ Do you want to update the file location or generate a new form?</source> </message> <message> <source>Could not write file</source> - <translation>ファイルに書き込むことができませんでした</translation> + <translation>ファイルに書き込めませんでした</translation> </message> <message> <source>&Close Preview</source> @@ -1491,7 +1491,7 @@ Do you want to update the file location or generate a new form?</source> </message> <message> <source>Save &As...</source> - <translation>名前をつけて保存(&A)...</translation> + <translation>名前を付けて保存(&A)...</translation> </message> <message> <source>Save A&ll</source> @@ -1525,7 +1525,7 @@ Do you want to update the file location or generate a new form?</source> <source>The file %1 could not be opened. Reason: %2 Would you like to retry or select a different file?</source> - <translation>ファイル %1 はオープンできませんでした。 + <translation>ファイル %1 を開けませんでした。 原因: %2 リトライしますか、それとも他のファイルを選択しますか?</translation> </message> @@ -1533,7 +1533,7 @@ Would you like to retry or select a different file?</source> <source>It was not possible to write the entire file %1 to disk. Reason:%2 Would you like to retry?</source> - <translation>ファイル %1 の全体をディスクに書き込むことができませんでした。 + <translation>ファイル %1 の全体をディスクに書き込めませんでした。 原因: %2 リトライしますか?</translation> </message> @@ -1876,7 +1876,7 @@ Container pages should only be added by specifying them in XML returned by the d </message> <message> <source>The file <b>%1</b> could not be opened.</source> - <translation>ファイル <b>%1</b> はオープンできませんでした。</translation> + <translation>ファイル <b>%1</b> を開けませんでした。</translation> </message> <message numerus="yes"> <source>There are %n forms with unsaved changes. Do you want to review these changes before quitting?</source> @@ -2164,7 +2164,7 @@ Empty class name passed to widget factory method</extracomment> </message> <message> <source>What's This</source> - <translation>ヘルプ</translation> + <translation>ヒント</translation> </message> <message> <source>Busy</source> @@ -2190,7 +2190,7 @@ Empty class name passed to widget factory method</extracomment> </message> <message> <source>Italic</source> - <translation>イタリック</translation> + <translation>斜体</translation> </message> <message> <source>Underline</source> @@ -2778,7 +2778,7 @@ to </message> <message> <source>Could not write %1: %2</source> - <translation>%1 に書き込むことが出来ませんでした: %2</translation> + <translation>%1 に書き込めませんでした: %2</translation> </message> <message> <source>Open Resource File</source> @@ -2790,11 +2790,11 @@ to </message> <message> <source>Move Up</source> - <translation>上へ移動</translation> + <translation>上に移動</translation> </message> <message> <source>Move Down</source> - <translation>下へ移動</translation> + <translation>下に移動</translation> </message> <message> <source>Add Prefix</source> @@ -3082,7 +3082,7 @@ Do you want overwrite the template?</source> </message> <message> <source>There was an error opening template %1 for writing. Reason: %2</source> - <translation>%1 というテンプレートを書き込み用にオープンしようとしてエラーになりました。理由: %2</translation> + <translation>%1 というテンプレートを書き込み用に開こうととしてエラーになりました。理由: %2</translation> </message> <message> <source>Write Error</source> @@ -3534,7 +3534,7 @@ Do you want overwrite the template?</source> </message> <message> <source>The file %1 could not be opened: %2</source> - <translation>ファイル %1 はオープンできませんでした: %2</translation> + <translation>ファイル %1 を開けませんでした: %2</translation> </message> <message> <source>The file %1 could not be written: %2</source> @@ -3797,19 +3797,19 @@ Do you want overwrite the template?</source> </message> <message> <source>Unable to open the file '%1' for writing: %2</source> - <translation>ファイル '%1' を書き込み用にオープンできませんでした: %2</translation> + <translation>ファイル '%1' を書き込み用に開けません: %2</translation> </message> <message> <source>Open profile</source> - <translation>プロファイルをオープン</translation> + <translation>プロファイルを開く</translation> </message> <message> <source>Open Profile - Error</source> - <translation>プロファイルをオープン - Error</translation> + <translation>プロファイルを開く - エラー</translation> </message> <message> <source>Unable to open the file '%1' for reading: %2</source> - <translation>ファイル '%1' を読み込み用にオープンできませんでした: %2</translation> + <translation>ファイル '%1' を読み込み用に開けません: %2</translation> </message> <message> <source>'%1' is not a valid profile: %2</source> @@ -4558,7 +4558,7 @@ Please select another name.</source> </message> <message> <source>Unable to open the form template file '%1': %2</source> - <translation>フォームのテンプレートファイル '%1' をオープンできません: %2</translation> + <translation>フォームのテンプレートファイル '%1' を開けません: %2</translation> </message> <message> <source>Internal error: No template selected.</source> @@ -4761,7 +4761,7 @@ Please select another name.</source> </message> <message> <source>Refresh</source> - <translation>リフレッシュ</translation> + <translation>更新</translation> </message> <message> <source>Scan for newly installed custom widget plugins.</source> @@ -5256,7 +5256,7 @@ Class: %2</source> </message> <message> <source>&OK</source> - <translation>OK(&O)</translation> + <translation>&OK</translation> </message> <message> <source>&Cancel</source> @@ -5287,7 +5287,7 @@ Class: %2</source> </message> <message> <source>Italic</source> - <translation>イタリック</translation> + <translation>斜体</translation> </message> <message> <source>CTRL+I</source> @@ -5730,7 +5730,7 @@ Class: %2</source> </message> <message> <source>List View</source> - <translation>リスト表示</translation> + <translation>一覧表示</translation> </message> <message> <source>Icon View</source> @@ -5792,7 +5792,7 @@ UI ファイルに矛盾が発生しています。</translation> <name>qdesigner_internal::WizardContainerWidgetTaskMenu</name> <message> <source>Next</source> - <translation>進む</translation> + <translation>次へ</translation> </message> <message> <source>Back</source> diff --git a/translations/linguist_ja.ts b/translations/linguist_ja.ts index 40bb778..9164b75 100644 --- a/translations/linguist_ja.ts +++ b/translations/linguist_ja.ts @@ -84,6 +84,10 @@ <context> <name>DataModel</name> <message> + <source>The translation file '%1' will not be loaded because it is empty.</source> + <translation>翻訳ファイル '%1' が空のためロードできません。</translation> + </message> + <message> <source><qt>Duplicate messages found in '%1':</source> <translation><qt>'%1' に重複したメッセージが見つかりました:</translation> </message> @@ -345,7 +349,7 @@ Return value: 2 on read failures 3 on write failures </source> - <translation type="unfinished"> + <translation> 使い方: lconvert [オプション] <入力ファイル> [<入力ファイル>...] @@ -365,8 +369,8 @@ lconvert は Qt Linguist ツールチェインの一部です。 -i <入力ファイル> --input-file <入力ファイル> 入力ファイルを指定します。<入力ファイル> の指定はダッシュ記号で始まっていてもよいです。 - This option can be used several times to merge inputs. - May be '-' (標準入力) for use in a pipe. + このオプションはマージする入力ファイルを指定する際に複数回使用できます。 + パイプで利用する場合には '-' で標準入力を指定します。 -o <出力ファイル> --output-file <出力ファイル> @@ -382,29 +386,30 @@ lconvert は Qt Linguist ツールチェインの一部です。 出力形式を指定します。-if を参照してください。 --input-codec <コーデック> - Specify encoding for QM and PO input files. Default is 'Latin1' - for QM and 'UTF-8' for PO files. UTF-8 is always tried as well for - QM, corresponding to the possible use of the trUtf8() function. + QM や PO ファイルのエンコーディングを指定します。デフォルトでは + QM ファイルでは 'Latin1' を PO ファイルでは 'UTF-8' を使用します。 + QM ファイルでは通常 trUtf8() 関数が組み合わせて利用されるため、 + UTF-8 の利用も試みます。 --output-codec <コーデック> - Specify encoding for PO output files.デフォルトは 'UTF-8' です。 + PO 出力ファイルのエンコーディングを指定します。デフォルトは 'UTF-8' です。 --drop-tags <正規表現> - Drop named extra tags when writing TS or XLIFF files. - May be specified repeatedly. + TS ファイルや XLIFF ファイルに出力する際に名前付き拡張タグを削除します。 + 複数回指定可能です。 --drop-translations - Drop existing translations and reset the status to 'unfinished'. - 注意: --no-obsolete と同等です。 + 既存の翻訳を削除してステータスを'未完了'にリセットします。 + 注意: --no-obsolete の指定を含みます。 --source-language <language>[_<region>] - Specify/override the language of the source strings. Defaults to - POSIX if not specified and the file does not name it yet. + ソーステキストの言語を指定もしくは上書きします。 + 未指定でファイルにも記述されていない場合、POSIX をデフォルトで使用します。 --target-language <language>[_<region>] - Specify/override the language of the translation. - The target language is guessed from the file name if this option - is not specified and the file contents name no language yet. + 翻訳で使用される言語を指定もしくは上書きします。 + オプションやファイル内で言語が指定されていない場合は、 + ファイル名から言語を推測します。 --no-obsolete 未使用のメッセージを取り除きます。 @@ -416,14 +421,14 @@ lconvert は Qt Linguist ツールチェインの一部です。 出力する TS ファイル内のコンテキストをアルファベット順にソートします。 --locations {absolute|relative|none} - Override how source code references are saved in TS files. - Default is absolute. + TS ファイル内に保存されているソースコードへの参照を上書きします。 + デフォルトは absolute (絶対パス) です。 --no-ui-lines UI ファイルを参照している行番号を取り除きます。 --verbose - be a bit more verbose + より詳しいログを出力します。 長すぎるオプションの指定はダッシュ記号で括る事で1つにできます。 @@ -489,13 +494,14 @@ Options: -version Display the version of lrelease and exit </source> - <translation type="unfinished">使い方: + <translation>使い方: lrelease [オプション] project-file lrelease [オプション] ts-files [-qm qm-file] -lrelease is part of Qt's Linguist tool chain. It can be used as a -stand-alone tool to convert XML-based translations files in the TS -format into the 'compiled' QM format used by QTranslator objects. +lrelease は Qt Linguist ツールチェインの一部です。 +XMLベースの翻訳ファイルであるTSフォーマットを +QTranslatorで利用可能な「コンパイル済み」のQMフォーマットに +変換する事ができるスタンドアロンのツールです。 オプション: -help このヘルプを表示して終了します @@ -506,13 +512,13 @@ format into the 'compiled' QM format used by QTranslator objects. -nounfinished 未完了の翻訳をインクルードしません -removeidentical - If the translated text is the same as - the source text, do not include the message + 翻訳後の文字列がソースと同じ場合、 + メッセージをQMファイルに組み込みません -markuntranslated <プレフィクス> - If a message has no real translation, use the source text - prefixed with the given string instead + メッセージが翻訳されていない場合、ソースの文字列に + <プレフィックス>を追加した文字列を代わりに使用します -silent - 完了した事を通知しません + 実行内容を表示しません -version lrelease のバージョンを表示して終了します </translation> @@ -823,62 +829,62 @@ Options: @lst-file Read additional file names (one per line) from lst-file. </source> - <translation type="unfinished">使い方: + <translation>使い方: lupdate [オプション] [プロジェクトファイル]... lupdate [オプション] [source-file|path|@lst-file]... -ts ts-files|@lst-file -lupdate は Qt' Linguist ツールチェインの一部です。Qt UI ファイル、C++ 、Java、 +lupdate は Qt Linguist ツールチェインの一部です。Qt UI ファイル、C++ 、Java、 JavaScript/QtScript のソースコードからメッセージを抽出します。 -Extracted messages are stored in textual translation source files (typically -Qt TS XML). 新しく追加されたり変更されたメッセージは既存の TS ファイル内のメッセージから -マージされます。 +抽出されたメッセージは原文として翻訳ソースファイル(通常は Qt TS XML)に保存されます。 +新しく追加されたり変更されたメッセージは既存の TS ファイル内のメッセージからマージされます。 オプション: -help このヘルプを表示して終了します。 -no-obsolete - すべての未使用の文字列を取り除きます。 + すべての未使用の文字列を取り除きます。 -extensions <ext>[,<ext>]... - 与えられた拡張子のファイルだけ処理します。 - 拡張子のリストはカンマで区切り、空白スペースを含んではいけません。 - デフォルト: '%1' + 与えられた拡張子のファイルだけを処理します。 + 拡張子のリストはカンマで区切り、空白スペースを含んではいけません。 + デフォルト: '%1' -pluralonly - 複数形のメッセージだけインクルードします。 + 複数形のメッセージだけインクルードします。 -silent - 完了した事を通知しません + 完了した事を通知しません -no-sort - TS ファイル内のコンテキストをソートしません。 + TS ファイル内のコンテキストをソートしません。 -no-recursive - ディレクトリ内を再帰的に処理しません。 + ディレクトリ内を再帰的に処理しません。 -recursive - ディレクトリ内を再帰的に処理します。(デフォルト) + ディレクトリ内を再帰的に処理します。(デフォルト) -I <includepath> or -I<includepath> - Additional location to look for include files. - May be specified multiple times. + include ファイルを検索するパスを追加します。 + 複数回の指定が可能です。 -locations {absolute|relative|none} - Specify/override how source code references are saved in TS files. - Default is absolute. + TS ファイルに保存されるソースコードの参照方法を指定/上書きします。 + デフォルトは absolute (絶対パス)です。 -no-ui-lines - UI ファイルを参照する行番号を記録しません。 + UI ファイルを参照する行番号を記録しません。 -disable-heuristic {sametext|similartext|number} - Disable the named merge heuristic. Can be specified multiple times. + 指定された手法のあいまいマージを行いません。複数回の指定が可能です。 -pro <ファイル名> - .pro ファイルの名前を指定します。Useful for files with .pro file syntax but - different file suffix. Projects are recursed into and merged. + .pro ファイルの名前を指定します。.pro ファイルの書式に従いながら、 + 拡張子が異なる場合に有用です。 + プロジェクトは再帰的に検索し、複数指定時はマージされます。 -source-language <language>[_<region>] - Specify the language of the source strings for new files. - Defaults to POSIX if not specified. + 新しくファイルを作成する場合のソース文字列の言語を指定します。 + 指定されない場合のデフォルトは POSIX です。 -target-language <language>[_<region>] - Specify the language of the translations for new files. - Guessed from the file name if not specified. + 新しくファイルを作成する場合の翻訳言語を指定します。 + 指定されない場合はファイル名から推測されます。 -ts <ts-file>... - 出力ファイルを指定します。This will override the TRANSLATIONS - and nullify the CODECFORTR from possibly specified project files. + 出力ファイルを指定します。プロジェクトファイルで指定された + TRANSLATIONS と CODECFORTR は無視されます。 -codecfortr <codec> - Specify the codec assumed for tr() calls. Effective only with -ts. + tr() の呼び出し時に想定されるコーデックを指定します。-ts オプションを指定した場合にのみ有効です。 -version - lupdate のバージョン情報を表示して終了します。 + lupdate のバージョン情報を表示して終了します。 @lst-file - Read additional file names (one per line) from lst-file. + lst-file を使って追加で読み込むファイル名(1行に1ファイル)を指定します。 </translation> </message> <message> diff --git a/translations/qt_gl.ts b/translations/qt_gl.ts index 2431a5d..a77bcc7 100644 --- a/translations/qt_gl.ts +++ b/translations/qt_gl.ts @@ -3728,18 +3728,6 @@ ou comercial onde non é preciso compartir ningún código fonte con terceiras p <p>Qt é un produto de Nokia. Consulte <a href="http://qt.nokia.com/">qt.nokia.com</a> para máis información.</p></translation> </message> <message> - <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation type="obsolete"><p>Qt é un toolkit de C++ para o desenvolvemento de programas multiplataforma.</p> <p>Qt fornece portabilidade entre MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e as principais variantes comerciais de Unix cun único código fonte. Qt tamén está dispoñíbel para dispositivos incrustados como Qt para Embedded Linux e Qt para Windows CE.</p> -<p>Qt está dispoñíbel en tres opcións de licenzas diferentes deseñadas para adaptarse ás necesidades dos diferentes usuarios.</p> -</p>Qt distribuída sob o acordo de licenza comercial é adecuado para o desenvolvemento de software propietario -ou comercial onde non é preciso compartir ningún código fonte con terceiras partes ou que non poden cumprir os termos das licenzas GNU LGPL versión 2.1 nin da versión 3.0.</p> -<p>Qt sob a licenza GNU General Public License versión 2.1 é apropiada para o desenvolvemento de programas Qt (propietario ou de fontes abertas) supoñendo que poda cumprir cos termos e condicións da licenza GNU GPL versión 2.1.</p> -<p>Qt sob a licenza GNU General Public License versión 3.0 é apropiada para o desenvolvemento de programas Qt onde desexe empregar tales programas en combinación con software suxeito aos termos da GNU GPL versión 3.0 ou onde desexe cumprir cos termos da GNU GPL versión 3.0.</p> -<p>Consulte <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> para ler un resumo das licenzas de Qt.</p> -<p>Copyright (C) 2011 Nokia Corporation ou as súas subsidiarias.</p> -<p>Qt é un produto de Nokia. Consulte <a href="http://qt.nokia.com/">qt.nokia.com</a> para máis información.</p></translation> - </message> - <message> <source>About Qt</source> <translation>Acerca de Qt</translation> </message> diff --git a/translations/qt_help_ja.ts b/translations/qt_help_ja.ts index 2a725ca..59036e0 100644 --- a/translations/qt_help_ja.ts +++ b/translations/qt_help_ja.ts @@ -43,7 +43,7 @@ </message> <message> <source>Cannot open collection file: %1</source> - <translation>コレクションファイルをオープンできません: %1</translation> + <translation>コレクションファイルを開けません: %1</translation> </message> <message> <source>Cannot create tables in file %1!</source> @@ -67,7 +67,7 @@ </message> <message> <source>Cannot open database '%1' to optimize!</source> - <translation>最適化用にデータベース '%1' をオープンできません!</translation> + <translation>最適化用にデータベース '%1' を開けません!</translation> </message> <message> <source>Cannot create directory: %1</source> @@ -83,7 +83,7 @@ </message> <message> <source>Cannot open documentation file %1!</source> - <translation>ドキュメントファイル %1 をオープンできません!</translation> + <translation>ドキュメントファイル %1 を開けません!</translation> </message> <message> <source>The namespace %1 was not registered!</source> @@ -99,14 +99,14 @@ <message> <source>Cannot open database '%1' '%2': %3</source> <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment> - <translation>データベース '%1' '%2' がオープンできません: %3</translation> + <translation>データベース '%1' '%2' を開けません: %3</translation> </message> </context> <context> <name>QHelpEngineCore</name> <message> <source>Cannot open documentation file %1: %2!</source> - <translation>ドキュメントファイル %1 をオープンできません: %2!</translation> + <translation>ドキュメントファイル %1 を開けません: %2!</translation> </message> <message> <source>The specified namespace does not exist!</source> @@ -133,7 +133,7 @@ </message> <message> <source>Cannot open data base file %1!</source> - <translation>データベースファイル %1 をオープンできません!</translation> + <translation>データベースファイル %1 を開けません!</translation> </message> <message> <source>Cannot register namespace %1!</source> @@ -177,7 +177,7 @@ </message> <message> <source>Cannot open file %1! Skipping it.</source> - <translation>ファイル %1 をオープンできません! スキップします。</translation> + <translation>ファイル %1 を開けません! スキップします。</translation> </message> <message> <source>The filter %1 is already registered!</source> @@ -209,7 +209,7 @@ </message> <message> <source>File '%1' cannot be opened.</source> - <translation>ファイル '%1' をオープンできません。</translation> + <translation>ファイル '%1' を開けません。</translation> </message> <message> <source>File '%1' contains an invalid link to file '%2'</source> @@ -256,7 +256,7 @@ </message> <message> <source>The input file %1 could not be opened!</source> - <translation>入力ファイル %1 がオープンできません!</translation> + <translation>入力ファイル %1 を開けません!</translation> </message> </context> <context> diff --git a/translations/qt_ja.ts b/translations/qt_ja.ts index db8a917..094e34d 100644 --- a/translations/qt_ja.ts +++ b/translations/qt_ja.ts @@ -75,7 +75,7 @@ </message> <message> <source>Accessibility</source> - <translation>アクセシビリティ</translation> + <translation>ユーザー補助</translation> </message> </context> <context> @@ -136,7 +136,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>Could not open media source.</source> - <translation>メディアソースを開くことができません。</translation> + <translation>メディアソースを開けませんでした。</translation> </message> <message> <source>Invalid source type.</source> @@ -148,11 +148,11 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>Could not open audio device. The device is already in use.</source> - <translation>オーディオデバイスを開くことができません。デバイスは既に他のプロセスにより使用されています。</translation> + <translation>オーディオデバイスを開けませんでした。デバイスは既に他のプロセスにより使用されています。</translation> </message> <message> <source>Could not decode media source.</source> - <translation>メディアソースを開くことができません。見つからないか、未知の形式です。</translation> + <translation>メディアソースを開けませんでした。見つからないか、未知の形式です。</translation> </message> </context> <context> @@ -320,6 +320,10 @@ libgstreamer-plugins-base はインストールされていますか。</transla <source>Playback complete</source> <translation>再生が終了しました</translation> </message> + <message> + <source>Download error</source> + <translation>ダウンロードエラー</translation> + </message> </context> <context> <name>Phonon::MMF::AbstractVideoPlayer</name> @@ -439,6 +443,10 @@ libgstreamer-plugins-base はインストールされていますか。</transla <source>Error opening source: media type could not be determined</source> <translation>ソースのオープン時にエラーが発生しました: メディアのタイプが不明です</translation> </message> + <message> + <source>Failed to set requested IAP</source> + <translation>要求されたIAPのセットに失敗しました</translation> + </message> </context> <context> <name>Phonon::MMF::StereoWidening</name> @@ -511,7 +519,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>Open </source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>Select a Directory</source> @@ -559,7 +567,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>&OK</source> - <translation>OK(&O)</translation> + <translation>&OK</translation> </message> <message> <source>Look &in:</source> @@ -607,7 +615,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>Read-only</source> - <translation>読み込み専用</translation> + <translation>読み取り専用</translation> </message> <message> <source>Write-only</source> @@ -643,7 +651,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>Save As</source> @@ -651,7 +659,7 @@ libgstreamer-plugins-base はインストールされていますか。</transla </message> <message> <source>&Open</source> - <translation>オープン(&O)</translation> + <translation>開く(&O)</translation> </message> <message> <source>&Save</source> @@ -1168,7 +1176,7 @@ to <name>QComboBox</name> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>False</source> @@ -1216,6 +1224,11 @@ to <translation>%1: リソース不足です</translation> </message> <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation>%1: 許可されていません</translation> + </message> + <message> <source>%1: unknown error %2</source> <comment>QSystemSemaphore</comment> <translation>%1: 未知のエラー %2</translation> @@ -1290,11 +1303,11 @@ to <name>QDeclarativeAbstractAnimation</name> <message> <source>Cannot animate non-existent property "%1"</source> - <translation>存在しないプロパティ "%1" はアニメーション出来ません</translation> + <translation>存在しないプロパティ "%1" はアニメーションできません</translation> </message> <message> <source>Cannot animate read-only property "%1"</source> - <translation>読込専用のプロパティ "%1" はアニメーション出来ません</translation> + <translation>読込専用のプロパティ "%1" はアニメーションできません</translation> </message> <message> <source>Animation is an abstract class</source> @@ -1320,7 +1333,7 @@ to </message> <message> <source>Cannot anchor to an item that isn't a parent or sibling.</source> - <translation>親でも兄弟でもない要素にはアンカー出来ません。</translation> + <translation>親でも兄弟でもない要素にはアンカーできません。</translation> </message> <message> <source>Possible anchor loop detected on vertical anchor.</source> @@ -1336,15 +1349,15 @@ to </message> <message> <source>Cannot anchor to a null item.</source> - <translation>空の要素にはアンカー出来ません。</translation> + <translation>空の要素にはアンカーできません。</translation> </message> <message> <source>Cannot anchor a horizontal edge to a vertical edge.</source> - <translation>横方向のエッジから縦方向のエッジへはアンカー出来ません。</translation> + <translation>横方向のエッジから縦方向のエッジへはアンカーできません。</translation> </message> <message> <source>Cannot anchor item to self.</source> - <translation>自分自身へはアンカー出来ません。</translation> + <translation>自分自身へはアンカーできません。</translation> </message> <message> <source>Cannot specify top, bottom, and vcenter anchors.</source> @@ -1356,7 +1369,7 @@ to </message> <message> <source>Cannot anchor a vertical edge to a horizontal edge.</source> - <translation>縦方向のエッジから横方向のエッジへはアンカー出来ません。</translation> + <translation>縦方向のエッジから横方向のエッジへはアンカーできません。</translation> </message> </context> <context> @@ -1367,6 +1380,13 @@ to </message> </context> <context> + <name>QDeclarativeApplication</name> + <message> + <source>Application is an abstract class</source> + <translation>Application は抽象クラスです</translation> + </message> +</context> +<context> <name>QDeclarativeBehavior</name> <message> <source>Cannot change the animation assigned to a Behavior.</source> @@ -1494,12 +1514,20 @@ to <translation>仕様が空であるコンポーネントは作成できません</translation> </message> <message> + <source>"%1.%2" is not available in %3 %4.%5.</source> + <translation>%3 %4.%5 で "%1.%2" は利用できません。</translation> + </message> + <message> + <source>"%1.%2" is not available due to component versioning.</source> + <translation>コンポーネントのバージョンの問題により "%1.%2" は利用できません。</translation> + </message> + <message> <source>Incorrectly specified signal assignment</source> <translation>仕様と異なるシグナルが割り当てられています</translation> </message> <message> <source>Cannot assign a value to a signal (expecting a script to be run)</source> - <translation>値をシグナルに割り当てることはできません(ただし、スクリプトは除きます)</translation> + <translation>値はシグナルに割り当てできません(ただし、スクリプトは除きます)</translation> </message> <message> <source>Empty signal assignment</source> @@ -1551,7 +1579,7 @@ to </message> <message> <source>Cannot assign a value directly to a grouped property</source> - <translation>グループ化されたプロパティに直接値を割り当てることはできません</translation> + <translation>グループ化されたプロパティに直接値を割り当てできません</translation> </message> <message> <source>Invalid property use</source> @@ -1563,15 +1591,15 @@ to </message> <message> <source>Single property assignment expected</source> - <translation>プロパティに複数の値は割り当てられません</translation> + <translation>プロパティに複数の値は割り当てできません</translation> </message> <message> <source>Unexpected object assignment</source> - <translation>オブジェクトを割り当てることはできません</translation> + <translation>オブジェクトを割り当てできません</translation> </message> <message> <source>Cannot assign object to list</source> - <translation>オブジェクトをリストに割り当てることはできません</translation> + <translation>オブジェクトをリストに割り当てできません</translation> </message> <message> <source>Can only assign one binding to lists</source> @@ -1579,19 +1607,23 @@ to </message> <message> <source>Cannot assign primitives to lists</source> - <translation>プリミティブをリストに割り当てることはできません</translation> + <translation>プリミティブをリストに割り当てできません</translation> </message> <message> <source>Cannot assign multiple values to a script property</source> - <translation>複数の値をスクリプトプロパティに割り当てることはできません</translation> + <translation>複数の値をスクリプトプロパティに割り当てできません</translation> </message> <message> <source>Invalid property assignment: script expected</source> <translation>無効なプロパティの値: スクリプトを指定してください</translation> </message> <message> + <source>Cannot assign multiple values to a singular property</source> + <translation>複数の値を単数プロパティに割り当てできません</translation> + </message> + <message> <source>Cannot assign object to property</source> - <translation>オブジェクトをプロパティに割り当てることはできません</translation> + <translation>オブジェクトをプロパティに割り当てできません</translation> </message> <message> <source>"%1" cannot operate on "%2"</source> @@ -1647,7 +1679,7 @@ to </message> <message> <source>Cannot override FINAL property</source> - <translation>FINAL プロパティを上書きすることはできません</translation> + <translation>FINAL プロパティは上書きできません</translation> </message> <message> <source>Invalid property type</source> @@ -1675,19 +1707,27 @@ to </message> <message> <source>No property alias location</source> - <translation>プロパティのエイリアスのパスがありません</translation> + <translation>プロパティのエイリアスへのパスがありません</translation> </message> <message> <source>Invalid alias location</source> <translation>無効なエイリアスのパス</translation> </message> <message> + <source>Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property></source> + <translation>無効なエイリアスの参照です。エイリアスの参照先は <ID>, <ID>.<プロパティ> もしくは <ID>.<値プロパティ>.<プロパティ> のいずれかでなくてはいけません</translation> + </message> + <message> + <source>Alias property exceeds alias bounds</source> + <translation>エイリアスプロパティがエイリアスの境界を越えています</translation> + </message> + <message> <source>Invalid alias reference. An alias reference must be specified as <id> or <id>.<property></source> - <translation>無効なエイリアスの参照です。エイリアスの参照先は <ID> もしくは <ID>.<プロパティ> でなくてはいけません</translation> + <translation type="obsolete">無効なエイリアスの参照です。エイリアスの参照先は <ID> もしくは <ID>.<プロパティ> でなくてはいけません</translation> </message> <message> <source>Invalid alias reference. Unable to find id "%1"</source> - <translation>無効なエイリアスの参照です。 ID "%1" が見つかりません</translation> + <translation>無効なエイリアスの参照です。ID "%1" が見つかりません</translation> </message> </context> <context> @@ -1696,6 +1736,10 @@ to <source>Invalid empty URL</source> <translation>空の URL は無効です</translation> </message> + <message> + <source>createObject: value is not an object</source> + <translation>createObject: 値がオブジェクトではありません</translation> + </message> </context> <context> <name>QDeclarativeCompositeTypeManager</name> @@ -1776,6 +1820,10 @@ to <context> <name>QDeclarativeImportDatabase</name> <message> + <source>cannot load module "%1": File name case mismatch for "%2"</source> + <translation>モジュール "%1" がロードできません: ファイル名の大文字小文字が "%2" に合っていません</translation> + </message> + <message> <source>module "%1" definition "%2" not readable</source> <translation>"%1" モジュールの定義 "%2" が読めません</translation> </message> @@ -1831,19 +1879,34 @@ to <source>is not a type</source> <translation>は型ではありません</translation> </message> + <message> + <source>File name case mismatch for "%2"</source> + <translation>ファイル名の大文字小文字が "%2" に合っていません</translation> + </message> </context> <context> <name>QDeclarativeKeyNavigationAttached</name> <message> <source>KeyNavigation is only available via attached properties</source> - <translation>KeyNavigation はアタッチド・プロパティ(Attached Property: 型名.プロパティ名)の形式でのみ利用できます</translation> + <translation>KeyNavigation はアタッチされたプロパティ(Attached Property: 型名.プロパティ名)の形式でのみ利用できます</translation> </message> </context> <context> <name>QDeclarativeKeysAttached</name> <message> <source>Keys is only available via attached properties</source> - <translation>Keys はアタッチド・プロパティ(Attached Property: 型名.プロパティ名)の形式でのみ利用できます</translation> + <translation>Keys はアタッチされたプロパティ(Attached Property: 型名.プロパティ名)の形式でのみ利用できます</translation> + </message> +</context> +<context> + <name>QDeclarativeLayoutMirroringAttached</name> + <message> + <source>LayoutDirection attached property only works with Items</source> + <translation>アタッチされたプロパティ LayoutDirection はアイテムでのみ利用できます</translation> + </message> + <message> + <source>LayoutMirroring is only available via attached properties</source> + <translation>LayoutMirroring はアタッチされたプロパティ(Attached Property: 型名.プロパティ名)の形式でのみ利用できます</translation> </message> </context> <context> @@ -2146,7 +2209,7 @@ to </message> <message> <source>Cannot assign object type %1 with no default method</source> - <translation>型 %1 のオブジェクトをデフォルトメソッドなしに割り当てることはできません</translation> + <translation>デフォルトメソッドの無い型 %1 のオブジェクトは割り当てできません</translation> </message> <message> <source>Cannot connect mismatched signal/slot %1 %vs. %2</source> @@ -2220,7 +2283,7 @@ to <name>QDialog</name> <message> <source>What's This?</source> - <translation>ヒント?</translation> + <translation>ヒント</translation> </message> <message> <source>Done</source> @@ -2267,7 +2330,7 @@ to </message> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>&Cancel</source> @@ -2323,7 +2386,7 @@ to </message> <message> <source>&OK</source> - <translation>OK(&O)</translation> + <translation>&OK</translation> </message> </context> <context> @@ -2397,7 +2460,7 @@ to </message> <message> <source>&OK</source> - <translation>OK(&O)</translation> + <translation>&OK</translation> </message> </context> <context> @@ -2420,7 +2483,7 @@ to </message> <message> <source>Cannot open for output</source> - <translation>コピー先のファイルをオープンできません</translation> + <translation>コピー先のファイルを開けません</translation> </message> <message> <source>Failure to write block</source> @@ -2451,7 +2514,7 @@ to </message> <message> <source>&Open</source> - <translation>オープン(&O)</translation> + <translation>開く(&O)</translation> </message> <message> <source>&Save</source> @@ -2459,7 +2522,7 @@ to </message> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>%1 already exists. @@ -2477,7 +2540,7 @@ Please verify the correct file name was given.</source> </message> <message> <source>My Computer</source> - <translation>マイ コンピュータ</translation> + <translation>マイコンピュータ</translation> </message> <message> <source>%1 @@ -2692,7 +2755,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>My Computer</source> - <translation>マイ コンピュータ</translation> + <translation>マイコンピュータ</translation> </message> <message> <source>Computer</source> @@ -2732,7 +2795,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Italic</source> - <translation>イタリック</translation> + <translation>斜体</translation> </message> <message> <source>Oblique</source> @@ -3207,7 +3270,7 @@ Do you want to delete it anyway?</source> <name>QIBaseDriver</name> <message> <source>Error opening database</source> - <translation>データベースのオープンでエラーが発生しました</translation> + <translation>データベースのオープン時にエラーが発生しました</translation> </message> <message> <source>Could not start transaction</source> @@ -3234,7 +3297,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Unable to open BLOB</source> - <translation>バイナリラージオブジェクトをオープンできません</translation> + <translation>バイナリラージオブジェクトを開けません</translation> </message> <message> <source>Unable to read BLOB</source> @@ -3390,11 +3453,11 @@ Do you want to delete it anyway?</source> </message> <message> <source>Cannot load library %1: %2</source> - <translation>ライブラリ '%1' を読み込むことができません: %2</translation> + <translation>ライブラリ '%1' を読み込めません: %2</translation> </message> <message> <source>Cannot unload library %1: %2</source> - <translation>ライブラリ %1 を解放することができません: %2</translation> + <translation>ライブラリ %1 を解放できません: %2</translation> </message> <message> <source>Cannot resolve symbol "%1" in %2: %3</source> @@ -3502,7 +3565,7 @@ Do you want to delete it anyway?</source> <name>QMYSQLDriver</name> <message> <source>Unable to open database '</source> - <translation>データベースをオープンできません '</translation> + <translation>データベースを開けません '</translation> </message> <message> <source>Unable to connect</source> @@ -3659,7 +3722,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> <message> <source>Execute</source> @@ -3833,7 +3896,7 @@ Do you want to delete it anyway?</source> <name>QNetworkAccessCacheBackend</name> <message> <source>Error opening %1</source> - <translation>オープンのエラー %1</translation> + <translation>オープン時のエラー %1</translation> </message> </context> <context> @@ -3870,7 +3933,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Error opening %1: %2</source> - <translation>%1 をオープンする時にエラーが発生しました: %2</translation> + <translation>%1 のオープン時にエラーが発生しました: %2</translation> </message> <message> <source>Write error writing to %1: %2</source> @@ -3878,7 +3941,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Cannot open %1: Path is a directory</source> - <translation>%1 をオープンできません。指定されたパスはディレクトリです</translation> + <translation>%1 を開けません。指定されたパスはディレクトリです</translation> </message> <message> <source>Read error reading from %1: %2</source> @@ -3893,7 +3956,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Cannot open %1: is a directory</source> - <translation>%1 をオープンできません。指定されたパスはディレクトリです</translation> + <translation>%1 を開けません。指定されたパスはディレクトリです</translation> </message> <message> <source>Logging in to %1 failed: authentication required</source> @@ -4623,7 +4686,7 @@ Please choose a different file name.</source> <name>QPrintPreviewDialog</name> <message> <source>Page Setup</source> - <translation>ページの設定</translation> + <translation>ページ設定</translation> </message> <message> <source>%1%</source> @@ -4691,7 +4754,7 @@ Please choose a different file name.</source> </message> <message> <source>Page setup</source> - <translation>ページの設定</translation> + <translation>ページ設定</translation> </message> <message> <source>Close</source> @@ -4847,11 +4910,11 @@ Please choose a different file name.</source> <name>QProcess</name> <message> <source>Could not open input redirection for reading</source> - <translation>標準入力リダイレクトを読み込みのためにオープンすることができません</translation> + <translation>標準入力リダイレクトを読み込みのために開けませんでした</translation> </message> <message> <source>Could not open output redirection for writing</source> - <translation>標準出力リダイレクトを書き込みのためにオープンすることができません</translation> + <translation>標準出力リダイレクトを書き込みのために開けませんでした</translation> </message> <message> <source>Resource error (fork failure): %1</source> @@ -4893,7 +4956,7 @@ Please choose a different file name.</source> <name>QPushButton</name> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> </context> <context> @@ -4954,7 +5017,7 @@ Please choose a different file name.</source> <name>QSQLite2Driver</name> <message> <source>Error opening database</source> - <translation>データベースのオープンでエラーが発生しました</translation> + <translation>データベースのオープン時にエラーが発生しました</translation> </message> <message> <source>Unable to begin transaction</source> @@ -4984,11 +5047,11 @@ Please choose a different file name.</source> <name>QSQLiteDriver</name> <message> <source>Error opening database</source> - <translation>データベースのオープンでエラーが発生しました</translation> + <translation>データベースのオープン時にエラーが発生しました</translation> </message> <message> <source>Error closing database</source> - <translation>データベースのクローズでエラーが発生しました</translation> + <translation>データベースのクローズ時にエラーが発生しました</translation> </message> <message> <source>Unable to begin transaction</source> @@ -5495,11 +5558,11 @@ Please choose a different file name.</source> </message> <message> <source>Pause</source> - <translation>Pause</translation> + <translation>一時停止</translation> </message> <message> <source>Print</source> - <translation>Print</translation> + <translation>印刷</translation> </message> <message> <source>SysReq</source> @@ -6113,11 +6176,11 @@ Please choose a different file name.</source> </message> <message> <source>Insert</source> - <translation>Insert</translation> + <translation>挿入</translation> </message> <message> <source>Delete</source> - <translation>Delete</translation> + <translation>削除</translation> </message> <message> <source>Escape</source> @@ -6129,7 +6192,7 @@ Please choose a different file name.</source> </message> <message> <source>Select</source> - <translation>Select</translation> + <translation>選択</translation> </message> <message> <source>Yes</source> @@ -6430,7 +6493,7 @@ Please choose a different file name.</source> </message> <message> <source>Select</source> - <translation>セレクト</translation> + <translation>選択</translation> </message> <message> <source>Done</source> @@ -6554,6 +6617,10 @@ Please choose a different file name.</source> <translation>SSL ハンドシェーク時にエラーが発生しました: %1</translation> </message> <message> + <source>The peer certificate is blacklisted</source> + <translation>通信相手の証明書がブラックリストに載っています</translation> + </message> + <message> <source>No error</source> <translation>エラーはありません</translation> </message> @@ -6760,7 +6827,7 @@ Please choose a different file name.</source> </message> <message> <source>Open</source> - <translation>オープン</translation> + <translation>開く</translation> </message> </context> <context> @@ -6906,7 +6973,7 @@ Please choose a different file name.</source> <message> <source>Choose File</source> <comment>title for file button used in HTML forms</comment> - <translation>ファイルを選ぶ</translation> + <translation>ファイルを選択</translation> </message> <message> <source>No file selected</source> @@ -7061,7 +7128,7 @@ Please choose a different file name.</source> <message> <source>Italic</source> <comment>Italic context menu item</comment> - <translation>イタリック</translation> + <translation>斜体</translation> </message> <message> <source>Underline</source> @@ -7141,7 +7208,7 @@ Please choose a different file name.</source> <message> <source>Slider</source> <comment>Media controller element</comment> - <translation>スライダ</translation> + <translation>スライダー</translation> </message> <message> <source>Slider Thumb</source> @@ -7586,7 +7653,7 @@ Please choose a different file name.</source> <name>QWhatsThisAction</name> <message> <source>What's This?</source> - <translation>ヒント?</translation> + <translation>ヒント</translation> </message> </context> <context> diff --git a/translations/qtconfig_ja.ts b/translations/qtconfig_ja.ts index cf3ec13..8440389 100644 --- a/translations/qtconfig_ja.ts +++ b/translations/qtconfig_ja.ts @@ -4,6 +4,26 @@ <context> <name>MainWindow</name> <message> + <source><p><b><font size+=2>Appearance</font></b></p><hr><p>Use this tab to customize the appearance of your Qt applications.</p><p>You can select the default GUI Style from the drop down list and customize the colors.</p><p>Any GUI Style plugins in your plugin path will automatically be added to the list of built-in Qt styles. (See the Library Paths tab for information on adding new plugin paths.)</p><p>When you choose 3-D Effects and Window Background colors, the Qt Configuration program will automatically generate a palette for you. To customize colors further, press the Tune Palette button to open the advanced palette editor.<p>The Preview Window shows what the selected Style and colors look like.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Fonts</font></b></p><hr><p>Use this tab to select the default font for your Qt applications. The selected font is shown (initially as 'Sample Text') in the line edit below the Family, Style and Point Size drop down lists.</p><p>Qt has a powerful font substitution feature that allows you to specify a list of substitute fonts. Substitute fonts are used when a font cannot be loaded, or if the specified font doesn't have a particular character.<p>For example, if you select the font Lucida, which doesn't have Korean characters, but need to show some Korean text using the Mincho font family you can do so by adding Mincho to the list. Once Mincho is added, any Korean characters that are not found in the Lucida font will be taken from the Mincho font. Because the font substitutions are lists, you can also select multiple families, such as Song Ti (for use with Chinese text).</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Interface</font></b></p><hr><p>Use this tab to customize the feel of your Qt applications.</p><p>If the Resolve Symlinks checkbox is checked Qt will follow symlinks when handling URLs. For example, in the file dialog, if this setting is turned on and /usr/tmp is a symlink to /var/tmp, entering the /usr/tmp directory will cause the file dialog to change to /var/tmp. With this setting turned off, symlinks are not resolved or followed.</p><p>The Global Strut setting is useful for people who require a minimum size for all widgets (e.g. when using a touch panel or for users who are visually impaired). Leaving the Global Strut width and height at 0 will disable the Global Strut feature</p><p>XIM (Extended Input Methods) are used for entering characters in languages that have large character sets, for example, Chinese and Japanese.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Printer</font></b></p><hr><p>Use this tab to configure the way Qt generates output for the printer.You can specify if Qt should try to embed fonts into its generated output.If you enable font embedding, the resulting postscript will be more portable and will more accurately reflect the visual output on the screen; however the resulting postscript file size will be bigger.<p>When using font embedding you can select additional directories where Qt should search for embeddable font files. By default, the X server font path is used.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p><b><font size+=2>Phonon</font></b></p><hr><p>Use this tab to configure the Phonon GStreamer multimedia backend. <p>It is reccommended to leave all settings on "Auto" to let Phonon determine your settings automatically.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Desktop Settings (Default)</source> <translation>デスクトップの設定(デフォルト)</translation> </message> @@ -364,7 +384,7 @@ </message> <message> <source>Browse...</source> - <translation>ブラウズ...</translation> + <translation>参照...</translation> </message> <message> <source>Press the <b>Browse</b> button or enter a directory and press Enter to add them to the list.</source> diff --git a/util/network/cookiejar-generateTLDs/main.cpp b/util/corelib/qurl-generateTLDs/main.cpp index b369ece..861546c 100644 --- a/util/network/cookiejar-generateTLDs/main.cpp +++ b/util/corelib/qurl-generateTLDs/main.cpp @@ -77,7 +77,7 @@ int main(int argc, char **argv) { printf(" wget http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 -O effective_tld_names.dat\n"); printf(" grep '^[^\\/\\/]' effective_tld_names.dat > effective_tld_names.dat.trimmed\n"); printf(" %s effective_tld_names.dat.trimmed effective_tld_names.dat.qt\n\n", argv[0]); - printf("Now copy the data from effective_tld_names.dat.qt to the file src/network/access/qnetworkcookiejartlds_p.h in your Qt repo\n\n"); + printf("Now copy the data from effective_tld_names.dat.qt to the file src/corelib/io/qurltlds_p.h in your Qt repo\n\n"); exit(1); } QFile file(argv[1]); @@ -156,6 +156,6 @@ int main(int argc, char **argv) { outFile.write(outDataBufferBA); outFile.write("};\n"); outFile.close(); - printf("data generated to %s . Now copy the data from this file to src/network/access/qnetworkcookiejartlds_p.h in your Qt repo\n", argv[2]); + printf("data generated to %s . Now copy the data from this file to src/corelib/io/qurltlds_p.h in your Qt repo\n", argv[2]); exit(0); } diff --git a/util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro b/util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro index 9d5f1cf..9d5f1cf 100644 --- a/util/network/cookiejar-generateTLDs/cookiejar-generateTLDs.pro +++ b/util/corelib/qurl-generateTLDs/qurl-generateTLDs.pro |