X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fcharwindow.cpp;h=0309b78e82630cbbb00e31540b192c791257fae6;hb=3ef71393f70213eb53db552605ae3c93f1303ee9;hp=d9e6ee3ac2182931867b11a4464ee30a77cbe6bb;hpb=29b571499a38273c6c693334512e44f4162171a5;p=ttedit diff --git a/src/charwindow.cpp b/src/charwindow.cpp index d9e6ee3..0309b78 100755 --- a/src/charwindow.cpp +++ b/src/charwindow.cpp @@ -9,20 +9,23 @@ // --- ---------- ------------------------------------------------------------- // 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 -// - Render of main window points // #include "charwindow.h" #include "debug.h" -CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Tool), path(NULL) +//CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Tool), path(NULL) +CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Window), path(NULL) { setWindowTitle("Character: Unknown"); } @@ -36,127 +39,50 @@ void CharWindow::MakePathFromPoints(GlyphPoints * gp) delete path; path = new QPainterPath(); - -#if 0 - try - { - path->moveTo(gp->GetX(0), gp->GetY(0)); - } - catch (int e) - { - if (e == GP_OUT_OF_RANGE) - WriteLogMsg("CharWindow: Caught GP_OUT_OF_RANGE exception.\n"); - } - - for(int i=1; iGetNumPoints(); i++) - { - } -#endif +// path->setFillRule(Qt::OddEvenFill); + path->setFillRule(Qt::WindingFill); // Draw curve formed by points for(int poly=0; polyGetNumPolys(); poly++) { - if (gp->GetNumPoints(poly) > 2) + 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; iGetNumPoints(poly); i++) { - // Initial move... - // If it's not on curve, then move to it, otherwise move to last point... - - int x, y; - - if (gp->GetOnCurve(poly, gp->GetNumPoints(poly) - 1)) - x = (int)gp->GetX(poly, gp->GetNumPoints(poly) - 1), y = (int)gp->GetY(poly, gp->GetNumPoints(poly) - 1); + // 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 - x = (int)gp->GetX(poly, 0), y = (int)gp->GetY(poly, 0); - - path->moveTo(x, y); - - for(int i=0; iGetNumPoints(poly); i++) { + // 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)) - { -// p.drawLine(x, y, gp->GetX(poly, i), gp->GetY(poly, i)); - x = (int)gp->GetX(poly, i), y = (int)gp->GetY(poly, i); - path->lineTo(x, y); - } - else - { - uint32 prev = gp->GetPrev(poly, i), next = gp->GetNext(poly, i); - float px = gp->GetX(poly, prev), py = gp->GetY(poly, prev), - nx = gp->GetX(poly, next), ny = gp->GetY(poly, next); - - if (!gp->GetOnCurve(poly, prev)) - px = (px + gp->GetX(poly, i)) / 2.0f, - py = (py + gp->GetY(poly, i)) / 2.0f; - - if (!gp->GetOnCurve(poly, next)) - nx = (nx + gp->GetX(poly, i)) / 2.0f, - ny = (ny + gp->GetY(poly, i)) / 2.0f; - -// Bezier(p, point(px, py), point(gp->GetX(poly, i), gp->GetY(poly, i)), point(nx, ny)); -// path->moveTo(px, py); - path->quadTo(gp->GetX(poly, i), gp->GetY(poly, i), nx, ny); - x = (int)nx, y = (int)ny; - - if (gp->GetOnCurve(poly, next)) - i++; // Following point is on curve, so move past it - } - } - - path->closeSubpath(); - } - } - + continue; -#if 0 - // Draw curve formed by points + // 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)); - for(int poly=0; poly 2) - { - // Initial move... - // If it's not on curve, then move to it, otherwise move to last point... - - int x, y; - - if (pts.GetOnCurve(poly, pts.GetNumPoints(poly) - 1)) - x = (int)pts.GetX(poly, pts.GetNumPoints(poly) - 1), y = (int)pts.GetY(poly, pts.GetNumPoints(poly) - 1); - else - x = (int)pts.GetX(poly, 0), y = (int)pts.GetY(poly, 0); - - for(int i=0; iquadTo(gp->GetX(poly, i), gp->GetY(poly, i), pt.x, pt.y); } } + + path->closeSubpath(); } -#endif } QSize CharWindow::minimumSizeHint() const @@ -176,44 +102,39 @@ void CharWindow::paintEvent(QPaintEvent * /*event*/) QPainter p(this); -// Need to translate as well... -// p.scale(1.0, -1.0); - p.drawPath(*path); -} - - -#if 0 -BEGIN_EVENT_TABLE(CharWindow, wxMiniFrame) - EVT_PAINT(CharWindow::OnPaint) -// EVT_MOUSE_EVENTS(CharWindow::OnMouseEvent) -END_EVENT_TABLE() +// p.setBrush(QColor(0, 163, 200)); // Nice, aqua color... + p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine)); + p.setBrush(Qt::black); -CharWindow::CharWindow(wxFrame * parent, const wxString &title, const wxPoint &pos, - const wxSize &size, long style): wxMiniFrame(parent, -1, title, pos, size, style) -{ - Show(false); -} + QRectF rect = path->boundingRect(); + QSize paintSize = size(); -CharWindow::~CharWindow() -{ -} + // 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; -void CharWindow::OnPaint(wxPaintEvent &e) -{ - wxPaintDC dc(this); -//doesnothing dc.SetBackground(*wxWHITE_BRUSH); + 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 (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 = (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); } -#endif