Mirror premium sticker thumbnail / path.

This commit is contained in:
John Preston 2022-04-25 10:31:34 +04:00
parent 935fb79c52
commit 2ece565aac
4 changed files with 57 additions and 20 deletions

View file

@ -235,7 +235,8 @@ bool PaintStickerThumbnailPath(
QPainter &p, QPainter &p,
not_null<Data::DocumentMedia*> media, not_null<Data::DocumentMedia*> media,
QRect target, QRect target,
QLinearGradient *gradient) { QLinearGradient *gradient,
bool mirrorHorizontal) {
const auto &path = media->thumbnailPath(); const auto &path = media->thumbnailPath();
const auto dimensions = media->owner()->dimensions; const auto dimensions = media->owner()->dimensions;
if (path.isEmpty() || dimensions.isEmpty() || target.isEmpty()) { if (path.isEmpty() || dimensions.isEmpty() || target.isEmpty()) {
@ -254,6 +255,12 @@ bool PaintStickerThumbnailPath(
0); 0);
p.setBrush(*gradient); p.setBrush(*gradient);
} }
if (mirrorHorizontal) {
const auto c = QPointF(target.width() / 2., target.height() / 2.);
p.translate(c);
p.scale(-1., 1.);
p.translate(-c);
}
p.scale( p.scale(
target.width() / float64(dimensions.width()), target.width() / float64(dimensions.width()),
target.height() / float64(dimensions.height())); target.height() / float64(dimensions.height()));
@ -266,14 +273,25 @@ bool PaintStickerThumbnailPath(
QPainter &p, QPainter &p,
not_null<Data::DocumentMedia*> media, not_null<Data::DocumentMedia*> media,
QRect target, QRect target,
not_null<Ui::PathShiftGradient*> gradient) { not_null<Ui::PathShiftGradient*> gradient,
bool mirrorHorizontal) {
return gradient->paint([&](const Ui::PathShiftGradient::Background &bg) { return gradient->paint([&](const Ui::PathShiftGradient::Background &bg) {
if (const auto color = std::get_if<style::color>(&bg)) { if (const auto color = std::get_if<style::color>(&bg)) {
p.setBrush(*color); p.setBrush(*color);
return PaintStickerThumbnailPath(p, media, target); return PaintStickerThumbnailPath(
p,
media,
target,
nullptr,
mirrorHorizontal);
} }
const auto gradient = v::get<QLinearGradient*>(bg); const auto gradient = v::get<QLinearGradient*>(bg);
return PaintStickerThumbnailPath(p, media, target, gradient); return PaintStickerThumbnailPath(
p,
media,
target,
gradient,
mirrorHorizontal);
}); });
} }

View file

@ -105,13 +105,15 @@ bool PaintStickerThumbnailPath(
QPainter &p, QPainter &p,
not_null<Data::DocumentMedia*> media, not_null<Data::DocumentMedia*> media,
QRect target, QRect target,
QLinearGradient *gradient = nullptr); QLinearGradient *gradient = nullptr,
bool mirrorHorizontal = false);
bool PaintStickerThumbnailPath( bool PaintStickerThumbnailPath(
QPainter &p, QPainter &p,
not_null<Data::DocumentMedia*> media, not_null<Data::DocumentMedia*> media,
QRect target, QRect target,
not_null<Ui::PathShiftGradient*> gradient); not_null<Ui::PathShiftGradient*> gradient,
bool mirrorHorizontal = false);
[[nodiscard]] QSize ComputeStickerSize( [[nodiscard]] QSize ComputeStickerSize(
not_null<DocumentData*> document, not_null<DocumentData*> document,

View file

@ -180,14 +180,7 @@ void Sticker::paintLottie(
if (context.selected() && !_nextLastDiceFrame) { if (context.selected() && !_nextLastDiceFrame) {
request.colored = context.st->msgStickerOverlay()->c; request.colored = context.st->msgStickerOverlay()->c;
} }
const auto premium = _data->isPremiumSticker(); request.mirrorHorizontal = mirrorHorizontal();
if (premium) {
const auto rightAligned = _parent->hasOutLayout()
&& !_parent->delegate()->elementIsChatWide();
if (!rightAligned) {
request.mirrorHorizontal = true;
}
}
const auto frame = _lottie const auto frame = _lottie
? _lottie->frameInfo(request) ? _lottie->frameInfo(request)
: Lottie::Animation::FrameInfo(); : Lottie::Animation::FrameInfo();
@ -249,11 +242,24 @@ bool Sticker::paintPixmap(
if (pixmap.isNull()) { if (pixmap.isNull()) {
return false; return false;
} }
p.drawPixmap( const auto position = QPoint(
QPoint( r.x() + (r.width() - _size.width()) / 2,
r.x() + (r.width() - _size.width()) / 2, r.y() + (r.height() - _size.height()) / 2);
r.y() + (r.height() - _size.height()) / 2), const auto size = pixmap.size() / pixmap.devicePixelRatio();
pixmap); const auto mirror = mirrorHorizontal();
if (mirror) {
p.save();
const auto middle = QPointF(
position.x() + size.width() / 2.,
position.y() + size.height() / 2.);
p.translate(middle);
p.scale(-1., 1.);
p.translate(-middle);
}
p.drawPixmap(position, pixmap);
if (mirror) {
p.restore();
}
return true; return true;
} }
@ -274,7 +280,8 @@ void Sticker::paintPath(
p, p,
_dataMedia.get(), _dataMedia.get(),
r, r,
pathGradient); pathGradient,
mirrorHorizontal());
} }
QPixmap Sticker::paintedPixmap(const PaintContext &context) const { QPixmap Sticker::paintedPixmap(const PaintContext &context) const {
@ -301,6 +308,15 @@ QPixmap Sticker::paintedPixmap(const PaintContext &context) const {
return QPixmap(); return QPixmap();
} }
bool Sticker::mirrorHorizontal() const {
if (!_data->isPremiumSticker()) {
return false;
}
const auto rightAligned = _parent->hasOutLayout()
&& !_parent->delegate()->elementIsChatWide();
return !rightAligned;
}
ClickHandlerPtr Sticker::ShowSetHandler(not_null<DocumentData*> document) { ClickHandlerPtr Sticker::ShowSetHandler(not_null<DocumentData*> document) {
return std::make_shared<LambdaClickHandler>([=](ClickContext context) { return std::make_shared<LambdaClickHandler>([=](ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>(); const auto my = context.other.value<ClickHandlerContext>();

View file

@ -83,6 +83,7 @@ private:
bool paintPixmap(Painter &p, const PaintContext &context, const QRect &r); bool paintPixmap(Painter &p, const PaintContext &context, const QRect &r);
void paintPath(Painter &p, const PaintContext &context, const QRect &r); void paintPath(Painter &p, const PaintContext &context, const QRect &r);
[[nodiscard]] QPixmap paintedPixmap(const PaintContext &context) const; [[nodiscard]] QPixmap paintedPixmap(const PaintContext &context) const;
[[nodiscard]] bool mirrorHorizontal() const;
void ensureDataMediaCreated() const; void ensureDataMediaCreated() const;
void dataMediaCreated() const; void dataMediaCreated() const;