92 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // This file is part of Desktop App Toolkit,
 | |
| // a set of libraries for developing nice desktop applications.
 | |
| //
 | |
| // For license and copyright information please follow this link:
 | |
| // https://github.com/desktop-app/legal/blob/master/LEGAL
 | |
| //
 | |
| #pragma once
 | |
| 
 | |
| namespace Ui {
 | |
| 
 | |
| struct ImageSubrect {
 | |
| 	not_null<QImage*> image;
 | |
| 	QRect rect;
 | |
| };
 | |
| 
 | |
| class RoundAreaWithShadow final {
 | |
| public:
 | |
| 	static constexpr auto kFramesCount = 32;
 | |
| 
 | |
| 	[[nodiscard]] static QImage PrepareImage(QSize size);
 | |
| 	[[nodiscard]] static QImage PrepareFramesCache(
 | |
| 		QSize frame,
 | |
| 		int columns = 1);
 | |
| 	[[nodiscard]] static QRect FrameCacheRect(
 | |
| 		int frameIndex,
 | |
| 		int column,
 | |
| 		QSize frame);
 | |
| 
 | |
| 	// Returns center area which could be just filled with a solid color.
 | |
| 	static QRect FillWithImage(
 | |
| 		QPainter &p,
 | |
| 		QRect geometry,
 | |
| 		const ImageSubrect &pattern);
 | |
| 
 | |
| 	RoundAreaWithShadow(QSize inner, QMargins shadow, int twiceRadiusMax);
 | |
| 
 | |
| 	void setBackgroundColor(const QColor &background);
 | |
| 	void setShadowColor(const QColor &shadow);
 | |
| 
 | |
| 	[[nodiscard]] ImageSubrect validateFrame(
 | |
| 		int frameIndex,
 | |
| 		float64 scale,
 | |
| 		float64 radius);
 | |
| 	[[nodiscard]] ImageSubrect validateOverlayMask(
 | |
| 		int frameIndex,
 | |
| 		QSize innerSize,
 | |
| 		float64 radius,
 | |
| 		int twiceRadius,
 | |
| 		float64 scale);
 | |
| 	[[nodiscard]] ImageSubrect validateOverlayShadow(
 | |
| 		int frameIndex,
 | |
| 		QSize innerSize,
 | |
| 		float64 radius,
 | |
| 		int twiceRadius,
 | |
| 		float64 scale,
 | |
| 		const ImageSubrect &mask);
 | |
| 
 | |
| 	void overlayExpandedBorder(
 | |
| 		QPainter &p,
 | |
| 		QSize size,
 | |
| 		float64 expandRatio,
 | |
| 		float64 radiusFrom,
 | |
| 		float64 radiusTill,
 | |
| 		float64 scale);
 | |
| 
 | |
| private:
 | |
| 	[[nodiscard]] QRect validateShadow(
 | |
| 		int frameIndex,
 | |
| 		float64 scale,
 | |
| 		float64 radius);
 | |
| 
 | |
| 	QRect _inner;
 | |
| 	QSize _outer;
 | |
| 	QSize _overlay;
 | |
| 
 | |
| 	std::array<bool, kFramesCount> _validBg = { { false } };
 | |
| 	std::array<bool, kFramesCount> _validShadow = { { false } };
 | |
| 	std::array<bool, kFramesCount> _validOverlayMask = { { false } };
 | |
| 	std::array<bool, kFramesCount> _validOverlayShadow = { { false } };
 | |
| 	QColor _background;
 | |
| 	QColor _gradient;
 | |
| 	QColor _shadow;
 | |
| 	QImage _cacheBg;
 | |
| 	QImage _shadowParts;
 | |
| 	QImage _overlayCacheParts;
 | |
| 	QImage _overlayMaskScaled;
 | |
| 	QImage _overlayShadowScaled;
 | |
| 	QImage _shadowBuffer;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Ui
 | 
