mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
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.
This commit is contained in:
parent
7742f12f30
commit
7086e23bdd
2 changed files with 39 additions and 9 deletions
|
@ -27,6 +27,7 @@ MxcImageProvider::requestImageResponse(const QString &id, const QSize &requested
|
|||
auto id_ = id;
|
||||
bool crop = true;
|
||||
double radius = 0;
|
||||
auto size = requestedSize;
|
||||
|
||||
auto queryStart = id.lastIndexOf('?');
|
||||
if (queryStart != -1) {
|
||||
|
@ -39,11 +40,14 @@ MxcImageProvider::requestImageResponse(const QString &id, const QSize &requested
|
|||
crop = false;
|
||||
} else if (b.startsWith("radius=")) {
|
||||
radius = b.mid(7).toDouble();
|
||||
} else if (b.startsWith("height=")) {
|
||||
size.setHeight(b.mid(7).toInt());
|
||||
size.setWidth(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new MxcImageResponse(id_, crop, radius, requestedSize);
|
||||
return new MxcImageResponse(id_, crop, radius, size);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -120,7 +124,9 @@ MxcImageProvider::download(const QString &id,
|
|||
if (fileInfo.exists()) {
|
||||
QImage image = utils::readImageFromFile(fileInfo.absoluteFilePath());
|
||||
if (!image.isNull()) {
|
||||
image = image.scaled(requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
if (requestedSize != image.size()) {
|
||||
image = image.scaledToHeight(requestedSize.height(), Qt::SmoothTransformation);
|
||||
}
|
||||
|
||||
if (radius != 0) {
|
||||
image = clipRadius(std::move(image), radius);
|
||||
|
@ -151,8 +157,10 @@ MxcImageProvider::download(const QString &id,
|
|||
auto data = QByteArray(res.data(), (int)res.size());
|
||||
QImage image = utils::readImage(data);
|
||||
if (!image.isNull()) {
|
||||
image =
|
||||
image.scaled(requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
if (requestedSize != image.size()) {
|
||||
image =
|
||||
image.scaledToHeight(requestedSize.height(), Qt::SmoothTransformation);
|
||||
}
|
||||
|
||||
if (radius != 0) {
|
||||
image = clipRadius(std::move(image), radius);
|
||||
|
|
|
@ -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("(<img [^>]*)src=\"mxc://([^\"]*)\"([^>]*>)");
|
||||
formattedBody_.replace(matchImgUri, "\\1 src=\"image://mxcImage/\\2\"\\3");
|
||||
// Same regex but for single quotes around the src
|
||||
const static QRegularExpression matchImgUri2("(<img [^>]*)src=\'mxc://([^\']*)\'([^>]*>)");
|
||||
formattedBody_.replace(matchImgUri2, "\\1 src=\"image://mxcImage/\\2\"\\3");
|
||||
const static QRegularExpression matchEmoticonHeight(
|
||||
"(<img data-mx-emoticon [^>]*)height=\"([^\"]*)\"([^>]*>)");
|
||||
formattedBody_.replace(matchEmoticonHeight, QString("\\1 height=\"%1\"\\3").arg(ascent));
|
||||
|
||||
const static QRegularExpression matchIsImg("<img [^>]+>");
|
||||
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 <img>.
|
||||
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 <img> in formattedBody_ with our new <img>.
|
||||
formattedBody_.replace(curImg, imgReplacement);
|
||||
}
|
||||
|
||||
return QVariant(
|
||||
utils::replaceEmoji(utils::linkifyMessage(utils::escapeBlacklistedHtml(formattedBody_))));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue