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]);
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();
{
// 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;
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__
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));
}
if (pointNumber > numPoints)
throw GP_OUT_OF_RANGE;
- return IPoint(x[pointNumber], y[pointNumber]);
+ return IPoint(x[pointNumber], y[pointNumber], onCurve[pointNumber]);
}
}
+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
{
// 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
}
+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<GetNumPoints(poly)/2; i++)
+ {
+ IPoint point1 = GetPoint(pointNum1 + i);
+ IPoint point2 = GetPoint(pointNum2 - i);
+ SetPoint(pointNum2 - i, point1);
+ SetPoint(pointNum1 + i, point2);
+ }
+}
+
+
// really need to do checking on the results from fscanf...
bool GlyphPoints::LoadGlyphFromFile(FILE * file)
{
for(int i=0; i<numPoints; i++)
{
- fscanf(file, "%d %d %s", &x[i], &y[i], &line);
+ fscanf(file, "%d %d %s", &x[i], &y[i], (char *)&line);
onCurve[i] = (line[0] == 'T' ? true : false);
}
void ScalePoints(float);
void SetXY(uint16, int, int);
void SetOnCurve(uint16, bool);
+ void SetPoint(const uint16 pointNum, const IPoint point);
uint16 GetPrev(uint16);
uint16 GetNext(uint16);
uint16 GetPrev(uint16, uint16);
void RotatePoints(const double angle, const IPoint point);
IPoint GetPolyCentroid(const int16 poly);
void RotatePolyAroundCentroid(const int16 poly, const double angle);
+ void InvertPolyDrawSequence(const uint16 poly);
bool LoadGlyphFromFile(FILE *);
bool SaveGlyphToFile(FILE *);
newTool = (ToolType)((y * 4) + x);
// We don't have 11 yet, so fix this if the user selected the blank space
- if (newTool > 9)
+ if (newTool > 10)
newTool = TOOLNone;
return newTool;
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