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 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 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 66 NudgePointsCommand::~NudgePointsCommand() 67 { 68 delete[] fIndices; 69 delete[] fPoints; 70 } 71 72 // InitCheck 73 status_t 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 84 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