X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgraphicprimitives.cpp;h=dd9b480e54650eca6ce7553d3326276da7de3511;hb=3ef71393f70213eb53db552605ae3c93f1303ee9;hp=9802347b713ae289496f3a2eb9ab7e8a3f14d4b4;hpb=5c7c36b21d0f2a88accd8ff12c05dcc3004ce0e8;p=ttedit diff --git a/src/graphicprimitives.cpp b/src/graphicprimitives.cpp index 9802347..dd9b480 100755 --- a/src/graphicprimitives.cpp +++ b/src/graphicprimitives.cpp @@ -1,107 +1,123 @@ -// -// Graphics primitives -// -// Various graphic functions that are slightly more complex than those that -// come with various widget libraries. -// -// by James L. Hammons -// (C) 2005 Underground Software -// -// JLH = James L. Hammons -// -// Who When What -// --- ---------- ------------------------------------------------------------- -// JLH 03/14/1998 Created this file -// JLH 01/20/2005 Converted to use wxWidgets -// JLH 08/30/2008 Repurposed file to handle more than just bezier curves -// - -#include "graphicprimitives.h" - -double abs(double n) // Helper function -{ - return (n < 0 ? -n : n); -} - -// -// This function takes three points and draws a curve using a second order -// Bezier function. -// -void Bezier(wxDC &dc, point p1, point p2, point p3) -{ - double step = abs(p1.x - p3.x), tmp = abs(p1.y - p3.y); - step = (tmp > step ? tmp : step); // Get the larger of the two... - step = (step > 0 ? 1/step : 1); // & convert to valid step value - - wxCoord prevX = (wxCoord)p1.x, prevY = (wxCoord)p1.y; - - for(double u=0; u<=1; u+=step) - { - double _2u = 2*u, _uu = u*u, _2uu = 2*_uu; - double x = (p1.x * (1 - _2u + _uu)) + (p2.x * (_2u - _2uu)) + (p3.x * _uu); - double y = (p1.y * (1 - _2u + _uu)) + (p2.y * (_2u - _2uu)) + (p3.y * _uu); - - dc.DrawLine(prevX, prevY, (wxCoord)x, (wxCoord)y); - prevX = (wxCoord)x, prevY = (wxCoord)y; - } - - dc.DrawLine(prevX, prevY, (wxCoord)p3.x, (wxCoord)p3.y); -} - -// -// Draw a round dot (5x5, centered on [x, y]) -// -void DrawRoundDot(wxDC &dc, int32 x, int32 y) -{ - wxPoint pt[8]; - - pt[0].x = x - 1, pt[0].y = y - 2; - pt[1].x = x + 1, pt[1].y = y - 2; - pt[2].x = x + 2, pt[2].y = y - 1; - pt[3].x = x + 2, pt[3].y = y + 1; - pt[4].x = x + 1, pt[4].y = y + 2; - pt[5].x = x - 1, pt[5].y = y + 2; - pt[6].x = x - 2, pt[6].y = y + 1; - pt[7].x = x - 2, pt[7].y = y - 1; - - dc.DrawPolygon(8, pt); -} - -// -// Draw a sqaure dot (5x5, centered on [x, y]) -// -void DrawSquareDot(wxDC &dc, int32 x, int32 y) -{ - wxPoint pt[4]; - - pt[0].x = x - 2, pt[0].y = y - 2; - pt[1].x = x + 2, pt[1].y = y - 2; - pt[2].x = x + 2, pt[2].y = y + 2; - pt[3].x = x - 2, pt[3].y = y + 2; - - dc.DrawPolygon(4, pt); -} - -// -// Draw a sqaure dot (nxn, centered on [x, y]) -// -void DrawSquareDotN(wxDC &dc, int32 x, int32 y, uint32 n) -{ - wxPoint pt[4]; - uint32 offset = (n - 1) / 2; - - pt[0].x = x - offset, pt[0].y = y - offset; - pt[1].x = x + offset, pt[1].y = y - offset; - pt[2].x = x + offset, pt[2].y = y + offset; - pt[3].x = x - offset, pt[3].y = y + offset; - - dc.DrawPolygon(4, pt); -} - -// -// Draw a round dot (nxn, centered on [x, y]) -// -void DrawRoundDotN(wxDC &dc, int32 x, int32 y, uint32 n) -{ - dc.DrawCircle(x, y, (n / 2) + 1); -} +// +// Graphics primitives +// +// Various graphic functions that are slightly more complex than those that +// come with various widget libraries. +// +// by James L. Hammons +// (C) 2005 Underground Software +// +// JLH = James L. Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 03/14/1998 Created this file +// JLH 01/20/2005 Converted to use wxWidgets +// JLH 08/30/2008 Repurposed file to handle more than just bezier curves +// + +#include "graphicprimitives.h" + +double abs(double n) // Helper function +{ + return (n < 0 ? -n : n); +} + + +// +// This function takes three points and draws a curve using a second order +// Bezier function. +// +void Bezier(QPainter &p, point p1, point p2, point p3) +{ + double step = abs(p1.x - p3.x), tmp = abs(p1.y - p3.y); + step = (tmp > step ? tmp : step); // Get the larger of the two... + step = (step > 0 ? 1/step : 1); // & convert to valid step value + step *= 2.0; // (double it to draw less...) + + int prevX = (int)p1.x, prevY = (int)p1.y; + + for(double u=0; u<=1; u+=step) + { + double _2u = 2*u, _uu = u*u, _2uu = 2*_uu; + double x = (p1.x * (1 - _2u + _uu)) + (p2.x * (_2u - _2uu)) + (p3.x * _uu); + double y = (p1.y * (1 - _2u + _uu)) + (p2.y * (_2u - _2uu)) + (p3.y * _uu); + + p.drawLine(prevX, prevY, (int)x, (int)y); + prevX = (int)x, prevY = (int)y; + } + + p.drawLine(prevX, prevY, (int)p3.x, (int)p3.y); +} + + +// +// This is a convenience funtion, using IPoints :-) +// +void Bezier(QPainter &p, IPoint p1, IPoint p2, IPoint p3) +{ + Bezier(p, point(p1.x, p1.y), point(p2.x, p2.y), point(p3.x, p3.y)); +} + + +// +// Draw a round dot (5x5, centered on [x, y]) +// +void DrawRoundDot(QPainter &p, int32 x, int32 y) +{ + QPoint pt[8]; + + pt[0] = QPoint(x - 1, y - 2); + pt[1] = QPoint(x + 1, y - 2); + pt[2] = QPoint(x + 2, y - 1); + pt[3] = QPoint(x + 2, y + 1); + pt[4] = QPoint(x + 1, y + 2); + pt[5] = QPoint(x - 1, y + 2); + pt[6] = QPoint(x - 2, y + 1); + pt[7] = QPoint(x - 2, y - 1); + + p.drawPolygon(pt, 8); +} + + +// +// Draw a sqaure dot (5x5, centered on [x, y]) +// +void DrawSquareDot(QPainter &p, int32 x, int32 y) +{ + QPoint pt[4]; + + pt[0] = QPoint(x - 2, y - 2); + pt[1] = QPoint(x + 2, y - 2); + pt[2] = QPoint(x + 2, y + 2); + pt[3] = QPoint(x - 2, y + 2); + + p.drawPolygon(pt, 4); +} + + +// +// Draw a sqaure dot (nxn, centered on [x, y]) +// +void DrawSquareDotN(QPainter &p, int32 x, int32 y, uint32 n) +{ + QPoint pt[4]; + uint32 offset = (n - 1) / 2; + + pt[0] = QPoint(x - offset, y - offset); + pt[1] = QPoint(x + offset, y - offset); + pt[2] = QPoint(x + offset, y + offset); + pt[3] = QPoint(x - offset, y + offset); + + p.drawPolygon(pt, 4); +} + + +// +// Draw a round dot (nxn, centered on [x, y]) +// +void DrawRoundDotN(QPainter &p, int32 x, int32 y, uint32 n) +{ + int radius = (n / 2) + 1; + p.drawEllipse(x - radius, y - radius, n, n); +}