X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcharwindow.cpp;h=0309b78e82630cbbb00e31540b192c791257fae6;hb=3ef71393f70213eb53db552605ae3c93f1303ee9;hp=a6da0f9ca83f8e2312f5028261068dd7d5895421;hpb=a4763354603a2f8fbaff27a17edab7710ead6c2b;p=ttedit diff --git a/src/charwindow.cpp b/src/charwindow.cpp index a6da0f9..0309b78 100755 --- a/src/charwindow.cpp +++ b/src/charwindow.cpp @@ -24,7 +24,8 @@ #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"); } @@ -45,52 +46,42 @@ void CharWindow::MakePathFromPoints(GlyphPoints * gp) 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 last point is on curve then move to it, otherwise move to first point... - - int x, y; - - if (gp->GetOnCurve(poly, gp->GetPrev(poly, 0))) - x = gp->GetX(poly, gp->GetPrev(poly, 0)), - y = gp->GetY(poly, gp->GetPrev(poly, 0)); + // 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); - - if (!gp->GetOnCurve(poly, 0)) - { - IPoint pt = gp->GetMidpointToPrev(poly, 0); - x = pt.x, y = pt.y; - } - } + // 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; - path->moveTo(x, y); + // 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 i=0; iGetNumPoints(poly); i++) - { - 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 - { - IPoint pt = (gp->GetOnCurve(poly, gp->GetNext(poly, i)) ? gp->GetNextPoint(poly, i) : gp->GetMidpointToNext(poly, i)); - - path->quadTo(gp->GetX(poly, i), gp->GetY(poly, i), pt.x, pt.y); - x = pt.x, y = pt.y; - - // If following point is on curve, move past it - if (gp->GetOnCurve(poly, gp->GetNext(poly, i))) - i++; - } + path->quadTo(gp->GetX(poly, i), gp->GetY(poly, i), pt.x, pt.y); } - - path->closeSubpath(); } + + path->closeSubpath(); } } @@ -111,50 +102,36 @@ void CharWindow::paintEvent(QPaintEvent * /*event*/) 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 +// p.setBrush(QColor(0, 163, 200)); // Nice, aqua color... + p.setPen(QPen(Qt::black, 1.0, Qt::SolidLine)); + p.setBrush(Qt::black); -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(); + // 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(); + float extraX = 0.0f, extraY = 0.0f; + float xConvFac = (float)paintSize.width() / rect.width(); + float yConvFac = (float)paintSize.height() / rect.height(); -// if (((float)paintSize.width() / rect.width()) > ((float)paintSize.height() / rect.height())) if (xConvFac > yConvFac) { - // height is limiting factor + // height is limiting factor (smaller than width) 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((float)paintSize.width() / rect.width(), -(float)paintSize.width() / rect.height()); - p.scale((float)paintSize.width() / rect.width(), -(float)paintSize.width() / rect.width()); -extraY = (rect.width() / (float)paintSize.width()) * (float)paintSize.height();// / 2.0f; -extraY = extraY - rect.height(); -extraY /= 2.0f; + // 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; } p.translate(-rect.x() + extraX, -rect.y() + extraY);