Qt 5.13 introduces many new features and improvements as well as bugfixes
over the 5.12.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:

https://doc.qt.io/qt-5/index.html

The Qt version 5.13 series is binary compatible with the 5.12.x series.
Applications compiled for 5.12 will continue to run with 5.13.

Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:

https://bugreports.qt.io/

Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.

****************************************************************************
*                 Important Source Incompatible Changes                    *
****************************************************************************

 - Moc generated files include the standard <memory> header file now.
   A side effect of this is that code including the Moc output from within
   a namespace will fail to compile.

****************************************************************************
*                        Important Behavior Changes                        *
****************************************************************************

 - The Qt resource system now supports compressing content using the
   Zstandard (https://zstd.net) algorithm. Compared to zlib, it compresses
   better for the same CPU time, so this algorithm is the default.
   QResource::isCompressed() returns true for either compression algorithm.
   Use QResource::compressionAlgorithm() to find out which algorithm to
   decompress. QFile will automatically decompress using the correct
   algorithm.

 - QDataStream version bumped up to 19 to account for changes in the
   serialization of QFont.

 - [QTBUG-73048] Qt now enables by default warnings when using APIs
   marked as deprecated. It is possible to disable such warnings by
   defining the QT_NO_DEPRECATED_WARNINGS macro. The old
   QT_DEPRECATED_WARNINGS macro which was used to enable this warning
   now has no effect (warnings are automatically enabled).

****************************************************************************
*                             Third-Party Code                             *
****************************************************************************

 - Updated bundled SQLite to version 3.28.0.
 - [QTBUG-72623] Updated DNS public suffix list
 - [QTBUG-73883] libjpeg-turbo was updated to version 2.0.2
 - Bundled libpng was updated to version 1.6.37

****************************************************************************
*                        Platform-Specific Changes                         *
****************************************************************************

 - X11 / XCB:
   * [QTBUG-45375] QTabletEvent coordinates now come from AbsX/AbsY
     valuators in the X11 event, in more precise 32.32 fixed-point format,
     scaled to fit the virtual desktop. It's possible to revert to using
     the legacy 16.16-format event_x/event_y coordinates as in previous
     releases by setting the QT_XCB_TABLET_LEGACY_COORDINATES environment
     variable.
   * [plugins] platforminputcontexts now use libxkbcommon-compose APIs for
     compose key input, instead of Qt's own implementation.

 - Android
   * Increased the minimum supported Android version to Android 5.0
     (API level 21).

 - Windows
   * [QTBUG-47247][QTBUG-71855] Add a default setting for
     hasBorderInFullScreen in QtPlatformHeaders, QWindowsWindowFunctions
   * [QTBUG-57180] Removed confusing DirectWrite warning when loading
     bitmap fonts.

 - macOS
   * Accessibility: VoiceOver now reads all lines in multiline text
     components when navigating by lines.

****************************************************************************
*                                  Tools                                   *
****************************************************************************

 - configure & build system:
   * Added --linker=[bfg,lld,gold] configure flag.
   * The default OpenGL configuration changed from ANGLE to dynamic OpenGL.
   * Added -schannel option to enable Schannel support on Desktop Windows.
   * Added -coverage option for recording coverage data during execution

 - CMake
   * Added support for automatic linking of transitive dependencies in
     static builds

 - qmake
   * [QTBUG-53654] Introduced the variables WINDOWS_TARGET_PLATFORM_VERSION
     and WINDOWS_TARGET_PLATFORM_MIN_VERSION for overriding the default
     values of WindowsTargetPlatformVersion and
     WindowsTargetPlatformMinVersion in Visual Studio project files.

 - RCC now supports compressing content using the Zstandard
   (https://zstd.net) algorithm. Compared to zlib, it compresses better for
   the same CPU time, so this algorithm is the default. To go back to the
   previous algorithm, pass command-line option --compress-algo=zlib.
   Compression levels range from 1 (fastest, least compression) to 19
   (slowest, best compression). Level 0 tells the library to choose an
   implementation-defined default. The default compression level is
   "heuristic" (level -1): under this mode, RCC will attempt a very fast
   compression (level 1) and check if the file was sufficiently compressed.
   If it was, then RCC will compress again using an implementation-defined
   level.

****************************************************************************
*                                  QtCore                                  *
****************************************************************************

 - New class QConcatenateTablesProxyModel, to concatenate the rows from
   multiple source models.
 - New class QTransposeProxyModel to swap rows and columns of the source
   model.
 - Added macros Q_DISABLE_MOVE and Q_DISABLE_COPY_MOVE complementing
   Q_DISABLE_COPY.
 - Qt Containers and meta type system now use C++11 type traits
   (std::is_trivial, std::is_trivially_copyable and
   std::is_trivially_destructible) to detect the class of a type not
   explicitly set by Q_DECLARE_TYPEINFO. (Q_DECLARE_TYPEINFO is still
   needed for QList.)

 - QCommandLineParser:
   * [QTBUG-58490] The application name (if set in QCoreApplication) is now
     shown in error messages.

 - QDateTime:
   * [QTBUG-71030] Fixed race conditions in getting the local time zone. Qt now
     has a mutex lock around all calls to tzset() and mktime(). Application
     code should avoid calling those functions directly.

 - QFile:
   * Made QFile::copy() issue a filesystem-synchronization system call,
     which would make it less likely to result in incomplete or corrupt
     files if the system reboots or uncleanly shuts down soon after the
     function returns. New code is advised to use QSaveFile instead, which
     also allows display of a progress report while copying.

 - QFileInfo:
   * [QTBUG-63970][QTBUG-30401][QTBUG-20791] Fixed resolving of symbolic
     links to UNC shares on NTFS file systems.

 - QJsonArray:
   * [QTBUG-32793] Added cbegin() and cend() methods for compatibility with
     the Standard Library container concepts.

 - QJsonDocument:
   * [QTBUG-71445] Added the ability to stream QJsonDocument into and from
     QDataStream if it is contained in a QVariant.

 - QLocale:
   * Added support for Western Balochi, Ido, Lojban, Sicilian and
     Southern Kurdish.
   * [QTBUG-71445] Added a const overload for formattedDataSize().
   * [QTBUG-782] Added toLong() and toULong().

 - QMetaObject:
   * Non-copyable lambdas can now be used with invokeMethod(). For
     consistency reasons, the functor object is now always moved.

 - QMimeDatabase:
   * Added configure option -no-mimetype-database that tells Qt not to
     bundle its own copy of the XDG MIME database. If this option is
     passed, QMimeDatabase will only work if there's a system copy in
     $XDG_DATA_DIRS/mime. This option is useful for Linux distributions
     that ensure the data is always present.

 - QSettings:
   * Added QSettings(Scope...) constructor to avoid using #ifdef in Qt
     applications.

 - QStringListModel:
   * [QTBUG-69807] Implemented moveRows

 - QUrlQuery:
   * QUrlQuery now provides an initializer list constructor. It can be
     created using a list of key/value pairs.

 - QVector:
   * QVector no longer requires a default constructor for its template
     argument.

****************************************************************************
*                                 QtDBus                                   *
****************************************************************************

 - Matching namespace prefixes using QDBusServiceWatcher (instead of full
   service names) is now possible. For example, "com.example.backend1*"
   will match "com.example.backend1", "com.example.backend1.foo" and
   "com.example.backend1.foo.bar", but not "com.example.backend12".

****************************************************************************
*                                  QtGui                                   *
****************************************************************************

 - CSS:
   * Added support for HSL/HSLA colors.
   * Fix the range of the hue parameter when parsing a color given in HSL
     or HSV.

 - QFont:
   * Add setFamilies()/families() to support use of font families with
     commas and quotes in their name.

 - QImage:
   * [QTBUG-41176] Added support for 16-bit grayscale format.
   * A new method convertTo has been added to change the format of a QImage
     in place.

 - QPainterPath:
   * Added clear(), reserve(), capacity(). clear() removes allocated
     QPainterPath elements but preserves allocated memory, which can be
     useful for application with complex paths that are often recreated.
     reserve() and capacity() follow QVector semantics.

 - QWindow:
   * [QTBUG-67903][QTBUG-52944] QWindow::transientParent is now a property.

 - Text:
   * [QTBUG-60813] Deprecated QFont::lastResortFamily() and
     QFont::lastResortFont() which are not in use in Qt 5 and did not
     provide any useful information.
   * [QTBUG-22813] Added support for setting the font's style name in
     QTextCharFormat.

****************************************************************************
*                                QtNetwork                                 *
****************************************************************************

 - TLS (SSL):
   * Support for SSLv2 and SSLv3 sockets has been dropped, as per RFC 6176
     (2011) and RFC 7568 (2015).
   * The Schannel backend now supports ALPN and thus HTTP/2.
   * [QTBUG-62637] Added support for Schannel on Desktop Windows. To build
     Qt with Schannel support use '-schannel' during configure.
   * Added class QOcspResponse as a part of OCSP stapling support.
   * [QTBUG-12812][QTBUG-17158] Added OCSP-stapling support for OpenSSL
     backend
   * [QTBUG-71828][QTBUG-73289] Fixed SSL verification when connecting to IP
     address (no host name) if that IP address is listed in the certificate.

****************************************************************************
*                                QtTestLib                                 *
****************************************************************************

 - Added QTest::toString(const QModelIndex &idx)

 - Removed support for GPU_BLACKLIST files. Reimplementations or
   equivalents of QTEST_MAIN() should remove their uses of
   QTEST_ADD_GPU_BLACKLIST_SUPPORT and its _DEFS; they are still vacuously
   defined, but serve no remaining purpose and shall be undefined in due
   course.

****************************************************************************
*                                QtWidgets                                 *
****************************************************************************

 - QAbstractScrollArea:
   * [QTBUG-69120] QTableView/QTreeView, when reporting their
     viewportSizeHint(), now correctly take into account their scroll
     bars' visibility and visibilityPolicy.

 - QHeaderView:
   * dataChanged now respects the given roles to avoid useless
     recomputations.

 - QLabel:
   * Minor performance improvement when painting a label with an image.

 - QListWidget:
   * [QTBUG-69807] Implemented moveRows in model
   * [QTBUG-68977] Sped up handling of hidden items when working with large
     data sets.

 - QPlainTextEdit:
   * Added QRegularExpression find() method overload.

 - QTextEdit:
   * Added QRegularExpression find() method overload.

 - QTreeView:
   * Added expandRecursively() to expand all items below a given index.

 - QWidgetTextControlPrivate:
   * [QTBUG-69735] Moved cursor selection to start.

****************************************************************************
*                                  QtSql                                   *
****************************************************************************

 - SQLite:
   * [QTBUG-63498] The json1-extension for the SQLite3 plugin is now enabled
     by default.

 - PostgreSQL:
   * QSqlDatabase is now stricter about table names when used with record()
     and primaryIndex(). If the tablename was not quoted when it was
     created, then the table name passed to record() and primaryIndex()
     needs to be in lower case so that PostgreSQL is able to find it.
