1 /*
2 * Copyright 2006, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Stephan Aßmus <superstippi@gmx.de>
7 */
8
9 #include "NudgePointsCommand.h"
10
11 #include <new>
12 #include <stdio.h>
13
14 #include <Catalog.h>
15 #include <Locale.h>
16 #include <StringFormat.h>
17
18 #include "VectorPath.h"
19
20
21 #undef B_TRANSLATION_CONTEXT
22 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-NudgePointsCommand"
23
24
25 using std::nothrow;
26
27
28 static BString
_GetName(int32 count)29 _GetName(int32 count)
30 {
31 static BStringFormat format(B_TRANSLATE("Nudge {0, plural, "
32 "one{vertex} other{vertices}}"));
33 BString name;
34 format.Format(name, count);
35 return name;
36 }
37
38
39 // constructor
NudgePointsCommand(VectorPath * path,const int32 * indices,const control_point * points,int32 count)40 NudgePointsCommand::NudgePointsCommand(VectorPath* path,
41 const int32* indices,
42 const control_point* points,
43 int32 count)
44 : TransformCommand(B_ORIGIN,
45 B_ORIGIN,
46 0.0,
47 1.0,
48 1.0,
49 _GetName(count)),
50 fPath(path),
51 fIndices(NULL),
52 fPoints(NULL),
53 fCount(count)
54 {
55 if (fCount > 0 && indices) {
56 fIndices = new (nothrow) int32[fCount];
57 memcpy(fIndices, indices, fCount * sizeof(int32));
58 }
59 if (fCount > 0 && points) {
60 fPoints = new (nothrow) control_point[fCount];
61 memcpy((void*)fPoints, points, fCount * sizeof(control_point));
62 }
63 }
64
65 // destructor
~NudgePointsCommand()66 NudgePointsCommand::~NudgePointsCommand()
67 {
68 delete[] fIndices;
69 delete[] fPoints;
70 }
71
72 // InitCheck
73 status_t
InitCheck()74 NudgePointsCommand::InitCheck()
75 {
76 if (fPath && fIndices && fPoints)
77 return TransformCommand::InitCheck();
78 else
79 return B_NO_INIT;
80 }
81
82 // _SetTransformation
83 status_t
_SetTransformation(BPoint pivot,BPoint translation,double rotation,double xScale,double yScale) const84 NudgePointsCommand::_SetTransformation(BPoint pivot,
85 BPoint translation,
86 double rotation,
87 double xScale,
88 double yScale) const
89 {
90 if (!fPath)
91 return B_NO_INIT;
92
93 AutoNotificationSuspender _(fPath);
94
95 // restore original path
96 for (int32 i = 0; i < fCount; i++) {
97 fPath->SetPoint(fIndices[i], fPoints[i].point + translation,
98 fPoints[i].point_in + translation,
99 fPoints[i].point_out + translation,
100 fPoints[i].connected);
101 }
102
103 return B_OK;
104 }
105
106