summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHonglei Zhang <honglei.zhang@nokia.com>2011-04-27 15:37:12 +0300
committerHonglei Zhang <honglei.zhang@nokia.com>2011-04-27 15:37:12 +0300
commit9d6530b9774de482b0b3a29720f7f756e986f5c7 (patch)
tree5b786abe48cad2b0f616c92401258bc937d45b3e
parent27a24f1d009741b6e712300e7bc58b7e7e7d4c0b (diff)
parent02bb8e4c5f4584f3c0a7ed16bcba20c7f43456cd (diff)
downloadqt4-tools-9d6530b9774de482b0b3a29720f7f756e986f5c7.tar.gz
Merge branch 'master' of scm.dev.nokia.troll.no:qt/qt-symbian-team
-rw-r--r--doc/src/development/qmake-manual.qdoc49
-rw-r--r--mkspecs/common/symbian/backup_registration.xml8
-rw-r--r--mkspecs/features/enable_backup.prf43
-rw-r--r--src/gui/kernel/qapplication_s60.cpp3
-rw-r--r--src/gui/kernel/qt_s60_p.h26
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp30
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp41
-rw-r--r--tests/benchmarks/gui/image/blendbench/main.cpp4
8 files changed, 191 insertions, 13 deletions
diff --git a/doc/src/development/qmake-manual.qdoc b/doc/src/development/qmake-manual.qdoc
index 2bc8a340ff..0149da282f 100644
--- a/doc/src/development/qmake-manual.qdoc
+++ b/doc/src/development/qmake-manual.qdoc
@@ -1120,6 +1120,44 @@
\tableofcontents{3}
+
+ \target BACKUP_REGISTRATION_FILE_MAEMO
+ \section1 BACKUP_REGISTRATION_FILE_MAEMO
+
+ \e {This is only used on the Maemo platform.}
+
+ This variable is used to specify the backup registration file to use with
+ \c enable_backup \c CONFIG value for Maemo platform. The default value is:
+ \c{$$_PRO_FILE_PWD_/backup_registration/maemo/$$basename(TARGET).conf}.
+
+ Unfortunately it is not possible to have a common registration file for Maemo like there is
+ for Symbian, so the developer must always provide one if the platform default backup support is
+ not sufficient.
+
+ For documentation about how to create backup registration files and how the device
+ backup works in general, see:
+ (\l{http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Generic_Platform_Components/Using_Backup_Application}{Using Backup Application})
+
+ \target BACKUP_REGISTRATION_FILE_SYMBIAN
+ \section1 BACKUP_REGISTRATION_FILE_SYMBIAN
+
+ \e {This is only used on the Symbian platform.}
+
+ This variable is used to specify the backup registration file to use with
+ \c enable_backup \c CONFIG value for Symbian platform. The default value is
+ determined as follows:
+
+ If a custom registration file \c{$$_PRO_FILE_PWD_/backup_registration/symbian/backup_registration.xml}
+ exists, it is used. Otherwise, the common registration file \c{$$[QT_INSTALL_DATA]/mkspecs/common/symbian/backup_registration.xml}
+ is used. This common registration file will define backing up of application binaries,
+ resources, and all files under application private directory. Also note that \c{C:/Data}
+ contents are backed up by default on Symbian devices, so no registration is needed for any
+ files found there.
+
+ For documentation about how to create backup registration files and how the device
+ backup works in general, see:
+ (\l{http://library.forum.nokia.com/index.jsp?topic=/S60_5th_Edition_Cpp_Developers_Library/GUID-35228542-8C95-4849-A73F-2B4F082F0C44/sdk/doc_source/guide/Connectivity-subsystem-guide/Connectivity/PC_Connectivity_How-To_Write_Backup_Aware_Software.html}{How-To Write Backup-aware Software})
+
\target BLD_INF_RULES
\section1 BLD_INF_RULES
@@ -1341,6 +1379,17 @@
so some \c{.ts} files may be ignored by qmake.
\endtable
+ These options only have an effect on Symbian and Maemo platforms:
+
+ \table 95%
+ \header \o Option \o Description
+ \row \o enable_backup \o Generates deployment for backup registration file
+ to enable backing up the application during device backup.
+ See \l{#BACKUP_REGISTRATION_FILE_MAEMO}{BACKUP_REGISTRATION_FILE_MAEMO}
+ and \l{#BACKUP_REGISTRATION_FILE_SYMBIAN}{BACKUP_REGISTRATION_FILE_SYMBIAN}
+ for more information about backup.
+ \endtable
+
These options have an effect on Linux/Unix platforms:
\table 95%
diff --git a/mkspecs/common/symbian/backup_registration.xml b/mkspecs/common/symbian/backup_registration.xml
new file mode 100644
index 0000000000..794e11d5a6
--- /dev/null
+++ b/mkspecs/common/symbian/backup_registration.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="yes"?>
+<backup_registration>
+ <passive_backup>
+ <include_directory name = "\" />
+ </passive_backup>
+ <system_backup/>
+ <restore requires_reboot = "no"/>
+</backup_registration>
diff --git a/mkspecs/features/enable_backup.prf b/mkspecs/features/enable_backup.prf
new file mode 100644
index 0000000000..7700ca2d6c
--- /dev/null
+++ b/mkspecs/features/enable_backup.prf
@@ -0,0 +1,43 @@
+# Generate deployment for backup registration file for mobile devices
+symbian|maemo5|linux-g++-maemo {
+ symbian {
+ isEmpty(BACKUP_REGISTRATION_FILE_SYMBIAN) {
+ # Do not require a custom registration file in Symbian builds as the
+ # default file can be used as is in vast majority of projects.
+ # However, if the custom file exists in the default location, use that.
+
+ CUSTOM_BACKUP_REG_FILE = $$_PRO_FILE_PWD_/backup_registration/symbian/backup_registration.xml
+
+ exists($$CUSTOM_BACKUP_REG_FILE) {
+ BACKUP_REGISTRATION_FILE = $$CUSTOM_BACKUP_REG_FILE
+ } else {
+ BACKUP_REGISTRATION_FILE = $$[QT_INSTALL_DATA]/mkspecs/common/symbian/backup_registration.xml
+ }
+ } else {
+ BACKUP_REGISTRATION_FILE = $$BACKUP_REGISTRATION_FILE_SYMBIAN
+ }
+
+ contains(TEMPLATE, app) {
+ enable_backup_deployment.path = /private/$$replace(TARGET.UID3, 0x,)
+ } else {
+ enable_backup_deployment.path = /private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,)
+ }
+ DEPLOYMENT += enable_backup_deployment
+ } else {
+ isEmpty(BACKUP_REGISTRATION_FILE_MAEMO) {
+ BACKUP_REGISTRATION_FILE = $$_PRO_FILE_PWD_/backup_registration/maemo/$$basename(TARGET).conf
+ } else {
+ BACKUP_REGISTRATION_FILE = $$BACKUP_REGISTRATION_FILE_MAEMO
+ }
+
+ enable_backup_deployment.path = /etc/osso-backup/applications
+ INSTALLS += enable_backup_deployment
+ }
+
+ # Make sure that BACKUP_REGISTRATION_FILE has absolute path, otherwise the following exists check will not work.
+ !contains(BACKUP_REGISTRATION_FILE, "(^/|^\\\\|^.:).*"): BACKUP_REGISTRATION_FILE = $$_PRO_FILE_PWD_/$$BACKUP_REGISTRATION_FILE
+
+ !exists($$BACKUP_REGISTRATION_FILE): warning(The backup registration file \'$$BACKUP_REGISTRATION_FILE\' was not found. Please provide a valid backup registration file.)
+
+ enable_backup_deployment.files = $$BACKUP_REGISTRATION_FILE
+}
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 06880611b3..937f48522a 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -2606,6 +2606,9 @@ QS60ThreadLocalData::QS60ThreadLocalData()
QS60ThreadLocalData::~QS60ThreadLocalData()
{
+ for (int i = 0; i < releaseFuncs.count(); ++i)
+ releaseFuncs[i]();
+ releaseFuncs.clear();
if (!usingCONEinstances) {
delete screenDevice;
wsSession.Close();
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index ee0b862500..288ee99b09 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -90,6 +90,10 @@ static const int qt_symbian_max_screens = 4;
//this macro exists because EColor16MAP enum value doesn't exist in Symbian OS 9.2
#define Q_SYMBIAN_ECOLOR16MAP TDisplayMode(13)
+class QSymbianTypeFaceExtras;
+typedef QHash<QString, const QSymbianTypeFaceExtras *> QSymbianTypeFaceExtrasHash;
+typedef void (*QThreadLocalReleaseFunc)();
+
class Q_AUTOTEST_EXPORT QS60ThreadLocalData
{
public:
@@ -98,6 +102,8 @@ public:
bool usingCONEinstances;
RWsSession wsSession;
CWsScreenDevice *screenDevice;
+ QSymbianTypeFaceExtrasHash fontData;
+ QVector<QThreadLocalReleaseFunc> releaseFuncs;
};
class QS60Data
@@ -168,6 +174,8 @@ public:
inline CWsScreenDevice* screenDevice(const QWidget *widget);
inline CWsScreenDevice* screenDevice(int screenNumber);
static inline int screenNumberForWidget(const QWidget *widget);
+ inline QSymbianTypeFaceExtrasHash& fontData();
+ inline void addThreadLocalReleaseFunc(QThreadLocalReleaseFunc func);
static inline CCoeAppUi* appUi();
static inline CEikMenuBar* menuBar();
#ifdef Q_WS_S60
@@ -454,6 +462,24 @@ inline int QS60Data::screenNumberForWidget(const QWidget *widget)
return qt_widget_private(const_cast<QWidget *>(w))->symbianScreenNumber;
}
+inline QSymbianTypeFaceExtrasHash& QS60Data::fontData()
+{
+ if (!tls.hasLocalData()) {
+ tls.setLocalData(new QS60ThreadLocalData);
+ }
+ return tls.localData()->fontData;
+}
+
+inline void QS60Data::addThreadLocalReleaseFunc(QThreadLocalReleaseFunc func)
+{
+ if (!tls.hasLocalData()) {
+ tls.setLocalData(new QS60ThreadLocalData);
+ }
+ QS60ThreadLocalData *data = tls.localData();
+ if (!data->releaseFuncs.contains(func))
+ data->releaseFuncs.append(func);
+}
+
inline CCoeAppUi* QS60Data::appUi()
{
return CCoeEnv::Static()-> AppUi();
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp
index 6d3970eb8a..3c7255b077 100644
--- a/src/gui/text/qfontdatabase_s60.cpp
+++ b/src/gui/text/qfontdatabase_s60.cpp
@@ -152,7 +152,6 @@ public:
COpenFontRasterizer *m_rasterizer;
mutable QList<const QSymbianTypeFaceExtras *> m_extras;
- mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
mutable QSet<QString> m_applicationFontFamilies;
};
@@ -255,8 +254,9 @@ void QSymbianFontDatabaseExtrasImplementation::clear()
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
if (!dbExtras)
return; // initializeDb() has never been called
+ QSymbianTypeFaceExtrasHash &extrasHash = S60->fontData();
if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
- qDeleteAll(dbExtras->m_extrasHash);
+ qDeleteAll(extrasHash);
} else {
typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
for (iterator p = dbExtras->m_extras.begin(); p != dbExtras->m_extras.end(); ++p) {
@@ -265,11 +265,16 @@ void QSymbianFontDatabaseExtrasImplementation::clear()
}
dbExtras->m_extras.clear();
}
- dbExtras->m_extrasHash.clear();
+ extrasHash.clear();
}
void qt_cleanup_symbianFontDatabase()
{
+ static bool cleanupDone = false;
+ if (cleanupDone)
+ return;
+ cleanupDone = true;
+
QFontDatabasePrivate *db = privateDb();
if (!db)
return;
@@ -320,9 +325,12 @@ COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont)
const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &aTypeface,
bool bold, bool italic) const
{
+ QSymbianTypeFaceExtrasHash &extrasHash = S60->fontData();
+ if (extrasHash.isEmpty() && QThread::currentThread() != QApplication::instance()->thread())
+ S60->addThreadLocalReleaseFunc(clear);
const QString typeface = qt_symbian_fontNameWithAppFontMarker(aTypeface);
const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
- if (!m_extrasHash.contains(searchKey)) {
+ if (!extrasHash.contains(searchKey)) {
TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
if (bold)
searchSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
@@ -336,7 +344,7 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font);
QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font);
sFont.take();
- m_extrasHash.insert(searchKey, extras);
+ extrasHash.insert(searchKey, extras);
} else {
const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
Q_ASSERT(err == KErrNone && font);
@@ -350,20 +358,20 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
const QString foundKey =
QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
- if (!m_extrasHash.contains(foundKey)) {
+ if (!extrasHash.contains(foundKey)) {
QScopedPointer<CFont, CFontFromFontStoreReleaser> sFont(font);
QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
sFont.take();
m_extras.append(extras);
- m_extrasHash.insert(searchKey, extras);
- m_extrasHash.insert(foundKey, extras);
+ extrasHash.insert(searchKey, extras);
+ extrasHash.insert(foundKey, extras);
} else {
m_store->ReleaseFont(font);
- m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
+ extrasHash.insert(searchKey, extrasHash.value(foundKey));
}
}
}
- return m_extrasHash.value(searchKey);
+ return extrasHash.value(searchKey);
}
void QSymbianFontDatabaseExtrasImplementation::removeAppFontData(
@@ -956,7 +964,7 @@ bool QFontDatabase::removeAllApplicationFonts()
bool QFontDatabase::supportsThreadedFontRendering()
{
- return false;
+ return QSymbianTypeFaceExtras::symbianFontTableApiAvailable();
}
static
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index c21514b9c6..33e4c49bb0 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -72,6 +72,7 @@
#include <qgraphicsscene.h>
#include <qgraphicsproxywidget.h>
#include <qlayout.h>
+#include <qfontdatabase.h>
#if defined(Q_OS_SYMBIAN)
# define SRCDIR "."
@@ -264,6 +265,8 @@ private slots:
void QTBUG17053_zeroDashPattern();
+ void drawTextOutsideGuiThread();
+
private:
void fillData();
void setPenColor(QPainter& p);
@@ -4706,6 +4709,44 @@ void tst_QPainter::QTBUG17053_zeroDashPattern()
QCOMPARE(image, original);
}
+class TextDrawerThread : public QThread
+{
+public:
+ void run();
+ QImage rendering;
+};
+
+void TextDrawerThread::run()
+{
+ rendering = QImage(100, 100, QImage::Format_ARGB32_Premultiplied);
+ rendering.fill(0);
+ QPainter p(&rendering);
+ p.fillRect(10, 10, 100, 100, Qt::blue);
+ p.setPen(Qt::green);
+ p.drawText(20, 20, "some text");
+ p.end();
+}
+
+void tst_QPainter::drawTextOutsideGuiThread()
+{
+ if (!QFontDatabase::supportsThreadedFontRendering())
+ QSKIP("No threaded font rendering", SkipAll);
+
+ QImage referenceRendering(100, 100, QImage::Format_ARGB32_Premultiplied);
+ referenceRendering.fill(0);
+ QPainter p(&referenceRendering);
+ p.fillRect(10, 10, 100, 100, Qt::blue);
+ p.setPen(Qt::green);
+ p.drawText(20, 20, "some text");
+ p.end();
+
+ TextDrawerThread t;
+ t.start();
+ t.wait();
+
+ QCOMPARE(referenceRendering, t.rendering);
+}
+
QTEST_MAIN(tst_QPainter)
#include "tst_qpainter.moc"
diff --git a/tests/benchmarks/gui/image/blendbench/main.cpp b/tests/benchmarks/gui/image/blendbench/main.cpp
index a16fd5a5fa..06c36e7298 100644
--- a/tests/benchmarks/gui/image/blendbench/main.cpp
+++ b/tests/benchmarks/gui/image/blendbench/main.cpp
@@ -208,9 +208,9 @@ void BlendBench::unalignedBlendArgb32()
uchar *srcMemory = static_cast<uchar*>(qMallocAligned((dimension * dimension * sizeof(quint32)) + 16, 16));
QFETCH(int, offset);
- srcMemory += (offset * sizeof(quint32));
+ uchar *imageSrcMemory = srcMemory + (offset * sizeof(quint32));
- QImage src(srcMemory, dimension, dimension, QImage::Format_ARGB32_Premultiplied);
+ QImage src(imageSrcMemory, dimension, dimension, QImage::Format_ARGB32_Premultiplied);
src.fill(0x87654321);
QPainter painter(&destination);