1/*
2 * Copyright 2005, Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Simple BShape to agg::path_storage converter, implemented as BShapeIterator.
6 *
7 */
8
9
10#include "ShapeConverter.h"
11
12// constructor
13ShapeConverter::ShapeConverter()
14	: BShapeIterator(),
15	  Transformable(),
16	  fPath(NULL)
17{
18}
19
20// constructor
21ShapeConverter::ShapeConverter(agg::path_storage* path)
22	: BShapeIterator(),
23	  Transformable(),
24	  fPath(path)
25{
26}
27
28// SetPath
29void
30ShapeConverter::SetPath(agg::path_storage* path)
31{
32	fPath = path;
33}
34
35// IterateMoveTo
36status_t
37ShapeConverter::IterateMoveTo(BPoint* point)
38{
39	double x = point->x;
40	double y = point->y;
41	Transform(&x, &y);
42
43	fPath->move_to(x, y);
44
45	return B_OK;
46}
47
48// IterateLineTo
49status_t
50ShapeConverter::IterateLineTo(int32 lineCount, BPoint* linePts)
51{
52	while (lineCount--) {
53
54		double x = linePts->x;
55		double y = linePts->y;
56		Transform(&x, &y);
57
58		fPath->line_to(x, y);
59
60		linePts++;
61	}
62	return B_OK;
63}
64
65// IterateBezierTo
66status_t
67ShapeConverter::IterateBezierTo(int32 bezierCount, BPoint* bezierPts)
68{
69	bezierCount /= 3;
70	while (bezierCount--) {
71
72		double x1 = bezierPts[0].x;
73		double y1 = bezierPts[0].y;
74
75		double x2 = bezierPts[1].x;
76		double y2 = bezierPts[1].y;
77
78		double x3 = bezierPts[2].x;
79		double y3 = bezierPts[2].y;
80
81		Transform(&x1, &y1);
82		Transform(&x2, &y2);
83		Transform(&x3, &y3);
84
85		fPath->curve4(x1, y1, x2, y2, x3, y3);
86
87		bezierPts += 3;
88	}
89	return B_OK;
90}
91
92// IterateClose
93status_t
94ShapeConverter::IterateClose()
95{
96	fPath->close_polygon();
97	return B_OK;
98}
99