mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-07 23:53:58 +02:00
Mirror premium sticker thumbnail / path.
This commit is contained in:
parent
935fb79c52
commit
2ece565aac
4 changed files with 57 additions and 20 deletions
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue