From 91d96edc19805c9dcc35650eb42e7587837cecc8 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 Oct 2009 16:19:00 +0300 Subject: Enable overriding TARGETTYPE and OPTION statements with MMP_RULES If MMP_RULES contains TARGETTYPE or any OPTION statements, default values for these will not be added to MMP file. This allows for example conditional OPTIONs and using native PLUGIN target type using MMP_RULES. Task-number: QT-2229 Reviewed-by: axis --- qmake/generators/symbian/symmake.cpp | 75 +++++++++++++++++++++++++++--------- qmake/generators/symbian/symmake.h | 2 + 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp index dd1dd5f..3d24053 100644 --- a/qmake/generators/symbian/symmake.cpp +++ b/qmake/generators/symbian/symmake.cpp @@ -71,6 +71,9 @@ #define MMP_TARGET "TARGET" #define MMP_TARGETTYPE "TARGETTYPE" #define MMP_SECUREID "SECUREID" +#define MMP_OPTION_CW "OPTION CW" +#define MMP_OPTION_ARMCC "OPTION ARMCC" +#define MMP_OPTION_GCCE "OPTION GCCE" #define SIS_TARGET "sis" #define OK_SIS_TARGET "ok_sis" @@ -649,9 +652,35 @@ void SymbianMakefileGenerator::initMmpVariables() sysincspaths << temporary; systeminclude.insert("SYSTEMINCLUDE", sysincspaths); + + // Check MMP_RULES for singleton keywords that are overridden + QStringList overridableMmpKeywords; + overridableMmpKeywords << QLatin1String(MMP_TARGETTYPE) << QLatin1String(MMP_OPTION_CW) + << QLatin1String(MMP_OPTION_ARMCC) << QLatin1String(MMP_OPTION_GCCE); + + foreach (QString item, project->values("MMP_RULES")) { + if (project->values(item).isEmpty()) { + checkOverridability(overridableMmpKeywords, item); + } else { + foreach (QString itemRow, project->values(item)) { + checkOverridability(overridableMmpKeywords, itemRow); + } + } + } +} + +void SymbianMakefileGenerator::checkOverridability(QStringList &overridableKeywords, QString &checkString) +{ + // Check if checkString contains overridable keyword and + // add the keyword to overridden keywords list if so. + QString simplifiedString = checkString.simplified(); + foreach (QString item, overridableKeywords) { + if (simplifiedString.startsWith(item)) + appendIfnotExist(overriddenMmpKeywords, item); + } } -bool SymbianMakefileGenerator::removeDuplicatedStrings(QStringList& stringList) +bool SymbianMakefileGenerator::removeDuplicatedStrings(QStringList &stringList) { QStringList tmpStringList; @@ -762,24 +791,32 @@ void SymbianMakefileGenerator::addMacro(QTextStream& t, const QString& value) void SymbianMakefileGenerator::writeMmpFileTargetPart(QTextStream& t) { + bool skipTargetType = overriddenMmpKeywords.contains(MMP_TARGETTYPE); + if (targetType == TypeExe) { t << MMP_TARGET << "\t\t" << fixedTarget << ".exe" << endl; - if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) - t << MMP_TARGETTYPE << "\t\t" << "STDEXE" << endl; - else - t << MMP_TARGETTYPE << "\t\t" << "EXE" << endl; + if (!skipTargetType) { + if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) + t << MMP_TARGETTYPE << "\t\t" << "STDEXE" << endl; + else + t << MMP_TARGETTYPE << "\t\t" << "EXE" << endl; + } } else if (targetType == TypeDll || targetType == TypePlugin) { t << MMP_TARGET << "\t\t" << fixedTarget << ".dll" << endl; - if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) - t << MMP_TARGETTYPE << "\t\t" << "STDDLL" << endl; - else - t << MMP_TARGETTYPE << "\t\t" << "DLL" << endl; + if (!skipTargetType) { + if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) + t << MMP_TARGETTYPE << "\t\t" << "STDDLL" << endl; + else + t << MMP_TARGETTYPE << "\t\t" << "DLL" << endl; + } } else if (targetType == TypeLib) { t << MMP_TARGET << "\t\t" << fixedTarget << ".lib" << endl; - if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) - t << MMP_TARGETTYPE << "\t\t" << "STDLIB" << endl; - else - t << MMP_TARGETTYPE << "\t\t" << "LIB" << endl; + if (!skipTargetType) { + if (project->values("CONFIG").contains("stdbinary", Qt::CaseInsensitive)) + t << MMP_TARGETTYPE << "\t\t" << "STDLIB" << endl; + else + t << MMP_TARGETTYPE << "\t\t" << "LIB" << endl; + } } else { fprintf(stderr, "Error: Unexpected targettype (%d) in SymbianMakefileGenerator::writeMmpFileTargetPart\n", targetType); } @@ -990,12 +1027,12 @@ void SymbianMakefileGenerator::writeMmpFileCompilerOptionPart(QTextStream& t) if (!gcce.isEmpty() && gcce[gcce.size()-1] == ' ') gcce.chop(1); - if (!cw.isEmpty()) - t << "OPTION CW " << cw << endl; - if (!armcc.isEmpty()) - t << "OPTION ARMCC " << armcc << endl; - if (!gcce.isEmpty()) - t << "OPTION GCCE " << gcce << endl; + if (!cw.isEmpty() && !overriddenMmpKeywords.contains(MMP_OPTION_CW)) + t << MMP_OPTION_CW " " << cw << endl; + if (!armcc.isEmpty() && !overriddenMmpKeywords.contains(MMP_OPTION_ARMCC)) + t << MMP_OPTION_ARMCC " " << armcc << endl; + if (!gcce.isEmpty() && !overriddenMmpKeywords.contains(MMP_OPTION_GCCE)) + t << MMP_OPTION_GCCE " " << gcce << endl; t << endl; } diff --git a/qmake/generators/symbian/symmake.h b/qmake/generators/symbian/symmake.h index 8e1a492..36f6e05 100644 --- a/qmake/generators/symbian/symmake.h +++ b/qmake/generators/symbian/symmake.h @@ -73,6 +73,7 @@ protected: QMap library; // (output file) (source , command) QMap makmakeCommands; + QStringList overriddenMmpKeywords; QStringList generatedFiles; QStringList generatedDirs; @@ -95,6 +96,7 @@ protected: QString generateUID3(); void initMmpVariables(); + void checkOverridability(QStringList &overridableKeywords, QString &checkString); void writeHeader(QTextStream &t); void writeBldInfContent(QTextStream& t, bool addDeploymentExtension); -- cgit v0.12 From 9711987fb0ba2841016dd75c1f3a3d2276b8cc69 Mon Sep 17 00:00:00 2001 From: Espen Riskedal Date: Fri, 2 Oct 2009 15:10:23 +0200 Subject: Demos and applications have a nice Qt logo when installed on Symbian Added a line to the symbianpkgrules.pri files which includes an ICON if the TARGET.UID3 is defined. We should fix the application_icon.prf to handle ICON without UID3 situations more gracefully, but for now I reordered existing UID3s to be specified before the symbianpkgrules.pri includes. Reviewed-by: Aleksandar Babic --- demos/browser/browser.pro | 2 +- demos/deform/deform.pro | 2 +- demos/embedded/anomaly/anomaly.pro | 2 +- demos/embedded/desktopservices/desktopservices.pro | 2 +- demos/embedded/digiflip/digiflip.pro | 2 +- .../embeddedsvgviewer/embeddedsvgviewer.pro | 2 +- demos/embedded/flickable/flickable.pro | 2 +- demos/embedded/flightinfo/flightinfo.pro | 2 +- demos/embedded/fluidlauncher/fluidlauncher.pro | 35 +++++++++++++++++++--- demos/embedded/lightmaps/lightmaps.pro | 2 +- demos/embedded/raycasting/raycasting.pro | 2 +- demos/embedded/styledemo/styledemo.pro | 2 +- demos/embedded/weatherinfo/weatherinfo.pro | 2 +- demos/mediaplayer/mediaplayer.pro | 2 +- demos/pathstroke/pathstroke.pro | 2 +- demos/shared/shared.pro | 2 +- demos/symbianpkgrules.pri | 2 ++ .../draganddrop/draggableicons/draggableicons.pro | 2 +- .../draganddrop/draggabletext/draggabletext.pro | 2 +- .../draganddrop/fridgemagnets/fridgemagnets.pro | 2 +- examples/draganddrop/puzzle/puzzle.pro | 2 +- .../basicgraphicslayouts/basicgraphicslayouts.pro | 2 +- .../graphicsview/collidingmice/collidingmice.pro | 2 +- .../graphicsview/elasticnodes/elasticnodes.pro | 2 +- .../graphicsview/padnavigator/padnavigator.pro | 2 +- examples/itemviews/addressbook/addressbook.pro | 2 +- examples/itemviews/chart/chart.pro | 2 +- examples/mainwindows/menus/menus.pro | 2 +- .../multimedia/audio/audiodevices/audiodevices.pro | 2 +- .../multimedia/audio/audioinput/audioinput.pro | 2 +- .../multimedia/audio/audiooutput/audiooutput.pro | 2 +- examples/network/fortuneserver/fortuneserver.pro | 2 +- examples/network/ftp/ftp.pro | 2 +- .../securesocketclient/securesocketclient.pro | 2 +- examples/painting/basicdrawing/basicdrawing.pro | 2 +- .../concentriccircles/concentriccircles.pro | 2 +- .../painting/imagecomposition/imagecomposition.pro | 2 +- examples/painting/painterpaths/painterpaths.pro | 2 +- examples/painting/svgviewer/svgviewer.pro | 2 +- .../painting/transformations/transformations.pro | 2 +- examples/qtestlib/tutorial1/tutorial1.pro | 2 +- examples/qtestlib/tutorial2/tutorial2.pro | 2 +- examples/qtestlib/tutorial3/tutorial3.pro | 2 +- examples/qtestlib/tutorial4/tutorial4.pro | 2 +- examples/qtestlib/tutorial5/tutorial5.pro | 2 +- examples/script/context2d/context2d.pro | 2 +- examples/sql/drilldown/drilldown.pro | 2 +- examples/symbianpkgrules.pri | 2 ++ .../multipleinheritance/multipleinheritance.pro | 4 +-- .../video/videographicsitem/videographicsitem.pro | 2 +- examples/video/videowidget/videowidget.pro | 2 +- examples/webkit/formextractor/formextractor.pro | 2 +- examples/webkit/previewer/previewer.pro | 2 +- examples/widgets/analogclock/analogclock.pro | 2 +- examples/widgets/calculator/calculator.pro | 2 +- examples/widgets/calendarwidget/calendarwidget.pro | 2 +- examples/widgets/lineedits/lineedits.pro | 2 +- examples/widgets/shapedclock/shapedclock.pro | 2 +- examples/widgets/softkeys/softkeys.pro | 2 +- examples/widgets/tetrix/tetrix.pro | 2 +- examples/widgets/wiggly/wiggly.pro | 2 +- examples/xml/htmlinfo/htmlinfo.pro | 2 +- examples/xml/saxbookmarks/saxbookmarks.pro | 2 +- src/s60installs/qt.svg | 17 +++++++++++ 64 files changed, 113 insertions(+), 65 deletions(-) create mode 100644 src/s60installs/qt.svg diff --git a/demos/browser/browser.pro b/demos/browser/browser.pro index 407030f..dab9387 100644 --- a/demos/browser/browser.pro +++ b/demos/browser/browser.pro @@ -93,6 +93,6 @@ sources.path = $$[QT_INSTALL_DEMOS]/browser INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF70 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/deform/deform.pro b/demos/deform/deform.pro index 4cce195..421432d 100644 --- a/demos/deform/deform.pro +++ b/demos/deform/deform.pro @@ -19,6 +19,6 @@ sources.path = $$[QT_INSTALL_DEMOS]/deform INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000A63D + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/anomaly/anomaly.pro b/demos/embedded/anomaly/anomaly.pro index f7c11b6..06d73fa 100644 --- a/demos/embedded/anomaly/anomaly.pro +++ b/demos/embedded/anomaly/anomaly.pro @@ -22,10 +22,10 @@ SOURCES += src/Main.cpp \ RESOURCES += src/anomaly.qrc symbian { + TARGET.UID3 = 0xA000CF71 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h LIBS += -lesock -linsock -lconnmon TARGET.CAPABILITY = NetworkServices TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 - TARGET.UID3 = 0xA000CF71 } diff --git a/demos/embedded/desktopservices/desktopservices.pro b/demos/embedded/desktopservices/desktopservices.pro index 81fe16d..c160029c 100644 --- a/demos/embedded/desktopservices/desktopservices.pro +++ b/demos/embedded/desktopservices/desktopservices.pro @@ -16,7 +16,7 @@ image.path = /data/images/ DEPLOYMENT += music image symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000C611 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) ICON = ./resources/heart.svg } diff --git a/demos/embedded/digiflip/digiflip.pro b/demos/embedded/digiflip/digiflip.pro index 4db5171..72cdc0f 100644 --- a/demos/embedded/digiflip/digiflip.pro +++ b/demos/embedded/digiflip/digiflip.pro @@ -1,7 +1,7 @@ SOURCES = digiflip.cpp symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF72 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro index 9401871..209ec1a 100644 --- a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro +++ b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.pro @@ -16,6 +16,6 @@ wince* { } symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000A640 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/flickable/flickable.pro b/demos/embedded/flickable/flickable.pro index 02e88aa..731dcbe 100644 --- a/demos/embedded/flickable/flickable.pro +++ b/demos/embedded/flickable/flickable.pro @@ -2,6 +2,6 @@ SOURCES = flickable.cpp main.cpp HEADERS = flickable.h symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF73 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/flightinfo/flightinfo.pro b/demos/embedded/flightinfo/flightinfo.pro index 2f36cb8..5659fa2 100644 --- a/demos/embedded/flightinfo/flightinfo.pro +++ b/demos/embedded/flightinfo/flightinfo.pro @@ -6,8 +6,8 @@ RESOURCES = flightinfo.qrc QT += network symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF74 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h LIBS += -lesock -lconnmon -linsock TARGET.CAPABILITY = NetworkServices diff --git a/demos/embedded/fluidlauncher/fluidlauncher.pro b/demos/embedded/fluidlauncher/fluidlauncher.pro index 408bf53..5d3fc18 100644 --- a/demos/embedded/fluidlauncher/fluidlauncher.pro +++ b/demos/embedded/fluidlauncher/fluidlauncher.pro @@ -59,6 +59,7 @@ symbian { load(data_caging_paths) TARGET.UID3 = 0xA000A641 + ICON = $$QT_SOURCE_TREE/src/s60installs/qt.svg executables.sources = \ styledemo.exe \ @@ -123,6 +124,25 @@ symbian { resource.path = $$APP_RESOURCE_DIR + mifs.sources = \ + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A641.mif \ #fluidlauncher + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A63F.mif \ #styledemo + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A63D.mif \ #deform + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A63E.mif \ #pathstroke + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C607.mif \ #wiggly + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A648.mif \ #ftp + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C60A.mif \ #saxbookmarks + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C611.mif \ #desktopservices + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C610.mif \ #fridgemagnets + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C612.mif \ #drilldown + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF6B.mif \ #softkeys + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF76.mif \ #raycasting + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF73.mif \ #flickable + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF72.mif \ #digiflip + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF75.mif \ #lightmaps + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF74.mif #flightinfo + mifs.path = $$APP_RESOURCE_DIR + contains(QT_CONFIG, svg) { executables.sources += \ embeddedsvgviewer.exe \ @@ -135,28 +155,35 @@ symbian { resource.sources += \ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/embeddedsvgviewer.rsc \ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/weatherinfo.rsc + + mifs.sources += \ + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000A640.mif \ #embeddedsvgviewer + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF77.mif #weatherinfo + } contains(QT_CONFIG, webkit) { executables.sources += anomaly.exe reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/anomaly_reg.rsc resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/anomaly.rsc + mifs.sources += \ + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000CF71.mif #anomaly } contains(QT_CONFIG, phonon) { executables.sources += qmediaplayer.exe resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/qmediaplayer.rsc + mifs.sources += \ + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C613.mif #qmediaplayer } contains(QT_CONFIG, script) { executables.sources += context2d.exe reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/context2d_reg.rsc resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/context2d.rsc + mifs.sources += \ + $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C608.mif #context2d } - mifs.sources = \ - $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/0xA000C611.mif - mifs.path = $$APP_RESOURCE_DIR - files.sources = $$PWD/screenshots $$PWD/slides files.path = . diff --git a/demos/embedded/lightmaps/lightmaps.pro b/demos/embedded/lightmaps/lightmaps.pro index d4168b1..122865e 100644 --- a/demos/embedded/lightmaps/lightmaps.pro +++ b/demos/embedded/lightmaps/lightmaps.pro @@ -3,8 +3,8 @@ SOURCES = lightmaps.cpp QT += network symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF75 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h LIBS += -lesock -lconnmon -linsock TARGET.CAPABILITY = NetworkServices diff --git a/demos/embedded/raycasting/raycasting.pro b/demos/embedded/raycasting/raycasting.pro index 19e0212..8dd8a24 100644 --- a/demos/embedded/raycasting/raycasting.pro +++ b/demos/embedded/raycasting/raycasting.pro @@ -3,6 +3,6 @@ SOURCES = raycasting.cpp RESOURCES += raycasting.qrc symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF76 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/styledemo/styledemo.pro b/demos/embedded/styledemo/styledemo.pro index 7107798..2125f3b 100644 --- a/demos/embedded/styledemo/styledemo.pro +++ b/demos/embedded/styledemo/styledemo.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_DEMOS]/embedded/styledemo INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000A63F + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/embedded/weatherinfo/weatherinfo.pro b/demos/embedded/weatherinfo/weatherinfo.pro index 7bff6e9..5b2f03a 100644 --- a/demos/embedded/weatherinfo/weatherinfo.pro +++ b/demos/embedded/weatherinfo/weatherinfo.pro @@ -5,8 +5,8 @@ RESOURCES = weatherinfo.qrc QT += network svg symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF77 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h LIBS += -lesock -lconnmon -linsock TARGET.CAPABILITY = NetworkServices diff --git a/demos/mediaplayer/mediaplayer.pro b/demos/mediaplayer/mediaplayer.pro index 8f9ec82..d8d8301 100644 --- a/demos/mediaplayer/mediaplayer.pro +++ b/demos/mediaplayer/mediaplayer.pro @@ -26,6 +26,6 @@ DEPLOYMENT_PLUGIN += phonon_ds9 phonon_waveout } symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000C613 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/pathstroke/pathstroke.pro b/demos/pathstroke/pathstroke.pro index ac50842..43f20b6 100644 --- a/demos/pathstroke/pathstroke.pro +++ b/demos/pathstroke/pathstroke.pro @@ -19,6 +19,6 @@ sources.path = $$[QT_INSTALL_DEMOS]/pathstroke INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000A63E + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/shared/shared.pro b/demos/shared/shared.pro index de29857..0f7137f 100644 --- a/demos/shared/shared.pro +++ b/demos/shared/shared.pro @@ -33,6 +33,6 @@ INSTALLS += sources !cross_compile:INSTALLS += target symbian { - include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) TARGET.UID3 = 0xA000A63C + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) } diff --git a/demos/symbianpkgrules.pri b/demos/symbianpkgrules.pri index 7e6852b..cf52cb3 100644 --- a/demos/symbianpkgrules.pri +++ b/demos/symbianpkgrules.pri @@ -11,3 +11,5 @@ vendorinfo = \ " " default_deployment.pkg_prerules += vendorinfo + +!isEmpty(TARGET.UID3):ICON = $$QT_SOURCE_TREE/src/s60installs/qt.svg diff --git a/examples/draganddrop/draggableicons/draggableicons.pro b/examples/draganddrop/draggableicons/draggableicons.pro index f177bd6..9def1bc 100644 --- a/examples/draganddrop/draggableicons/draggableicons.pro +++ b/examples/draganddrop/draggableicons/draggableicons.pro @@ -10,6 +10,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/draganddrop/draggableicons INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C615 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/draganddrop/draggabletext/draggabletext.pro b/examples/draganddrop/draggabletext/draggabletext.pro index 19fee2d..7c2cfbb 100644 --- a/examples/draganddrop/draggabletext/draggabletext.pro +++ b/examples/draganddrop/draggabletext/draggabletext.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/draganddrop/draggabletext INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF64 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/draganddrop/fridgemagnets/fridgemagnets.pro b/examples/draganddrop/fridgemagnets/fridgemagnets.pro index b8388cf..ea40a74 100644 --- a/examples/draganddrop/fridgemagnets/fridgemagnets.pro +++ b/examples/draganddrop/fridgemagnets/fridgemagnets.pro @@ -12,8 +12,8 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/draganddrop/fridgemagnets INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C610 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/draganddrop/puzzle/puzzle.pro b/examples/draganddrop/puzzle/puzzle.pro index 20080e9..31786c7 100644 --- a/examples/draganddrop/puzzle/puzzle.pro +++ b/examples/draganddrop/puzzle/puzzle.pro @@ -14,11 +14,11 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/draganddrop/puzzle INSTALLS += target sources symbian:{ + TARGET.UID3 = 0xA000CF65 include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) addFile.sources = example.jpg addFile.path = . DEPLOYMENT += addFile - TARGET.UID3 = 0xA000CF65 } wince*: { addFile.sources = example.jpg diff --git a/examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro b/examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro index 8a6aae1..9549174 100644 --- a/examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro +++ b/examples/graphicsview/basicgraphicslayouts/basicgraphicslayouts.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/basicgraphicslayouts INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A645 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/graphicsview/collidingmice/collidingmice.pro b/examples/graphicsview/collidingmice/collidingmice.pro index e4dc117..207c645 100644 --- a/examples/graphicsview/collidingmice/collidingmice.pro +++ b/examples/graphicsview/collidingmice/collidingmice.pro @@ -14,6 +14,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/collidingmice INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A643 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/graphicsview/elasticnodes/elasticnodes.pro b/examples/graphicsview/elasticnodes/elasticnodes.pro index ba17386..c086461 100644 --- a/examples/graphicsview/elasticnodes/elasticnodes.pro +++ b/examples/graphicsview/elasticnodes/elasticnodes.pro @@ -18,6 +18,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/elasticnodes INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A642 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/graphicsview/padnavigator/padnavigator.pro b/examples/graphicsview/padnavigator/padnavigator.pro index cb09b90..d6f536c 100644 --- a/examples/graphicsview/padnavigator/padnavigator.pro +++ b/examples/graphicsview/padnavigator/padnavigator.pro @@ -26,6 +26,6 @@ INSTALLS += target sources CONFIG += console symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A644 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/itemviews/addressbook/addressbook.pro b/examples/itemviews/addressbook/addressbook.pro index b53a1cf..f45f92c 100644 --- a/examples/itemviews/addressbook/addressbook.pro +++ b/examples/itemviews/addressbook/addressbook.pro @@ -17,6 +17,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/itemviews/addressbook INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A646 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/itemviews/chart/chart.pro b/examples/itemviews/chart/chart.pro index 8568181..53601f4 100644 --- a/examples/itemviews/chart/chart.pro +++ b/examples/itemviews/chart/chart.pro @@ -15,6 +15,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/itemviews/chart INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A647 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/mainwindows/menus/menus.pro b/examples/mainwindows/menus/menus.pro index 5ac5b34..7ca442e 100644 --- a/examples/mainwindows/menus/menus.pro +++ b/examples/mainwindows/menus/menus.pro @@ -9,6 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/mainwindows/menus INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF66 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/multimedia/audio/audiodevices/audiodevices.pro b/examples/multimedia/audio/audiodevices/audiodevices.pro index 2c078ba..173aa8f 100644 --- a/examples/multimedia/audio/audiodevices/audiodevices.pro +++ b/examples/multimedia/audio/audiodevices/audiodevices.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiodevices INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7BE + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/multimedia/audio/audioinput/audioinput.pro b/examples/multimedia/audio/audioinput/audioinput.pro index 139240e..0d6198d 100644 --- a/examples/multimedia/audio/audioinput/audioinput.pro +++ b/examples/multimedia/audio/audioinput/audioinput.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audioinput INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7BF + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/multimedia/audio/audiooutput/audiooutput.pro b/examples/multimedia/audio/audiooutput/audiooutput.pro index e2069cf..b43763c 100644 --- a/examples/multimedia/audio/audiooutput/audiooutput.pro +++ b/examples/multimedia/audio/audiooutput/audiooutput.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiooutput INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7C0 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/network/fortuneserver/fortuneserver.pro b/examples/network/fortuneserver/fortuneserver.pro index 0a132a5..803c2f2 100644 --- a/examples/network/fortuneserver/fortuneserver.pro +++ b/examples/network/fortuneserver/fortuneserver.pro @@ -10,10 +10,10 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/network/fortuneserver INSTALLS += target sources symbian { + TARGET.UID3 = 0xA000CF71 include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h LIBS += -lesock - TARGET.UID3 = 0xA000CF71 TARGET.CAPABILITY = "All -TCB" TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff --git a/examples/network/ftp/ftp.pro b/examples/network/ftp/ftp.pro index 73eb716..ce2a97b 100644 --- a/examples/network/ftp/ftp.pro +++ b/examples/network/ftp/ftp.pro @@ -11,10 +11,10 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/network/ftp INSTALLS += target sources symbian { + TARGET.UID3 = 0xA000A648 include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) HEADERS += sym_iap_util.h INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE TARGET.CAPABILITY="NetworkServices ReadUserData WriteUserData" - TARGET.UID3 = 0xA000A648 LIBS+=-lesock -lcommdb -linsock # For IAP selection } diff --git a/examples/network/securesocketclient/securesocketclient.pro b/examples/network/securesocketclient/securesocketclient.pro index 48c8e0d..ff4f4587 100644 --- a/examples/network/securesocketclient/securesocketclient.pro +++ b/examples/network/securesocketclient/securesocketclient.pro @@ -16,6 +16,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/network/securesocketclient INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF67 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/painting/basicdrawing/basicdrawing.pro b/examples/painting/basicdrawing/basicdrawing.pro index ea23706..4fa0e71 100644 --- a/examples/painting/basicdrawing/basicdrawing.pro +++ b/examples/painting/basicdrawing/basicdrawing.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/painting/basicdrawing INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A649 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/painting/concentriccircles/concentriccircles.pro b/examples/painting/concentriccircles/concentriccircles.pro index a8d2c36..0ef4337 100644 --- a/examples/painting/concentriccircles/concentriccircles.pro +++ b/examples/painting/concentriccircles/concentriccircles.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/painting/concentriccircles INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64A + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/painting/imagecomposition/imagecomposition.pro b/examples/painting/imagecomposition/imagecomposition.pro index fe29a8a..e9e8725 100644 --- a/examples/painting/imagecomposition/imagecomposition.pro +++ b/examples/painting/imagecomposition/imagecomposition.pro @@ -10,6 +10,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/painting/imagecomposition INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64B + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/painting/painterpaths/painterpaths.pro b/examples/painting/painterpaths/painterpaths.pro index 1d981bb..1f42b41 100644 --- a/examples/painting/painterpaths/painterpaths.pro +++ b/examples/painting/painterpaths/painterpaths.pro @@ -12,6 +12,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/painting/painterpaths INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64C + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/painting/svgviewer/svgviewer.pro b/examples/painting/svgviewer/svgviewer.pro index 583d51c..5af8731 100644 --- a/examples/painting/svgviewer/svgviewer.pro +++ b/examples/painting/svgviewer/svgviewer.pro @@ -23,8 +23,8 @@ wince*: { } symbian: { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64E + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) addFiles.sources = files\*.svg addFiles.path = . DEPLOYMENT += addFiles diff --git a/examples/painting/transformations/transformations.pro b/examples/painting/transformations/transformations.pro index 9e225a4..91470f7 100644 --- a/examples/painting/transformations/transformations.pro +++ b/examples/painting/transformations/transformations.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/painting/transformations INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64D + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/qtestlib/tutorial1/tutorial1.pro b/examples/qtestlib/tutorial1/tutorial1.pro index bcce234..93b0ec6 100644 --- a/examples/qtestlib/tutorial1/tutorial1.pro +++ b/examples/qtestlib/tutorial1/tutorial1.pro @@ -8,6 +8,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial1 INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60B + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/qtestlib/tutorial2/tutorial2.pro b/examples/qtestlib/tutorial2/tutorial2.pro index bcfe940..eb79038 100644 --- a/examples/qtestlib/tutorial2/tutorial2.pro +++ b/examples/qtestlib/tutorial2/tutorial2.pro @@ -8,6 +8,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial2 INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60C + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/qtestlib/tutorial3/tutorial3.pro b/examples/qtestlib/tutorial3/tutorial3.pro index fed5064..603afd1 100644 --- a/examples/qtestlib/tutorial3/tutorial3.pro +++ b/examples/qtestlib/tutorial3/tutorial3.pro @@ -8,6 +8,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial3 INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60D + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/qtestlib/tutorial4/tutorial4.pro b/examples/qtestlib/tutorial4/tutorial4.pro index 00c2147..8695849 100644 --- a/examples/qtestlib/tutorial4/tutorial4.pro +++ b/examples/qtestlib/tutorial4/tutorial4.pro @@ -8,6 +8,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial4 INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60E + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/qtestlib/tutorial5/tutorial5.pro b/examples/qtestlib/tutorial5/tutorial5.pro index 4fdcec9..7f5e695 100644 --- a/examples/qtestlib/tutorial5/tutorial5.pro +++ b/examples/qtestlib/tutorial5/tutorial5.pro @@ -8,6 +8,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial5 INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60F + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/script/context2d/context2d.pro b/examples/script/context2d/context2d.pro index 301c227..54f5c31 100644 --- a/examples/script/context2d/context2d.pro +++ b/examples/script/context2d/context2d.pro @@ -23,8 +23,8 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/script/context2d INSTALLS += target sources symbian:{ - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C608 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.EPOCHEAPSIZE = 0x200000 0xA00000 contextScripts.path = . contextScripts.sources = scripts diff --git a/examples/sql/drilldown/drilldown.pro b/examples/sql/drilldown/drilldown.pro index b6de511..5c97e88 100644 --- a/examples/sql/drilldown/drilldown.pro +++ b/examples/sql/drilldown/drilldown.pro @@ -16,6 +16,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/sql/drilldown INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C612 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/symbianpkgrules.pri b/examples/symbianpkgrules.pri index 59c5480..069a16e 100644 --- a/examples/symbianpkgrules.pri +++ b/examples/symbianpkgrules.pri @@ -11,3 +11,5 @@ vendorinfo = \ " " default_deployment.pkg_prerules += vendorinfo + +!isEmpty(TARGET.UID3):ICON = $$QT_SOURCE_TREE/src/s60installs/qt.svg diff --git a/examples/uitools/multipleinheritance/multipleinheritance.pro b/examples/uitools/multipleinheritance/multipleinheritance.pro index b401c05..9b76d33 100644 --- a/examples/uitools/multipleinheritance/multipleinheritance.pro +++ b/examples/uitools/multipleinheritance/multipleinheritance.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/uitools/multipleinheritance INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7C1 -} \ No newline at end of file + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff --git a/examples/video/videographicsitem/videographicsitem.pro b/examples/video/videographicsitem/videographicsitem.pro index 7ebd975..d79c3fb 100644 --- a/examples/video/videographicsitem/videographicsitem.pro +++ b/examples/video/videographicsitem/videographicsitem.pro @@ -16,6 +16,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/video/videographicsitem INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7C2 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/video/videowidget/videowidget.pro b/examples/video/videowidget/videowidget.pro index cc0260f..4a1d717 100644 --- a/examples/video/videowidget/videowidget.pro +++ b/examples/video/videowidget/videowidget.pro @@ -14,6 +14,6 @@ SOURCES = \ videowidgetsurface.cpp symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000D7C3 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/webkit/formextractor/formextractor.pro b/examples/webkit/formextractor/formextractor.pro index ba9c72f..4364b4c 100644 --- a/examples/webkit/formextractor/formextractor.pro +++ b/examples/webkit/formextractor/formextractor.pro @@ -16,6 +16,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/webkit/formextractor INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF6D + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/webkit/previewer/previewer.pro b/examples/webkit/previewer/previewer.pro index c3088a2..525dbb2 100644 --- a/examples/webkit/previewer/previewer.pro +++ b/examples/webkit/previewer/previewer.pro @@ -13,6 +13,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/webkit/previewer INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF6F + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/analogclock/analogclock.pro b/examples/widgets/analogclock/analogclock.pro index 50c0a06..34c0ec5 100644 --- a/examples/widgets/analogclock/analogclock.pro +++ b/examples/widgets/analogclock/analogclock.pro @@ -9,6 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/analogclock INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000A64F + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/calculator/calculator.pro b/examples/widgets/calculator/calculator.pro index 585ff43..b31208e 100644 --- a/examples/widgets/calculator/calculator.pro +++ b/examples/widgets/calculator/calculator.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/calculator INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C602 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/calendarwidget/calendarwidget.pro b/examples/widgets/calendarwidget/calendarwidget.pro index f6cf21f..4675db1 100644 --- a/examples/widgets/calendarwidget/calendarwidget.pro +++ b/examples/widgets/calendarwidget/calendarwidget.pro @@ -9,6 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/calendarwidget INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C603 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/lineedits/lineedits.pro b/examples/widgets/lineedits/lineedits.pro index 409215c..0a40dcf 100644 --- a/examples/widgets/lineedits/lineedits.pro +++ b/examples/widgets/lineedits/lineedits.pro @@ -9,6 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/lineedits INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C604 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/shapedclock/shapedclock.pro b/examples/widgets/shapedclock/shapedclock.pro index bf4ee70..0a2515f 100644 --- a/examples/widgets/shapedclock/shapedclock.pro +++ b/examples/widgets/shapedclock/shapedclock.pro @@ -9,6 +9,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/shapedclock INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C605 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/softkeys/softkeys.pro b/examples/widgets/softkeys/softkeys.pro index 6c3271e..d4d192f 100644 --- a/examples/widgets/softkeys/softkeys.pro +++ b/examples/widgets/softkeys/softkeys.pro @@ -10,6 +10,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/softkeys INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000CF6B + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/tetrix/tetrix.pro b/examples/widgets/tetrix/tetrix.pro index d683f61..fbdb366 100644 --- a/examples/widgets/tetrix/tetrix.pro +++ b/examples/widgets/tetrix/tetrix.pro @@ -13,6 +13,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/tetrix INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C606 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/widgets/wiggly/wiggly.pro b/examples/widgets/wiggly/wiggly.pro index 857122f..f40f86f 100644 --- a/examples/widgets/wiggly/wiggly.pro +++ b/examples/widgets/wiggly/wiggly.pro @@ -11,6 +11,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/wiggly INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C607 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/xml/htmlinfo/htmlinfo.pro b/examples/xml/htmlinfo/htmlinfo.pro index f70fb7d..5e9c8ca 100644 --- a/examples/xml/htmlinfo/htmlinfo.pro +++ b/examples/xml/htmlinfo/htmlinfo.pro @@ -14,6 +14,6 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/xml/htmlinfo INSTALLS += target sources symbian { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C609 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff --git a/examples/xml/saxbookmarks/saxbookmarks.pro b/examples/xml/saxbookmarks/saxbookmarks.pro index 16ef184..4af3ddd 100644 --- a/examples/xml/saxbookmarks/saxbookmarks.pro +++ b/examples/xml/saxbookmarks/saxbookmarks.pro @@ -20,8 +20,8 @@ wince*: { } symbian: { - include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) TARGET.UID3 = 0xA000C60A + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) addFiles.sources = frank.xbel jennifer.xbel addFiles.path = /data/qt/saxbookmarks DEPLOYMENT += addFiles diff --git a/src/s60installs/qt.svg b/src/s60installs/qt.svg new file mode 100644 index 0000000..22cb204 --- /dev/null +++ b/src/s60installs/qt.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + -- cgit v0.12 From 6bfc155e1e3e2dd7d3cf4cd1607103af9a6f592c Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 2 Oct 2009 15:11:23 +0200 Subject: Mac: bugfix 45f095b8970dc3c1b6f6e97fa2323654ba848288 Seems like I forgot to handle page scrolls. Also did a small optimization (see also 45f095b8970dc3c1b6f6e97fa2323654ba848288) --- src/gui/widgets/qabstractslider.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/gui/widgets/qabstractslider.cpp b/src/gui/widgets/qabstractslider.cpp index 28f3be3..19a8b63 100644 --- a/src/gui/widgets/qabstractslider.cpp +++ b/src/gui/widgets/qabstractslider.cpp @@ -694,7 +694,7 @@ void QAbstractSlider::wheelEvent(QWheelEvent * e) return; qreal currentOffset = qreal(e->delta()) / 120; - d->offset_accumulated += d->invertedControls ? -currentOffset : currentOffset; + d->offset_accumulated += currentOffset; if (int(d->offset_accumulated) == 0) { // QAbstractSlider works on integer values. So if the accumulated // offset is less than +/- 1, we need to wait until we get more @@ -703,17 +703,24 @@ void QAbstractSlider::wheelEvent(QWheelEvent * e) return; } - // Calculate the number of steps to scroll (per 15 degrees of rotate): + int stepsToScroll; + if ((e->modifiers() & Qt::ControlModifier) || (e->modifiers() & Qt::ShiftModifier)) { + stepsToScroll = currentOffset > 0 ? d->pageStep : -d->pageStep; + } else { + // Calculate the number of steps to scroll (per 15 degrees of rotate): #ifdef Q_OS_MAC - // On mac, since mouse wheel scrolling is accelerated and - // fine tuned by the OS, we skip applying acceleration: - int stepsToScroll = int(d->offset_accumulated); + // On mac, since mouse wheel scrolling is accelerated and + // fine tuned by the OS, we skip applying acceleration: + stepsToScroll = int(d->offset_accumulated); #else - int step = qMin(QApplication::wheelScrollLines() * d->singleStep, d->pageStep); - if ((e->modifiers() & Qt::ControlModifier) || (e->modifiers() & Qt::ShiftModifier)) - step = d->pageStep; - int stepsToScroll = step * int(d->offset_accumulated); + stepsToScroll = int(d->offset_accumulated) * QApplication::wheelScrollLines() * d->singleStep; #endif + if (qAbs(stepsToScroll) > d->pageStep) + stepsToScroll = currentOffset > 0 ? d->pageStep : -d->pageStep; + } + + if (d->invertedControls) + stepsToScroll = -stepsToScroll; int prevValue = d->value; d->position = d->overflowSafeAdd(stepsToScroll); // value will be updated by triggerAction() -- cgit v0.12 From 6592c0868771b28f7f2d17b1899a2f7554fb26f6 Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Fri, 2 Oct 2009 14:54:04 +0200 Subject: Adds a bool to QAbstractAnimationPrivate to keep track of top-level animations Also refactored the timer verifications on (un)registerAnimation: we should never register an animation that has a registeredTimer, but we can unregister an animation several times. Reviewed-by: thierry --- src/corelib/animation/qabstractanimation.cpp | 17 +++++++++-------- src/corelib/animation/qabstractanimation_p.h | 8 +++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp index f92c22d..6bbd801 100644 --- a/src/corelib/animation/qabstractanimation.cpp +++ b/src/corelib/animation/qabstractanimation.cpp @@ -83,7 +83,7 @@ updateCurrentTime(). The duration() function lets you report a duration for the animation (as discussed above). The animation framework calls updateCurrentTime() when current time has changed. - By reimplementing this function, you can track the animation + By reimplementing this function, you can track the animation progress. Note that neither the interval between calls nor the number of calls to this function are defined; though, it will normally be 60 updates per second. @@ -228,15 +228,16 @@ void QUnifiedTimer::timerEvent(QTimerEvent *event) void QUnifiedTimer::registerAnimation(QAbstractAnimation *animation) { - if (animations.contains(animation) || animationsToStart.contains(animation)) - return; + Q_ASSERT(!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer); + QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer = true; animationsToStart << animation; - startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this); // we delay the check if we should start/stop the global timer + startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this); } void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation) { - Q_ASSERT(animations.count(animation) + animationsToStart.count(animation) <= 1); + if (!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer) + return; int idx = animations.indexOf(animation); if (idx != -1) { @@ -244,13 +245,14 @@ void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation) // this is needed if we unregister an animation while its running if (idx <= currentAnimationIdx) --currentAnimationIdx; + if (animations.isEmpty()) + startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this); } else { animationsToStart.removeOne(animation); } - startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this); // we delay the check if we should start/stop the global timer + QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer = false; } - void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) { Q_Q(QAbstractAnimation); @@ -326,7 +328,6 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) } break; } - } /*! diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h index 20868f9..1a79f40 100644 --- a/src/corelib/animation/qabstractanimation_p.h +++ b/src/corelib/animation/qabstractanimation_p.h @@ -75,6 +75,7 @@ public: currentTime(0), loopCount(1), currentLoop(0), + hasRegisteredTimer(false), group(0) { } @@ -96,6 +97,8 @@ public: int loopCount; int currentLoop; + bool hasRegisteredTimer; + QAnimationGroup *group; private: @@ -137,7 +140,10 @@ protected: void timerEvent(QTimerEvent *); private: - QBasicTimer animationTimer, startStopAnimationTimer; + // timer used for all active animations + QBasicTimer animationTimer; + // timer used to delay the check if we should start/stop the global timer + QBasicTimer startStopAnimationTimer; QTime time; int lastTick; int timingInterval; -- cgit v0.12 From a5a02758bc1c924fdce529d68172c39fcfa5df0b Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Fri, 2 Oct 2009 15:43:21 +0200 Subject: Doc: mark API of Gesture framework as preliminary. New API will most likely not be in the Beta release. --- doc/src/getting-started/examples.qdoc | 4 ++++ doc/src/qt4-intro.qdoc | 3 ++- src/gui/kernel/qgesture.cpp | 1 + src/gui/kernel/qstandardgestures.cpp | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/src/getting-started/examples.qdoc b/doc/src/getting-started/examples.qdoc index d80308a..30dae88 100644 --- a/doc/src/getting-started/examples.qdoc +++ b/doc/src/getting-started/examples.qdoc @@ -1077,9 +1077,13 @@ \contentspage Qt Examples \nextpage D-Bus Examples + The API of the gesture framework is not yet finalized and + still subject to change. +\omit \list \o \l{widgets/imageviewer}{Image Viewer} \endlist +\endomit */ /*! diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc index 1fd62be..6224cd4 100644 --- a/doc/src/qt4-intro.qdoc +++ b/doc/src/qt4-intro.qdoc @@ -567,7 +567,8 @@ \o Enable extensibility. \endlist - See the QTouchEvent and QGesture class documentation for more information. + See the QTouchEvent class documentation for more information. The + Gesture framework API is still subject to change. \section1 DOM access API diff --git a/src/gui/kernel/qgesture.cpp b/src/gui/kernel/qgesture.cpp index 00839d1..237ce46 100644 --- a/src/gui/kernel/qgesture.cpp +++ b/src/gui/kernel/qgesture.cpp @@ -67,6 +67,7 @@ private: /*! \class QGesture \since 4.6 + \preliminary \brief The QGesture class is the base class for implementing custom gestures. diff --git a/src/gui/kernel/qstandardgestures.cpp b/src/gui/kernel/qstandardgestures.cpp index bcc411a..3cfb987 100644 --- a/src/gui/kernel/qstandardgestures.cpp +++ b/src/gui/kernel/qstandardgestures.cpp @@ -57,6 +57,7 @@ QWidgetPrivate *qt_widget_private(QWidget *widget); /*! \class QPanGesture + \preliminary \since 4.6 \brief The QPanGesture class represents a Pan gesture, @@ -339,6 +340,7 @@ QSizeF QPanGesture::offset() const /*! \class QPinchGesture + \preliminary \since 4.6 \brief The QPinchGesture class represents a Pinch gesture, @@ -667,6 +669,7 @@ QPointF QPinchGesture::startCenterPoint() const /*! \class QSwipeGesture + \preliminary \since 4.6 \brief The QSwipeGesture class represents a swipe gesture, -- cgit v0.12 From 5d2f84dc7aa757ea70b0d84b7802feef5515b92e Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 2 Oct 2009 17:01:51 +0200 Subject: Add prefix to statemachine-specific event types "Signal" and "Wrapped" is too generic; prefix with StateMachine. Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/corelib/kernel/qcoreevent.cpp | 4 ++-- src/corelib/kernel/qcoreevent.h | 4 ++-- src/corelib/statemachine/qeventtransition.cpp | 2 +- src/corelib/statemachine/qsignaltransition.cpp | 4 ++-- src/corelib/statemachine/qstatemachine.cpp | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index 3bef0d4..744e6a9 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -192,8 +192,9 @@ QT_BEGIN_NAMESPACE \value ShortcutOverride Key press in child, for overriding shortcut key handling (QKeyEvent). \value Show Widget was shown on screen (QShowEvent). \value ShowToParent A child widget has been shown. - \value Signal A signal delivered to a state machine (QStateMachine::SignalEvent). \value SockAct Socket activated, used to implement QSocketNotifier. + \value StateMachineSignal A signal delivered to a state machine (QStateMachine::SignalEvent). + \value StateMachineWrapped The event is a wrapper for, i.e., contains, another event (QStateMachine::WrappedEvent). \value StatusTip A status tip is requested (QStatusTipEvent). \value StyleChange Widget's style has been changed. \value TabletMove Wacom tablet move (QTabletEvent). @@ -221,7 +222,6 @@ QT_BEGIN_NAMESPACE \value WindowStateChange The \l{QWidget::windowState()}{window's state} (minimized, maximized or full-screen) has changed (QWindowStateChangeEvent). \value WindowTitleChange The window title has changed. \value WindowUnblocked The window is unblocked after a modal dialog exited. - \value Wrapped The event is a wrapper for, i.e., contains, another event (QStateMachine::WrappedEvent). \value ZOrderChange The widget's z-order has changed. This event is never sent to top level windows. \value KeyboardLayoutChange The keyboard layout has changed. \value DynamicPropertyChange A dynamic property was added, changed or removed from the object. diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index be25b41..a039d32 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -269,8 +269,8 @@ public: CocoaRequestModal = 190, // Internal for requesting an application modal Cocoa Window MacGLClearDrawable = 191, // Internal Cocoa, the window has changed, so we must clear - Signal = 192, - Wrapped = 193, + StateMachineSignal = 192, + StateMachineWrapped = 193, TouchBegin = 194, TouchUpdate = 195, diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp index f278371..949f39e 100644 --- a/src/corelib/statemachine/qeventtransition.cpp +++ b/src/corelib/statemachine/qeventtransition.cpp @@ -231,7 +231,7 @@ void QEventTransition::setEventSource(QObject *object) bool QEventTransition::eventTest(QEvent *event) { Q_D(const QEventTransition); - if (event->type() == QEvent::Wrapped) { + if (event->type() == QEvent::StateMachineWrapped) { QStateMachine::WrappedEvent *we = static_cast(event); return (we->object() == d->object) && (we->event()->type() == d->eventType); diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp index 9811725..f55f634 100644 --- a/src/corelib/statemachine/qsignaltransition.cpp +++ b/src/corelib/statemachine/qsignaltransition.cpp @@ -218,7 +218,7 @@ void QSignalTransition::setSignal(const QByteArray &signal) bool QSignalTransition::eventTest(QEvent *event) { Q_D(const QSignalTransition); - if (event->type() == QEvent::Signal) { + if (event->type() == QEvent::StateMachineSignal) { if (d->signalIndex == -1) return false; QStateMachine::SignalEvent *se = static_cast(event); @@ -248,7 +248,7 @@ void QSignalTransitionPrivate::callOnTransition(QEvent *e) { Q_Q(QSignalTransition); - if (e->type() == QEvent::Signal) { + if (e->type() == QEvent::StateMachineSignal) { QStateMachine::SignalEvent *se = static_cast(e); int savedSignalIndex = se->m_signalIndex; se->m_signalIndex = originalSignalIndex; diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index c7144e4..e182c88 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -2206,7 +2206,7 @@ QSignalEventGenerator::QSignalEventGenerator(QStateMachine *parent) */ QStateMachine::SignalEvent::SignalEvent(QObject *sender, int signalIndex, const QList &arguments) - : QEvent(QEvent::Signal), m_sender(sender), + : QEvent(QEvent::StateMachineSignal), m_sender(sender), m_signalIndex(signalIndex), m_arguments(arguments) { } @@ -2269,7 +2269,7 @@ QStateMachine::SignalEvent::~SignalEvent() The WrappedEvent object takes ownership of \a event. */ QStateMachine::WrappedEvent::WrappedEvent(QObject *object, QEvent *event) - : QEvent(QEvent::Wrapped), m_object(object), m_event(event) + : QEvent(QEvent::StateMachineWrapped), m_object(object), m_event(event) { } -- cgit v0.12 From 4f7d94ca73556f3a40631ad07f565995f6f85176 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Fri, 2 Oct 2009 14:29:16 +0200 Subject: Added qFastSin() and qFastCos() functions. The new functions use a lookup table. Reviewed-by: Trond --- src/corelib/kernel/kernel.pri | 6 +- src/corelib/kernel/qmath.cpp | 305 ++++++++++++++++++++++++++++++++++++++++++ src/corelib/kernel/qmath.h | 24 ++++ 3 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 src/corelib/kernel/qmath.cpp diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri index 003693b..d0dad49 100644 --- a/src/corelib/kernel/kernel.pri +++ b/src/corelib/kernel/kernel.pri @@ -33,7 +33,8 @@ HEADERS += \ kernel/qsystemsemaphore.h \ kernel/qsystemsemaphore_p.h \ kernel/qfunctions_p.h \ - kernel/qguard_p.h + kernel/qguard_p.h \ + kernel/qmath.h SOURCES += \ kernel/qabstracteventdispatcher.cpp \ @@ -55,7 +56,8 @@ SOURCES += \ kernel/qcoreglobaldata.cpp \ kernel/qsharedmemory.cpp \ kernel/qsystemsemaphore.cpp \ - kernel/qpointer.cpp + kernel/qpointer.cpp \ + kernel/qmath.cpp win32 { SOURCES += \ diff --git a/src/corelib/kernel/qmath.cpp b/src/corelib/kernel/qmath.cpp new file mode 100644 index 0000000..24bec4a --- /dev/null +++ b/src/corelib/kernel/qmath.cpp @@ -0,0 +1,305 @@ +/**************************************************************************** +** +** Copyright (C) 2009 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$ +** 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 + +QT_BEGIN_NAMESPACE + +Q_CORE_EXPORT const qreal qt_sine_table[QT_SINE_TABLE_SIZE] = { + 0.0, + 0.024541228522912288, + 0.049067674327418015, + 0.073564563599667426, + 0.098017140329560604, + 0.1224106751992162, + 0.14673047445536175, + 0.17096188876030122, + 0.19509032201612825, + 0.2191012401568698, + 0.24298017990326387, + 0.26671275747489837, + 0.29028467725446233, + 0.31368174039889152, + 0.33688985339222005, + 0.35989503653498811, + 0.38268343236508978, + 0.40524131400498986, + 0.42755509343028208, + 0.44961132965460654, + 0.47139673682599764, + 0.49289819222978404, + 0.51410274419322166, + 0.53499761988709715, + 0.55557023301960218, + 0.57580819141784534, + 0.59569930449243336, + 0.61523159058062682, + 0.63439328416364549, + 0.65317284295377676, + 0.67155895484701833, + 0.68954054473706683, + 0.70710678118654746, + 0.72424708295146689, + 0.74095112535495911, + 0.75720884650648446, + 0.77301045336273699, + 0.78834642762660623, + 0.80320753148064483, + 0.81758481315158371, + 0.83146961230254524, + 0.84485356524970701, + 0.85772861000027212, + 0.87008699110871135, + 0.88192126434835494, + 0.89322430119551532, + 0.90398929312344334, + 0.91420975570353069, + 0.92387953251128674, + 0.93299279883473885, + 0.94154406518302081, + 0.94952818059303667, + 0.95694033573220894, + 0.96377606579543984, + 0.97003125319454397, + 0.97570213003852857, + 0.98078528040323043, + 0.98527764238894122, + 0.98917650996478101, + 0.99247953459870997, + 0.99518472667219682, + 0.99729045667869021, + 0.99879545620517241, + 0.99969881869620425, + 1.0, + 0.99969881869620425, + 0.99879545620517241, + 0.99729045667869021, + 0.99518472667219693, + 0.99247953459870997, + 0.98917650996478101, + 0.98527764238894122, + 0.98078528040323043, + 0.97570213003852857, + 0.97003125319454397, + 0.96377606579543984, + 0.95694033573220894, + 0.94952818059303667, + 0.94154406518302081, + 0.93299279883473885, + 0.92387953251128674, + 0.91420975570353069, + 0.90398929312344345, + 0.89322430119551521, + 0.88192126434835505, + 0.87008699110871146, + 0.85772861000027212, + 0.84485356524970723, + 0.83146961230254546, + 0.81758481315158371, + 0.80320753148064494, + 0.78834642762660634, + 0.7730104533627371, + 0.75720884650648468, + 0.74095112535495899, + 0.72424708295146689, + 0.70710678118654757, + 0.68954054473706705, + 0.67155895484701855, + 0.65317284295377664, + 0.63439328416364549, + 0.61523159058062693, + 0.59569930449243347, + 0.57580819141784545, + 0.55557023301960218, + 0.53499761988709715, + 0.51410274419322177, + 0.49289819222978415, + 0.47139673682599786, + 0.44961132965460687, + 0.42755509343028203, + 0.40524131400498992, + 0.38268343236508989, + 0.35989503653498833, + 0.33688985339222033, + 0.31368174039889141, + 0.29028467725446239, + 0.26671275747489848, + 0.24298017990326407, + 0.21910124015687005, + 0.19509032201612861, + 0.17096188876030122, + 0.1467304744553618, + 0.12241067519921635, + 0.098017140329560826, + 0.073564563599667732, + 0.049067674327417966, + 0.024541228522912326, + 0.0, + -0.02454122852291208, + -0.049067674327417724, + -0.073564563599667496, + -0.09801714032956059, + -0.1224106751992161, + -0.14673047445536158, + -0.17096188876030097, + -0.19509032201612836, + -0.2191012401568698, + -0.24298017990326382, + -0.26671275747489825, + -0.29028467725446211, + -0.31368174039889118, + -0.33688985339222011, + -0.35989503653498811, + -0.38268343236508967, + -0.40524131400498969, + -0.42755509343028181, + -0.44961132965460665, + -0.47139673682599764, + -0.49289819222978393, + -0.51410274419322155, + -0.53499761988709693, + -0.55557023301960196, + -0.57580819141784534, + -0.59569930449243325, + -0.61523159058062671, + -0.63439328416364527, + -0.65317284295377653, + -0.67155895484701844, + -0.68954054473706683, + -0.70710678118654746, + -0.72424708295146678, + -0.74095112535495888, + -0.75720884650648423, + -0.77301045336273666, + -0.78834642762660589, + -0.80320753148064505, + -0.81758481315158382, + -0.83146961230254524, + -0.84485356524970701, + -0.85772861000027201, + -0.87008699110871135, + -0.88192126434835494, + -0.89322430119551521, + -0.90398929312344312, + -0.91420975570353047, + -0.92387953251128652, + -0.93299279883473896, + -0.94154406518302081, + -0.94952818059303667, + -0.95694033573220882, + -0.96377606579543984, + -0.97003125319454397, + -0.97570213003852846, + -0.98078528040323032, + -0.98527764238894111, + -0.9891765099647809, + -0.99247953459871008, + -0.99518472667219693, + -0.99729045667869021, + -0.99879545620517241, + -0.99969881869620425, + -1.0, + -0.99969881869620425, + -0.99879545620517241, + -0.99729045667869021, + -0.99518472667219693, + -0.99247953459871008, + -0.9891765099647809, + -0.98527764238894122, + -0.98078528040323043, + -0.97570213003852857, + -0.97003125319454397, + -0.96377606579543995, + -0.95694033573220894, + -0.94952818059303679, + -0.94154406518302092, + -0.93299279883473907, + -0.92387953251128663, + -0.91420975570353058, + -0.90398929312344334, + -0.89322430119551532, + -0.88192126434835505, + -0.87008699110871146, + -0.85772861000027223, + -0.84485356524970723, + -0.83146961230254546, + -0.81758481315158404, + -0.80320753148064528, + -0.78834642762660612, + -0.77301045336273688, + -0.75720884650648457, + -0.74095112535495911, + -0.724247082951467, + -0.70710678118654768, + -0.68954054473706716, + -0.67155895484701866, + -0.65317284295377709, + -0.63439328416364593, + -0.61523159058062737, + -0.59569930449243325, + -0.57580819141784523, + -0.55557023301960218, + -0.53499761988709726, + -0.51410274419322188, + -0.49289819222978426, + -0.47139673682599792, + -0.44961132965460698, + -0.42755509343028253, + -0.40524131400499042, + -0.38268343236509039, + -0.359895036534988, + -0.33688985339222, + -0.31368174039889152, + -0.2902846772544625, + -0.26671275747489859, + -0.24298017990326418, + -0.21910124015687016, + -0.19509032201612872, + -0.17096188876030177, + -0.14673047445536239, + -0.12241067519921603, + -0.098017140329560506, + -0.073564563599667412, + -0.049067674327418091, + -0.024541228522912448 +}; + +QT_END_NAMESPACE diff --git a/src/corelib/kernel/qmath.h b/src/corelib/kernel/qmath.h index b521323..a9e4378 100644 --- a/src/corelib/kernel/qmath.h +++ b/src/corelib/kernel/qmath.h @@ -52,6 +52,10 @@ QT_BEGIN_NAMESPACE QT_MODULE(Core) +#define QT_SINE_TABLE_SIZE 256 + +extern Q_CORE_EXPORT const qreal qt_sine_table[QT_SINE_TABLE_SIZE]; + inline int qCeil(qreal v) { #ifdef QT_USE_MATH_H_FLOATS @@ -136,6 +140,26 @@ inline qreal qPow(qreal x, qreal y) #define M_PI (3.14159265358979323846) #endif +inline qreal qFastSin(qreal x) +{ + int si = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower. + qreal d = x - si * (2.0 * M_PI / QT_SINE_TABLE_SIZE); + int ci = si + QT_SINE_TABLE_SIZE / 4; + si &= QT_SINE_TABLE_SIZE - 1; + ci &= QT_SINE_TABLE_SIZE - 1; + return qt_sine_table[si] + (qt_sine_table[ci] - 0.5 * qt_sine_table[si] * d) * d; +} + +inline qreal qFastCos(qreal x) +{ + int ci = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower. + qreal d = x - ci * (2.0 * M_PI / QT_SINE_TABLE_SIZE); + int si = ci + QT_SINE_TABLE_SIZE / 4; + si &= QT_SINE_TABLE_SIZE - 1; + ci &= QT_SINE_TABLE_SIZE - 1; + return qt_sine_table[si] - (qt_sine_table[ci] + 0.5 * qt_sine_table[si] * d) * d; +} + QT_END_NAMESPACE QT_END_HEADER -- cgit v0.12 From 385176ad28b3a79bcd196d2d529c4bf7abd4fcc0 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Tue, 29 Sep 2009 17:08:41 +0200 Subject: Added support for drawing a pixmap multiple times in one call. This is internal API. It's possible to specify a horizontal and vertical scale, rotation, opacity and source rectangle for each pixmap item. Useful for particle effects. Reviewed-by: Trond --- src/gui/painting/qdrawutil.cpp | 55 ++++++++ src/gui/painting/qdrawutil.h | 12 ++ src/gui/painting/qpaintengineex.cpp | 25 ++++ src/gui/painting/qpaintengineex_p.h | 6 +- .../gl2paintengineex/qglengineshadermanager.cpp | 59 +++++---- .../gl2paintengineex/qglengineshadermanager_p.h | 14 +- .../gl2paintengineex/qglengineshadersource_p.h | 20 +++ .../gl2paintengineex/qpaintengineex_opengl2.cpp | 141 ++++++++++++++++++--- .../gl2paintengineex/qpaintengineex_opengl2_p.h | 8 +- 9 files changed, 292 insertions(+), 48 deletions(-) diff --git a/src/gui/painting/qdrawutil.cpp b/src/gui/painting/qdrawutil.cpp index ac3796a..4f17e59 100644 --- a/src/gui/painting/qdrawutil.cpp +++ b/src/gui/painting/qdrawutil.cpp @@ -45,6 +45,7 @@ #include "qapplication.h" #include "qpainter.h" #include "qpalette.h" +#include QT_BEGIN_NAMESPACE @@ -1351,4 +1352,58 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin } } +/*! + \struct QDrawPixmapsData + \since 4.6 + \internal + + This structure is used with the qDrawPixmaps() function. + + QPointF point: Specifies the center of the target rectangle. + QRectF source: Specifies the source rectangle in the pixmap passed into the qDrawPixmaps() call. + qreal scaleX: Specifies the horizontal scale of the target rectangle. + qreal scaleY: Specifies the vertical scale of the target rectangle. + qreal rotation: Specifies the rotation of the target rectangle in degrees. + The target rectangle is rotated after scaling. + qreal opacity: Specifies the opacity of the rectangle. +*/ + +/*! + \internal + \since 4.6 + + This function is used to draw \a pixmap, or a sub-rectangle of \a pixmap, at multiple positions + with different scale, rotation and opacity on \a painter. \a drawingData is an array of \a + dataCount elements specifying the parameters used to draw each pixmap instance. + This can be used for example to implement a particle system. +*/ +void qDrawPixmaps(QPainter *painter, const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +{ + QPaintEngine *engine = painter->paintEngine(); + if (!engine) + return; + + if (engine->isExtended()) { + static_cast(engine)->drawPixmaps(drawingData, dataCount, pixmap); + } else { + qreal oldOpacity = painter->opacity(); + QTransform oldTransform = painter->transform(); + + for (int i = 0; i < dataCount; ++i) { + QTransform transform = oldTransform; + transform.translate(drawingData[i].point.x(), drawingData[i].point.y()); + transform.rotate(drawingData[i].rotation); + painter->setOpacity(oldOpacity * drawingData[i].opacity); + painter->setTransform(transform); + + qreal w = drawingData[i].scaleX * drawingData[i].source.width(); + qreal h = drawingData[i].scaleY * drawingData[i].source.height(); + painter->drawPixmap(QRectF(-0.5 * w, -0.5 * h, w, h), pixmap, drawingData[i].source); + } + + painter->setOpacity(oldOpacity); + painter->setTransform(oldTransform); + } +} + QT_END_NAMESPACE diff --git a/src/gui/painting/qdrawutil.h b/src/gui/painting/qdrawutil.h index 22a57e9..98a36a7 100644 --- a/src/gui/painting/qdrawutil.h +++ b/src/gui/painting/qdrawutil.h @@ -158,6 +158,18 @@ inline void qDrawBorderPixmap(QPainter *painter, qDrawBorderPixmap(painter, target, margins, pixmap, pixmap.rect(), margins); } +struct QDrawPixmapsData +{ + QPointF point; + QRectF source; + qreal scaleX; + qreal scaleY; + qreal rotation; + qreal opacity; +}; + +Q_GUI_EXPORT void qDrawPixmaps(QPainter *painter, const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index 60e4df6..2342b9d 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -932,6 +932,31 @@ void QPaintEngineEx::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, con fill(path, brush); } +void QPaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +{ + qreal oldOpacity = state()->opacity; + QTransform oldTransform = state()->matrix; + + for (int i = 0; i < dataCount; ++i) { + QTransform transform = oldTransform; + transform.translate(drawingData[i].point.x(), drawingData[i].point.y()); + transform.rotate(drawingData[i].rotation); + state()->opacity = oldOpacity * drawingData[i].opacity; + state()->matrix = transform; + opacityChanged(); + transformChanged(); + + qreal w = drawingData[i].scaleX * drawingData[i].source.width(); + qreal h = drawingData[i].scaleY * drawingData[i].source.height(); + drawPixmap(QRectF(-0.5 * w, -0.5 * h, w, h), pixmap, drawingData[i].source); + } + + state()->opacity = oldOpacity; + state()->matrix = oldTransform; + opacityChanged(); + transformChanged(); +} + void QPaintEngineEx::setState(QPainterState *s) { QPaintEngine::state = s; diff --git a/src/gui/painting/qpaintengineex_p.h b/src/gui/painting/qpaintengineex_p.h index 814a0f0..42c1ce9 100644 --- a/src/gui/painting/qpaintengineex_p.h +++ b/src/gui/painting/qpaintengineex_p.h @@ -70,7 +70,7 @@ QT_MODULE(Gui) class QPainterState; class QPaintEngineExPrivate; struct StrokeHandler; - +struct QDrawPixmapsData; struct QIntRect { int x1, y1, x2, y2; @@ -133,8 +133,6 @@ public: qreal pts[8]; }; - - #ifndef QT_NO_DEBUG_STREAM QDebug Q_GUI_EXPORT &operator<<(QDebug &, const QVectorPath &path); #endif @@ -198,6 +196,8 @@ public: virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s); + virtual void drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); + virtual void updateState(const QPaintEngineState &state); virtual void setState(QPainterState *s); diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp index fcb20b4..59c50aa 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp +++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp @@ -97,6 +97,7 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context) code[MainVertexShader] = qglslMainVertexShader; code[MainWithTexCoordsVertexShader] = qglslMainWithTexCoordsVertexShader; + code[MainWithTexCoordsAndOpacityVertexShader] = qglslMainWithTexCoordsAndOpacityVertexShader; code[UntransformedPositionVertexShader] = qglslUntransformedPositionVertexShader; code[PositionOnlyVertexShader] = qglslPositionOnlyVertexShader; @@ -119,6 +120,7 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context) code[MainFragmentShader_C] = qglslMainFragmentShader_C; code[MainFragmentShader_O] = qglslMainFragmentShader_O; code[MainFragmentShader] = qglslMainFragmentShader; + code[MainFragmentShader_ImageArrays] = qglslMainFragmentShader_ImageArrays; code[ImageSrcFragmentShader] = qglslImageSrcFragmentShader; code[ImageSrcWithPatternFragmentShader] = qglslImageSrcWithPatternFragmentShader; @@ -285,6 +287,8 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS cached.program->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR); if (cached.useTextureCoords) cached.program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); + if (cached.useOpacityAttribute) + cached.program->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR); cached.program->link(); if (!cached.program->isLinked()) { @@ -331,7 +335,7 @@ QGLEngineShaderManager::QGLEngineShaderManager(QGLContext* context) : ctx(context), shaderProgNeedsChanging(true), srcPixelType(Qt::NoBrush), - useGlobalOpacity(false), + opacityMode(NoOpacity), maskType(NoMask), compositionMode(QPainter::CompositionMode_SourceOver), customSrcStage(0), @@ -407,12 +411,12 @@ void QGLEngineShaderManager::setSrcPixelType(PixelSrcType type) shaderProgNeedsChanging = true; //### } -void QGLEngineShaderManager::setUseGlobalOpacity(bool useOpacity) +void QGLEngineShaderManager::setOpacityMode(OpacityMode mode) { - if (useGlobalOpacity == useOpacity) + if (opacityMode == mode) return; - useGlobalOpacity = useOpacity; + opacityMode = mode; shaderProgNeedsChanging = true; //### } @@ -564,22 +568,28 @@ bool QGLEngineShaderManager::useCorrectShaderProg() // Choose fragment shader main function: QGLEngineSharedShaders::ShaderName mainFragShaderName; - if (hasCompose && hasMask && useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CMO; - if (hasCompose && hasMask && !useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CM; - if (!hasCompose && hasMask && useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_MO; - if (!hasCompose && hasMask && !useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_M; - if (hasCompose && !hasMask && useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CO; - if (hasCompose && !hasMask && !useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_C; - if (!hasCompose && !hasMask && useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_O; - if (!hasCompose && !hasMask && !useGlobalOpacity) - mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader; + if (opacityMode == AttributeOpacity) { + Q_ASSERT(!hasCompose && !hasMask); + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_ImageArrays; + } else { + bool useGlobalOpacity = (opacityMode == UniformOpacity); + if (hasCompose && hasMask && useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CMO; + if (hasCompose && hasMask && !useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CM; + if (!hasCompose && hasMask && useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_MO; + if (!hasCompose && hasMask && !useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_M; + if (hasCompose && !hasMask && useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_CO; + if (hasCompose && !hasMask && !useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_C; + if (!hasCompose && !hasMask && useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader_O; + if (!hasCompose && !hasMask && !useGlobalOpacity) + mainFragShaderName = QGLEngineSharedShaders::MainFragmentShader; + } requiredProgram.mainFragShader = sharedShaders->compileNamedShader(mainFragShaderName, QGLShader::PartialFragmentShader); @@ -652,12 +662,17 @@ bool QGLEngineShaderManager::useCorrectShaderProg() // Choose vertex shader main function QGLEngineSharedShaders::ShaderName mainVertexShaderName = QGLEngineSharedShaders::InvalidShaderName; - if (texCoords) + if (opacityMode == AttributeOpacity) { + Q_ASSERT(texCoords); + mainVertexShaderName = QGLEngineSharedShaders::MainWithTexCoordsAndOpacityVertexShader; + } else if (texCoords) { mainVertexShaderName = QGLEngineSharedShaders::MainWithTexCoordsVertexShader; - else + } else { mainVertexShaderName = QGLEngineSharedShaders::MainVertexShader; + } requiredProgram.mainVertexShader = sharedShaders->compileNamedShader(mainVertexShaderName, QGLShader::PartialVertexShader); requiredProgram.useTextureCoords = texCoords; + requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity); // At this point, requiredProgram is fully populated so try to find the program in the cache diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h index fbb6d9c..291d24c 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h @@ -247,6 +247,7 @@ struct QGLEngineShaderProg QVector uniformLocations; bool useTextureCoords; + bool useOpacityAttribute; bool operator==(const QGLEngineShaderProg& other) { // We don't care about the program @@ -277,6 +278,7 @@ struct QGLEngineCachedShaderProg static const GLuint QT_VERTEX_COORDS_ATTR = 0; static const GLuint QT_TEXTURE_COORDS_ATTR = 1; +static const GLuint QT_OPACITY_ATTR = 2; class QGLEngineSharedShaders : public QObject { @@ -285,6 +287,7 @@ public: enum ShaderName { MainVertexShader, MainWithTexCoordsVertexShader, + MainWithTexCoordsAndOpacityVertexShader, UntransformedPositionVertexShader, PositionOnlyVertexShader, @@ -307,6 +310,7 @@ public: MainFragmentShader_C, MainFragmentShader_O, MainFragmentShader, + MainFragmentShader_ImageArrays, ImageSrcFragmentShader, ImageSrcWithPatternFragmentShader, @@ -406,13 +410,19 @@ public: NumUniforms }; + enum OpacityMode { + NoOpacity, + UniformOpacity, + AttributeOpacity + }; + // There are optimisations we can do, depending on the brush transform: // 1) May not have to apply perspective-correction // 2) Can use lower precision for matrix void optimiseForBrushTransform(const QTransform &transform); void setSrcPixelType(Qt::BrushStyle); void setSrcPixelType(PixelSrcType); // For non-brush sources, like pixmaps & images - void setUseGlobalOpacity(bool); + void setOpacityMode(OpacityMode); void setMaskType(MaskType); void setCompositionMode(QPainter::CompositionMode); void setCustomStage(QGLCustomShaderStage* stage); @@ -451,7 +461,7 @@ private: // Current state variables which influence the choice of shader: QTransform brushTransform; int srcPixelType; - bool useGlobalOpacity; + OpacityMode opacityMode; MaskType maskType; QPainter::CompositionMode compositionMode; QGLCustomShaderStage* customSrcStage; diff --git a/src/opengl/gl2paintengineex/qglengineshadersource_p.h b/src/opengl/gl2paintengineex/qglengineshadersource_p.h index 8ae86d3..6712bf6 100644 --- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h @@ -84,6 +84,20 @@ static const char* const qglslMainWithTexCoordsVertexShader = "\ textureCoords = textureCoordArray; \ }"; +static const char* const qglslMainWithTexCoordsAndOpacityVertexShader = "\ + attribute highp vec2 textureCoordArray; \ + attribute lowp float opacityArray; \ + varying highp vec2 textureCoords; \ + varying lowp float opacity; \ + uniform highp float depth; \ + void setPosition(); \ + void main(void) \ + { \ + setPosition(); \ + gl_Position.z = depth * gl_Position.w; \ + textureCoords = textureCoordArray; \ + opacity = opacityArray; \ + }"; static const char* const qglslPositionOnlyVertexShader = "\ attribute highp vec4 vertexCoordsArray;\ @@ -331,6 +345,12 @@ static const char* const qglslShockingPinkSrcFragmentShader = "\ return vec4(0.98, 0.06, 0.75, 1.0); \ }"; +static const char* const qglslMainFragmentShader_ImageArrays = "\ + varying lowp float opacity; \ + lowp vec4 srcPixel(); \ + void main() { \ + gl_FragColor = srcPixel() * opacity; \ + }"; static const char* const qglslMainFragmentShader_CMO = "\ uniform lowp float globalOpacity; \ diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index f612bc0..12a8ed8 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -366,7 +366,7 @@ void QGL2PaintEngineExPrivate::updateTextureFilter(GLenum target, GLenum wrapMod } -QColor QGL2PaintEngineExPrivate::premultiplyColor(QColor c, GLfloat opacity) +inline QColor qt_premultiplyColor(QColor c, GLfloat opacity) { qreal alpha = c.alphaF() * opacity; c.setAlphaF(alpha); @@ -469,7 +469,7 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() QTransform brushQTransform = currentBrush->transform(); if (style == Qt::SolidPattern) { - QColor col = premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); + QColor col = qt_premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::FragmentColor), col); } else { @@ -479,7 +479,7 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() if (style <= Qt::DiagCrossPattern) { translationPoint = q->state()->brushOrigin; - QColor col = premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); + QColor col = qt_premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col); @@ -541,7 +541,7 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms() const QPixmap& texPixmap = currentBrush->texture(); if (qHasPixmapTexture(*currentBrush) && currentBrush->texture().isQBitmap()) { - QColor col = premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); + QColor col = qt_premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col); } @@ -712,7 +712,7 @@ void QGL2PaintEngineExPrivate::drawTexture(const QGLRect& dest, const QGLRect& s shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT); if (pattern) { - QColor col = premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity); + QColor col = qt_premultiplyColor(q->state()->pen.color(), (GLfloat)q->state()->opacity); shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col); } @@ -796,9 +796,10 @@ void QGL2PaintEngineExPrivate::transferMode(EngineMode newMode) if (newMode == mode) return; - if (mode == TextDrawingMode || mode == ImageDrawingMode) { + if (mode == TextDrawingMode || mode == ImageDrawingMode || mode == ImageArrayDrawingMode) { glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glDisableVertexAttribArray(QT_OPACITY_ATTR); lastTexture = GLuint(-1); } @@ -824,6 +825,16 @@ void QGL2PaintEngineExPrivate::transferMode(EngineMode newMode) glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, staticTextureCoordinateArray); } + if (newMode == ImageArrayDrawingMode) { + glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR); + glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR); + glEnableVertexAttribArray(QT_OPACITY_ATTR); + + glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray.data()); + glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray.data()); + glVertexAttribPointer(QT_OPACITY_ATTR, 1, GL_FLOAT, GL_FALSE, 0, opacityArray.data()); + } + // This needs to change when we implement high-quality anti-aliasing... if (newMode != TextDrawingMode) shaderManager->setMaskType(QGLEngineShaderManager::NoMask); @@ -953,7 +964,7 @@ void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(QGL2PEXVertexArray& ve bool QGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque) { - if (brushTextureDirty && mode != ImageDrawingMode) + if (brushTextureDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode) updateBrushTexture(); if (compositionModeDirty) @@ -972,16 +983,22 @@ bool QGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque) glEnable(GL_BLEND); } - bool useGlobalOpacityUniform = stateHasOpacity; - if (stateHasOpacity && (mode != ImageDrawingMode)) { - // Using a brush - bool brushIsPattern = (currentBrush->style() >= Qt::Dense1Pattern) && - (currentBrush->style() <= Qt::DiagCrossPattern); - - if ((currentBrush->style() == Qt::SolidPattern) || brushIsPattern) - useGlobalOpacityUniform = false; // Global opacity handled by srcPixel shader + QGLEngineShaderManager::OpacityMode opacityMode; + if (mode == ImageArrayDrawingMode) { + opacityMode = QGLEngineShaderManager::AttributeOpacity; + } else { + opacityMode = stateHasOpacity ? QGLEngineShaderManager::UniformOpacity + : QGLEngineShaderManager::NoOpacity; + if (stateHasOpacity && (mode != ImageDrawingMode)) { + // Using a brush + bool brushIsPattern = (currentBrush->style() >= Qt::Dense1Pattern) && + (currentBrush->style() <= Qt::DiagCrossPattern); + + if ((currentBrush->style() == Qt::SolidPattern) || brushIsPattern) + opacityMode = QGLEngineShaderManager::NoOpacity; // Global opacity handled by srcPixel shader + } } - shaderManager->setUseGlobalOpacity(useGlobalOpacityUniform); + shaderManager->setOpacityMode(opacityMode); bool changed = shaderManager->useCorrectShaderProg(); // If the shader program needs changing, we change it and mark all uniforms as dirty @@ -993,7 +1010,7 @@ bool QGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque) opacityUniformDirty = true; } - if (brushUniformsDirty && mode != ImageDrawingMode) + if (brushUniformsDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode) updateBrushUniforms(); if (shaderMatrixUniformDirty) { @@ -1006,7 +1023,7 @@ bool QGL2PaintEngineExPrivate::prepareForDraw(bool srcPixelsAreOpaque) depthUniformDirty = false; } - if (useGlobalOpacityUniform && opacityUniformDirty) { + if (opacityMode == QGLEngineShaderManager::UniformOpacity && opacityUniformDirty) { shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::GlobalOpacity), (GLfloat)q->state()->opacity); opacityUniformDirty = false; } @@ -1332,7 +1349,7 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(const QPointF &p, QFontEngineGly QColor c = pensBrush.color(); qreal oldOpacity = q->state()->opacity; if (compMode == QPainter::CompositionMode_Source) { - c = premultiplyColor(c, q->state()->opacity); + c = qt_premultiplyColor(c, q->state()->opacity); q->state()->opacity = 1; opacityUniformDirty = true; } @@ -1411,6 +1428,92 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(const QPointF &p, QFontEngineGly glDrawArrays(GL_TRIANGLES, 0, 6 * glyphs.size()); } +void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +{ + // Use fallback for extended composition modes. + if (state()->composition_mode > QPainter::CompositionMode_Plus) { + QPaintEngineEx::drawPixmaps(drawingData, dataCount, pixmap); + return; + } + + Q_D(QGL2PaintEngineEx); + + GLfloat dx = 1.0f / pixmap.size().width(); + GLfloat dy = 1.0f / pixmap.size().height(); + + d->vertexCoordinateArray.clear(); + d->textureCoordinateArray.clear(); + d->opacityArray.reset(); + + bool allOpaque = true; + + for (int i = 0; i < dataCount; ++i) { + qreal s = 0.5 * qSin(drawingData[i].rotation * Q_PI / 180); + qreal c = 0.5 * qCos(drawingData[i].rotation * Q_PI / 180); + + qreal right = drawingData[i].scaleX * drawingData[i].source.width(); + qreal bottom = drawingData[i].scaleY * drawingData[i].source.height(); + QGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c); + QGLPoint bottomLeft(-right * c - bottom * s, -right * s + bottom * c); + + d->vertexCoordinateArray.lineToArray(bottomRight.x + drawingData[i].point.x(), bottomRight.y + drawingData[i].point.y()); + d->vertexCoordinateArray.lineToArray(-bottomLeft.x + drawingData[i].point.x(), -bottomLeft.y + drawingData[i].point.y()); + d->vertexCoordinateArray.lineToArray(-bottomRight.x + drawingData[i].point.x(), -bottomRight.y + drawingData[i].point.y()); + d->vertexCoordinateArray.lineToArray(-bottomRight.x + drawingData[i].point.x(), -bottomRight.y + drawingData[i].point.y()); + d->vertexCoordinateArray.lineToArray(bottomLeft.x + drawingData[i].point.x(), bottomLeft.y + drawingData[i].point.y()); + d->vertexCoordinateArray.lineToArray(bottomRight.x + drawingData[i].point.x(), bottomRight.y + drawingData[i].point.y()); + + QGLRect src(drawingData[i].source.left() * dx, drawingData[i].source.top() * dy, + drawingData[i].source.right() * dx, drawingData[i].source.bottom() * dy); + + d->textureCoordinateArray.lineToArray(src.right, src.bottom); + d->textureCoordinateArray.lineToArray(src.right, src.top); + d->textureCoordinateArray.lineToArray(src.left, src.top); + d->textureCoordinateArray.lineToArray(src.left, src.top); + d->textureCoordinateArray.lineToArray(src.left, src.bottom); + d->textureCoordinateArray.lineToArray(src.right, src.bottom); + + qreal opacity = drawingData[i].opacity * state()->opacity; + d->opacityArray << opacity << opacity << opacity << opacity << opacity << opacity; + allOpaque &= (opacity >= 0.99f); + } + + ensureActive(); + + QGLContext *ctx = d->ctx; + glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT); + QGLTexture *texture = ctx->d_func()->bindTexture(pixmap, GL_TEXTURE_2D, GL_RGBA, + QGLContext::InternalBindOption + | QGLContext::CanFlipNativePixmapBindOption); + + if (texture->options & QGLContext::InvertedYBindOption) { + // Flip texture y-coordinate. + QGLPoint *data = d->textureCoordinateArray.data(); + for (int i = 0; i < 6 * dataCount; ++i) + data[i].y = 1 - data[i].y; + } + + d->transferMode(ImageArrayDrawingMode); + + bool isBitmap = pixmap.isQBitmap(); + bool isOpaque = !isBitmap && !pixmap.hasAlphaChannel() && allOpaque; + + d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, + state()->renderHints & QPainter::SmoothPixmapTransform, texture->id); + + // Setup for texture drawing + d->shaderManager->setSrcPixelType(isBitmap ? QGLEngineShaderManager::PatternSrc : QGLEngineShaderManager::ImageSrc); + if (d->prepareForDraw(isOpaque)) + d->shaderManager->currentProgram()->setUniformValue(d->location(QGLEngineShaderManager::ImageTexture), QT_IMAGE_TEXTURE_UNIT); + + if (isBitmap) { + QColor col = qt_premultiplyColor(state()->pen.color(), (GLfloat)state()->opacity); + d->shaderManager->currentProgram()->setUniformValue(d->location(QGLEngineShaderManager::PatternColor), col); + } + + glDrawArrays(GL_TRIANGLES, 0, 6 * dataCount); +} + bool QGL2PaintEngineEx::begin(QPaintDevice *pdev) { Q_D(QGL2PaintEngineEx); diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h index f245945..9d40726 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h @@ -61,11 +61,13 @@ #include #include #include +#include enum EngineMode { ImageDrawingMode, TextDrawingMode, - BrushDrawingMode + BrushDrawingMode, + ImageArrayDrawingMode }; QT_BEGIN_NAMESPACE @@ -126,6 +128,8 @@ public: virtual void drawTextItem(const QPointF &p, const QTextItem &textItem); + virtual void drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); + Type type() const { return OpenGL2; } void setState(QPainterState *s); @@ -195,7 +199,6 @@ public: // ^ returns whether the current program changed or not inline void useSimpleShader(); - inline QColor premultiplyColor(QColor c, GLfloat opacity); float zValueForRenderText() const; @@ -230,6 +233,7 @@ public: QGL2PEXVertexArray vertexCoordinateArray; QGL2PEXVertexArray textureCoordinateArray; + QDataBuffer opacityArray; GLfloat staticVertexCoordinateArray[8]; GLfloat staticTextureCoordinateArray[8]; -- cgit v0.12 From 5a26fa6da1986bdb507391fd8784c51258e81d80 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Thu, 1 Oct 2009 13:36:57 +0200 Subject: Changed implementation of qDrawBorderPixmap() to use qDrawPixmaps(). Reviewed-by: Trond --- src/gui/painting/qdrawutil.cpp | 408 ++++++++++----------- src/gui/painting/qdrawutil.h | 63 +++- src/gui/painting/qpaintengineex.cpp | 2 +- src/gui/painting/qpaintengineex_p.h | 9 +- .../gl2paintengineex/qpaintengineex_opengl2.cpp | 18 +- .../gl2paintengineex/qpaintengineex_opengl2_p.h | 2 +- 6 files changed, 262 insertions(+), 240 deletions(-) diff --git a/src/gui/painting/qdrawutil.cpp b/src/gui/painting/qdrawutil.cpp index 4f17e59..c20d8d8 100644 --- a/src/gui/painting/qdrawutil.cpp +++ b/src/gui/painting/qdrawutil.cpp @@ -46,6 +46,8 @@ #include "qpainter.h" #include "qpalette.h" #include +#include +#include QT_BEGIN_NAMESPACE @@ -1079,91 +1081,7 @@ void qDrawItem(QPainter *p, Qt::GUIStyle gs, according to the \a margins structure. */ -static inline void qVerticalRepeat(QPainter *painter, - const QRect &target, - const QPixmap &pixmap, - const QRect &source, - void (*drawPixmap)(QPainter*, - const QRect&, - const QPixmap&, - const QRect&)) -{ - const int x = target.x(); - const int width = target.width(); - const int height = source.height(); - const int bottom = target.bottom() - height; - int y = target.y(); - for (; y < bottom; y += height) - (*drawPixmap)(painter, QRect(x, y, width, height), pixmap, source); - const QRect remaining(source.x(), source.y(), source.width(), target.bottom() - y + 1); - (*drawPixmap)(painter, QRect(x, y, width, remaining.height()), pixmap, remaining); -} - -static inline void qHorizontalRepeat(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source, - void (*drawPixmap)(QPainter*, const QRect&, const QPixmap&, const QRect&)) -{ - const int y = target.y(); - const int width = source.width(); - const int height = target.height(); - const int right = target.right() - width; - int x = target.x(); - for (; x < right; x += width) - (*drawPixmap)(painter, QRect(x, y, width, height), pixmap, source); - const QRect remaining(source.x(), source.y(), target.right() - x + 1, source.height()); - (*drawPixmap)(painter, QRect(x, y, remaining.width(), height), pixmap, remaining); -} - -static inline void qVerticalRound(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source, - void (*drawPixmap)(QPainter*, const QRect&, const QPixmap&, const QRect&)) -{ - // qreal based - slow on non-fpu devices - const qreal x = target.x(); - const qreal width = target.width(); - const qreal verticalFactor = static_cast(target.height()) / static_cast(source.height()); - const qreal verticalIncrement = static_cast(target.height()) / static_cast(verticalFactor + 0.5); - const qreal bottom = target.bottom(); - for (qreal y = static_cast(target.y()); y < bottom; y += verticalIncrement) - (*drawPixmap)(painter, QRectF(x, y, width, verticalIncrement).toRect(), pixmap, source); - -} - -static inline void qHorizontalRound(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source, - void (*drawPixmap)(QPainter*, const QRect&, const QPixmap&, const QRect&)) -{ - // qreal based - slow on non-fpu devices - const qreal y = target.y(); - const qreal height = target.height(); - const qreal horizontalFactor = static_cast(target.width()) / static_cast(source.width()); - const qreal horizontalIncrement = static_cast(target.width()) / static_cast(horizontalFactor + 0.5); - const qreal right = target.right(); - for (qreal x = target.x(); x < right; x += horizontalIncrement) - (*drawPixmap)(painter, QRectF(x, y, horizontalIncrement, height).toRect(), pixmap, source); -} - -static inline void qDrawPixmap(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source) -{ - painter->drawPixmap(target, pixmap, source); -} - -static inline void qDrawVerticallyRepeatedPixmap(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source) -{ - qVerticalRepeat(painter, target, pixmap, source, qDrawPixmap); -} - -static inline void qDrawHorizontallyRepeatedPixmap(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source) -{ - qHorizontalRepeat(painter, target, pixmap, source, qDrawPixmap); -} - -static inline void qDrawVerticallyRoundedPixmap(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source) -{ - qVerticalRound(painter, target, pixmap, source, qDrawPixmap); -} - -static inline void qDrawHorizontallyRoundedPixmap(QPainter *painter, const QRect &target, const QPixmap &pixmap, const QRect &source) -{ - qHorizontalRound(painter, target, pixmap, source, qDrawPixmap); -} +typedef QVarLengthArray QDrawPixmapsDataArray; /*! \since 4.6 @@ -1180,180 +1098,227 @@ static inline void qDrawHorizontallyRoundedPixmap(QPainter *painter, const QRect \sa Qt::TileRule, QTileRules, QMargins */ -void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargins &targetMargins, const QPixmap &pixmap, - const QRect &sourceRect, const QMargins &sourceMargins, const QTileRules &rules) +void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargins &targetMargins, + const QPixmap &pixmap, const QRect &sourceRect,const QMargins &sourceMargins, + const QTileRules &rules, QDrawBorderPixmap::DrawingHints hints) { + QDrawPixmaps::Data d; + d.opacity = 1.0; + d.rotation = 0.0; + + QDrawPixmapsDataArray opaqueData; + QDrawPixmapsDataArray translucentData; + // source center - const int sourceTop = sourceRect.top(); - const int sourceLeft = sourceRect.left(); - const int sourceCenterTop = sourceTop + sourceMargins.top(); - const int sourceCenterLeft = sourceLeft + sourceMargins.left(); + const int sourceCenterTop = sourceRect.top() + sourceMargins.top(); + const int sourceCenterLeft = sourceRect.left() + sourceMargins.left(); const int sourceCenterBottom = sourceRect.bottom() - sourceMargins.bottom() + 1; const int sourceCenterRight = sourceRect.right() - sourceMargins.right() + 1; - const int sourceCenterWidth = sourceCenterRight - sourceMargins.left(); - const int sourceCenterHeight = sourceCenterBottom - sourceMargins.top(); + const int sourceCenterWidth = sourceCenterRight - sourceCenterLeft; + const int sourceCenterHeight = sourceCenterBottom - sourceCenterTop; // target center - const int targetTop = targetRect.top(); - const int targetLeft = targetRect.left(); - const int targetCenterTop = targetTop + targetMargins.top(); - const int targetCenterLeft = targetLeft + targetMargins.left(); + const int targetCenterTop = targetRect.top() + targetMargins.top(); + const int targetCenterLeft = targetRect.left() + targetMargins.left(); const int targetCenterBottom = targetRect.bottom() - targetMargins.bottom() + 1; const int targetCenterRight = targetRect.right() - targetMargins.right() + 1; const int targetCenterWidth = targetCenterRight - targetCenterLeft; const int targetCenterHeight = targetCenterBottom - targetCenterTop; + QVarLengthArray xTarget; // x-coordinates of target rectangles + QVarLengthArray yTarget; // y-coordinates of target rectangles + + int columns = 3; + int rows = 3; + if (rules.horizontal != Qt::StretchTile && sourceCenterWidth != 0) + columns = qMax(3, 2 + qCeil(targetCenterWidth / qreal(sourceCenterWidth))); + if (rules.vertical != Qt::StretchTile && sourceCenterHeight != 0) + rows = qMax(3, 2 + qCeil(targetCenterHeight / qreal(sourceCenterHeight))); + + xTarget.resize(columns + 1); + yTarget.resize(rows + 1); + + xTarget[0] = targetRect.left(); + xTarget[1] = targetCenterLeft; + xTarget[columns - 1] = targetCenterRight; + xTarget[columns] = targetRect.left() + targetRect.width(); + + yTarget[0] = targetRect.top(); + yTarget[1] = targetCenterTop; + yTarget[rows - 1] = targetCenterBottom; + yTarget[rows] = targetRect.top() + targetRect.height(); + + qreal dx; + qreal dy; + + switch (rules.horizontal) { + case Qt::StretchTile: + dx = targetCenterWidth; + break; + case Qt::RepeatTile: + dx = sourceCenterWidth; + break; + case Qt::RoundTile: + dx = targetCenterWidth / qreal(columns - 2); + break; + } + + for (int i = 2; i < columns - 1; ++i) + xTarget[i] = xTarget[i - 1] + dx; + + switch (rules.vertical) { + case Qt::StretchTile: + dy = targetCenterHeight; + break; + case Qt::RepeatTile: + dy = sourceCenterHeight; + break; + case Qt::RoundTile: + dy = targetCenterHeight / qreal(rows - 2); + break; + } + + for (int i = 2; i < rows - 1; ++i) + yTarget[i] = yTarget[i - 1] + dy; + // corners if (targetMargins.top() > 0 && targetMargins.left() > 0 && sourceMargins.top() > 0 && sourceMargins.left() > 0) { // top left - const QRect targetTopLeftRect(targetLeft, targetTop, targetMargins.left(), targetMargins.top()); - const QRect sourceTopLeftRect(sourceLeft, sourceTop, sourceMargins.left(), sourceMargins.top()); - qDrawPixmap(painter, targetTopLeftRect, pixmap, sourceTopLeftRect); + d.point.setX(0.5 * (xTarget[1] + xTarget[0])); + d.point.setY(0.5 * (yTarget[1] + yTarget[0])); + d.source = QRectF(sourceRect.left(), sourceRect.top(), sourceMargins.left(), sourceMargins.top()); + d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.source.width(); + d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.source.height(); + if (hints & QDrawBorderPixmap::OpaqueTopLeft) + opaqueData.append(d); + else + translucentData.append(d); } if (targetMargins.top() > 0 && targetMargins.right() > 0 && sourceMargins.top() > 0 && sourceMargins.right() > 0) { // top right - const QRect targetTopRightRect(targetCenterRight, targetTop, targetMargins.right(), targetMargins.top()); - const QRect sourceTopRightRect(sourceCenterRight, sourceTop, sourceMargins.right(), sourceMargins.top()); - qDrawPixmap(painter, targetTopRightRect, pixmap, sourceTopRightRect); + d.point.setX(0.5 * (xTarget[columns] + xTarget[columns - 1])); + d.point.setY(0.5 * (yTarget[1] + yTarget[0])); + d.source = QRectF(sourceCenterRight, sourceRect.top(), sourceMargins.right(), sourceMargins.top()); + d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.source.width(); + d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.source.height(); + if (hints & QDrawBorderPixmap::OpaqueTopRight) + opaqueData.append(d); + else + translucentData.append(d); } if (targetMargins.bottom() > 0 && targetMargins.left() > 0 && sourceMargins.bottom() > 0 && sourceMargins.left() > 0) { // bottom left - const QRect targetBottomLeftRect(targetLeft, targetCenterBottom, targetMargins.left(), targetMargins.bottom()); - const QRect sourceBottomLeftRect(sourceLeft, sourceCenterBottom, sourceMargins.left(), sourceMargins.bottom()); - qDrawPixmap(painter, targetBottomLeftRect, pixmap, sourceBottomLeftRect); + d.point.setX(0.5 * (xTarget[1] + xTarget[0])); + d.point.setY(0.5 * (yTarget[rows] + yTarget[rows - 1])); + d.source = QRectF(sourceRect.left(), sourceCenterBottom, sourceMargins.left(), sourceMargins.bottom()); + d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.source.width(); + d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.source.height(); + if (hints & QDrawBorderPixmap::OpaqueBottomLeft) + opaqueData.append(d); + else + translucentData.append(d); } if (targetMargins.bottom() > 0 && targetMargins.right() > 0 && sourceMargins.bottom() > 0 && sourceMargins.right() > 0) { // bottom right - const QRect targetBottomRightRect(targetCenterRight, targetCenterBottom, targetMargins.right(), targetMargins.bottom()); - const QRect sourceBottomRightRect(sourceCenterRight, sourceCenterBottom, sourceMargins.right(), sourceMargins.bottom()); - qDrawPixmap(painter, targetBottomRightRect, pixmap, sourceBottomRightRect); + d.point.setX(0.5 * (xTarget[columns] + xTarget[columns - 1])); + d.point.setY(0.5 * (yTarget[rows] + yTarget[rows - 1])); + d.source = QRectF(sourceCenterRight, sourceCenterBottom, sourceMargins.right(), sourceMargins.bottom()); + d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.source.width(); + d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.source.height(); + if (hints & QDrawBorderPixmap::OpaqueBottomRight) + opaqueData.append(d); + else + translucentData.append(d); } // horizontal edges - switch (rules.horizontal) { - case Qt::StretchTile: + if (targetCenterWidth > 0 && sourceCenterWidth > 0) { if (targetMargins.top() > 0 && sourceMargins.top() > 0) { // top - const QRect targetTopRect(targetCenterLeft, targetTop, targetCenterWidth, targetMargins.top()); - const QRect sourceTopRect(sourceCenterLeft, sourceTop, sourceCenterWidth, sourceMargins.top()); - qDrawPixmap(painter, targetTopRect, pixmap, sourceTopRect); - } - if (targetMargins.bottom() > 0 && sourceMargins.bottom() > 0) { // bottom - const QRect targetBottomRect(targetCenterLeft, targetCenterBottom, targetCenterWidth, targetMargins.bottom()); - const QRect sourceBottomRect(sourceCenterLeft, sourceCenterBottom, sourceCenterWidth, sourceMargins.bottom()); - qDrawPixmap(painter, targetBottomRect, pixmap, sourceBottomRect); - } - break; - case Qt::RepeatTile: - if (targetMargins.top() > 0 && sourceMargins.top() > 0) { // top - const QRect targetTopRect(targetCenterLeft, targetTop, targetCenterWidth, targetMargins.top()); - const QRect sourceTopRect(sourceCenterLeft, sourceTop, sourceCenterWidth, sourceMargins.top()); - qDrawHorizontallyRepeatedPixmap(painter, targetTopRect, pixmap, sourceTopRect); - } - if (targetMargins.bottom() > 0 && sourceMargins.bottom() > 0) { // bottom - const QRect targetBottomRect(targetCenterLeft, targetCenterBottom, targetCenterWidth, targetMargins.bottom()); - const QRect sourceBottomRect(sourceCenterLeft, sourceCenterBottom, sourceCenterWidth, sourceMargins.bottom()); - qDrawHorizontallyRepeatedPixmap(painter, targetBottomRect, pixmap, sourceBottomRect); - } - break; - case Qt::RoundTile: - if (targetMargins.top() > 0 && sourceMargins.top() > 0) { // top - const QRect targetTopRect(targetCenterLeft, targetTop, targetCenterWidth, targetMargins.top()); - const QRect sourceTopRect(sourceCenterLeft, sourceTop, sourceCenterWidth, sourceMargins.top()); - qDrawHorizontallyRoundedPixmap(painter, targetTopRect, pixmap, sourceTopRect); + QDrawPixmapsDataArray &data = hints & QDrawBorderPixmap::OpaqueTop ? opaqueData : translucentData; + d.source = QRectF(sourceCenterLeft, sourceRect.top(), sourceCenterWidth, sourceMargins.top()); + d.point.setY(0.5 * (yTarget[1] + yTarget[0])); + d.scaleX = dx / d.source.width(); + d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.source.height(); + for (int i = 1; i < columns - 1; ++i) { + d.point.setX(0.5 * (xTarget[i + 1] + xTarget[i])); + data.append(d); + } + if (rules.horizontal == Qt::RepeatTile) + data[data.size() - 1].source.setWidth((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); } if (targetMargins.bottom() > 0 && sourceMargins.bottom() > 0) { // bottom - const QRect targetBottomRect(targetCenterLeft, targetCenterBottom, targetCenterWidth, targetMargins.bottom()); - const QRect sourceBottomRect(sourceCenterLeft, sourceCenterBottom, sourceCenterWidth, sourceMargins.bottom()); - qDrawHorizontallyRoundedPixmap(painter, targetBottomRect, pixmap, sourceBottomRect); + QDrawPixmapsDataArray &data = hints & QDrawBorderPixmap::OpaqueBottom ? opaqueData : translucentData; + d.source = QRectF(sourceCenterLeft, sourceCenterBottom, sourceCenterWidth, sourceMargins.bottom());; + d.point.setY(0.5 * (yTarget[rows] + yTarget[rows - 1])); + d.scaleX = dx / d.source.width(); + d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.source.height(); + for (int i = 1; i < columns - 1; ++i) { + d.point.setX(0.5 * (xTarget[i + 1] + xTarget[i])); + data.append(d); + } + if (rules.horizontal == Qt::RepeatTile) + data[data.size() - 1].source.setWidth((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); } - break; } // vertical edges - switch (rules.vertical) { - case Qt::StretchTile: - if (targetMargins.left() > 0 && sourceMargins.left() > 0) { // left - const QRect targetLeftRect(targetLeft, targetCenterTop, targetMargins.left(), targetCenterHeight); - const QRect sourceLeftRect(sourceLeft, sourceCenterTop, sourceMargins.left(), sourceCenterHeight); - qDrawPixmap(painter, targetLeftRect, pixmap, sourceLeftRect); - } - if (targetMargins.right() > 0 && sourceMargins.right() > 0) { // right - const QRect targetRightRect(targetCenterRight, targetCenterTop, targetMargins.right(), targetCenterHeight); - const QRect sourceRightRect(sourceCenterRight, sourceCenterTop, sourceMargins.right(), sourceCenterHeight); - qDrawPixmap(painter, targetRightRect, pixmap, sourceRightRect); - } - break; - case Qt::RepeatTile: - if (targetMargins.left() > 0 && sourceMargins.left() > 0) { // left - const QRect targetLeftRect(targetLeft, targetCenterTop, targetMargins.left(), targetCenterHeight); - const QRect sourceLeftRect(sourceLeft, sourceCenterTop, sourceMargins.left(), sourceCenterHeight); - qDrawVerticallyRepeatedPixmap(painter, targetLeftRect, pixmap, sourceLeftRect); - } - if (targetMargins.right() > 0 && sourceMargins.right() > 0) { // right - const QRect targetRightRect(targetCenterRight, targetCenterTop, targetMargins.right(), targetCenterHeight); - const QRect sourceRightRect(sourceCenterRight, sourceCenterTop, sourceMargins.right(), sourceCenterHeight); - qDrawVerticallyRepeatedPixmap(painter, targetRightRect, pixmap, sourceRightRect); - } - break; - case Qt::RoundTile: + if (targetCenterHeight > 0 && sourceCenterHeight > 0) { if (targetMargins.left() > 0 && sourceMargins.left() > 0) { // left - const QRect targetLeftRect(targetLeft, targetCenterTop, targetMargins.left(), targetCenterHeight); - const QRect sourceLeftRect(sourceLeft, sourceCenterTop, sourceMargins.left(), sourceCenterHeight); - qDrawVerticallyRoundedPixmap(painter, targetLeftRect, pixmap, sourceLeftRect); + QDrawPixmapsDataArray &data = hints & QDrawBorderPixmap::OpaqueLeft ? opaqueData : translucentData; + d.source = QRectF(sourceRect.left(), sourceCenterTop, sourceMargins.left(), sourceCenterHeight); + d.point.setX(0.5 * (xTarget[1] + xTarget[0])); + d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.source.width(); + d.scaleY = dy / d.source.height(); + for (int i = 1; i < rows - 1; ++i) { + d.point.setY(0.5 * (yTarget[i + 1] + yTarget[i])); + data.append(d); + } + if (rules.vertical == Qt::RepeatTile) + data[data.size() - 1].source.setHeight((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); } if (targetMargins.right() > 0 && sourceMargins.right() > 0) { // right - const QRect targetRightRect(targetCenterRight, targetCenterTop, targetMargins.right(), targetCenterHeight); - const QRect sourceRightRect(sourceCenterRight, sourceCenterTop, sourceMargins.right(), sourceCenterHeight); - qDrawVerticallyRoundedPixmap(painter, targetRightRect, pixmap, sourceRightRect); + QDrawPixmapsDataArray &data = hints & QDrawBorderPixmap::OpaqueRight ? opaqueData : translucentData; + d.source = QRectF(sourceCenterRight, sourceCenterTop, sourceMargins.right(), sourceCenterHeight); + d.point.setX(0.5 * (xTarget[columns] + xTarget[columns - 1])); + d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.source.width(); + d.scaleY = dy / d.source.height(); + for (int i = 1; i < rows - 1; ++i) { + d.point.setY(0.5 * (yTarget[i + 1] + yTarget[i])); + data.append(d); + } + if (rules.vertical == Qt::RepeatTile) + data[data.size() - 1].source.setHeight((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); } - break; } // center if (targetCenterWidth > 0 && targetCenterHeight > 0 && sourceCenterWidth > 0 && sourceCenterHeight > 0) { - const QRect targetCenterRect(targetCenterLeft, targetCenterTop, targetCenterWidth, targetCenterHeight); - const QRect sourceCenterRect(sourceCenterLeft, sourceCenterTop, sourceCenterWidth, sourceCenterHeight); - switch (rules.horizontal) { - case Qt::StretchTile: - switch (rules.vertical) { - case Qt::StretchTile: // stretch stretch - qDrawPixmap(painter, targetCenterRect, pixmap, sourceCenterRect); - break; - case Qt::RepeatTile: // stretch repeat - qVerticalRepeat(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawPixmap); - break; - case Qt::RoundTile: // stretch round - qVerticalRound(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawPixmap); - break; + QDrawPixmapsDataArray &data = hints & QDrawBorderPixmap::OpaqueCenter ? opaqueData : translucentData; + d.source = QRectF(sourceCenterLeft, sourceCenterTop, sourceCenterWidth, sourceCenterHeight); + d.scaleX = dx / d.source.width(); + d.scaleY = dy / d.source.height(); + + qreal repeatWidth = (xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX; + qreal repeatHeight = (yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY; + + for (int j = 1; j < rows - 1; ++j) { + d.point.setY(0.5 * (yTarget[j + 1] + yTarget[j])); + for (int i = 1; i < columns - 1; ++i) { + d.point.setX(0.5 * (xTarget[i + 1] + xTarget[i])); + data.append(d); } - break; - case Qt::RepeatTile: - switch (rules.vertical) { - case Qt::StretchTile: // repeat stretch - qHorizontalRepeat(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawPixmap); - break; - case Qt::RepeatTile: // repeat repeat - qVerticalRepeat(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawHorizontallyRepeatedPixmap); - break; - case Qt::RoundTile: // repeat round - qVerticalRound(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawHorizontallyRepeatedPixmap); - break; - } - break; - case Qt::RoundTile: - switch (rules.vertical) { - case Qt::StretchTile: // round stretch - qHorizontalRound(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawPixmap); - break; - case Qt::RepeatTile: // round repeat - qHorizontalRound(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawVerticallyRepeatedPixmap); - break; - case Qt::RoundTile: // round round - qHorizontalRound(painter, targetCenterRect, pixmap, sourceCenterRect, qDrawVerticallyRoundedPixmap); - break; - } - break; + if (rules.horizontal == Qt::RepeatTile) + data[data.size() - 1].source.setWidth(repeatWidth); + } + if (rules.vertical == Qt::RepeatTile) { + for (int i = 1; i < columns - 1; ++i) + data[data.size() - i].source.setHeight(repeatHeight); } } + + if (opaqueData.size()) + qDrawPixmaps(painter, opaqueData.data(), opaqueData.size(), pixmap, QDrawPixmaps::OpaqueHint); + if (translucentData.size()) + qDrawPixmaps(painter, translucentData.data(), translucentData.size(), pixmap); } /*! - \struct QDrawPixmapsData + \class QDrawPixmaps::Data \since 4.6 \internal @@ -1369,6 +1334,11 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin */ /*! + \enum QDrawPixmaps::DrawingHint + \internal +*/ + +/*! \internal \since 4.6 @@ -1377,14 +1347,14 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin dataCount elements specifying the parameters used to draw each pixmap instance. This can be used for example to implement a particle system. */ -void qDrawPixmaps(QPainter *painter, const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +void qDrawPixmaps(QPainter *painter, const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QDrawPixmaps::DrawingHints hints) { QPaintEngine *engine = painter->paintEngine(); if (!engine) return; if (engine->isExtended()) { - static_cast(engine)->drawPixmaps(drawingData, dataCount, pixmap); + static_cast(engine)->drawPixmaps(drawingData, dataCount, pixmap, hints); } else { qreal oldOpacity = painter->opacity(); QTransform oldTransform = painter->transform(); diff --git a/src/gui/painting/qdrawutil.h b/src/gui/painting/qdrawutil.h index 98a36a7..fff1cc1 100644 --- a/src/gui/painting/qdrawutil.h +++ b/src/gui/painting/qdrawutil.h @@ -143,13 +143,43 @@ struct QTileRules Qt::TileRule vertical; }; +#ifndef Q_QDOC +// For internal use only. +namespace QDrawBorderPixmap +{ + enum DrawingHint + { + OpaqueTopLeft = 0x0001, + OpaqueTop = 0x0002, + OpaqueTopRight = 0x0004, + OpaqueLeft = 0x0008, + OpaqueCenter = 0x0010, + OpaqueRight = 0x0020, + OpaqueBottomLeft = 0x0040, + OpaqueBottom = 0x0080, + OpaqueBottomRight = 0x0100, + OpaqueCorners = OpaqueTopLeft | OpaqueTopRight | OpaqueBottomLeft | OpaqueBottomRight, + OpaqueEdges = OpaqueTop | OpaqueLeft | OpaqueRight | OpaqueBottom, + OpaqueFrame = OpaqueCorners | OpaqueEdges, + OpaqueAll = OpaqueCenter | OpaqueFrame + }; + + Q_DECLARE_FLAGS(DrawingHints, DrawingHint) +} +#endif + Q_GUI_EXPORT void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargins &targetMargins, const QPixmap &pixmap, const QRect &sourceRect, const QMargins &sourceMargins, - const QTileRules &rules = QTileRules()); + const QTileRules &rules = QTileRules() +#ifndef Q_QDOC + , QDrawBorderPixmap::DrawingHints hints = 0 +#endif + ); + inline void qDrawBorderPixmap(QPainter *painter, const QRect &target, const QMargins &margins, @@ -158,17 +188,30 @@ inline void qDrawBorderPixmap(QPainter *painter, qDrawBorderPixmap(painter, target, margins, pixmap, pixmap.rect(), margins); } -struct QDrawPixmapsData +// For internal use only. +namespace QDrawPixmaps { - QPointF point; - QRectF source; - qreal scaleX; - qreal scaleY; - qreal rotation; - qreal opacity; -}; + struct Data + { + QPointF point; + QRectF source; + qreal scaleX; + qreal scaleY; + qreal rotation; + qreal opacity; + }; + + enum DrawingHint + { + OpaqueHint = 0x01 + }; + + Q_DECLARE_FLAGS(DrawingHints, DrawingHint) +} -Q_GUI_EXPORT void qDrawPixmaps(QPainter *painter, const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); +// This function is private and may change without notice. Do not use outside Qt!!! +Q_GUI_EXPORT void qDrawPixmaps(QPainter *painter, const QDrawPixmaps::Data *drawingData, + int dataCount, const QPixmap &pixmap, QDrawPixmaps::DrawingHints hints = 0); QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index 2342b9d..d712669 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -932,7 +932,7 @@ void QPaintEngineEx::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, con fill(path, brush); } -void QPaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +void QPaintEngineEx::drawPixmaps(const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QDrawPixmaps::DrawingHints hints) { qreal oldOpacity = state()->opacity; QTransform oldTransform = state()->matrix; diff --git a/src/gui/painting/qpaintengineex_p.h b/src/gui/painting/qpaintengineex_p.h index 42c1ce9..81ed06b 100644 --- a/src/gui/painting/qpaintengineex_p.h +++ b/src/gui/painting/qpaintengineex_p.h @@ -70,7 +70,12 @@ QT_MODULE(Gui) class QPainterState; class QPaintEngineExPrivate; struct StrokeHandler; -struct QDrawPixmapsData; + +namespace QDrawPixmaps +{ + struct Data; + enum DrawingHint; +} struct QIntRect { int x1, y1, x2, y2; @@ -196,7 +201,7 @@ public: virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s); - virtual void drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); + virtual void drawPixmaps(const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QFlags hints); virtual void updateState(const QPaintEngineState &state); diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 12a8ed8..992d47d 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -1428,11 +1428,11 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(const QPointF &p, QFontEngineGly glDrawArrays(GL_TRIANGLES, 0, 6 * glyphs.size()); } -void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap) +void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QDrawPixmaps::DrawingHints hints) { // Use fallback for extended composition modes. if (state()->composition_mode > QPainter::CompositionMode_Plus) { - QPaintEngineEx::drawPixmaps(drawingData, dataCount, pixmap); + QPaintEngineEx::drawPixmaps(drawingData, dataCount, pixmap, hints); return; } @@ -1448,11 +1448,15 @@ void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dat bool allOpaque = true; for (int i = 0; i < dataCount; ++i) { - qreal s = 0.5 * qSin(drawingData[i].rotation * Q_PI / 180); - qreal c = 0.5 * qCos(drawingData[i].rotation * Q_PI / 180); + qreal s = 0; + qreal c = 1; + if (drawingData[i].rotation != 0) { + s = qFastSin(drawingData[i].rotation * Q_PI / 180); + c = qFastCos(drawingData[i].rotation * Q_PI / 180); + } - qreal right = drawingData[i].scaleX * drawingData[i].source.width(); - qreal bottom = drawingData[i].scaleY * drawingData[i].source.height(); + qreal right = 0.5 * drawingData[i].scaleX * drawingData[i].source.width(); + qreal bottom = 0.5 * drawingData[i].scaleY * drawingData[i].source.height(); QGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c); QGLPoint bottomLeft(-right * c - bottom * s, -right * s + bottom * c); @@ -1496,7 +1500,7 @@ void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmapsData *drawingData, int dat d->transferMode(ImageArrayDrawingMode); bool isBitmap = pixmap.isQBitmap(); - bool isOpaque = !isBitmap && !pixmap.hasAlphaChannel() && allOpaque; + bool isOpaque = !isBitmap && (!pixmap.hasAlphaChannel() || (hints & QDrawPixmaps::OpaqueHint)) && allOpaque; d->updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, state()->renderHints & QPainter::SmoothPixmapTransform, texture->id); diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h index 9d40726..4f42082 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h @@ -128,7 +128,7 @@ public: virtual void drawTextItem(const QPointF &p, const QTextItem &textItem); - virtual void drawPixmaps(const QDrawPixmapsData *drawingData, int dataCount, const QPixmap &pixmap); + virtual void drawPixmaps(const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QDrawPixmaps::DrawingHints hints); Type type() const { return OpenGL2; } -- cgit v0.12