QPainter p(this);
//hm, causes lockup (or does it???)
p.setRenderHint(QPainter::Antialiasing);
-//Doesn't do crap!
-//dc.SetBackground(*wxWHITE_BRUSH);
-// Due to the screwiness of wxWidgets coord system, the origin is ALWAYS
-// the upper left corner--regardless of axis orientation, etc...
-// int width, height;
-// dc.GetSize(&width, &height);
QSize winSize = size();
-// dc.SetDeviceOrigin(-offsetX, height - (-offsetY));
-// dc.SetAxisOrientation(true, true);
p.translate(QPoint(-offsetX, winSize.height() - (-offsetY)));
p.scale(1.0, -1.0);
// Instead, we have to scale EVERYTHING by hand. Crap!
// It's not *that* bad, but not as convenient either...
-// dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0xFF), 1, wxDOT)));
-//// dc.DrawLine(0, 0, 10, 10);
p.setPen(QPen(Qt::blue, 1.0, Qt::DotLine));
// Draw coordinate axes
-// dc.CrossHair(0, 0);
p.drawLine(0, -16384, 0, 16384);
p.drawLine(-16384, 0, 16384, 0);
{
for(int poly=0; poly<glyph.GetNumPolys(); poly++)
{
- if (glyph.GetNumPoints(poly) > 2)
- {
- // Initial move...
- // If it's not on curve, then move to it, otherwise move to last point...
+ if (glyph.GetNumPoints(poly) < 3)
+ continue;
- int x, y;
+ // Initial move: If our start point is on curve, then go to it. Otherwise,
+ // check previous point. If it's on curve, go to it otherwise go the
+ // midpoint between start point and previous (since it's between two curve
+ // control points).
+ IPoint pt = (glyph.GetOnCurve(poly, 0)
+ ? glyph.GetPoint(poly, 0) : (glyph.GetPrevOnCurve(poly, 0)
+ ? glyph.GetPrevPoint(poly, 0) : glyph.GetMidpointToPrev(poly, 0)));
- if (glyph.GetOnCurve(poly, glyph.GetNumPoints(poly) - 1))
- x = (int)glyph.GetX(poly, glyph.GetNumPoints(poly) - 1), y = (int)glyph.GetY(poly, glyph.GetNumPoints(poly) - 1);
- else
- x = (int)glyph.GetX(poly, 0), y = (int)glyph.GetY(poly, 0);
+// Need to add separate color handling here for polys that are being manipulated...
- for(int i=0; i<glyph.GetNumPoints(poly); i++)
+ for(int i=0; i<glyph.GetNumPoints(poly); i++)
+ {
+ // If this point and then next are both on curve, we have a line...
+ if (glyph.GetOnCurve(poly, i) && glyph.GetNextOnCurve(poly, i))
+ {
+ IPoint pt2 = glyph.GetNextPoint(poly, i);
+ p.drawLine(pt.x, pt.y, pt2.x, pt2.y);
+ pt = pt2;
+ }
+ else
{
+ // Skip point if it's on curve (start of curve--it's already
+ // been plotted so we don't need to handle it...)
if (glyph.GetOnCurve(poly, i))
- {
- p.drawLine(x, y, glyph.GetX(poly, i), glyph.GetY(poly, i));
- x = (int)glyph.GetX(poly, i), y = (int)glyph.GetY(poly, i);
- }
- else
- {
- uint32 prev = glyph.GetPrev(poly, i), next = glyph.GetNext(poly, i);
- float px = glyph.GetX(poly, prev), py = glyph.GetY(poly, prev),
- nx = glyph.GetX(poly, next), ny = glyph.GetY(poly, next);
+ continue;
- if (!glyph.GetOnCurve(poly, prev))
- px = (px + glyph.GetX(poly, i)) / 2.0f,
- py = (py + glyph.GetY(poly, i)) / 2.0f;
+ // We are now guaranteed that we are sitting on a curve control point
+ // (off curve). Figure the extent of the curve: If the following is a
+ // curve control point, then use the midpoint to it otherwise go to
+ // the next point since it's on curve.
+ IPoint pt2 = (glyph.GetNextOnCurve(poly, i)
+ ? glyph.GetNextPoint(poly, i) : glyph.GetMidpointToNext(poly, i));
- if (!glyph.GetOnCurve(poly, next))
- nx = (nx + glyph.GetX(poly, i)) / 2.0f,
- ny = (ny + glyph.GetY(poly, i)) / 2.0f;
+ Bezier(p, pt, glyph.GetPoint(poly, i), pt2);
+ pt = pt2;
+ }
+ }
+ }
+}
- Bezier(p, point(px, py), point(glyph.GetX(poly, i), glyph.GetY(poly, i)), point(nx, ny));
- x = (int)nx, y = (int)ny;
- if (glyph.GetOnCurve(poly, next))
- i++; // Following point is on curve, so move past it
- }
- }
+void EditWindow::DrawGlyphPoly(QPainter & p, GlyphPoints & glyph, uint16 poly)
+{
+ // Sanity check
+ if (glyph.GetNumPoints(poly) < 3)
+ return;
+
+ // Initial move: If our start point is on curve, then go to it. Otherwise,
+ // check previous point. If it's on curve, go to it otherwise go the
+ // midpoint between start point and previous (since it's between two curve
+ // control points).
+ IPoint pt = (glyph.GetOnCurve(poly, 0)
+ ? glyph.GetPoint(poly, 0) : (glyph.GetPrevOnCurve(poly, 0)
+ ? glyph.GetPrevPoint(poly, 0) : glyph.GetMidpointToPrev(poly, 0)));
+
+ for(int i=0; i<glyph.GetNumPoints(poly); i++)
+ {
+ // If this point and then next are both on curve, we have a line...
+ if (glyph.GetOnCurve(poly, i) && glyph.GetNextOnCurve(poly, i))
+ {
+ IPoint pt2 = glyph.GetNextPoint(poly, i);
+ p.drawLine(pt.x, pt.y, pt2.x, pt2.y);
+ pt = pt2;
+ }
+ else
+ {
+ // Skip point if it's on curve (start of curve--it's already
+ // been plotted so we don't need to handle it...)
+ if (glyph.GetOnCurve(poly, i))
+ continue;
+
+ // We are now guaranteed that we are sitting on a curve control point
+ // (off curve). Figure the extent of the curve: If the following is a
+ // curve control point, then use the midpoint to it otherwise go to
+ // the next point since it's on curve.
+ IPoint pt2 = (glyph.GetNextOnCurve(poly, i)
+ ? glyph.GetNextPoint(poly, i) : glyph.GetMidpointToNext(poly, i));
+
+ Bezier(p, pt, glyph.GetPoint(poly, i), pt2);
+ pt = pt2;
}
}
}
;//meh CaptureMouse(); // Make sure we capture the mouse when in scroll/zoom mode
else if (tool == TOOLAddPt) // "Add Point" tool
{
- if (pts.GetNumPoints() > 0)
+ QPoint pt = GetAdjustedMousePosition(event);
+ IPoint pointToAdd(pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
+
+ if (pts.GetNumPoints() < 2)
{
- QPoint pt = GetAdjustedMousePosition(event);
- pts.InsertPoint(pts.GetNext(ptHighlight), pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
+// pts += IPoint(pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
+ pts += pointToAdd;
+ ptHighlight = pts.GetNumPoints() - 1;
+ }
+ else
+ {
+// QPoint pt = GetAdjustedMousePosition(event);
+// pts.InsertPoint(pts.GetNext(ptHighlight), pt.x(), pt.y(), ((event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) ? false : true));
+ pts.InsertPoint(pts.GetNext(ptHighlight), pointToAdd);
ptHighlight = ptNextHighlight;
- update();
+// update();
}
+
+ update();
}
else if (tool == TOOLAddPoly) // "Add Poly" tool
{
}
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();
}
}
{
if (tool == TOOLAddPt || tool == TOOLAddPoly || tool == TOOLSelect)
{
- if (tool != TOOLAddPt || pts.GetNumPoints() > 0)//yecch.
- {
-//temporary, for testing. BTW, Select drag bug is here...!
-#if 1
- QPoint pt2 = GetAdjustedMousePosition(event);
- pts.SetXY(ptHighlight, pt2.x(), pt2.y());
- update();
-#endif
- }
+ // Bail out if we have the select tool and no points yet...
+ if (tool == TOOLSelect && pts.GetNumPoints() == 0)
+ return;
+
+ QPoint pt2 = GetAdjustedMousePosition(event);
+ pts.SetXY(ptHighlight, pt2.x(), pt2.y());
+ update();
}
else if (tool == TOOLPolySelect)
{
QPoint pt2 = GetAdjustedMousePosition(event);
// Should also set onCurve here as well, depending on keystate
//Or should we?
+//Would be nice, but we'd need to trap the keyPressEvent() as well, otherwise pressing/releasing
+//the hotkey would show no change until the user moved their mouse.
pts.OffsetPoly(pts.GetPoly(ptHighlight), pt2.x() - pts.GetX(ptHighlight), pt2.y() - pts.GetY(ptHighlight));
update();
}