xref: /haiku/src/libs/icon/style/Style.h (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2006-2007, 2023, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  *		Zardshard
8  */
9 #ifndef STYLE_H
10 #define STYLE_H
11 
12 
13 #ifdef ICON_O_MATIC
14 #	include "IconObject.h"
15 #	include "Observer.h"
16 #endif
17 
18 #include "IconBuild.h"
19 #include "IconRenderer.h"
20 	// TODO: put GammaTable into its own file
21 
22 #include <GraphicsDefs.h>
23 
24 #include <agg_color_rgba.h>
25 
26 
27 class BMessage;
28 
29 
30 _BEGIN_ICON_NAMESPACE
31 
32 
33 class Gradient;
34 class Shape;
35 
36 // TODO: This class can represent solid colors, gradients, and bitmaps. It
37 // should probably be split into subclasses.
38 #ifdef ICON_O_MATIC
39 class Style : public IconObject,
40 			  public Observer {
41 #else
42 class Style {
43 #endif
44  public:
45 								Style();
46 								Style(const Style& other);
47 								Style(const rgb_color& color);
48 #ifdef ICON_O_MATIC
49 								Style(BBitmap* image);
50 									// transfers ownership of the image
51 #endif
52 								Style(BMessage* archive);
53 
54 	virtual						~Style();
55 
56 #ifdef ICON_O_MATIC
57 	// Observer interface
58 	virtual	void				ObjectChanged(const Observable* object);
59 
60 	// Style
61 			status_t			Archive(BMessage* into,
62 										bool deep = true) const;
63 
64 			bool				operator==(const Style& other) const;
65 #else
66 	inline	void				Notify() {}
67 #endif // ICON_O_MATIC
68 
69 			bool				HasTransparency() const;
70 
71 			void				SetColor(const rgb_color& color);
72 	inline	rgb_color			Color() const
73 									{ return fColor; }
74 
75 			void				SetGradient(const _ICON_NAMESPACE Gradient*
76 											gradient);
77 			_ICON_NAMESPACE Gradient* Gradient() const
78 									{ return fGradient; }
79 
80 #ifdef ICON_O_MATIC
81 			void				SetBitmap(BBitmap* image);
82 									// transfers ownership of the image
83 			BBitmap*			Bitmap() const
84 									{ return fImage; }
85 
86 		// alpha only applies to bitmaps
87 			void				SetAlpha(uint8 alpha)
88 									{ fAlpha = alpha; Notify(); }
89 			uint8				Alpha() const
90 									{ return fAlpha; }
91 #endif // ICON_O_MATIC
92 
93 			const agg::rgba8*	Colors() const
94 									{ return fColors; }
95 
96 			const agg::rgba8*	GammaCorrectedColors(
97 									const GammaTable& table) const;
98 
99  private:
100 			rgb_color			fColor;
101 
102 			_ICON_NAMESPACE Gradient* fGradient;
103 
104 			// hold gradient color array
105 			agg::rgba8*			fColors;
106 
107 #ifdef ICON_O_MATIC
108 			BBitmap*			fImage;
109 			uint8				fAlpha;
110 #endif
111 
112 			// for caching gamma corrected gradient color array
113 	mutable	agg::rgba8*			fGammaCorrectedColors;
114 	mutable	bool				fGammaCorrectedColorsValid;
115 };
116 
117 
118 _END_ICON_NAMESPACE
119 
120 
121 _USING_ICON_NAMESPACE
122 
123 
124 #endif	// STYLE_H
125