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
ShapeConverter()13 ShapeConverter::ShapeConverter()
14 : BShapeIterator(),
15 Transformable(),
16 fPath(NULL)
17 {
18 }
19
20 // constructor
ShapeConverter(agg::path_storage * path)21 ShapeConverter::ShapeConverter(agg::path_storage* path)
22 : BShapeIterator(),
23 Transformable(),
24 fPath(path)
25 {
26 }
27
28 // SetPath
29 void
SetPath(agg::path_storage * path)30 ShapeConverter::SetPath(agg::path_storage* path)
31 {
32 fPath = path;
33 }
34
35 // IterateMoveTo
36 status_t
IterateMoveTo(BPoint * point)37 ShapeConverter::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
49 status_t
IterateLineTo(int32 lineCount,BPoint * linePts)50 ShapeConverter::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
66 status_t
IterateBezierTo(int32 bezierCount,BPoint * bezierPts)67 ShapeConverter::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
93 status_t
IterateClose()94 ShapeConverter::IterateClose()
95 {
96 fPath->close_polygon();
97 return B_OK;
98 }
99