1262fc999SStefano Ceccherini#include <Application.h>
2262fc999SStefano Ceccherini#include <Box.h>
315fd71bfSAxel Dörfler#include <Entry.h>
415fd71bfSAxel Dörfler#include <FindDirectory.h>
515fd71bfSAxel Dörfler#include <Path.h>
6262fc999SStefano Ceccherini#include <Picture.h>
7262fc999SStefano Ceccherini#include <Shape.h>
8262fc999SStefano Ceccherini#include <View.h>
9262fc999SStefano Ceccherini#include <Window.h>
10262fc999SStefano Ceccherini
1115fd71bfSAxel Dörfler
12c087e0e3SStefano Ceccherini#include "SVGViewView.h"
13c087e0e3SStefano Ceccherini
1415fd71bfSAxel Dörfler
15f10faf61SStephan Aßmusclass Svg2PictureWindow : public BWindow {
16f10faf61SStephan Aßmuspublic:
17f10faf61SStephan Aßmus	Svg2PictureWindow(BRect frame, const char *filename)
18f10faf61SStephan Aßmus		:   BWindow(frame, "Svg2Picture", B_TITLED_WINDOW, 0) {
19f10faf61SStephan Aßmus
20f10faf61SStephan Aßmus        	BView *view = new Svg2PictureView(Bounds(), filename);
21f10faf61SStephan Aßmus        	AddChild(view);
22f10faf61SStephan Aßmus	}
23c087e0e3SStefano Ceccherini};
24262fc999SStefano Ceccherini
2515fd71bfSAxel Dörfler
26262fc999SStefano Ceccheriniclass OriginalView : public BBox {
27262fc999SStefano Ceccherinipublic:
28262fc999SStefano Ceccherini	OriginalView(BRect frame);
29262fc999SStefano Ceccherini	virtual void Draw(BRect update);
30262fc999SStefano Ceccherini};
31262fc999SStefano Ceccherini
32262fc999SStefano Ceccherini
33262fc999SStefano Ceccheriniclass PictureView : public BBox {
34262fc999SStefano Ceccherinipublic:
35262fc999SStefano Ceccherini	PictureView(BRect frame);
36262fc999SStefano Ceccherini	~PictureView();
37262fc999SStefano Ceccherini
38262fc999SStefano Ceccherini	virtual void Draw(BRect update);
39262fc999SStefano Ceccherini	virtual void AllAttached();
40262fc999SStefano Ceccherini
41262fc999SStefano Ceccheriniprivate:
42262fc999SStefano Ceccherini	BPicture *fPicture;
43262fc999SStefano Ceccherini};
44262fc999SStefano Ceccherini
45262fc999SStefano Ceccherini
46262fc999SStefano Ceccherinistatic void
47262fc999SStefano CeccheriniDrawStuff(BView *view)
48262fc999SStefano Ceccherini{
49262fc999SStefano Ceccherini	// StrokeShape
50262fc999SStefano Ceccherini	BShape shape;
51262fc999SStefano Ceccherini	BPoint bezier[3] = {BPoint(100,0), BPoint(100, 100), BPoint(25, 50)};
52262fc999SStefano Ceccherini	shape.MoveTo(BPoint(150,0));
53262fc999SStefano Ceccherini	shape.LineTo(BPoint(200,100));
54262fc999SStefano Ceccherini	shape.BezierTo(bezier);
55262fc999SStefano Ceccherini	shape.Close();
56262fc999SStefano Ceccherini	view->StrokeShape(&shape);
57262fc999SStefano Ceccherini
58262fc999SStefano Ceccherini	// Stroke/FillRect, Push/PopState, SetHighColor, SetLineMode, SetPenSize
59262fc999SStefano Ceccherini	view->PushState();
60262fc999SStefano Ceccherini	const rgb_color blue = { 0, 0, 240, 0 };
61262fc999SStefano Ceccherini	view->SetHighColor(blue);
62262fc999SStefano Ceccherini	view->SetLineMode(B_BUTT_CAP, B_BEVEL_JOIN);
63262fc999SStefano Ceccherini	view->SetPenSize(7);
64262fc999SStefano Ceccherini	view->StrokeRect(BRect(10, 220, 50, 260));
65262fc999SStefano Ceccherini	view->FillRect(BRect(65, 245, 120, 300));
66262fc999SStefano Ceccherini	view->PopState();
67262fc999SStefano Ceccherini
68262fc999SStefano Ceccherini	// Stroke/FillEllipse
69262fc999SStefano Ceccherini	view->StrokeEllipse(BPoint(50, 150), 50, 50);
70262fc999SStefano Ceccherini	view->FillEllipse(BPoint(100, 120), 50, 50);
71262fc999SStefano Ceccherini
72262fc999SStefano Ceccherini	// Stroke/FillArc
73262fc999SStefano Ceccherini	view->StrokeArc(BRect(0, 200, 50, 250), 180, 180);
74262fc999SStefano Ceccherini	view->FillArc(BPoint(150, 250), 50, 50, 0, 125);
75262fc999SStefano Ceccherini
76262fc999SStefano Ceccherini	// DrawString, SetHighColor, SetFontSize
77262fc999SStefano Ceccherini	const rgb_color red = { 240, 0, 0, 0 };
78262fc999SStefano Ceccherini	view->SetHighColor(red);
79262fc999SStefano Ceccherini	view->SetFontSize(20);
80f10faf61SStephan Aßmus	view->DrawString("BPicture ", BPoint(30, 20));
81f10faf61SStephan Aßmus	view->DrawString("test");
82f10faf61SStephan Aßmus
83f10faf61SStephan Aßmus	// DrawLine with pen position
84f10faf61SStephan Aßmus	const rgb_color purple = { 200, 0, 220, 0 };
85f10faf61SStephan Aßmus	view->SetHighColor(purple);
86f10faf61SStephan Aßmus	view->StrokeLine(BPoint(50, 30), BPoint(30, 50));
87f10faf61SStephan Aßmus	view->StrokeLine(BPoint(80, 50));
88f10faf61SStephan Aßmus	view->StrokeLine(BPoint(50, 30));
89262fc999SStefano Ceccherini}
90262fc999SStefano Ceccherini
91262fc999SStefano Ceccherini
92262fc999SStefano Ceccherini// OriginalView
93262fc999SStefano CeccheriniOriginalView::OriginalView(BRect frame)
94262fc999SStefano Ceccherini	:	BBox(frame, "original_view", B_FOLLOW_ALL_SIDES, B_WILL_DRAW)
95262fc999SStefano Ceccherini{
96262fc999SStefano Ceccherini}
97262fc999SStefano Ceccherini
98262fc999SStefano Ceccherini
99262fc999SStefano Ceccherinivoid
100262fc999SStefano CeccheriniOriginalView::Draw(BRect updateRect)
101262fc999SStefano Ceccherini{
102262fc999SStefano Ceccherini	DrawStuff(this);
103262fc999SStefano Ceccherini}
104262fc999SStefano Ceccherini
105262fc999SStefano Ceccherini
106262fc999SStefano Ceccherini// PictureView
107262fc999SStefano CeccheriniPictureView::PictureView(BRect frame)
108262fc999SStefano Ceccherini	:	BBox(frame, "pict_view", B_FOLLOW_ALL_SIDES, B_WILL_DRAW),
109262fc999SStefano Ceccherini		fPicture(NULL)
110262fc999SStefano Ceccherini{
111262fc999SStefano Ceccherini}
112262fc999SStefano Ceccherini
113262fc999SStefano CeccheriniPictureView::~PictureView()
114262fc999SStefano Ceccherini{
115262fc999SStefano Ceccherini	delete fPicture;
116262fc999SStefano Ceccherini}
117262fc999SStefano Ceccherini
118262fc999SStefano Ceccherinivoid
119262fc999SStefano CeccheriniPictureView::AllAttached()
1202d940ebcSStefano Ceccherini{
121262fc999SStefano Ceccherini	BeginPicture(new BPicture);
122262fc999SStefano Ceccherini
123262fc999SStefano Ceccherini	DrawStuff(this);
124262fc999SStefano Ceccherini
1252d940ebcSStefano Ceccherini	BPicture *picture = EndPicture();
126ccfc8a3dSStefano Ceccherini	if (picture == NULL)
127ccfc8a3dSStefano Ceccherini		return;
128ccfc8a3dSStefano Ceccherini
129ccfc8a3dSStefano Ceccherini	BMessage message;
130ccfc8a3dSStefano Ceccherini	picture->Archive(&message);
13196d7f22dSStefano Ceccherini	message.PrintToStream();
132ccfc8a3dSStefano Ceccherini
1332d940ebcSStefano Ceccherini	BMallocIO stream;
1342d940ebcSStefano Ceccherini
1352d940ebcSStefano Ceccherini	status_t status = picture->Flatten(&stream);
136ccfc8a3dSStefano Ceccherini	delete picture;
137ccfc8a3dSStefano Ceccherini
1382d940ebcSStefano Ceccherini	if (status != B_OK)
1392d940ebcSStefano Ceccherini		printf("Error flattening BPicture: %s\n", strerror(status));
140ccfc8a3dSStefano Ceccherini
1412d940ebcSStefano Ceccherini	if (status == B_OK) {
1423bf72bcbSStefano Ceccherini		stream.Seek(0, SEEK_SET);
1432d940ebcSStefano Ceccherini		fPicture = new BPicture();
1442d940ebcSStefano Ceccherini		status = fPicture->Unflatten(&stream);
14505525b50SStefano Ceccherini		if (status != B_OK) {
1462d940ebcSStefano Ceccherini			printf("Error unflattening BPicture: %s\n", strerror(status));
14705525b50SStefano Ceccherini			return;
14805525b50SStefano Ceccherini		}
1492d940ebcSStefano Ceccherini	}
1502d940ebcSStefano Ceccherini
151ccfc8a3dSStefano Ceccherini	BMessage message2;
152ece074abSStefano Ceccherini	fPicture->Archive(&message2);
15396d7f22dSStefano Ceccherini	message2.PrintToStream();
154262fc999SStefano Ceccherini}
155262fc999SStefano Ceccherini
15615fd71bfSAxel Dörfler
157262fc999SStefano Ceccherinivoid
158262fc999SStefano CeccheriniPictureView::Draw(BRect update)
159262fc999SStefano Ceccherini{
160262fc999SStefano Ceccherini	if (fPicture)
161262fc999SStefano Ceccherini		DrawPicture(fPicture, B_ORIGIN);
162262fc999SStefano Ceccherini}
163262fc999SStefano Ceccherini
164262fc999SStefano Ceccherini
16515fd71bfSAxel Dörfler// #pragma mark -
16615fd71bfSAxel Dörfler
16715fd71bfSAxel Dörfler
168262fc999SStefano Ceccheriniint
169262fc999SStefano Ceccherinimain()
170262fc999SStefano Ceccherini{
171262fc999SStefano Ceccherini	BApplication pictureApp("application/x-vnd.picture");
17215fd71bfSAxel Dörfler
173262fc999SStefano Ceccherini	BWindow *pictureWindow = new BWindow(BRect(100, 100, 500, 400),
17415fd71bfSAxel Dörfler		"BPicture test", B_TITLED_WINDOW,
17515fd71bfSAxel Dörfler		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_QUIT_ON_WINDOW_CLOSE);
17615fd71bfSAxel Dörfler
177262fc999SStefano Ceccherini	BRect rect(pictureWindow->Bounds());
178262fc999SStefano Ceccherini	rect.right -= (rect.Width() + 1) / 2;
179262fc999SStefano Ceccherini	OriginalView *testView = new OriginalView(rect);
180262fc999SStefano Ceccherini
181262fc999SStefano Ceccherini	rect.OffsetBy(rect.Width() + 1, 0);
182262fc999SStefano Ceccherini	PictureView *pictureView = new PictureView(rect);
183262fc999SStefano Ceccherini
184262fc999SStefano Ceccherini	pictureWindow->AddChild(testView);
185262fc999SStefano Ceccherini	pictureWindow->AddChild(pictureView);
186262fc999SStefano Ceccherini	pictureWindow->Show();
18715fd71bfSAxel Dörfler
18815fd71bfSAxel Dörfler	BPath path;
18915fd71bfSAxel Dörfler	if (find_directory(B_SYSTEM_DATA_DIRECTORY, &path) == B_OK) {
19015fd71bfSAxel Dörfler		path.Append("artwork/lion.svg");
19115fd71bfSAxel Dörfler		BEntry entry(path.Path());
19215fd71bfSAxel Dörfler		if (entry.Exists()) {
19315fd71bfSAxel Dörfler			BWindow *svgWindow = new Svg2PictureWindow(BRect(300, 300, 600, 600),
19415fd71bfSAxel Dörfler				path.Path());
19515fd71bfSAxel Dörfler			svgWindow->Show();
19615fd71bfSAxel Dörfler		}
19715fd71bfSAxel Dörfler	}
198c087e0e3SStefano Ceccherini
199262fc999SStefano Ceccherini	pictureApp.Run();
200262fc999SStefano Ceccherini	return 0;
201262fc999SStefano Ceccherini}
202262fc999SStefano Ceccherini
203