Support patterned reactions dropdown.

This commit is contained in:
John Preston 2021-12-28 01:48:46 +03:00
parent 95e003153a
commit a7c93a9421
3 changed files with 26 additions and 22 deletions

View file

@ -269,7 +269,9 @@ Manager::Manager(
_cacheParts.setDevicePixelRatio(ratio); _cacheParts.setDevicePixelRatio(ratio);
_cacheParts.fill(Qt::transparent); _cacheParts.fill(Qt::transparent);
_cacheForPattern = QImage( _cacheForPattern = QImage(
_outer * ratio, QSize(
_outer.width(),
_outer.height() + st::reactionCornerAddedHeightMax) * ratio,
QImage::Format_ARGB32_Premultiplied); QImage::Format_ARGB32_Premultiplied);
_cacheForPattern.setDevicePixelRatio(ratio); _cacheForPattern.setDevicePixelRatio(ratio);
_shadowBuffer = QImage( _shadowBuffer = QImage(
@ -529,13 +531,13 @@ void Manager::paintButton(
p.setOpacity(opacity); p.setOpacity(opacity);
} }
if (patterned) { if (patterned) {
p.drawImage( const auto source = validateShadow(frameIndex, scale, shadow);
position, paintLongImage(p, geometry, _cacheParts, source);
_cacheParts,
validateShadow(frameIndex, scale, shadow));
validateCacheForPattern(frameIndex, scale, geometry, context); validateCacheForPattern(frameIndex, scale, geometry, context);
p.drawImage(geometry, _cacheForPattern); p.drawImage(
geometry,
_cacheForPattern,
QRect(QPoint(), geometry.size() * style::DevicePixelRatio()));
} else { } else {
const auto &stm = context.st->messageStyle(outbg, false); const auto &stm = context.st->messageStyle(outbg, false);
const auto background = stm.msgBg->c; const auto background = stm.msgBg->c;
@ -545,11 +547,7 @@ void Manager::paintButton(
scale, scale,
stm.msgBg->c, stm.msgBg->c,
shadow); shadow);
if (size.height() > _outer.height()) { paintLongImage(p, geometry, _cacheInOut, source);
paintLongImage(p, geometry, _cacheInOut, source);
} else {
p.drawImage(position, _cacheInOut, source);
}
} }
const auto mainEmojiPosition = position + (button->expandUp() const auto mainEmojiPosition = position + (button->expandUp()
@ -572,10 +570,14 @@ void Manager::paintButton(
} }
void Manager::paintLongImage( void Manager::paintLongImage(
Painter &p, QPainter &p,
QRect geometry, QRect geometry,
const QImage &image, const QImage &image,
QRect source) { QRect source) {
if (geometry.height() == _outer.height()) {
p.drawImage(geometry.topLeft(), image, source);
return;
}
const auto factor = style::DevicePixelRatio(); const auto factor = style::DevicePixelRatio();
const auto part = (source.height() / factor) / 2 - 1; const auto part = (source.height() / factor) / 2 - 1;
const auto fill = geometry.height() - 2 * part; const auto fill = geometry.height() - 2 * part;
@ -583,13 +585,13 @@ void Manager::paintLongImage(
const auto top = source.height() - half; const auto top = source.height() - half;
p.drawImage( p.drawImage(
geometry.topLeft(), geometry.topLeft(),
_cacheInOut, image,
QRect(source.x(), source.y(), source.width(), half)); QRect(source.x(), source.y(), source.width(), half));
p.drawImage( p.drawImage(
QRect( QRect(
geometry.topLeft() + QPoint(0, part), geometry.topLeft() + QPoint(0, part),
QSize(source.width() / factor, fill)), QSize(source.width() / factor, fill)),
_cacheInOut, image,
QRect( QRect(
source.x(), source.x(),
source.y() + half, source.y() + half,
@ -597,7 +599,7 @@ void Manager::paintLongImage(
top - half)); top - half));
p.drawImage( p.drawImage(
geometry.topLeft() + QPoint(0, part + fill), geometry.topLeft() + QPoint(0, part + fill),
_cacheInOut, image,
QRect(source.x(), source.y() + top, source.width(), half)); QRect(source.x(), source.y() + top, source.width(), half));
} }
@ -640,17 +642,18 @@ void Manager::validateCacheForPattern(
float64 scale, float64 scale,
const QRect &geometry, const QRect &geometry,
const PaintContext &context) { const PaintContext &context) {
CopyImagePart(
_cacheForPattern,
_cacheParts,
validateMask(frameIndex, scale));
auto q = QPainter(&_cacheForPattern); auto q = QPainter(&_cacheForPattern);
q.setCompositionMode(QPainter::CompositionMode_Source);
const auto source = validateMask(frameIndex, scale);
paintLongImage(q, QRect(QPoint(), geometry.size()), _cacheParts, source);
q.setCompositionMode(QPainter::CompositionMode_SourceIn); q.setCompositionMode(QPainter::CompositionMode_SourceIn);
Ui::PaintPatternBubblePart( Ui::PaintPatternBubblePart(
q, q,
context.viewport.translated(-geometry.topLeft()), context.viewport.translated(-geometry.topLeft()),
context.bubblesPattern->pixmap, context.bubblesPattern->pixmap,
QRect(QPoint(), _outer)); QRect(QPoint(), geometry.size()));
} }
void Manager::applyPatternedShadow(const QColor &shadow) { void Manager::applyPatternedShadow(const QColor &shadow) {

View file

@ -157,7 +157,7 @@ private:
float64 scale, float64 scale,
QPoint mainEmojiPosition); QPoint mainEmojiPosition);
void paintLongImage( void paintLongImage(
Painter &p, QPainter &p,
QRect geometry, QRect geometry,
const QImage &image, const QImage &image,
QRect source); QRect source);

View file

@ -150,6 +150,7 @@ constexpr auto kMinAcceptableContrast = 1.14;// 4.5;
[[nodiscard]] QImage PrepareBubblesBackground( [[nodiscard]] QImage PrepareBubblesBackground(
const ChatThemeBubblesData &data) { const ChatThemeBubblesData &data) {
return QImage(":/gui/art/themeimage.jpg"); AssertIsDebug();
if (data.colors.size() < 2) { if (data.colors.size() < 2) {
return QImage(); return QImage();
} }