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,
not_null<Data::DocumentMedia*> media,
QRect target,
QLinearGradient *gradient) {
QLinearGradient *gradient,
bool mirrorHorizontal) {
const auto &path = media->thumbnailPath();
const auto dimensions = media->owner()->dimensions;
if (path.isEmpty() || dimensions.isEmpty() || target.isEmpty()) {
@ -254,6 +255,12 @@ bool PaintStickerThumbnailPath(
0);
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(
target.width() / float64(dimensions.width()),
target.height() / float64(dimensions.height()));
@ -266,14 +273,25 @@ bool PaintStickerThumbnailPath(
QPainter &p,
not_null<Data::DocumentMedia*> media,
QRect target,
not_null<Ui::PathShiftGradient*> gradient) {
not_null<Ui::PathShiftGradient*> gradient,
bool mirrorHorizontal) {
return gradient->paint([&](const Ui::PathShiftGradient::Background &bg) {
if (const auto color = std::get_if<style::color>(&bg)) {
p.setBrush(*color);
return PaintStickerThumbnailPath(p, media, target);
return PaintStickerThumbnailPath(
p,
media,
target,
nullptr,
mirrorHorizontal);
}
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,
not_null<Data::DocumentMedia*> media,
QRect target,
QLinearGradient *gradient = nullptr);
QLinearGradient *gradient = nullptr,
bool mirrorHorizontal = false);
bool PaintStickerThumbnailPath(
QPainter &p,
not_null<Data::DocumentMedia*> media,
QRect target,
not_null<Ui::PathShiftGradient*> gradient);
not_null<Ui::PathShiftGradient*> gradient,
bool mirrorHorizontal = false);
[[nodiscard]] QSize ComputeStickerSize(
not_null<DocumentData*> document,

View file

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

View file

@ -83,6 +83,7 @@ private:
bool paintPixmap(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]] bool mirrorHorizontal() const;
void ensureDataMediaCreated() const;
void dataMediaCreated() const;