From 7086e23bdd73143529882e221b8f0963c8a7e82c Mon Sep 17 00:00:00 2001 From: tastytea Date: Mon, 27 Dec 2021 00:17:27 +0100 Subject: Request inline images in the right size and anti-alias them - If an inline image has specified a height, add parameters to the image:// URI. - Add scaled to the parameters, the images would be cropped otherwise. - Extract the height from image:// URI and use it for requestSize. - Use scaledToHeight instead of scaled. --- src/timeline/TimelineModel.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'src/timeline/TimelineModel.cpp') diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index b9941dfa..9696dffb 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -561,15 +561,37 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r } // TODO(Nico): Don't parse html with a regex - const static QRegularExpression matchImgUri("(]*)src=\"mxc://([^\"]*)\"([^>]*>)"); - formattedBody_.replace(matchImgUri, "\\1 src=\"image://mxcImage/\\2\"\\3"); - // Same regex but for single quotes around the src - const static QRegularExpression matchImgUri2("(]*)src=\'mxc://([^\']*)\'([^>]*>)"); - formattedBody_.replace(matchImgUri2, "\\1 src=\"image://mxcImage/\\2\"\\3"); const static QRegularExpression matchEmoticonHeight( "(]*)height=\"([^\"]*)\"([^>]*>)"); formattedBody_.replace(matchEmoticonHeight, QString("\\1 height=\"%1\"\\3").arg(ascent)); + const static QRegularExpression matchIsImg("]+>"); + auto itIsImg = matchIsImg.globalMatch(formattedBody_); + while (itIsImg.hasNext()) { + const QString curImg = itIsImg.next().captured(0); + + // Construct image parameters later used by MxcImageProvider. + QString imgParams; + if (curImg.contains("height")) { + const static QRegularExpression matchImgHeight("height=[\"\']?(\\d+)[\"\']?"); + const auto height = matchImgHeight.match(curImg).captured(1).toInt(); + imgParams = QString("?scale&height=%1").arg(height); + } + + // Replace src in current . + auto imgReplacement = curImg; + const static QRegularExpression matchImgUri("src=\"mxc://([^\"]*)\""); + imgReplacement.replace(matchImgUri, + QString("src=\"image://mxcImage/\\1%1\"").arg(imgParams)); + // Same regex but for single quotes around the src + const static QRegularExpression matchImgUri2("src=\'mxc://([^\']*)\'"); + imgReplacement.replace(matchImgUri2, + QString("src=\'image://mxcImage/\\1%1\'").arg(imgParams)); + + // Replace in formattedBody_ with our new . + formattedBody_.replace(curImg, imgReplacement); + } + return QVariant( utils::replaceEmoji(utils::linkifyMessage(utils::escapeBlacklistedHtml(formattedBody_)))); } -- cgit 1.5.1 From 850d139e3d9e9d2ee96ea44666d676af28df4a8f Mon Sep 17 00:00:00 2001 From: tastytea Date: Mon, 27 Dec 2021 23:16:26 +0100 Subject: Make custom emoticons twice as high as the font. --- src/timeline/TimelineModel.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'src/timeline/TimelineModel.cpp') diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 9696dffb..0bec9505 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -561,25 +561,28 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r } // TODO(Nico): Don't parse html with a regex - const static QRegularExpression matchEmoticonHeight( - "(]*)height=\"([^\"]*)\"([^>]*>)"); - formattedBody_.replace(matchEmoticonHeight, QString("\\1 height=\"%1\"\\3").arg(ascent)); - const static QRegularExpression matchIsImg("]+>"); auto itIsImg = matchIsImg.globalMatch(formattedBody_); while (itIsImg.hasNext()) { + // The current tag. const QString curImg = itIsImg.next().captured(0); + // The replacement for the current . + auto imgReplacement = curImg; // Construct image parameters later used by MxcImageProvider. QString imgParams; if (curImg.contains("height")) { - const static QRegularExpression matchImgHeight("height=[\"\']?(\\d+)[\"\']?"); - const auto height = matchImgHeight.match(curImg).captured(1).toInt(); + const static QRegularExpression matchImgHeight("height=([\"\']?)(\\d+)([\"\']?)"); + // Make emoticons twice as high as the font. + if (curImg.contains("data-mx-emoticon")) { + imgReplacement = + imgReplacement.replace(matchImgHeight, "height=\\1%1\\3").arg(ascent * 2); + } + const auto height = matchImgHeight.match(imgReplacement).captured(2).toInt(); imgParams = QString("?scale&height=%1").arg(height); } // Replace src in current . - auto imgReplacement = curImg; const static QRegularExpression matchImgUri("src=\"mxc://([^\"]*)\""); imgReplacement.replace(matchImgUri, QString("src=\"image://mxcImage/\\1%1\"").arg(imgParams)); -- cgit 1.5.1