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
 |