From bc0c6e9bb53f935c659dda90c7968d7738705f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Wed, 1 Sep 2010 08:57:36 +0200 Subject: Use NEON and preloading for 16 bit small / medium sized image blits. This gives a nice speedup for blitting of small and medium sized images by using preloading and avoiding function call overhead to memcpy for each scanline. For larger image widths memcpy becomes more efficient. Speedups of up to 40 % for 64 pixel wide images were measured. For image widths between 2 and 16 the speedup ranges between 12 % and 28 %. Task-number: QT-3401 Reviewed-by: Benjamin Poulain --- src/gui/painting/qblendfunctions.cpp | 8 +-- src/gui/painting/qdrawhelper.cpp | 1 + src/gui/painting/qdrawhelper_neon.cpp | 98 +++++++++++++++++++++++++++++++++++ src/gui/painting/qdrawhelper_neon_p.h | 5 ++ 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp index 24908ce..0edf256 100644 --- a/src/gui/painting/qblendfunctions.cpp +++ b/src/gui/painting/qblendfunctions.cpp @@ -254,10 +254,10 @@ void qt_scale_image_argb32_on_rgb16(uchar *destPixels, int dbpl, } } -static void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl, - const uchar *src, int sbpl, - int w, int h, - int const_alpha) +void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl, + const uchar *src, int sbpl, + int w, int h, + int const_alpha) { #ifdef QT_DEBUG_DRAW printf("qt_blend_rgb16_on_rgb16: dst=(%p, %d), src=(%p, %d), dim=(%d, %d) alpha=%d\n", diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 5223458..5e1509d 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -8014,6 +8014,7 @@ void qInitDrawhelperAsm() qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_neon; qBlendFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_rgb16_neon; qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB16] = qt_blend_rgb16_on_argb32_neon; + qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_neon; qScaleFunctions[QImage::Format_RGB16][QImage::Format_ARGB32_Premultiplied] = qt_scale_image_argb32_on_rgb16_neon; qScaleFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_scale_image_rgb16_on_rgb16_neon; diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp index ed15c5c..0afd077 100644 --- a/src/gui/painting/qdrawhelper_neon.cpp +++ b/src/gui/painting/qdrawhelper_neon.cpp @@ -167,6 +167,14 @@ pixman_composite_scanline_over_asm_neon (int32_t w, const uint32_t *dst, const uint32_t *src); +extern "C" void +pixman_composite_src_0565_0565_asm_neon (int32_t w, + int32_t h, + uint16_t *dst, + int32_t dst_stride, + uint16_t *src, + int32_t src_stride); + // qblendfunctions.cpp void qt_blend_argb32_on_rgb16_const_alpha(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, @@ -200,6 +208,96 @@ void qt_blend_rgb16_on_argb32_neon(uchar *destPixels, int dbpl, pixman_composite_src_0565_8888_asm_neon(w, h, dst, dbpl, src, sbpl); } +// qblendfunctions.cpp +void qt_blend_rgb16_on_rgb16(uchar *dst, int dbpl, + const uchar *src, int sbpl, + int w, int h, + int const_alpha); + +template +static inline void scanLineBlit16(quint16 *dst, quint16 *src, int dstride) +{ + if (N >= 2) { + ((quint32 *)dst)[0] = ((quint32 *)src)[0]; + __builtin_prefetch(dst + dstride, 1, 0); + } + for (int i = 1; i < N/2; ++i) + ((quint32 *)dst)[i] = ((quint32 *)src)[i]; + if (N & 1) + dst[N-1] = src[N-1]; +} + +template +static inline void blockBlit16(quint16 *dst, quint16 *src, int dstride, int sstride, int h) +{ + union { + quintptr address; + quint16 *pointer; + } u; + + u.pointer = dst; + + if (u.address & 2) { + while (h--) { + // align dst + dst[0] = src[0]; + if (Width > 1) + scanLineBlit16(dst + 1, src + 1, dstride); + dst += dstride; + src += sstride; + } + } else { + while (h--) { + scanLineBlit16(dst, src, dstride); + + dst += dstride; + src += sstride; + } + } +} + +void qt_blend_rgb16_on_rgb16_neon(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha) +{ + // testing show that the default memcpy is faster for widths 150 and up + if (const_alpha != 256 || w >= 150) { + qt_blend_rgb16_on_rgb16(destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha); + return; + } + + int dstride = dbpl / 2; + int sstride = sbpl / 2; + + quint16 *dst = (quint16 *) destPixels; + quint16 *src = (quint16 *) srcPixels; + + switch (w) { +#define BLOCKBLIT(n) case n: blockBlit16(dst, src, dstride, sstride, h); return; + BLOCKBLIT(1); + BLOCKBLIT(2); + BLOCKBLIT(3); + BLOCKBLIT(4); + BLOCKBLIT(5); + BLOCKBLIT(6); + BLOCKBLIT(7); + BLOCKBLIT(8); + BLOCKBLIT(9); + BLOCKBLIT(10); + BLOCKBLIT(11); + BLOCKBLIT(12); + BLOCKBLIT(13); + BLOCKBLIT(14); + BLOCKBLIT(15); +#undef BLOCKBLIT + default: + break; + } + + pixman_composite_src_0565_0565_asm_neon (w, h, dst, dstride, src, sstride); +} + extern "C" void blend_8_pixels_argb32_on_rgb16_neon(quint16 *dst, const quint32 *src, int const_alpha); void qt_blend_argb32_on_rgb16_neon(uchar *destPixels, int dbpl, diff --git a/src/gui/painting/qdrawhelper_neon_p.h b/src/gui/painting/qdrawhelper_neon_p.h index 451edbc..d25b7ec 100644 --- a/src/gui/painting/qdrawhelper_neon_p.h +++ b/src/gui/painting/qdrawhelper_neon_p.h @@ -84,6 +84,11 @@ void qt_blend_rgb16_on_argb32_neon(uchar *destPixels, int dbpl, int w, int h, int const_alpha); +void qt_blend_rgb16_on_rgb16_neon(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + void qt_alphamapblit_quint16_neon(QRasterBuffer *rasterBuffer, int x, int y, quint32 color, const uchar *bitmap, -- cgit v0.12 From dcb98430f6add24c9d54253bd35d35010cc75c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Wed, 1 Sep 2010 12:33:55 +0200 Subject: Fix a crash when passing a null pixmap to QPainter::drawPixmapFragments(). Task-number: QTBUG-13331 Reviewed-by: Samuel --- src/gui/painting/qpainter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 4e10671..c6046ac 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -9028,7 +9028,7 @@ void QPainter::drawPixmapFragments(const PixmapFragment *fragments, int fragment { Q_D(QPainter); - if (!d->engine) + if (!d->engine || pixmap.isNull()) return; #ifndef QT_NO_DEBUG -- cgit v0.12 From 25622198904580c6eb93996f74c2e7b62afa77c7 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 30 Aug 2010 14:03:37 +0200 Subject: Fix compiling issue for FreeType version earlier than 2.1.10 FT_GlyphSlot_Embolden was introduced since FreeType 2.1.10 and we started using it since 4.7. Some systems (including RHEL/CentOS 4) only provide earlier versions will get a compiling error if they use -system-freetype to build Qt. This patch fix it by providing a graceful degradation when the function is not available. Task-number: QTBUG-13274 Reviewed-by: Eskil --- src/gui/text/qfontengine_ft.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 2c4fbab..60db8b6 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -94,6 +94,13 @@ QT_BEGIN_NAMESPACE #define Y_SIZE(face,i) ((face)->available_sizes[i].height << 6) #endif +/* FreeType 2.1.10 starts to provide FT_GlyphSlot_Embolden */ +#if (FREETYPE_MAJOR*10000+FREETYPE_MINOR*100+FREETYPE_PATCH) >= 20110 +#define Q_FT_GLYPHSLOT_EMBOLDEN(slot) FT_GlyphSlot_Embolden(slot) +#else +#define Q_FT_GLYPHSLOT_EMBOLDEN(slot) +#endif + #define FLOOR(x) ((x) & -64) #define CEIL(x) (((x)+63) & -64) #define TRUNC(x) ((x) >> 6) @@ -794,7 +801,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyphMetrics(QGlyphSet *set, uint glyph } FT_GlyphSlot slot = face->glyph; - if (embolden) FT_GlyphSlot_Embolden(slot); + if (embolden) Q_FT_GLYPHSLOT_EMBOLDEN(slot); int left = slot->metrics.horiBearingX; int right = slot->metrics.horiBearingX + slot->metrics.width; int top = slot->metrics.horiBearingY; @@ -940,7 +947,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, Glyph return 0; FT_GlyphSlot slot = face->glyph; - if (embolden) FT_GlyphSlot_Embolden(slot); + if (embolden) Q_FT_GLYPHSLOT_EMBOLDEN(slot); FT_Library library = qt_getFreetype(); info.xOff = TRUNC(ROUND(slot->advance.x)); -- cgit v0.12 From 068e9ddcce8adbf64e5a75f25754fd56d01f7eff Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Wed, 1 Sep 2010 18:01:09 +0200 Subject: Build fix on Solaris for an autotest Task-number: QTBUG-12993 Reviewed-by: Trust-Me --- tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp index 3634ce9..4476084 100644 --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp @@ -4578,7 +4578,7 @@ void tst_QGraphicsItem::itemChange() QCOMPARE(tester.changes.at(tester.changes.size() - 1), QGraphicsItem::ItemFlagsHaveChanged); QVariant expectedFlags = qVariantFromValue(QGraphicsItem::GraphicsItemFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges)); QCOMPARE(tester.values.at(tester.values.size() - 2), expectedFlags); - QCOMPARE(tester.values.at(tester.values.size() - 1), qVariantFromValue(QGraphicsItem::ItemIsSelectable)); + QCOMPARE(tester.values.at(tester.values.size() - 1), qVariantFromValue((quint32)QGraphicsItem::ItemIsSelectable)); } { // ItemSelectedChange -- cgit v0.12 From e48e0e7cb0fe51cc676b894cdce9eebeca7d5991 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 28 Jul 2010 15:13:34 +0200 Subject: put iterator variables into loop headers Reviewed-by: joerg --- bin/syncqt | 57 +++++++++++++++++++-------------------------------------- 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/bin/syncqt b/bin/syncqt index 4acb5b5..c9f2223 100755 --- a/bin/syncqt +++ b/bin/syncqt @@ -297,8 +297,7 @@ sub classNames { push @symbols, "QMutable" . $1 . "Iterator"; } - foreach (@symbols) { - my $symbol = $_; + foreach my $symbol (@symbols) { $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces); push @ret, $symbol if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q @@ -696,9 +695,8 @@ my %inject_headers; # find the header by normal means. %inject_headers = ( "$basedir/src/corelib/global" => ( "*qconfig.h" ) ) unless (-e "$basedir/src/corelib/global/qconfig.h"); -foreach (@modules_to_sync) { +foreach my $lib (@modules_to_sync) { #iteration info - my $lib = $_; my $dir = "$modules{$lib}"; my $pathtoheaders = ""; $pathtoheaders = "$moduleheaders{$lib}" if ($moduleheaders{$lib}); @@ -715,8 +713,7 @@ foreach (@modules_to_sync) { #get dependencies if(-e "$dir/" . basename($dir) . ".pro") { if(open(F, "<$dir/" . basename($dir) . ".pro")) { - while() { - my $line = $_; + while(my $line = ) { chomp $line; if($line =~ /^ *QT *\+?= *([^\r\n]*)/) { foreach(split(/ /, "$1")) { @@ -743,8 +740,7 @@ foreach (@modules_to_sync) { #remove the old files if($remove_stale) { my @subdirs = ("$out_basedir/include/$lib"); - foreach (@subdirs) { - my $subdir = "$_"; + foreach my $subdir (@subdirs) { if (opendir DIR, "$subdir") { while(my $t = readdir(DIR)) { my $file = "$subdir/$t"; @@ -753,12 +749,10 @@ foreach (@modules_to_sync) { } else { my @files = ("$file"); #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t"); - foreach (@files) { - my $file = $_; + foreach my $file (@files) { my $remove_file = 0; if(open(F, "<$file")) { - while() { - my $line = $_; + while(my $line = ) { chomp $line; if($line =~ /^\#include \"([^\"]*)\"$/) { my $include = $1; @@ -782,14 +776,12 @@ foreach (@modules_to_sync) { } #create the new ones - foreach (split(/;/, $dir)) { - my $current_dir = "$_"; + foreach my $current_dir (split(/;/, $dir)) { my $headers_dir = $current_dir; $headers_dir .= "/$pathtoheaders" if ($pathtoheaders); #calc subdirs my @subdirs = ($headers_dir); - foreach (@subdirs) { - my $subdir = "$_"; + foreach my $subdir (@subdirs) { opendir DIR, "$subdir" or next; while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && @@ -801,12 +793,10 @@ foreach (@modules_to_sync) { } #calc files and "copy" them - foreach (@subdirs) { - my $subdir = "$_"; + foreach my $subdir (@subdirs) { my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); push @headers, $inject_headers{$subdir} if (defined $inject_headers{$subdir}); - foreach (@headers) { - my $header = "$_"; + foreach my $header (@headers) { my $shadow = ($header =~ s/^\*//); $header = 0 if("$header" =~ /^ui_.*.h/); foreach (@ignore_headers) { @@ -862,15 +852,15 @@ foreach (@modules_to_sync) { close HEADERFILE; } - foreach(@classes) { + foreach my $full_class (@classes) { my $header_base = basename($header); - my $class = $_; # Strip namespaces: + my $class = $full_class; $class =~ s/^.*:://; # if ($class =~ m/::/) { # class =~ s,::,/,g; # } - $class_lib_map_contents .= "QT_CLASS_LIB($_, $lib, $header_base)\n"; + $class_lib_map_contents .= "QT_CLASS_LIB($full_class, $lib, $header_base)\n"; $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0)); # KDE-Compat headers for Phonon @@ -892,8 +882,7 @@ foreach (@modules_to_sync) { #deal with the install directives if($public_header) { my $pri_install_iheader = fixPaths($iheader, $current_dir); - foreach(@classes) { - my $class = $_; + foreach my $class (@classes) { # Strip namespaces: $class =~ s/^.*:://; # if ($class =~ m/::/) { @@ -994,14 +983,10 @@ unless($showonly || !$create_uic_class_map) { } if($check_includes) { - for (keys(%modules)) { - #iteration info - my $lib = $_; - { + for my $lib (keys(%modules)) { #calc subdirs my @subdirs = ($modules{$lib}); - foreach (@subdirs) { - my $subdir = "$_"; + foreach my $subdir (@subdirs) { opendir DIR, "$subdir" or die "Huh, directory ".$subdir." cannot be opened."; while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && @@ -1012,8 +997,7 @@ if($check_includes) { closedir DIR; } - foreach (@subdirs) { - my $subdir = "$_"; + foreach my $subdir (@subdirs) { my $header_skip_qt_module_test = 0; foreach(@ignore_for_qt_module_check) { foreach (split(/;/, $_)) { @@ -1021,8 +1005,7 @@ if($check_includes) { } } my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); - foreach (@headers) { - my $header = "$_"; + foreach my $header (@headers) { my $header_skip_qt_begin_header_test = 0; my $header_skip_qt_begin_namespace_test = 0; $header = 0 if("$header" =~ /^ui_.*.h/); @@ -1074,8 +1057,7 @@ if($check_includes) { $include = 0; } if($include) { - for (keys(%modules)) { - my $trylib = $_; + for my $trylib (keys(%modules)) { if(-e "$out_basedir/include/$trylib/$include") { print "WARNING: $iheader includes $include when it should include $trylib/$include\n"; } @@ -1124,7 +1106,6 @@ if($check_includes) { } } } - } } } -- cgit v0.12 From 8aa5b8cf04baa11891918ebb57ff0d2d7ada7f78 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 28 Jul 2010 15:26:40 +0200 Subject: remove overquoting in perl, "$foo" is basically just slower and less legible than $foo. Reviewed-by: joerg --- bin/syncqt | 160 ++++++++++++++++++++++++++++++------------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/bin/syncqt b/bin/syncqt index c9f2223..60ecf3a 100755 --- a/bin/syncqt +++ b/bin/syncqt @@ -213,7 +213,7 @@ sub classNames { } } return @ret if($line =~ m/^#pragma qt_sync_stop_processing/); - push(@ret, "$1") if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/); + push(@ret, $1) if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/); $line = 0; } if($line) { @@ -323,7 +323,7 @@ sub syncHeader { $header =~ s=\\=/=g; return copyFile($iheader, $header) if($copy); - unless(-e "$header") { + unless(-e $header) { my $header_dir = dirname($header); mkpath $header_dir, !$quiet; @@ -367,7 +367,7 @@ sub fixPaths { $dir =~ s=\\=/=g; } $dir =~ s,/cygdrive/([a-zA-Z])/,$1:/,g; - return basename($file) if("$file_dir" eq "$dir"); + return basename($file) if($file_dir eq $dir); #guts my $match_dir = 0; @@ -429,7 +429,7 @@ sub fileCompare { my $file2contents = fileContents($file2); if (! -e $file1) { return 1; } if (! -e $file2) { return -1; } - return $file1contents ne $file2contents ? (stat("$file2"))[9] <=> (stat("$file1"))[9] : 0; + return $file1contents ne $file2contents ? (stat($file2))[9] <=> (stat($file1))[9] : 0; } ###################################################################### @@ -466,7 +466,7 @@ sub copyFile if ( $knowdiff || ($filecontents ne $ifilecontents) ) { if ( $copy > 0 ) { my $file_dir = dirname($file); - mkpath $file_dir, !$quiet unless(-e "$file_dir"); + mkpath $file_dir, !$quiet unless(-e $file_dir); open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)"; local $/; binmode O; @@ -475,7 +475,7 @@ sub copyFile return 1; } elsif ( $copy < 0 ) { my $ifile_dir = dirname($ifile); - mkpath $ifile_dir, !$quiet unless(-e "$ifile_dir"); + mkpath $ifile_dir, !$quiet unless(-e $ifile_dir); open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)"; local $/; binmode O; @@ -566,102 +566,102 @@ while ( @ARGV ) { #parse my $arg = shift @ARGV; - if ("$arg" eq "-h" || "$arg" eq "-help" || "$arg" eq "?") { + if ($arg eq "-h" || $arg eq "-help" || $arg eq "?") { $var = "show_help"; $val = "yes"; - } elsif("$arg" eq "-copy") { + } elsif($arg eq "-copy") { $var = "copy"; $val = "yes"; - } elsif("$arg" eq "-o" || "$arg" eq "-outdir") { + } elsif($arg eq "-o" || $arg eq "-outdir") { $var = "output"; $val = shift @ARGV; - } elsif("$arg" eq "-showonly" || "$arg" eq "-remove-stale" || "$arg" eq "-windows" || - "$arg" eq "-relative" || "$arg" eq "-check-includes") { + } elsif($arg eq "-showonly" || $arg eq "-remove-stale" || $arg eq "-windows" || + $arg eq "-relative" || $arg eq "-check-includes") { $var = substr($arg, 1); $val = "yes"; - } elsif("$arg" =~ /^-no-(.*)$/) { + } elsif($arg =~ /^-no-(.*)$/) { $var = $1; $val = "no"; #these are for commandline compat - } elsif("$arg" eq "-inc") { + } elsif($arg eq "-inc") { $var = "output"; $val = shift @ARGV; - } elsif("$arg" eq "-module") { + } elsif($arg eq "-module") { $var = "module"; $val = shift @ARGV; - } elsif("$arg" eq "-separate-module") { + } elsif($arg eq "-separate-module") { $var = "separate-module"; $val = shift @ARGV; - } elsif("$arg" eq "-show") { + } elsif($arg eq "-show") { $var = "showonly"; $val = "yes"; - } elsif("$arg" eq "-quiet") { + } elsif($arg eq "-quiet") { $var = "quiet"; $val = "yes"; - } elsif("$arg" eq "-base-dir") { + } elsif($arg eq "-base-dir") { # skip, it's been dealt with at the top of the file shift @ARGV; next; } #do something - if(!$var || "$var" eq "show_help") { + if(!$var || $var eq "show_help") { print "Unknown option: $arg\n\n" if(!$var); showUsage(); - } elsif ("$var" eq "copy") { - if("$val" eq "yes") { + } elsif ($var eq "copy") { + if($val eq "yes") { $copy_headers++; } elsif($showonly) { $copy_headers--; } - } elsif ("$var" eq "showonly") { - if("$val" eq "yes") { + } elsif ($var eq "showonly") { + if($val eq "yes") { $showonly++; } elsif($showonly) { $showonly--; } - } elsif ("$var" eq "quiet") { - if("$val" eq "yes") { + } elsif ($var eq "quiet") { + if($val eq "yes") { $quiet++; } elsif($quiet) { $quiet--; } - } elsif ("$var" eq "check-includes") { - if("$val" eq "yes") { + } elsif ($var eq "check-includes") { + if($val eq "yes") { $check_includes++; } elsif($check_includes) { $check_includes--; } - } elsif ("$var" eq "remove-stale") { - if("$val" eq "yes") { + } elsif ($var eq "remove-stale") { + if($val eq "yes") { $remove_stale++; } elsif($remove_stale) { $remove_stale--; } - } elsif ("$var" eq "windows") { - if("$val" eq "yes") { + } elsif ($var eq "windows") { + if($val eq "yes") { $force_win++; } elsif($force_win) { $force_win--; } - } elsif ("$var" eq "relative") { - if("$val" eq "yes") { + } elsif ($var eq "relative") { + if($val eq "yes") { $force_relative++; } elsif($force_relative) { $force_relative--; } - } elsif ("$var" eq "module") { + } elsif ($var eq "module") { print "module :$val:\n" unless $quiet; die "No such module: $val" unless(defined $modules{$val}); push @modules_to_sync, $val; - } elsif ("$var" eq "separate-module") { + } elsif ($var eq "separate-module") { my ($module, $prodir, $headerdir) = split(/:/, $val); $modules{$module} = $prodir; push @modules_to_sync, $module; $moduleheaders{$module} = $headerdir; $create_uic_class_map = 0; $create_private_headers = 0; - } elsif ("$var" eq "output") { + } elsif ($var eq "output") { my $outdir = $val; if(checkRelative($outdir)) { $out_basedir = getcwd(); @@ -697,9 +697,9 @@ my %inject_headers; foreach my $lib (@modules_to_sync) { #iteration info - my $dir = "$modules{$lib}"; + my $dir = $modules{$lib}; my $pathtoheaders = ""; - $pathtoheaders = "$moduleheaders{$lib}" if ($moduleheaders{$lib}); + $pathtoheaders = $moduleheaders{$lib} if ($moduleheaders{$lib}); #information used after the syncing my $pri_install_classes = ""; @@ -716,20 +716,20 @@ foreach my $lib (@modules_to_sync) { while(my $line = ) { chomp $line; if($line =~ /^ *QT *\+?= *([^\r\n]*)/) { - foreach(split(/ /, "$1")) { - $master_contents .= "#include \n" if("$_" eq "core"); - $master_contents .= "#include \n" if("$_" eq "gui"); - $master_contents .= "#include \n" if("$_" eq "network"); - $master_contents .= "#include \n" if("$_" eq "svg"); - $master_contents .= "#include \n" if("$_" eq "declarative"); - $master_contents .= "#include \n" if("$_" eq "script"); - $master_contents .= "#include \n" if("$_" eq "scripttools"); - $master_contents .= "#include \n" if("$_" eq "qt3support"); - $master_contents .= "#include \n" if("$_" eq "sql"); - $master_contents .= "#include \n" if("$_" eq "xml"); - $master_contents .= "#include \n" if("$_" eq "xmlpatterns"); - $master_contents .= "#include \n" if("$_" eq "opengl"); - $master_contents .= "#include \n" if("$_" eq "openvg"); + foreach(split(/ /, $1)) { + $master_contents .= "#include \n" if($_ eq "core"); + $master_contents .= "#include \n" if($_ eq "gui"); + $master_contents .= "#include \n" if($_ eq "network"); + $master_contents .= "#include \n" if($_ eq "svg"); + $master_contents .= "#include \n" if($_ eq "declarative"); + $master_contents .= "#include \n" if($_ eq "script"); + $master_contents .= "#include \n" if($_ eq "scripttools"); + $master_contents .= "#include \n" if($_ eq "qt3support"); + $master_contents .= "#include \n" if($_ eq "sql"); + $master_contents .= "#include \n" if($_ eq "xml"); + $master_contents .= "#include \n" if($_ eq "xmlpatterns"); + $master_contents .= "#include \n" if($_ eq "opengl"); + $master_contents .= "#include \n" if($_ eq "openvg"); } } } @@ -741,13 +741,13 @@ foreach my $lib (@modules_to_sync) { if($remove_stale) { my @subdirs = ("$out_basedir/include/$lib"); foreach my $subdir (@subdirs) { - if (opendir DIR, "$subdir") { + if (opendir DIR, $subdir) { while(my $t = readdir(DIR)) { my $file = "$subdir/$t"; - if(-d "$file") { - push @subdirs, "$file" unless($t eq "." || $t eq ".."); + if(-d $file) { + push @subdirs, $file unless($t eq "." || $t eq ".."); } else { - my @files = ("$file"); + my @files = ($file); #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t"); foreach my $file (@files) { my $remove_file = 0; @@ -757,14 +757,14 @@ foreach my $lib (@modules_to_sync) { if($line =~ /^\#include \"([^\"]*)\"$/) { my $include = $1; $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/"); - $remove_file = 1 unless(-e "$include"); + $remove_file = 1 unless(-e $include); } else { $remove_file = 0; last; } } close(F); - unlink "$file" if($remove_file); + unlink $file if($remove_file); } } } @@ -782,7 +782,7 @@ foreach my $lib (@modules_to_sync) { #calc subdirs my @subdirs = ($headers_dir); foreach my $subdir (@subdirs) { - opendir DIR, "$subdir" or next; + opendir DIR, $subdir or next; while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && !($t eq "..") && !($t eq ".obj") && @@ -794,13 +794,13 @@ foreach my $lib (@modules_to_sync) { #calc files and "copy" them foreach my $subdir (@subdirs) { - my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); + my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0); push @headers, $inject_headers{$subdir} if (defined $inject_headers{$subdir}); foreach my $header (@headers) { my $shadow = ($header =~ s/^\*//); - $header = 0 if("$header" =~ /^ui_.*.h/); + $header = 0 if($header =~ /^ui_.*.h/); foreach (@ignore_headers) { - $header = 0 if("$header" eq "$_"); + $header = 0 if($header eq $_); } if($header) { my $header_copies = 0; @@ -810,7 +810,7 @@ foreach my $lib (@modules_to_sync) { $public_header = 0; } else { foreach (@ignore_for_master_contents) { - $public_header = 0 if("$header" eq "$_"); + $public_header = 0 if($header eq $_); } } @@ -829,7 +829,7 @@ foreach my $lib (@modules_to_sync) { @headers = ( "$out_basedir/include/$lib/$header" ); # write forwarding headers to include/Qt - if ("$lib" ne "phonon" && "$subdir" =~ /^$basedir\/src/) { + if ($lib ne "phonon" && $subdir =~ /^$basedir\/src/) { my $file_name = "$out_basedir/include/Qt/$header"; my $file_op = '>'; my $header_content = ''; @@ -917,8 +917,8 @@ foreach my $lib (@modules_to_sync) { foreach my $master_include (@master_includes) { #generate the "master" include file my @tmp = split(/;/,$modules{$lib}); - $pri_install_files .= fixPaths($master_include, "$tmp[0]") . " "; #get the master file installed too - if($master_include && -e "$master_include") { + $pri_install_files .= fixPaths($master_include, $tmp[0]) . " "; #get the master file installed too + if($master_include && -e $master_include) { open MASTERINCLUDE, "<$master_include"; local $/; binmode MASTERINCLUDE; @@ -932,7 +932,7 @@ foreach my $lib (@modules_to_sync) { mkpath $master_dir, !$quiet; print "header (master) created for $lib\n" unless $quiet; open MASTERINCLUDE, ">$master_include"; - print MASTERINCLUDE "$master_contents"; + print MASTERINCLUDE $master_contents; close MASTERINCLUDE; } } @@ -943,7 +943,7 @@ foreach my $lib (@modules_to_sync) { $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n"; $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n"; my $headers_pri_file = "$out_basedir/include/$lib/headers.pri"; - if(-e "$headers_pri_file") { + if(-e $headers_pri_file) { open HEADERS_PRI_FILE, "<$headers_pri_file"; local $/; binmode HEADERS_PRI_FILE; @@ -957,14 +957,14 @@ foreach my $lib (@modules_to_sync) { mkpath $headers_pri_dir, !$quiet; print "headers.pri file created for $lib\n" unless $quiet; open HEADERS_PRI_FILE, ">$headers_pri_file"; - print HEADERS_PRI_FILE "$headers_pri_contents"; + print HEADERS_PRI_FILE $headers_pri_contents; close HEADERS_PRI_FILE; } } } unless($showonly || !$create_uic_class_map) { my $class_lib_map = "$out_basedir/src/tools/uic/qclass_lib_map.h"; - if(-e "$class_lib_map") { + if(-e $class_lib_map) { open CLASS_LIB_MAP, "<$class_lib_map"; local $/; binmode CLASS_LIB_MAP; @@ -977,7 +977,7 @@ unless($showonly || !$create_uic_class_map) { my $class_lib_map_dir = dirname($class_lib_map); mkpath $class_lib_map_dir, !$quiet; open CLASS_LIB_MAP, ">$class_lib_map"; - print CLASS_LIB_MAP "$class_lib_map_contents"; + print CLASS_LIB_MAP $class_lib_map_contents; close CLASS_LIB_MAP; } } @@ -987,7 +987,7 @@ if($check_includes) { #calc subdirs my @subdirs = ($modules{$lib}); foreach my $subdir (@subdirs) { - opendir DIR, "$subdir" or die "Huh, directory ".$subdir." cannot be opened."; + opendir DIR, $subdir or die "Huh, directory ".$subdir." cannot be opened."; while(my $t = readdir(DIR)) { push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") && !($t eq "..") && !($t eq ".obj") && @@ -1001,16 +1001,16 @@ if($check_includes) { my $header_skip_qt_module_test = 0; foreach(@ignore_for_qt_module_check) { foreach (split(/;/, $_)) { - $header_skip_qt_module_test = 1 if ("$subdir" =~ /^$_/); + $header_skip_qt_module_test = 1 if ($subdir =~ /^$_/); } } - my @headers = findFiles("$subdir", "^[-a-z0-9_]*\\.h\$" , 0); + my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0); foreach my $header (@headers) { my $header_skip_qt_begin_header_test = 0; my $header_skip_qt_begin_namespace_test = 0; - $header = 0 if("$header" =~ /^ui_.*.h/); + $header = 0 if($header =~ /^ui_.*.h/); foreach (@ignore_headers) { - $header = 0 if("$header" eq "$_"); + $header = 0 if($header eq $_); } if($header) { my $public_header = $header; @@ -1018,17 +1018,17 @@ if($check_includes) { $public_header = 0; } else { foreach (@ignore_for_master_contents) { - $public_header = 0 if("$header" eq "$_"); + $public_header = 0 if($header eq $_); } if($public_header) { foreach (@ignore_for_include_check) { - $public_header = 0 if("$header" eq "$_"); + $public_header = 0 if($header eq $_); } foreach(@ignore_for_qt_begin_header_check) { - $header_skip_qt_begin_header_test = 1 if ("$header" eq "$_"); + $header_skip_qt_begin_header_test = 1 if ($header eq $_); } foreach(@ignore_for_qt_begin_namespace_check) { - $header_skip_qt_begin_namespace_test = 1 if ("$header" eq "$_"); + $header_skip_qt_begin_namespace_test = 1 if ($header eq $_); } } } -- cgit v0.12 From b2643a207a23599dbf1aec37cd2b6f8adae1e2dd Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 1 Sep 2010 19:51:37 +0200 Subject: make syncqt propagate timestamps as well this should reduce the number of unnecessary rebuilds of qt-using code even after re-building qt from scratch - provided the timestamp of qconfig.h is preserved externally. Task-number: QTBUG-12731 --- bin/syncqt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/bin/syncqt b/bin/syncqt index 60ecf3a..907869d 100755 --- a/bin/syncqt +++ b/bin/syncqt @@ -309,16 +309,17 @@ sub classNames { } ###################################################################### -# Syntax: syncHeader(header, iheader, copy) +# Syntax: syncHeader(header, iheader, copy, timestamp) # Params: header, string, filename to create "symlink" for # iheader, string, destination name of symlink # copy, forces header to be a copy of iheader +# timestamp, the requested modification time if copying # # Purpose: Syncronizes header to iheader # Returns: 1 if successful, else 0. ###################################################################### sub syncHeader { - my ($header, $iheader, $copy) = @_; + my ($header, $iheader, $copy, $ts) = @_; $iheader =~ s=\\=/=g; $header =~ s=\\=/=g; return copyFile($iheader, $header) if($copy); @@ -332,6 +333,7 @@ sub syncHeader { open HEADER, ">$header" || die "Could not open $header for writing!\n"; print HEADER "#include \"$iheader_out\"\n"; close HEADER; + utime(time, $ts, $header) or die "$iheader, $header"; return 1; } return 0; @@ -472,6 +474,7 @@ sub copyFile binmode O; print O $ifilecontents; close O; + utime time, (stat($ifile))[9], $file; return 1; } elsif ( $copy < 0 ) { my $ifile_dir = dirname($ifile); @@ -481,6 +484,7 @@ sub copyFile binmode O; print O $filecontents; close O; + utime time, (stat($file))[9], $ifile; return 1; } } @@ -823,6 +827,7 @@ foreach my $lib (@modules_to_sync) { print "SYMBOL: $_\n"; } } else { + my $ts = (stat($iheader))[9]; #find out all the places it goes.. my @headers; if ($public_header) { @@ -861,18 +866,18 @@ foreach my $lib (@modules_to_sync) { # class =~ s,::,/,g; # } $class_lib_map_contents .= "QT_CLASS_LIB($full_class, $lib, $header_base)\n"; - $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0)); + $header_copies++ if(syncHeader("$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0, $ts)); # KDE-Compat headers for Phonon if ($lib eq "phonon") { - $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0)); + $header_copies++ if (syncHeader("$out_basedir/include/phonon_compat/Phonon/$class", "$out_basedir/include/$lib/$header", 0, $ts)); } } } elsif ($create_private_headers) { @headers = ( "$out_basedir/include/$lib/private/$header" ); } foreach(@headers) { #sync them - $header_copies++ if(syncHeader($_, $iheader, $copy_headers)); + $header_copies++ if(syncHeader($_, $iheader, $copy_headers, $ts)); } if($public_header) { -- cgit v0.12 From 72a1709cbe216220722750c743641bf5ba8a8da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Thu, 2 Sep 2010 08:11:18 +0200 Subject: Minor performance improvement to QGraphicsItem::update. Reported by other teams in Nokia. Avoid calling discardUpdateRequest() twice, first in update() and then in markDirty(). No-brainer. Task-number: QTBUG-10817 Reviewed-by: Trustme --- src/gui/graphicsview/qgraphicsitem.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 7a622f1..fc122d2 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -5666,9 +5666,6 @@ void QGraphicsItem::update(const QRectF &rect) return; } - if (d_ptr->discardUpdateRequest()) - return; - if (d_ptr->scene) d_ptr->scene->d_func()->markDirty(this, rect); } -- cgit v0.12 From cbe62050c28bae3b1f251be72e28cfe509cea14c Mon Sep 17 00:00:00 2001 From: axis Date: Wed, 1 Sep 2010 15:44:47 +0200 Subject: Fixed Symbian builds after introduction of boilerplate code. Hopefully the linux-armcc and linux-gcce mkspecs will be renamed later, but until then, we need this fix. RevBy: Trust me --- src/corelib/global/global.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri index 2505e72..260ed59 100644 --- a/src/corelib/global/global.pri +++ b/src/corelib/global/global.pri @@ -19,7 +19,7 @@ INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global # Only used on platforms with CONFIG += precompile_header PRECOMPILED_HEADER = global/qt_pch.h -linux*:!static { +linux*:!static:!linux-armcc:!linux-gcce { QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate prog=$$quote(if (/program interpreter: (.*)]/) { print $1; }) DEFINES += ELF_INTERPRETER=\\\"$$system(readelf -l /bin/ls | perl -n -e \'$$prog\')\\\" -- cgit v0.12 From 389921022ea903c1a3eab6e110afd9bff49e719b Mon Sep 17 00:00:00 2001 From: axis Date: Thu, 2 Sep 2010 09:47:37 +0200 Subject: Revert "QLineEdit cursor is shown when asked to be non-visible" This reverts commit 9ef61d3d1e53d32dc2568cbfb9f8ff5b19cb4ffc. --- src/gui/widgets/qlinecontrol.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp index 69e6791..b6dfd13 100644 --- a/src/gui/widgets/qlinecontrol.cpp +++ b/src/gui/widgets/qlinecontrol.cpp @@ -464,8 +464,6 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event) if (a.type == QInputMethodEvent::Cursor) { m_preeditCursor = a.start; m_hideCursor = !a.length; - if (m_hideCursor) - setCursorBlinkPeriod(0); } else if (a.type == QInputMethodEvent::TextFormat) { QTextCharFormat f = qvariant_cast(a.value).toCharFormat(); if (f.isValid()) { @@ -529,7 +527,7 @@ void QLineControl::draw(QPainter *painter, const QPoint &offset, const QRect &cl int cursor = m_cursor; if (m_preeditCursor != -1) cursor += m_preeditCursor; - if (!m_hideCursor && (!m_blinkPeriod || m_blinkStatus)) + if(!m_blinkPeriod || m_blinkStatus) m_textLayout.drawCursor(painter, offset, cursor, m_cursorWidth); } } -- cgit v0.12 From 4c8571de2d50e1dbfeef38b1e1e09c48a0a27aa4 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 23 Aug 2010 12:53:04 +0200 Subject: Fix symbol font detection in generic CMap decoding For fonts that have an AppleRoman name table, *isSymbolFont failed to return correct value even if they have a symbol table. This patch corrected this behavior by using symbolTable variable to detect that instead of checking if score == Symbol. Also prefer symbol table over AppleRoman table to make generic CMap decoding consistent with QFontEngineFT (which will use the symbol table whenever its available). Task-number: QTBUG-3852 Reviewed-by: Lars Knoll --- src/gui/text/qfontengine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 3f758b1..1e8461f 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -874,8 +874,8 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy enum { Invalid, - Symbol, AppleRoman, + Symbol, Unicode11, Unicode, MicrosoftUnicode, @@ -939,7 +939,7 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy return 0; resolveTable: - *isSymbolFont = (score == Symbol); + *isSymbolFont = (symbolTable > -1); unsigned int unicode_table = qFromBigEndian(maps + 8*tableToUse + 4); -- cgit v0.12 From 7f5cae532d9f1841d15f01064bf97775b9fd8b0d Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 23 Aug 2010 12:56:50 +0200 Subject: Keep mirrored char handling consistent between some font engines Mirrored character subsitution should be used in right-to-left text direction unless the font is a symbol font. This patch will keep this behavior consistent between FreeType, QPF and S60 font engines. For Mac font engines, the shaping process is delegated to Core Text or ATSUI, so we don't do mirrored char handling by ourselves. Task-number: QTBUG-3852 Reviewed-by: Lars Knoll --- src/gui/text/qfontengine_ft.cpp | 2 -- src/gui/text/qfontengine_qpf.cpp | 2 -- src/gui/text/qfontengine_s60.cpp | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 60db8b6..a9b25f5 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -1565,8 +1565,6 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs FT_Face face = freetype->face; for ( int i = 0; i < len; ++i ) { unsigned int uc = getChar(str, i, len); - if (mirrored) - uc = QChar::mirroredChar(uc); glyphs->glyphs[glyph_pos] = uc < QFreetypeFace::cmapCacheSize ? freetype->cmapCache[uc] : 0; if ( !glyphs->glyphs[glyph_pos] ) { glyph_t glyph; diff --git a/src/gui/text/qfontengine_qpf.cpp b/src/gui/text/qfontengine_qpf.cpp index a0593cc..53b6910 100644 --- a/src/gui/text/qfontengine_qpf.cpp +++ b/src/gui/text/qfontengine_qpf.cpp @@ -578,8 +578,6 @@ bool QFontEngineQPF::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph if (symbol) { for (int i = 0; i < len; ++i) { unsigned int uc = getChar(str, i, len); - if (mirrored) - uc = QChar::mirroredChar(uc); glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc); if(!glyphs->glyphs[glyph_pos] && uc < 0x100) glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc + 0xf000); diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp index 2cc3f50..2c533db 100644 --- a/src/gui/text/qfontengine_s60.cpp +++ b/src/gui/text/qfontengine_s60.cpp @@ -256,7 +256,7 @@ bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout for (int i = 0; i < len; ++i) { const unsigned int uc = getChar(characters, i, len); *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, - isRtl ? QChar::mirroredChar(uc) : uc); + (isRtl && !m_symbolCMap) ? QChar::mirroredChar(uc) : uc); } glyphs->numGlyphs = g - glyphs->glyphs; -- cgit v0.12 From 9d88ff485e93e9701719263ce0a46cb86b0398ca Mon Sep 17 00:00:00 2001 From: Gareth Stockwell Date: Thu, 2 Sep 2010 13:03:50 +0100 Subject: Prevent null pointer dereference Task-number: QTBUG-13204 Reviewed-by: axis --- src/gui/kernel/qapplication_s60.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 4ed4ba3..21f930e 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -129,7 +129,7 @@ void QS60Data::setStatusPaneAndButtonGroupVisibility(bool statusPaneVisible, boo statusPaneVisibilityChanged = (s->IsVisible() != statusPaneVisible); s->MakeVisible(statusPaneVisible); } - if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged) + if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged && QApplication::activeWindow()) // Ensure that control rectangle is updated static_cast(QApplication::activeWindow()->winId())->handleClientAreaChange(); } -- cgit v0.12 From 55b067d14d8c12bd29b03c17e0281a11a49f95ca Mon Sep 17 00:00:00 2001 From: Gareth Stockwell Date: Thu, 2 Sep 2010 13:07:59 +0100 Subject: Update QDesktopWidget geometry when S60 furniture visibility changes Task-number: QTBUG-13204 Reviewed-by: axis --- src/gui/kernel/qapplication_s60.cpp | 6 ++++++ src/gui/kernel/qwidget_s60.cpp | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 21f930e..e937918 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -129,6 +129,12 @@ void QS60Data::setStatusPaneAndButtonGroupVisibility(bool statusPaneVisible, boo statusPaneVisibilityChanged = (s->IsVisible() != statusPaneVisible); s->MakeVisible(statusPaneVisible); } + if (buttonGroupVisibilityChanged || statusPaneVisibilityChanged) { + const QSize size = qt_TRect2QRect(static_cast(S60->appUi())->ClientRect()).size(); + const QSize oldSize; // note that QDesktopWidget::resizeEvent ignores the QResizeEvent contents + QResizeEvent event(size, oldSize); + QApplication::instance()->sendEvent(QApplication::desktop(), &event); + } if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged && QApplication::activeWindow()) // Ensure that control rectangle is updated static_cast(QApplication::activeWindow()->winId())->handleClientAreaChange(); diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index fc13c93..c98c05a 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -503,8 +503,10 @@ void QWidgetPrivate::show_sys() // Can't use AppUi directly because it privately inherits from MEikStatusPaneObserver. QSymbianControl *desktopControl = static_cast(QApplication::desktop()->winId()); S60->statusPane()->SetObserver(desktopControl); - if (isFullscreen) - S60->statusPane()->MakeVisible(false); + if (isFullscreen) { + const bool cbaVisible = S60->buttonGroupContainer() && S60->buttonGroupContainer()->IsVisible(); + S60->setStatusPaneAndButtonGroupVisibility(false, cbaVisible); + } } } } -- cgit v0.12 From f8c789a70ee3061dd81307ead82c47bb0f8041d5 Mon Sep 17 00:00:00 2001 From: Jani Hautakangas Date: Thu, 2 Sep 2010 15:30:37 +0300 Subject: Document known limitations in UI performance on S60 5.0 based devices. Task-number: QTBUG-11333 Reviewed-by: axis --- doc/src/images/symbian-draw-pixmap-sequence.png | Bin 0 -> 5724 bytes doc/src/images/symbian-qt-draw-pixmap-sequence.png | Bin 0 -> 9141 bytes .../symbian-qt-rendering-stack-non-screenplay.png | Bin 0 -> 52802 bytes .../symbian-rendering-stack-non-screenplay.png | Bin 0 -> 44655 bytes doc/src/platforms/platform-notes.qdoc | 50 +++++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 doc/src/images/symbian-draw-pixmap-sequence.png create mode 100644 doc/src/images/symbian-qt-draw-pixmap-sequence.png create mode 100644 doc/src/images/symbian-qt-rendering-stack-non-screenplay.png create mode 100644 doc/src/images/symbian-rendering-stack-non-screenplay.png diff --git a/doc/src/images/symbian-draw-pixmap-sequence.png b/doc/src/images/symbian-draw-pixmap-sequence.png new file mode 100644 index 0000000..05e3739 Binary files /dev/null and b/doc/src/images/symbian-draw-pixmap-sequence.png differ diff --git a/doc/src/images/symbian-qt-draw-pixmap-sequence.png b/doc/src/images/symbian-qt-draw-pixmap-sequence.png new file mode 100644 index 0000000..f7546f4 Binary files /dev/null and b/doc/src/images/symbian-qt-draw-pixmap-sequence.png differ diff --git a/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png new file mode 100644 index 0000000..9e1997d Binary files /dev/null and b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png differ diff --git a/doc/src/images/symbian-rendering-stack-non-screenplay.png b/doc/src/images/symbian-rendering-stack-non-screenplay.png new file mode 100644 index 0000000..80cb078 Binary files /dev/null and b/doc/src/images/symbian-rendering-stack-non-screenplay.png differ diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc index 94b9856..6f533ae 100644 --- a/doc/src/platforms/platform-notes.qdoc +++ b/doc/src/platforms/platform-notes.qdoc @@ -526,6 +526,56 @@ platform in use. If available, it is loaded in preference over the MMF plugin. If the Helix plugin fails to load, the MMF plugin, if present on the device, will be loaded instead. + + \section1 UI Performance in devices prior to Symbian^3 + + Qt uses the QPainter class to perform low-level painting on widgets and + other paint devices. QPainter provides functions to draw complex shapes, + aligned text and pixmaps. It can also do vector path clipping, coordinate + transformations and Porter-Duff composition. If the underlying graphics + architecture does not support all of these operations then Qt uses the + raster graphics system for rendering. + + Most of the Symbian devices prior to Symbian^3 use a non-ScreenPlay + graphics architecture which does not have native support for all functions + provided by QPainter. In non-ScreenPlay devices Qt uses the raster + graphics system by default which has a performance penalty when compared + to native Symbian rendering. + + In order to be able to perform all functions provided by QPainter, the + raster graphics system needs to have pixel level framebuffer access. To + make this possible in non-ScreenPlay devices Qt has to create an + additional offscreen buffer that is the target for all Qt rendering + operations. Qt renders the widget tree to the offscreen buffer and the + offscreen buffer is blitted to the framebuffer via Symbian Window Server. + + The following table shows the rendering stacks of native Symbian and Qt in + non-ScreenPlay devices. + + \table + \header \o Symbian + \o Qt + \row \o \image symbian-rendering-stack-non-screenplay.png + \o \image symbian-qt-rendering-stack-non-screenplay.png + \endtable + + The following diagrams show a simplified sequence of drawing a pixmap in + a non-ScreenPlay device. + + \table + \header \o Symbian + \row \o \image symbian-draw-pixmap-sequence.png + \endtable + + \table + \header \o Qt + \row \o \image symbian-qt-draw-pixmap-sequence.png + \endtable + + When compared to a native Symbian application, Qt does an additional blit + to the offscreen buffer before drawing to the framebuffer. That is the + performance penalty which needs to be paid to get all functionality + provided by QPainter in non-ScreenPlay architecture. */ /*! -- cgit v0.12 From 19beb3de012c4531dc69699bbb33f2cf1e86a84c Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Thu, 2 Sep 2010 15:57:59 +0200 Subject: Fix broken S60 build Reviewed-by: Liang Qi --- src/gui/text/qfontengine_s60.cpp | 7 ++++++- src/gui/text/qfontengine_s60_p.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp index 2c533db..5980f20 100644 --- a/src/gui/text/qfontengine_s60.cpp +++ b/src/gui/text/qfontengine_s60.cpp @@ -166,6 +166,11 @@ const uchar *QSymbianTypeFaceExtras::cmap() const return reinterpret_cast(m_cmapTable.constData()); } +bool QSymbianTypeFaceExtras::isSymbolCMap() const +{ + return m_symbolCMap; +} + CFont *QSymbianTypeFaceExtras::fontOwner() const { return m_cFont; @@ -256,7 +261,7 @@ bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout for (int i = 0; i < len; ++i) { const unsigned int uc = getChar(characters, i, len); *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, - (isRtl && !m_symbolCMap) ? QChar::mirroredChar(uc) : uc); + (isRtl && !m_extras->isSymbolCMap()) ? QChar::mirroredChar(uc) : uc); } glyphs->numGlyphs = g - glyphs->glyphs; diff --git a/src/gui/text/qfontengine_s60_p.h b/src/gui/text/qfontengine_s60_p.h index d65f13b..d05c23c 100644 --- a/src/gui/text/qfontengine_s60_p.h +++ b/src/gui/text/qfontengine_s60_p.h @@ -81,6 +81,7 @@ public: bool getSfntTableData(uint tag, uchar *buffer, uint *length) const; const uchar *cmap() const; CFont *fontOwner() const; + bool isSymbolCMap() const; private: CFont* m_cFont; -- cgit v0.12