-//\r
-// TTEDIT.CPP - The TrueType Editor\r
-// by James L. Hammons\r
-// (C) 2004 Underground Software\r
-//\r
-// JLH = James L. Hammons <jlhamm@acm.org>\r
-//\r
-// Who When What\r
-// --- ---------- -------------------------------------------------------------\r
-// JLH 08/28/2008 Created this file\r
-//\r
-\r
-// FIXED:\r
-//\r
-// STILL TO BE DONE:\r
-//\r
-// - Fix problem with owned window causing main window refresh problems\r
-// (ironically enough, it doesn't seem to be a problem anymore...)\r
-//\r
-\r
-#include "charwindow.h"\r
-\r
-\r
-BEGIN_EVENT_TABLE(CharWindow, wxMiniFrame)\r
- EVT_PAINT(CharWindow::OnPaint)\r
-// EVT_MOUSE_EVENTS(CharWindow::OnMouseEvent)\r
-END_EVENT_TABLE()\r
-\r
-CharWindow::CharWindow(wxFrame * parent, const wxString &title, const wxPoint &pos,\r
- const wxSize &size, long style): wxMiniFrame(parent, -1, title, pos, size, style)\r
-{\r
- Show(false);\r
-}\r
-\r
-CharWindow::~CharWindow()\r
-{\r
-}\r
-\r
-void CharWindow::OnPaint(wxPaintEvent &e)\r
-{\r
- wxPaintDC dc(this);\r
-//doesnothing dc.SetBackground(*wxWHITE_BRUSH);\r
-\r
-// wxMemoryDC memDC;\r
-// memDC.SelectObject(*bmp);\r
-// dc.Blit(0, 0, sizeTPBM.x, sizeTPBM.y, &memDC, 0, 0, wxCOPY);\r
-\r
-// if (prevTool != -1)\r
-// {\r
-// //need ul corner of bitmap, ul corner of dest, width/height\r
-// wxPoint pt(sizeStamp.x * (prevTool & 0x03), sizeStamp.y * (prevTool >> 2));\r
-// dc.Blit(pt.x, pt.y, sizeStamp.x, sizeStamp.y, &memDC, pt.x, pt.y, wxSRC_INVERT);\r
-// }\r
-\r
-// memDC.SelectObject(wxNullBitmap);\r
-}\r
+//
+// TTEDIT.CPP - The TrueType Editor
+// by James L. Hammons
+// (C) 2004 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who When What
+// --- ---------- -----------------------------------------------------------
+// JLH 08/28/2008 Created this file
+// JLH 03/19/2009 Converted from wxWidgets to Qt
+// JLH 03/21/2009 Fixed main screen points rendering
+//
+
+// FIXED:
+//
+// - Render of main window points [DONE]
+//
+// STILL TO BE DONE:
+//
+// - Fix "window disappears when tool win comes up" problem
+//
+
+#include "charwindow.h"
+#include "debug.h"
+
+
+CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Window), path(NULL)
+{
+ setWindowTitle("Character: Unknown");
+}
+
+
+QPainterPath * CharWindow::MakePathFromPoints(GlyphPoints * gp)
+{
+ if (gp == NULL)
+ return NULL;
+
+ if (path != NULL)
+ delete path;
+
+ path = new QPainterPath();
+// path->setFillRule(Qt::OddEvenFill);
+ path->setFillRule(Qt::WindingFill);
+
+ // Draw curve formed by points
+
+ for(int poly=0; poly<gp->GetNumPolys(); poly++)
+ {
+ if (gp->GetNumPoints(poly) < 3)
+ continue;
+
+ // 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 = (gp->GetOnCurve(poly, 0)
+ ? gp->GetPoint(poly, 0) : (gp->GetPrevOnCurve(poly, 0)
+ ? gp->GetPrevPoint(poly, 0) : gp->GetMidpointToPrev(poly, 0)));
+ path->moveTo(pt.x, pt.y);
+
+ for(int i=0; i<gp->GetNumPoints(poly); i++)
+ {
+ // If this point and then next are both on curve, we have a line...
+ if (gp->GetOnCurve(poly, i) && gp->GetNextOnCurve(poly, i))
+ path->lineTo(gp->GetNextX(poly, i), gp->GetNextY(poly, i));
+ 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 (gp->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 pt = (gp->GetNextOnCurve(poly, i)
+ ? gp->GetNextPoint(poly, i) : gp->GetMidpointToNext(poly, i));
+
+ path->quadTo(gp->GetX(poly, i), gp->GetY(poly, i), pt.x, pt.y);
+ }
+ }
+
+ path->closeSubpath();
+ }
+
+ return path;
+}
+
+
+void CharWindow::RenderPathInImage(QPainterPath * path, QImage * img)
+{
+ if ((path == NULL) || (img == NULL))
+ return;
+
+ QPainter p(img);
+
+ p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine));
+ p.setBrush(Qt::black);
+
+ QRectF rect = path->boundingRect();
+ QSize paintSize = img->size();
+
+#if 0
+ // For some reason, this code cuts off two pixels when rendering the path.
+ // Not sure why, but we compensate for that here.
+ paintSize.rwidth() -= 2;
+ paintSize.rheight() -= 2;
+#endif
+
+ p.translate(0, paintSize.height());
+ float extraX = 0.0f, extraY = 0.0f;
+ float xConvFac = (float)paintSize.width() / rect.width();
+ float yConvFac = (float)paintSize.height() / rect.height();
+
+ if (xConvFac > yConvFac)
+ {
+ // height is limiting factor (smaller than width)
+ p.scale(yConvFac, -yConvFac);
+ extraX = (((float)paintSize.width() / yConvFac) - rect.width()) / 2.0f;
+ }
+ else
+ {
+ // width is limiting factor (smaller than height)
+ p.scale(xConvFac, -xConvFac);
+ extraY = (((float)paintSize.height() / xConvFac) - rect.height()) / 2.0f;
+ }
+
+ p.translate(-rect.x() + extraX, -rect.y() + extraY);
+ p.drawPath(*path);
+}
+
+
+QSize CharWindow::minimumSizeHint() const
+{
+ return QSize(50, 50);
+}
+
+
+QSize CharWindow::sizeHint() const
+{
+ return QSize(200, 200);
+}
+
+
+void CharWindow::paintEvent(QPaintEvent * /*event*/)
+{
+ if (path == NULL)
+ return;
+
+ QPainter p(this);
+
+// p.setBrush(QColor(0, 163, 200)); // Nice, aqua color...
+ p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine));
+ p.setBrush(Qt::black);
+
+ QRectF rect = path->boundingRect();
+ QSize paintSize = size();
+
+ // For some reason, this code cuts off two pixels when rendering the path.
+ // Not sure why, but we compensate for that here.
+ paintSize.rwidth() -= 2;
+ paintSize.rheight() -= 2;
+
+ p.translate(0, paintSize.height());
+ float extraX = 0.0f, extraY = 0.0f;
+ float xConvFac = (float)paintSize.width() / rect.width();
+ float yConvFac = (float)paintSize.height() / rect.height();
+
+ if (xConvFac > yConvFac)
+ {
+ // height is limiting factor (smaller than width)
+ p.scale(yConvFac, -yConvFac);
+ extraX = (((float)paintSize.width() / yConvFac) - rect.width()) / 2.0f;
+ }
+ else
+ {
+ // width is limiting factor (smaller than height)
+ p.scale(xConvFac, -xConvFac);
+ extraY = (((float)paintSize.height() / xConvFac) - rect.height()) / 2.0f;
+ }
+
+ p.translate(-rect.x() + extraX, -rect.y() + extraY);
+
+ p.drawPath(*path);
+}
+