1#include <stdio.h>
2#include <string.h>
3
4#include <Application.h>
5#include <Message.h>
6#include <Shape.h>
7#include <View.h>
8#include <Window.h>
9
10
11static const char* kAppSignature = "application/x.vnd-Haiku.ShapeTest";
12
13
14class TestView : public BView {
15public:
16								TestView(BRect frame, const char* name,
17									uint32 resizeFlags, uint32 flags);
18
19	virtual	void				Draw(BRect updateRect);
20};
21
22
23TestView::TestView(BRect frame, const char* name, uint32 resizeFlags,
24		uint32 flags)
25	:
26	BView(frame, name, resizeFlags, flags)
27{
28}
29
30
31void
32TestView::Draw(BRect updateRect)
33{
34	BRect r(Bounds());
35
36	SetDrawingMode(B_OP_ALPHA);
37	SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
38	SetHighColor(0, 0, 0, 240);
39
40	class TranslateIterator : public BShapeIterator {
41	public:
42		TranslateIterator()
43			:
44			fOffsetX(0),
45			fOffsetY(0)
46		{
47		}
48
49		TranslateIterator(float offsetX, float offsetY)
50			:
51			fOffsetX(offsetX),
52			fOffsetY(offsetY)
53		{
54		}
55
56		void SetOffset(float offsetX, float offsetY)
57		{
58			fOffsetX = offsetX;
59			fOffsetY = offsetY;
60		}
61
62		virtual status_t IterateMoveTo(BPoint* point)
63		{
64			point->x += fOffsetX;
65			point->y += fOffsetY;
66			return B_OK;
67		}
68
69		virtual status_t IterateLineTo(int32 lineCount, BPoint* linePts)
70		{
71			while (lineCount--) {
72				linePts->x += fOffsetX;
73				linePts->y += fOffsetY;
74				linePts++;
75			}
76			return B_OK;
77		}
78
79		virtual status_t IterateBezierTo(int32 bezierCount, BPoint* bezierPts)
80		{
81			while (bezierCount--) {
82				bezierPts[0].x += fOffsetX;
83				bezierPts[0].y += fOffsetY;
84				bezierPts[1].x += fOffsetX;
85				bezierPts[1].y += fOffsetY;
86				bezierPts[2].x += fOffsetX;
87				bezierPts[2].y += fOffsetY;
88				bezierPts += 3;
89			}
90			return B_OK;
91		}
92
93		virtual status_t IterateArcTo(float& rx, float& ry, float& angle,
94			bool largeArc, bool counterClockWise, BPoint& point)
95		{
96			point.x += fOffsetX;
97			point.y += fOffsetY;
98			return B_OK;
99		}
100
101	private:
102		float fOffsetX;
103		float fOffsetY;
104	} translator;
105
106	MovePenTo(B_ORIGIN);
107
108	const float arcRX = 50;
109	const float arcRY = 80;
110
111	BShape shape;
112	shape.MoveTo(BPoint(20, 10));
113	shape.LineTo(BPoint(10, 90));
114	shape.LineTo(BPoint(90, 100));
115	shape.ArcTo(arcRX, arcRY, 45, true, true, BPoint(100, 20));
116	shape.Close();
117
118	StrokeShape(&shape);
119
120	shape.Clear();
121	shape.MoveTo(BPoint(20, 10));
122	shape.LineTo(BPoint(10, 90));
123	shape.LineTo(BPoint(90, 100));
124	shape.ArcTo(arcRX, arcRY, 45, false, true, BPoint(100, 20));
125	shape.Close();
126
127	translator.SetOffset(10, 10);
128	translator.Iterate(&shape);
129
130	SetHighColor(140, 30, 50, 255);
131	StrokeShape(&shape);
132
133	shape.Clear();
134	shape.MoveTo(BPoint(20, 10));
135	shape.LineTo(BPoint(10, 90));
136	shape.LineTo(BPoint(90, 100));
137	shape.ArcTo(arcRX, arcRY, 45, true, false, BPoint(100, 20));
138	shape.Close();
139
140	translator.SetOffset(20, 20);
141	translator.Iterate(&shape);
142
143	SetHighColor(140, 130, 50, 255);
144	StrokeShape(&shape);
145
146	shape.Clear();
147	shape.MoveTo(BPoint(20, 10));
148	shape.LineTo(BPoint(10, 90));
149	shape.LineTo(BPoint(90, 100));
150	shape.ArcTo(arcRX, arcRY, 45, false, false, BPoint(100, 20));
151	shape.Close();
152
153	translator.SetOffset(30, 30);
154	translator.Iterate(&shape);
155
156	SetHighColor(40, 130, 150, 255);
157	StrokeShape(&shape);
158}
159
160
161// #pragma mark -
162
163
164int
165main(int argc, char** argv)
166{
167	BApplication app(kAppSignature);
168
169	BWindow* window = new BWindow(BRect(50.0, 50.0, 300.0, 250.0),
170		"BShape Test", B_TITLED_WINDOW,
171		B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE);
172
173	BView* view = new TestView(window->Bounds(), "test", B_FOLLOW_ALL,
174		B_WILL_DRAW);
175	window->AddChild(view);
176
177	window->Show();
178
179	app.Run();
180	return 0;
181}
182