Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix automatic font download on Windows #57844

Merged
merged 2 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ tasks, e.g. the font family name if known.
.. versionadded:: 3.38
%End

bool installFontsFromData( const QByteArray &data, QString &errorMessage /Out/, QStringList &families /Out/, QString &licenseDetails /Out/, const QString &filename = QString() );
bool installFontsFromData( const QByteArray &data, QString &errorMessage /Out/, QStringList &families /Out/, QString &licenseDetails /Out/, const QString &filename = QString(), const QString &extension = QString() );
%Docstring
Installs local user fonts from the specified raw ``data``.

Expand All @@ -287,6 +287,7 @@ or a zipped archive of font files.

:param data: raw font data or zipped font data
:param filename: filename hint for destination file. Will be ignored for archived content (e.g. zip file data)
:param extension: known file extension (eg "ttf", "otf") for font. Should be specified to avoid issues with font installation on Windows if filename is not specified (since QGIS 3.38)

:return: - ``True`` if installation was successful.
- errorMessage: will be set to a descriptive error message if the installation fails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ tasks, e.g. the font family name if known.
.. versionadded:: 3.38
%End

bool installFontsFromData( const QByteArray &data, QString &errorMessage /Out/, QStringList &families /Out/, QString &licenseDetails /Out/, const QString &filename = QString() );
bool installFontsFromData( const QByteArray &data, QString &errorMessage /Out/, QStringList &families /Out/, QString &licenseDetails /Out/, const QString &filename = QString(), const QString &extension = QString() );
%Docstring
Installs local user fonts from the specified raw ``data``.

Expand All @@ -287,6 +287,7 @@ or a zipped archive of font files.

:param data: raw font data or zipped font data
:param filename: filename hint for destination file. Will be ignored for archived content (e.g. zip file data)
:param extension: known file extension (eg "ttf", "otf") for font. Should be specified to avoid issues with font installation on Windows if filename is not specified (since QGIS 3.38)

:return: - ``True`` if installation was successful.
- errorMessage: will be set to a descriptive error message if the installation fails
Expand Down
20 changes: 17 additions & 3 deletions src/core/textrenderer/qgsfontmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1855,8 +1855,15 @@ void QgsFontManager::downloadAndInstallFont( const QgsFontDownloadDetails &detai
QStringList thisUrlFamilies;
const QByteArray fontData = allFontData[i];
const QString contentDispositionFilename = task->contentDispositionFilenames().at( i );
QString extension;
if ( contentDispositionFilename.isEmpty() )
{
const QUrl originalUrl = details.fontUrls().value( i );
const thread_local QRegularExpression rxExtension( QStringLiteral( "^.*\\.(\\w+?)$" ) );
extension = rxExtension.match( originalUrl.toString() ).captured( 1 );
}
QString thisLicenseDetails;
if ( !installFontsFromData( fontData, errorMessage, thisUrlFamilies, thisLicenseDetails, contentDispositionFilename ) )
if ( !installFontsFromData( fontData, errorMessage, thisUrlFamilies, thisLicenseDetails, contentDispositionFilename, extension ) )
{
QgsReadWriteLocker locker( mReplacementLock, QgsReadWriteLocker::Write );
mPendingFontDownloads.remove( identifier );
Expand Down Expand Up @@ -1900,13 +1907,20 @@ void QgsFontManager::downloadAndInstallFont( const QUrl &url, const QString &ide
downloadAndInstallFont( QgsFontDownloadDetails( identifier, { url.toString() } ) );
}

bool QgsFontManager::installFontsFromData( const QByteArray &data, QString &errorMessage, QStringList &families, QString &licenseDetails, const QString &filename )
bool QgsFontManager::installFontsFromData( const QByteArray &data, QString &errorMessage, QStringList &families, QString &licenseDetails, const QString &filename, const QString &extension )
{
errorMessage.clear();
families.clear();
licenseDetails.clear();

QTemporaryFile tempFile;
if ( !extension.isEmpty() )
{
QString cleanedExtension = extension;
if ( cleanedExtension.startsWith( '.' ) )
cleanedExtension = cleanedExtension.mid( 1 );
tempFile.setFileTemplate( QStringLiteral( "%1/XXXXXX.%2" ).arg( QDir::tempPath(), cleanedExtension ) );
}
QTemporaryDir tempDir;

QgsReadWriteLocker locker( mReplacementLock, QgsReadWriteLocker::Read );
Expand All @@ -1927,7 +1941,7 @@ bool QgsFontManager::installFontsFromData( const QByteArray &data, QString &erro
QString sourcePath = tempFile.fileName();

//try to install the data directly as a font
int id = QFontDatabase::addApplicationFont( sourcePath );
int id = QFontDatabase::addApplicationFontFromData( data );
if ( id != -1 )
{
// successfully loaded data as a font
Expand Down
3 changes: 2 additions & 1 deletion src/core/textrenderer/qgsfontmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,10 +328,11 @@ class CORE_EXPORT QgsFontManager : public QObject
* \param families will be populated with a list of font families installed from the data
* \param licenseDetails will be populated with font license details, if found
* \param filename filename hint for destination file. Will be ignored for archived content (e.g. zip file data)
* \param extension known file extension (eg "ttf", "otf") for font. Should be specified to avoid issues with font installation on Windows if filename is not specified (since QGIS 3.38)
*
* \returns TRUE if installation was successful.
*/
bool installFontsFromData( const QByteArray &data, QString &errorMessage SIP_OUT, QStringList &families SIP_OUT, QString &licenseDetails SIP_OUT, const QString &filename = QString() );
bool installFontsFromData( const QByteArray &data, QString &errorMessage SIP_OUT, QStringList &families SIP_OUT, QString &licenseDetails SIP_OUT, const QString &filename = QString(), const QString &extension = QString() );

/**
* Adds a \a directory to use for user fonts.
Expand Down
Loading