]> Shamusworld >> Repos - ttedit/blobdiff - src/charwindow.cpp
Added some functions to GlyphPoints to reduce redundancy in glyph
[ttedit] / src / charwindow.cpp
index 4c601c8392e27ae21dc27fca89ba784fa5d884ce..95965d4d60f2f5810d5974c8b6e37fcdde7fd155 100755 (executable)
 // 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 problem with owned window causing main window refresh problems
-//   (ironically enough, it doesn't seem to be a problem anymore...)
+// - Fix "window disappears when tool win comes up" problem
 //
 
 #include "charwindow.h"
+#include "debug.h"
+
+CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Tool), path(NULL)
+{
+       setWindowTitle("Character: Unknown");
+}
+
+void CharWindow::MakePathFromPoints(GlyphPoints * gp)
+{
+       if (gp == NULL)
+               return;
+
+       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) > 2)
+               {
+                       // Initial move...
+                       // If last point is on curve then move to it, otherwise move to first point...
+
+//NOTE: This is basically doing the below for i=-1.
+//      Find some way to integrate this crap.
+/*
+Could do in pairs: get i and i+1, connect them depending on whether the pair
+is a line or a curve.
+4 cases: on to on (line),
+         on to off (begin curve),
+         off to on (end curve),
+         off to off (begin curve)
+*/
+#if 1
+                       for(int i=0; i<gp->GetNumPoints(poly); i++)
+                       {
+                               if (i == 0)
+                               {
+                                       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);
+                               }
+
+                               if (gp->GetOnCurve(poly, i) && gp->GetNextOnCurve(poly, i))
+                               {
+                                       // Handle lines...
+                                       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 care about it...
+                                       if (gp->GetOnCurve(poly, i))
+                                               i++;
+
+                                       // We may have moved past the end; if not, handle curve
+                                       if (i < gp->GetNumPoints(poly))
+                                       {
+                                               // Handle curves...
+                                               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);
+                                       }
+                               }
+                       }
+#else
+                       IPoint pt;
 
+                       if (gp->GetPrevOnCurve(poly, 0))
+                               pt = gp->GetPrevPoint(poly, 0);
+                       else
+                               pt = (gp->GetOnCurve(poly, 0)
+                                       ? gp->GetPoint(poly, 0) : gp->GetMidpointToPrev(poly, 0));
 
-BEGIN_EVENT_TABLE(CharWindow, wxMiniFrame)
-       EVT_PAINT(CharWindow::OnPaint)
-//     EVT_MOUSE_EVENTS(CharWindow::OnMouseEvent)
-END_EVENT_TABLE()
+                       path->moveTo(pt.x, pt.y);
 
-CharWindow::CharWindow(wxFrame * parent, const wxString &title, const wxPoint &pos,
-       const wxSize &size, long style): wxMiniFrame(parent, -1, title, pos, size, style)
+                       for(int i=0; i<gp->GetNumPoints(poly); i++)
+                       {
+                               if (gp->GetOnCurve(poly, i))
+                                       path->lineTo(gp->GetX(poly, i), gp->GetY(poly, i));
+                               else
+                               {
+                                       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);
+
+                                       // If following point is on curve, move past it
+                                       if (gp->GetNextOnCurve(poly, i))
+                                               i++;
+                               }
+                       }
+#endif
+
+                       path->closeSubpath();
+               }
+       }
+}
+
+QSize CharWindow::minimumSizeHint() const
 {
-       Show(false);
+       return QSize(50, 50);
 }
 
-CharWindow::~CharWindow()
+QSize CharWindow::sizeHint() const
 {
+       return QSize(200, 200);
 }
 
-void CharWindow::OnPaint(wxPaintEvent &e)
+void CharWindow::paintEvent(QPaintEvent * /*event*/)
 {
-       wxPaintDC dc(this);
-//doesnothing  dc.SetBackground(*wxWHITE_BRUSH);
+       if (path == NULL)
+               return;
+
+       QPainter p(this);
+
+       p.setBrush(QColor(122, 163, 39));
+// Need to translate as well...
+//     p.scale(2.0, 2.0);
+
+/*
+1.0 -> 3.0, height = 400
+r.h / ps.h = 2/400 <-- do it the other way!
+
+height works, width does not
+
+2-step process:
+compare aspect ratios
+
+ps.w - ((r.h / ps.h) * ps.w)
+
+0.5 -> where in the 400? -> 100
+0.5/r.h(2.0) = 0.25 * ps.h(400) = 100
+conv.fac. -> (ps.h / r.h)
+*/
+       QRectF rect = path->boundingRect();
+       QSize paintSize = size();
+
+       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();
 
-//     wxMemoryDC memDC;
-//     memDC.SelectObject(*bmp);
-//     dc.Blit(0, 0, sizeTPBM.x, sizeTPBM.y, &memDC, 0, 0, wxCOPY);
+       if (xConvFac > yConvFac)
+       {
+               // height is limiting factor
+               p.scale(yConvFac, -yConvFac);
+//extraX = (rect.height() / (float)paintSize.height()) * (float)paintSize.width();
+//extraX = (extraX - rect.width()) / 2.0f;
+               extraX = (((float)paintSize.width() / yConvFac) - rect.width()) / 2.0f;
+       }
+       else
+       {
+               // width is limiting factor
+               p.scale(xConvFac, -xConvFac);
+//extraY = (rect.width() / (float)paintSize.width()) * (float)paintSize.height();
+//extraY = (extraY - rect.height()) / 2.0f;
+               extraY = (((float)paintSize.height() / xConvFac) - rect.height()) / 2.0f;
+       }
 
-//     if (prevTool != -1)
-//     {
-//         //need ul corner of bitmap, ul corner of dest, width/height
-//             wxPoint pt(sizeStamp.x * (prevTool & 0x03), sizeStamp.y * (prevTool >> 2));
-//             dc.Blit(pt.x, pt.y, sizeStamp.x, sizeStamp.y, &memDC, pt.x, pt.y, wxSRC_INVERT);
-//     }
+       p.translate(-rect.x() + extraX, -rect.y() + extraY);
 
-//     memDC.SelectObject(wxNullBitmap);
+       p.drawPath(*path);
 }