xref: /haiku/headers/os/interface/Gradient.h (revision 922e7ba1f3228e6f28db69b0ded8f86eb32dea17)
1 /*
2  * Copyright 2006-2009, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _GRADIENT_H
6 #define _GRADIENT_H
7 
8 
9 #include <Archivable.h>
10 #include <GraphicsDefs.h>
11 #include <List.h>
12 
13 
14 class BMessage;
15 class BRect;
16 
17 
18 // WARNING! This is experimental API and may change! Be prepared to
19 // recompile your software in a next version of haiku. In particular,
20 // the offsets are currently specified on [0..255], but may be changed
21 // to the interval [0..1]. This class also does not have any FBC padding,
22 // So your software will definitely break when this class gets new
23 // virtuals. And the object size may change too...
24 
25 
26 class BGradient : public BArchivable {
27 public:
28 	enum Type {
29 		TYPE_LINEAR = 0,
30 		TYPE_RADIAL,
31 		TYPE_RADIAL_FOCUS,
32 		TYPE_DIAMOND,
33 		TYPE_CONIC,
34 		TYPE_NONE
35 	};
36 
37 	struct ColorStop {
38 		ColorStop(const rgb_color c, float o);
39 		ColorStop(uint8 r, uint8 g, uint8 b, uint8 a, float o);
40 		ColorStop(const ColorStop& other);
41 		ColorStop();
42 
43 		bool operator!=(const ColorStop& other) const;
44 
45 		rgb_color		color;
46 		float			offset;
47 	};
48 
49 public:
50 								BGradient();
51 								BGradient(BMessage* archive);
52 	virtual						~BGradient();
53 
54 			status_t			Archive(BMessage* into,
55 									bool deep = true) const;
56 
57 			BGradient&			operator=(const BGradient& other);
58 
59 			bool				operator==(const BGradient& other) const;
60 			bool				operator!=(const BGradient& other) const;
61 			bool				ColorStopsAreEqual(
62 									const BGradient& other) const;
63 
64 			void				SetColorStops(const BGradient& other);
65 
66 			int32				AddColor(const rgb_color& color,
67 									float offset);
68 			bool				AddColorStop(const ColorStop& colorStop,
69 									int32 index);
70 
71 			bool				RemoveColor(int32 index);
72 
73 			bool				SetColorStop(int32 index,
74 									const ColorStop& colorStop);
75 			bool				SetColor(int32 index, const rgb_color& color);
76 			bool				SetOffset(int32 index, float offset);
77 
78 			int32				CountColorStops() const;
79 			ColorStop*			ColorStopAt(int32 index) const;
80 			ColorStop*			ColorStopAtFast(int32 index) const;
81 			ColorStop*			ColorStops() const;
82 			void				SortColorStopsByOffset();
83 
84 			Type				GetType() const
85 									{ return fType; }
86 
87 			void				MakeEmpty();
88 
89 private:
90 	friend class BGradientLinear;
91 	friend class BGradientRadial;
92 	friend class BGradientRadialFocus;
93 	friend class BGradientDiamond;
94 	friend class BGradientConic;
95 
96 			union {
97 				struct {
98 					float x1, y1, x2, y2;
99 				} linear;
100 				struct {
101 					float cx, cy, radius;
102 				} radial;
103 				struct {
104 					float cx, cy, fx, fy, radius;
105 				} radial_focus;
106 				struct {
107 					float cx, cy;
108 				} diamond;
109 				struct {
110 					float cx, cy, angle;
111 				} conic;
112 			} fData;
113 
114 			BList				fColorStops;
115 			Type				fType;
116 };
117 
118 #endif // _GRADIENT_H
119