-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSVGDataCreator.cpp
115 lines (96 loc) · 2.51 KB
/
SVGDataCreator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "SVGDataCreator.h"
#include <stdio.h>
BSVGDataCreator::BSVGDataCreator(BString &target)
: BShapeIterator(),
fTarget(target),
fLast(NULL)
{
}
BSVGDataCreator::~BSVGDataCreator()
{
}
status_t
BSVGDataCreator::IterateMoveTo(BPoint *point)
{
fTarget << " M" << point->x << " " << point->y;
fLast = point;
return B_OK;
}
status_t
BSVGDataCreator::IterateLineTo(int32 lineCount, BPoint *linePts)
{
for (int i = 0; i < lineCount; i++) {
if (fLast && linePts[i].x == fLast->x)
fTarget << " V" << linePts[i].y;
else if (fLast && linePts[i].y == fLast->y)
fTarget << " H" << linePts[i].x;
else
fTarget << " L" << linePts[i].x << " " << linePts[i].y;
fLast = &linePts[i];
}
return B_OK;
}
status_t
BSVGDataCreator::IterateBezierTo(int32 bezierCount, BPoint *bezierPts)
{
for (int i = 0; i < bezierCount * 3; i += 3) {
if (bezierPts[i + 1] == bezierPts[i + 2]) {
if (i > 0 && bezierPts[i] == bezierPts[i - 1] - bezierPts[i - 3] + bezierPts[i - 1]) {
// shorthand quadric bezier
fTarget << " T" << bezierPts[i + 2].x << " " << bezierPts[i + 2].y;
} else {
// normal quadric bezier
fTarget << " Q" << bezierPts[i].x << " " << bezierPts[i].y;
fTarget << " " << bezierPts[i + 1].x << " " << bezierPts[i + 1].y;
}
} else {
if (i > 0 && bezierPts[i] == bezierPts[i - 1] - bezierPts[i - 2] + bezierPts[i - 1]) {
// shorthand cubic bezier
fTarget << " S" << bezierPts[i + 1].x << " " << bezierPts[i + 1].y;
fTarget << " " << bezierPts[i + 2].x << " " << bezierPts[i + 2].y;
} else {
// normal cubic bezier
fTarget << " C" << bezierPts[i].x << " " << bezierPts[i].y;
fTarget << " " << bezierPts[i + 1].x << " " << bezierPts[i + 1].y;
fTarget << " " << bezierPts[i + 2].x << " " << bezierPts[i + 2].y;
}
}
}
fLast = NULL;
return B_OK;
}
status_t
BSVGDataCreator::IterateClose()
{
fTarget << " Z";
fLast = NULL;
return B_OK;
}
// *******************************************************************
BSVGPolyDataCreator::BSVGPolyDataCreator(BString &target)
: BSVGDataCreator(target)
{
}
BSVGPolyDataCreator::~BSVGPolyDataCreator()
{
}
status_t
BSVGPolyDataCreator::IterateMoveTo(BPoint *point)
{
// should only happen once
fTarget << point->x << "," << point->y;
return B_OK;
}
status_t
BSVGPolyDataCreator::IterateLineTo(int32 lineCount, BPoint *linePts)
{
for (int i = 0; i < lineCount; i++)
fTarget << " " << linePts[i].x << "," << linePts[i].y;
return B_OK;
}
status_t
BSVGPolyDataCreator::IterateClose()
{
// no-op
return B_OK;
}