From faaae13292af283e277b0d1480aad54a6e4a2dd6 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Sun, 2 Dec 2012 21:47:56 -0600 Subject: [PATCH] Added implementation of Polygon Rotate and Flip Winding tools. --- src/editwindow.cpp | 27 ++++++++++++++++++++------ src/editwindow.h | 3 ++- src/glyphpoints.cpp | 47 +++++++++++++++++++++++++++++++++++++++++---- src/glyphpoints.h | 2 ++ src/toolwindow.cpp | 2 +- src/toolwindow.h | 3 ++- 6 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/editwindow.cpp b/src/editwindow.cpp index 242d237..192c9d2 100755 --- a/src/editwindow.cpp +++ b/src/editwindow.cpp @@ -71,12 +71,12 @@ QSize EditWindow::sizeHint() const void EditWindow::CreateCursors(void) { - int hotx[10] = { 1, 1, 11, 15, 1, 1, 1, 1, 1, 1 }; - int hoty[10] = { 1, 1, 11, 13, 1, 1, 1, 1, 1, 1 }; - char cursorName[10][48] = { "select", "select-poly", "scroll", "zoom", "add-point", - "add-poly", "del-point", "del-poly", "rotate", "rotate" }; + int hotx[11] = { 1, 1, 11, 15, 1, 1, 1, 1, 1, 1, 1 }; + int hoty[11] = { 1, 1, 11, 13, 1, 1, 1, 1, 1, 1, 1 }; + char cursorName[11][48] = { "select", "select-poly", "scroll", "zoom", "add-point", + "add-poly", "del-point", "del-poly", "rotate", "rotate", "select" }; - for(int i=0; i<10; i++) + for(int i=0; i<11; i++) { QString s; s.sprintf(":/res/cursor-%s.png", cursorName[i]); @@ -382,6 +382,21 @@ WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumP rotationAngle = 0; update(); } + else if (tool == TOOLFlipWinding) + { +// IPoint centroid = pts.GetPolyCentroid(pts.GetPolyForPointNumber(ptHighlight)); +// rotationCenter = QPoint(centroid.x, centroid.y); +// showRotationCenter = true; + pts.InvertPolyDrawSequence(pts.GetPolyForPointNumber(ptHighlight)); + pt = GetAdjustedClientPosition(pts.GetX(ptHighlight), pts.GetY(ptHighlight)); + QCursor::setPos(mapToGlobal(pt)); +// rotationZeroPoint = QPoint(pts.GetX(ptHighlight), pts.GetY(ptHighlight)); +// haveZeroPoint = true; +// rotationAngle = 0; + update(); +// ((TTEdit *)qApp)->charWnd->MakePathFromPoints(&pts); +// ((TTEdit *)qApp)->charWnd->update(); + } } event->accept(); @@ -472,7 +487,7 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) { // Moving, not dragging... if (tool == TOOLSelect || tool == TOOLDelPt || tool == TOOLAddPt - || tool == TOOLPolySelect || tool == TOOLRotatePoly) + || tool == TOOLPolySelect || tool == TOOLRotatePoly || tool == TOOLFlipWinding) { QPoint pt2 = GetAdjustedMousePosition(event); double closest = 1.0e+99; diff --git a/src/editwindow.h b/src/editwindow.h index d6f2acb..c60317f 100755 --- a/src/editwindow.h +++ b/src/editwindow.h @@ -42,13 +42,14 @@ class EditWindow: public QWidget ToolType tool; // Current tool GlyphPoints pts; // Glyph point structure int32 ptHighlight, oldPtHighlight, ptNextHighlight, oldPtNextHighlight; + int16 polyHighlight, oldPolyHighlight; bool polyFirstPoint; bool showRotationCenter, haveZeroPoint; QPoint rotationCenter, rotationZeroPoint, rotationCurrentPoint; double rotationAngle; ToolWindow * toolPalette; - QCursor cur[10]; + QCursor cur[11]; }; #endif // __EDITWINDOW_H__ diff --git a/src/glyphpoints.cpp b/src/glyphpoints.cpp index 05edc82..a11b09c 100755 --- a/src/glyphpoints.cpp +++ b/src/glyphpoints.cpp @@ -437,7 +437,7 @@ int GlyphPoints::GetNextY(uint16 poly, uint16 pt) IPoint GlyphPoints::GetPoint(uint16 poly, uint16 pt) { - return IPoint(GetX(poly, pt), GetY(poly, pt)); + return IPoint(GetX(poly, pt), GetY(poly, pt), GetOnCurve(poly, pt)); } @@ -446,7 +446,7 @@ IPoint GlyphPoints::GetPoint(uint16 pointNumber) if (pointNumber > numPoints) throw GP_OUT_OF_RANGE; - return IPoint(x[pointNumber], y[pointNumber]); + return IPoint(x[pointNumber], y[pointNumber], onCurve[pointNumber]); } @@ -580,6 +580,22 @@ WriteLogMsg("Exception: SetOnCurve(uint16, bool). pt=%u, numPoints=%u\xD\xA", pt } +void GlyphPoints::SetPoint(const uint16 pointNum, const IPoint point) +{ + if (pointNum >= numPoints) +#ifdef DEBUG +{ +WriteLogMsg("Exception: SetPoint(uint16, IPoint). pt=%u, numPoints=%u\xD\xA", pointNum, numPoints); +#endif + throw GP_OUT_OF_RANGE; +#ifdef DEBUG +} +#endif + + x[pointNum] = point.x, y[pointNum] = point.y, onCurve[pointNum] = point.onCurve; +} + + uint16 GlyphPoints::GetPrev(uint16 pt) { // pt = 7, polyEnd = 4, 9, 15 @@ -808,8 +824,10 @@ IPoint GlyphPoints::GetPolyCentroid(const int16 poly) { // We should throw an exception here, but meh // (this actually short circuits the exception handling in all the GetPolyXXX() functions) + // [now we do!] if (poly >= numPolys) - return IPoint(0, 0); + throw GP_OUT_OF_RANGE; +// return IPoint(0, 0); // if (poly >= numPolys) //#ifdef DEBUG @@ -853,6 +871,27 @@ void GlyphPoints::RotatePolyAroundCentroid(const int16 poly, const double angle) } +void GlyphPoints::InvertPolyDrawSequence(const uint16 poly) +{ + if (poly >= numPolys) + throw GP_OUT_OF_RANGE; + + uint16 pointNum1 = GetPolyStart(poly); + uint16 pointNum2 = GetPolyEnd(poly); + + // Algorithm: Step through points in the polygon, swapping 1st and last, then + // 2nd and (last - 1), 3rd and (last - 2), etc. We only do this for half the + // points, as doing it for all would undo the swapping we did in the 1st half. + for(uint16 i=0; i 9) + if (newTool > 10) newTool = TOOLNone; return newTool; diff --git a/src/toolwindow.h b/src/toolwindow.h index f9134bc..bb10b15 100755 --- a/src/toolwindow.h +++ b/src/toolwindow.h @@ -23,7 +23,8 @@ enum ToolType { TOOLDelPt, // Delete point tool TOOLDelPoly, // Delete polygon tool TOOLRotate, // Rotate tool - TOOLRotatePoly // Rotate polygon around centroid tool + TOOLRotatePoly, // Rotate polygon around centroid tool + TOOLFlipWinding // Change polygon's winding direction tool }; class ToolWindow: public QWidget -- 2.37.2