unwanted cache flush in Freetype engine (#1400417, QTBUG-49452)

This commit is contained in:
Rex Dieter 2016-12-13 10:14:01 -06:00
parent 91176c3fee
commit 81d6fcc4ca
2 changed files with 68 additions and 1 deletions

View File

@ -0,0 +1,61 @@
From 6f423555eba55ccdf7287071e10576bc1b687fd2 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Mon, 1 Aug 2016 13:39:53 +0200
Subject: [PATCH 447/783] REG: Fix unwanted cache flush in Freetype engine
The Freetype cache was almost completely disabled by
134c6db8587a8ce156d4fa31ffa62605821851b2 because after that
change, the lockedAlphaMapForGlyph() function would no longer
cut off early for empty glyphs like spaces, but rather go
through all alpha map functions before it realized that there
was nothing to render. This would in turn invalidate the cache
for every empty glyph, causing all glyphs to be rerendered for
every isolated word.
This change adds back a cut off. This is only needed in the
lockedAlphaMapForGlyph() function, since the superclass implementation
of the other alpha map functions already contains a cut off for
width/height == 0.
[ChangeLog][Qt Gui][Text] Fixed a performance regression in Freetype
engine that was introduced in Qt 5.5.
Change-Id: I381285939909e99cc5fb5f3497fecf9fa871f29a
Task-number: QTBUG-49452
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
---
src/gui/text/qfontengine_ft.cpp | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 4de41df..7c878da 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -1716,7 +1716,7 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe
static inline QImage alphaMapFromGlyphData(QFontEngineFT::Glyph *glyph, QFontEngine::GlyphFormat glyphFormat)
{
- if (glyph == Q_NULLPTR)
+ if (glyph == Q_NULLPTR || glyph->height == 0 || glyph->width == 0)
return QImage();
QImage::Format format = QImage::Format_Invalid;
@@ -1764,11 +1764,15 @@ QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixe
currentlyLockedAlphaMap = alphaMapFromGlyphData(glyph, neededFormat);
+ const bool glyphHasGeometry = glyph != Q_NULLPTR && glyph->height != 0 && glyph->width != 0;
if (!cacheEnabled && glyph != &emptyGlyph) {
currentlyLockedAlphaMap = currentlyLockedAlphaMap.copy();
delete glyph;
}
+ if (!glyphHasGeometry)
+ return Q_NULLPTR;
+
if (currentlyLockedAlphaMap.isNull())
return QFontEngine::lockedAlphaMapForGlyph(glyphIndex, subPixelPosition, neededFormat, t, offset);
--
2.7.4

View File

@ -62,7 +62,7 @@ BuildRequires: pkgconfig(libsystemd)
Name: qt5-qtbase
Summary: Qt5 - QtBase components
Version: 5.7.0
Release: 6%{?dist}
Release: 7%{?dist}
# See LGPL_EXCEPTIONS.txt, for exception details
License: LGPLv2 with exceptions or GPLv3 with exceptions
@ -113,6 +113,7 @@ Patch60: qtbase-opensource-src-5.7.1-moc_system_defines.patch
Patch61: qt5-qtbase-cxxflag.patch
## upstream patches
Patch447: 0447-REG-Fix-unwanted-cache-flush-in-Freetype-engine.patch
# Do not check any files in %%{_qt5_plugindir}/platformthemes/ for requires.
# Those themes are there for platform integration. If the required libraries are
@ -344,6 +345,8 @@ Qt5 libraries used for drawing widgets and OpenGL items.
%patch60 -p1 -b .moc_system_defines
%patch61 -p1 -b .qt5-qtbase-cxxflag
%patch447 -p1 -b .0447
%if 0%{?inject_optflags}
## adjust $RPM_OPT_FLAGS
@ -935,6 +938,9 @@ fi
%changelog
* Tue Dec 13 2016 Rex Dieter <rdieter@fedoraproject.org> - 5.7.0-7
- unwanted cache flush in Freetype engine (#1400417, QTBUG-49452)
* Mon Dec 12 2016 Vitaly Zaitsev <vitaly@easycoding.org> - 5.7.0-6
- Backported QTBUG-53071 patch to resolve problem with latest tzdata.
- Fixed Source URL.