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,
 | 
			
		||||
		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);
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
	const auto position = QPoint(
 | 
			
		||||
		r.x() + (r.width() - _size.width()) / 2,
 | 
			
		||||
			r.y() + (r.height() - _size.height()) / 2),
 | 
			
		||||
		pixmap);
 | 
			
		||||
		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>();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue