summaryrefslogtreecommitdiff
path: root/app/bin/draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/draw.c')
-rw-r--r--app/bin/draw.c3128
1 files changed, 1779 insertions, 1349 deletions
diff --git a/app/bin/draw.c b/app/bin/draw.c
index 343ae3f..d833a7b 100644
--- a/app/bin/draw.c
+++ b/app/bin/draw.c
@@ -17,63 +17,44 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifdef HAVE_MALLOC_C
-#include <malloc.h>
-#endif
-#include <math.h>
-#include <ctype.h>
-#include <string.h>
-#include <time.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#ifndef WINDOWS
-#include <unistd.h>
-#include <sys/time.h>
-#else
-#include <sys/timeb.h>
-#endif
-
#include "cselect.h"
#include "custom.h"
#include "draw.h"
#include "fileio.h"
-#include "i18n.h"
-#include "messages.h"
#include "misc.h"
#include "param.h"
#include "track.h"
-#include "utility.h"
#include "layout.h"
+#include "common-ui.h"
+
+
+EXPORT wIndex_t panCmdInx;
static void DrawRoomWalls( wBool_t );
static void DrawMarkers( void );
static void ConstraintOrig( coOrd *, coOrd, int, int );
static void DoMouse( wAction_t action, coOrd pos );
static void DDrawPoly(
- drawCmd_p d,
- int cnt,
- coOrd * pts,
- int * types,
- wDrawColor color,
- wDrawWidth width,
- int fill,
- int open );
+ drawCmd_p d,
+ int cnt,
+ coOrd * pts,
+ int * types,
+ wDrawColor color,
+ wDrawWidth width,
+ drawFill_e eFillOpt );
static void DrawMapBoundingBox( BOOL_T set );
static void DrawTicks( drawCmd_p d, coOrd size );
+static void DoZoom( void * pScaleVP );
EXPORT int log_pan = 0;
static int log_zoom = 0;
static int log_mouse = 0;
static int log_redraw = 0;
-
-static BOOL_T hideBox = FALSE;
+static int log_timemainredraw = 0;
+static int log_mapsize = 0;
static wFontSize_t drawMaxTextFontSize = 100;
@@ -85,11 +66,14 @@ static wFontSize_t drawMaxTextFontSize = 100;
// static char FAR message[STR_LONG_SIZE];
-EXPORT wPos_t closePixels = 10;
EXPORT long maxArcSegStraightLen = 100;
EXPORT long drawCount;
EXPORT BOOL_T drawEnable = TRUE;
EXPORT long currRedraw = 0;
+EXPORT long constrainMain = 0;
+//EXPORT long mapScale = 64;
+EXPORT long liveMap = 0;
+EXPORT long descriptionFontSize = 72;
EXPORT coOrd panCenter;
EXPORT coOrd menuPos;
@@ -100,10 +84,15 @@ EXPORT wDrawColor drawColorRed;
EXPORT wDrawColor drawColorBlue;
EXPORT wDrawColor drawColorGreen;
EXPORT wDrawColor drawColorAqua;
+EXPORT wDrawColor drawColorDkRed;
+EXPORT wDrawColor drawColorDkBlue;
+EXPORT wDrawColor drawColorDkGreen;
+EXPORT wDrawColor drawColorDkAqua;
EXPORT wDrawColor drawColorPreviewSelected;
EXPORT wDrawColor drawColorPreviewUnselected;
EXPORT wDrawColor drawColorPowderedBlue;
EXPORT wDrawColor drawColorPurple;
+EXPORT wDrawColor drawColorMagenta;
EXPORT wDrawColor drawColorGold;
EXPORT wDrawColor drawColorGrey10;
EXPORT wDrawColor drawColorGrey20;
@@ -125,8 +114,8 @@ EXPORT DIST_T pixelBins = 80;
*
*/
-static wPos_t infoHeight;
-static wPos_t textHeight;
+static wWinPix_t infoHeight;
+static wWinPix_t textHeight;
EXPORT wWin_p mapW;
EXPORT BOOL_T mapVisible;
EXPORT BOOL_T magneticSnap;
@@ -142,24 +131,26 @@ EXPORT wDrawColor elevColorDefined;
EXPORT wDrawColor profilePathColor;
EXPORT wDrawColor exceptionColor;
+DIST_T closeDist = 0.100;
+
static wFont_p rulerFp;
static struct {
- wStatus_p scale_m;
- wStatus_p count_m;
- wStatus_p posX_m;
- wStatus_p posY_m;
- wStatus_p info_m;
- wPos_t scale_w;
- wPos_t count_w;
- wPos_t pos_w;
- wPos_t info_w;
- wBox_p scale_b;
- wBox_p count_b;
- wBox_p posX_b;
- wBox_p posY_b;
- wBox_p info_b;
- } infoD;
+ wStatus_p scale_m;
+ wStatus_p count_m;
+ wStatus_p posX_m;
+ wStatus_p posY_m;
+ wStatus_p info_m;
+ wWinPix_t scale_w;
+ wWinPix_t count_w;
+ wWinPix_t pos_w;
+ wWinPix_t info_w;
+ wBox_p scale_b;
+ wBox_p count_b;
+ wBox_p posX_b;
+ wBox_p posY_b;
+ wBox_p info_b;
+} infoD;
EXPORT coOrd oldMarker = { 0.0, 0.0 };
@@ -170,7 +161,8 @@ EXPORT BOOL_T inError = FALSE;
typedef enum { mouseNone, mouseLeft, mouseRight, mouseLeftPending } mouseState_e;
static mouseState_e mouseState;
-static int mousePositionx, mousePositiony; /**< position of mouse pointer */
+static wDrawPix_t mousePositionx,
+ mousePositiony; /**< position of mouse pointer */
static int delayUpdate = 1;
@@ -179,47 +171,71 @@ static char yLabel[] = "Y: ";
static char zoomLabel[] = "Zoom: ";
static struct {
- char * name;
- double value;
- wMenuRadio_p pdRadio;
- wMenuRadio_p btRadio;
- wMenuRadio_p ctxRadio1;
- wMenuRadio_p panRadio;
- } zoomList[] = {
- { "1:10", 1.0 / 10.0 },
- { "1:9", 1.0 / 9.0 },
- { "1:8", 1.0 / 8.0 },
- { "1:7", 1.0 / 7.0 },
- { "1:6", 1.0 / 6.0 },
- { "1:5", 1.0 / 5.0 },
- { "1:4", 1.0 / 4.0 },
- { "1:3", 1.0 / 3.0 },
- { "1:2", 1.0 / 2.0 },
- { "1:1", 1.0 },
- { "2:1", 2.0 },
- { "3:1", 3.0 },
- { "4:1", 4.0 },
- { "5:1", 5.0 },
- { "6:1", 6.0 },
- { "7:1", 7.0 },
- { "8:1", 8.0 },
- { "9:1", 9.0 },
- { "10:1", 10.0 },
- { "12:1", 12.0 },
- { "14:1", 14.0 },
- { "16:1", 16.0 },
- { "18:1", 18.0 },
- { "20:1", 20.0 },
- { "24:1", 24.0 },
- { "28:1", 28.0 },
- { "32:1", 32.0 },
- { "36:1", 36.0 },
- { "40:1", 40.0 },
- { "48:1", 48.0 },
- { "56:1", 56.0 },
- { "64:1", 64.0 },
- { "128:1", 128.0 },
- { "256:1", 256.0 },
+ char * name;
+ DIST_T value;
+ wMenuRadio_p pdRadio;
+ wMenuRadio_p btRadio;
+ wMenuRadio_p ctxRadio1;
+ wMenuRadio_p panRadio;
+} zoomList[] = {
+ { "1:10", 1.0 / 10.0 },
+ { "1:9", 1.0 / 9.0 },
+ { "1:8", 1.0 / 8.0 },
+ { "1:7", 1.0 / 7.0 },
+ { "1:6", 1.0 / 6.0 },
+ { "1:5", 1.0 / 5.0 },
+ { "1:4", 1.0 / 4.0 },
+ { "1:3.5", 1.0 / 3.5 },
+ { "1:3", 1.0 / 3.0 },
+ { "1:2.5", 1.0 / 2.5 },
+ { "1:2", 1.0 / 2.0 },
+ { "1:1.75", 1.0 / 1.75 },
+ { "1:1.5", 1.0 / 1.5 },
+ { "1:1.25", 1.0 / 1.25 },
+ { "1:1", 1.0 },
+ { "1.25:1", 1.25 },
+ { "1.5:1", 1.5 },
+ { "1.75:1", 1.75 },
+ { "2:1", 2.0 },
+ { "2.5:1", 2.5 },
+ { "3:1", 3.0 },
+ { "3.5:1", 3.5 },
+ { "4:1", 4.0 },
+ { "5:1", 5.0 },
+ { "6:1", 6.0 },
+ { "7:1", 7.0 },
+ { "8:1", 8.0 },
+ { "9:1", 9.0 },
+ { "10:1", 10.0 },
+ { "12:1", 12.0 },
+ { "14:1", 14.0 },
+ { "16:1", 16.0 },
+ { "18:1", 18.0 },
+ { "20:1", 20.0 },
+ { "24:1", 24.0 },
+ { "28:1", 28.0 },
+ { "32:1", 32.0 },
+ { "36:1", 36.0 },
+ { "40:1", 40.0 },
+ { "48:1", 48.0 },
+ { "56:1", 56.0 },
+ { "64:1", 64.0 },
+ { "80:1", 80.0 },
+ { "96:1", 96.0 },
+ { "112:1", 112.0 },
+ { "128:1", 128.0 },
+ { "160:1", 160.0 },
+ { "192:1", 192.0 },
+ { "224:1", 224.0 },
+ { "256:1", 256.0 },
+ { "320:1", 320.0 },
+ { "384:1", 384.0 },
+ { "448:1", 448.0 },
+ { "512:1", 512.0 },
+ { "640:1", 640.0 },
+ { "768:1", 768.0 },
+ { "896:1", 896.0 },
+ { "1024:1", 1024.0 },
};
@@ -230,35 +246,39 @@ static struct {
*
*/
-static void MainCoOrd2Pix( drawCmd_p d, coOrd p, wPos_t * x, wPos_t * y )
+static void MainCoOrd2Pix( drawCmd_p d, coOrd p, wDrawPix_t * x,
+ wDrawPix_t * y )
{
DIST_T t;
- if (d->angle != 0.0)
+ if (d->angle != 0.0) {
Rotate( &p, d->orig, -d->angle );
+ }
p.x = (p.x - d->orig.x) / d->scale;
p.y = (p.y - d->orig.y) / d->scale;
t = p.x*d->dpi;
- if ( t > 0.0 )
+ if ( t > 0.0 ) {
t += 0.5;
- else
+ } else {
t -= 0.5;
- *x = ((wPos_t)t) + ((d->options&DC_TICKS)?LBORDER:0);
+ }
+ *x = ((wDrawPix_t)t) + ((d->options&DC_TICKS)?LBORDER:0);
t = p.y*d->dpi;
- if ( t > 0.0 )
+ if ( t > 0.0 ) {
t += 0.5;
- else
+ } else {
t -= 0.5;
- *y = ((wPos_t)t) + ((d->options&DC_TICKS)?BBORDER:0);
+ }
+ *y = ((wDrawPix_t)t) + ((d->options&DC_TICKS)?BBORDER:0);
}
static int Pix2CoOrd_interpolate = 0;
static void MainPix2CoOrd(
- drawCmd_p d,
- wPos_t px,
- wPos_t py,
- coOrd * posR )
+ drawCmd_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ coOrd * posR )
{
DIST_T x, y;
DIST_T bins = pixelBins;
@@ -266,19 +286,20 @@ static void MainPix2CoOrd(
y = ((((POS_T)((py)-BBORDER))/d->dpi)) * d->scale;
x = (long)(x*bins)/bins;
y = (long)(y*bins)/bins;
-if (Pix2CoOrd_interpolate) {
- DIST_T x1, y1;
- x1 = ((((POS_T)((px-1)-LBORDER))/d->dpi)) * d->scale;
- y1 = ((((POS_T)((py-1)-BBORDER))/d->dpi)) * d->scale;
- x1 = (long)(x1*bins)/bins;
- y1 = (long)(y1*bins)/bins;
- if (x == x1) {
- x += 1/bins/2;
- printf ("px=%d x1=%0.6f x=%0.6f\n", px, x1, x );
- }
- if (y == y1)
- y += 1/bins/2;
-}
+ if (Pix2CoOrd_interpolate) {
+ DIST_T x1, y1;
+ x1 = ((((POS_T)((px-1)-LBORDER))/d->dpi)) * d->scale;
+ y1 = ((((POS_T)((py-1)-BBORDER))/d->dpi)) * d->scale;
+ x1 = (long)(x1*bins)/bins;
+ y1 = (long)(y1*bins)/bins;
+ if (x == x1) {
+ x += 1/bins/2;
+ printf ("px=%0.1f x1=%0.6f x=%0.6f\n", px, x1, x );
+ }
+ if (y == y1) {
+ y += 1/bins/2;
+ }
+ }
x += d->orig.x;
y += d->orig.y;
posR->x = x;
@@ -286,37 +307,41 @@ if (Pix2CoOrd_interpolate) {
}
+#define DRAWOPTS( D ) (((D->options&DC_TEMP)?wDrawOptTemp:0)|((D->options&DC_OUTLINE)?wDrawOutlineFont:0))
+
static void DDrawLine(
- drawCmd_p d,
- coOrd p0,
- coOrd p1,
- wDrawWidth width,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p0,
+ coOrd p1,
+ wDrawWidth width,
+ wDrawColor color )
{
- wPos_t x0, y0, x1, y1;
+ wDrawPix_t x0, y0, x1, y1;
BOOL_T in0 = FALSE, in1 = FALSE;
coOrd orig, size;
- if (d == &mapD && !mapVisible)
+ if (d == &mapD && !mapVisible) {
return;
- if ( (d->options&DC_NOCLIP) == 0 ) {
- if (d->angle == 0.0) {
- in0 = (p0.x >= d->orig.x && p0.x <= d->orig.x+d->size.x &&
- p0.y >= d->orig.y && p0.y <= d->orig.y+d->size.y);
- in1 = (p1.x >= d->orig.x && p1.x <= d->orig.x+d->size.x &&
- p1.y >= d->orig.y && p1.y <= d->orig.y+d->size.y);
- }
- if ( (!in0) || (!in1) ) {
- orig = d->orig;
- size = d->size;
- if (d->options&DC_TICKS) {
- orig.x -= LBORDER/d->dpi*d->scale;
- orig.y -= BBORDER/d->dpi*d->scale;
- size.x += (LBORDER+RBORDER)/d->dpi*d->scale;
- size.y += (BBORDER+TBORDER)/d->dpi*d->scale;
- }
- if (!ClipLine( &p0, &p1, orig, d->angle, size ))
- return;
}
+ if ( (d->options&DC_NOCLIP) == 0 ) {
+ if (d->angle == 0.0) {
+ in0 = (p0.x >= d->orig.x && p0.x <= d->orig.x+d->size.x &&
+ p0.y >= d->orig.y && p0.y <= d->orig.y+d->size.y);
+ in1 = (p1.x >= d->orig.x && p1.x <= d->orig.x+d->size.x &&
+ p1.y >= d->orig.y && p1.y <= d->orig.y+d->size.y);
+ }
+ if ( (!in0) || (!in1) ) {
+ orig = d->orig;
+ size = d->size;
+ if (d->options&DC_TICKS) {
+ orig.x -= LBORDER/d->dpi*d->scale;
+ orig.y -= BBORDER/d->dpi*d->scale;
+ size.x += (LBORDER+RBORDER)/d->dpi*d->scale;
+ size.y += (BBORDER+TBORDER)/d->dpi*d->scale;
+ }
+ if (!ClipLine( &p0, &p1, orig, d->angle, size )) {
+ return;
+ }
+ }
}
d->CoOrd2Pix(d,p0,&x0,&y0);
d->CoOrd2Pix(d,p1,&x1,&y1);
@@ -324,128 +349,129 @@ static void DDrawLine(
wDrawLineType_e lineOpt = wDrawLineSolid;
unsigned long NotSolid = DC_NOTSOLIDLINE;
unsigned long opt = d->options&NotSolid;
- if (opt == DC_DASH)
- lineOpt = wDrawLineDash;
- else if(opt == DC_DOT)
- lineOpt = wDrawLineDot;
- else if(opt == DC_DASHDOT)
- lineOpt = wDrawLineDashDot;
- else if (opt == DC_DASHDOTDOT)
- lineOpt = wDrawLineDashDotDot;
- else if(opt == DC_CENTER)
- lineOpt = wDrawLineCenter;
- else if (opt == DC_PHANTOM)
- lineOpt = wDrawLinePhantom;
+ if (opt == DC_DASH) {
+ lineOpt = wDrawLineDash;
+ } else if(opt == DC_DOT) {
+ lineOpt = wDrawLineDot;
+ } else if(opt == DC_DASHDOT) {
+ lineOpt = wDrawLineDashDot;
+ } else if (opt == DC_DASHDOTDOT) {
+ lineOpt = wDrawLineDashDotDot;
+ } else if(opt == DC_CENTER) {
+ lineOpt = wDrawLineCenter;
+ } else if (opt == DC_PHANTOM) {
+ lineOpt = wDrawLinePhantom;
+ }
if (drawEnable) {
wDrawLine( d->d, x0, y0, x1, y1,
- width,
- lineOpt,
- color, (wDrawOpts)d->funcs->options );
+ width,
+ lineOpt,
+ color, DRAWOPTS(d) );
}
}
static void DDrawArc(
- drawCmd_p d,
- coOrd p,
- DIST_T r,
- ANGLE_T angle0,
- ANGLE_T angle1,
- BOOL_T drawCenter,
- wDrawWidth width,
- wDrawColor color )
-{
- wPos_t x, y;
- ANGLE_T da;
- coOrd p0, p1;
- DIST_T rr;
- int i, cnt;
-
- if (d == &mapD && !mapVisible)
- {
- return;
- }
- rr = (r / d->scale) * d->dpi + 0.5;
- if (rr > wDrawGetMaxRadius(d->d))
- {
- da = (maxArcSegStraightLen * 180) / (M_PI * rr);
- cnt = (int)(angle1/da) + 1;
- da = angle1 / cnt;
- coOrd min,max;
- min = d->orig;
- max.x = min.x + d->size.x;
- max.y = min.y + d->size.y;
- PointOnCircle(&p0, p, r, angle0);
- for (i=1; i<=cnt; i++) {
- angle0 += da;
- PointOnCircle(&p1, p, r, angle0);
- if (d->angle == 0.0 &&
- ((p0.x >= min.x &&
- p0.x <= max.x &&
- p0.y >= min.y &&
- p0.y <= max.y) ||
- (p1.x >= min.x &&
- p1.x <= max.x &&
- p1.y >= min.y &&
- p1.y <= max.y))) {
- DrawLine(d, p0, p1, width, color);
- } else {
- coOrd clip0 = p0, clip1 = p1;
- if (ClipLine(&clip0, &clip1, d->orig, d->angle, d->size)) {
- DrawLine(d, clip0, clip1, width, color);
- }
- }
-
- p0 = p1;
- }
- return;
- }
- if (d->angle!=0.0 && angle1 < 360.0)
- {
- angle0 = NormalizeAngle(angle0-d->angle);
- }
- d->CoOrd2Pix(d,p,&x,&y);
- drawCount++;
- wDrawLineType_e lineOpt = wDrawLineSolid;
- unsigned long NotSolid = DC_NOTSOLIDLINE;
- unsigned long opt = d->options&NotSolid;
- if (opt == DC_DASH)
+ drawCmd_p d,
+ coOrd p,
+ DIST_T r,
+ ANGLE_T angle0,
+ ANGLE_T angle1,
+ BOOL_T drawCenter,
+ wDrawWidth width,
+ wDrawColor color )
+{
+ wDrawPix_t x, y;
+ ANGLE_T da;
+ coOrd p0, p1;
+ DIST_T rr;
+ int i, cnt;
+
+ if (d == &mapD && !mapVisible) {
+ return;
+ }
+ rr = (r / d->scale) * d->dpi + 0.5;
+ if (rr > wDrawGetMaxRadius(d->d)) {
+ da = (maxArcSegStraightLen * 180) / (M_PI * rr);
+ cnt = (int)(angle1/da) + 1;
+ da = angle1 / cnt;
+ coOrd min,max;
+ min = d->orig;
+ max.x = min.x + d->size.x;
+ max.y = min.y + d->size.y;
+ PointOnCircle(&p0, p, r, angle0);
+ for (i=1; i<=cnt; i++) {
+ angle0 += da;
+ PointOnCircle(&p1, p, r, angle0);
+ if (d->angle == 0.0 &&
+ ((p0.x >= min.x &&
+ p0.x <= max.x &&
+ p0.y >= min.y &&
+ p0.y <= max.y) ||
+ (p1.x >= min.x &&
+ p1.x <= max.x &&
+ p1.y >= min.y &&
+ p1.y <= max.y))) {
+ DrawLine(d, p0, p1, width, color);
+ } else {
+ coOrd clip0 = p0, clip1 = p1;
+ if (ClipLine(&clip0, &clip1, d->orig, d->angle, d->size)) {
+ DrawLine(d, clip0, clip1, width, color);
+ }
+ }
+
+ p0 = p1;
+ }
+ return;
+ }
+ if (d->angle!=0.0 && angle1 < 360.0) {
+ angle0 = NormalizeAngle(angle0-d->angle);
+ }
+ d->CoOrd2Pix(d,p,&x,&y);
+ drawCount++;
+ wDrawLineType_e lineOpt = wDrawLineSolid;
+ unsigned long NotSolid = DC_NOTSOLIDLINE;
+ unsigned long opt = d->options&NotSolid;
+ if (opt == DC_DASH) {
lineOpt = wDrawLineDash;
- else if(opt == DC_DOT)
+ } else if(opt == DC_DOT) {
lineOpt = wDrawLineDot;
- else if(opt == DC_DASHDOT)
+ } else if(opt == DC_DASHDOT) {
lineOpt = wDrawLineDashDot;
- else if (opt == DC_DASHDOTDOT)
+ } else if (opt == DC_DASHDOTDOT) {
lineOpt = wDrawLineDashDotDot;
- else if(opt == DC_CENTER)
+ } else if(opt == DC_CENTER) {
lineOpt = wDrawLineCenter;
- else if (opt == DC_PHANTOM)
+ } else if (opt == DC_PHANTOM) {
lineOpt = wDrawLinePhantom;
- if (drawEnable)
- {
- wDrawArc(d->d, x, y, (wPos_t)(rr), angle0, angle1, drawCenter,
- width, lineOpt,
- color, (wDrawOpts)d->funcs->options);
- }
+ }
+ if (drawEnable) {
+ int sizeCenter = (int)(drawCenter ? ((d->options & DC_PRINT) ?
+ (d->dpi / BASE_DPI) : 1) : 0);
+ wDrawArc(d->d, x, y, (wDrawPix_t)(rr), angle0, angle1, sizeCenter,
+ width, lineOpt,
+ color, DRAWOPTS(d) );
+ }
}
static void DDrawString(
- drawCmd_p d,
- coOrd p,
- ANGLE_T a,
- char * s,
- wFont_p fp,
- FONTSIZE_T fontSize,
- wDrawColor color )
-{
- wPos_t x, y;
- if (d == &mapD && !mapVisible)
+ drawCmd_p d,
+ coOrd p,
+ ANGLE_T a,
+ char * s,
+ wFont_p fp,
+ FONTSIZE_T fontSize,
+ wDrawColor color )
+{
+ wDrawPix_t x, y;
+ if (d == &mapD && !mapVisible) {
return;
+ }
d->CoOrd2Pix(d,p,&x,&y);
if ( color == wDrawColorWhite ) {
- wPos_t width, height, descent, ascent;
+ wDrawPix_t width, height, descent, ascent;
coOrd pos[4], size;
double scale = 1.0;
wDrawGetTextSize( &width, &height, &descent, &ascent, d->d, s, fp, fontSize );
@@ -461,29 +487,30 @@ static void DDrawString(
Rotate( &pos[1], pos[0], a );
Rotate( &pos[2], pos[0], a );
Rotate( &pos[3], pos[0], a );
- DDrawPoly( d, 4, pos, NULL, color, 0, 1, 0 );
+ DDrawPoly( d, 4, pos, NULL, color, 0, DRAW_FILL );
} else {
fontSize /= d->scale;
- wDrawString( d->d, x, y, d->angle-a, s, fp, fontSize, color, (wDrawOpts)d->funcs->options );
+ wDrawString( d->d, x, y, d->angle-a, s, fp, fontSize, color, DRAWOPTS(d) );
}
}
static void DDrawPoly(
- drawCmd_p d,
- int cnt,
- coOrd * pts,
- int * types,
- wDrawColor color,
- wDrawWidth width,
- int fill,
- int open )
-{
- typedef wPos_t wPos2[2];
+ drawCmd_p d,
+ int cnt,
+ coOrd * pts,
+ int * types,
+ wDrawColor color,
+ wDrawWidth width,
+ drawFill_e eFillOpt )
+{
+ typedef wDrawPix_t wPos2[2];
static dynArr_t wpts_da;
static dynArr_t wpts_type_da;
int inx;
- wPos_t x, y;
+ int fill = 0;
+ int open = 0;
+ wDrawPix_t x, y;
DYNARR_SET( wPos2, wpts_da, cnt * 2 );
DYNARR_SET( int, wpts_type_da, cnt);
#define wpts(N) DYNARR_N( wPos2, wpts_da, N )
@@ -492,114 +519,174 @@ static void DDrawPoly(
d->CoOrd2Pix( d, pts[inx], &x, &y );
wpts(inx)[0] = x;
wpts(inx)[1] = y;
- if (!types)
+ if (!types) {
wtype(inx) = 0;
- else
+ } else {
wtype(inx) = (wPolyLine_e)types[inx];
+ }
}
wDrawLineType_e lineOpt = wDrawLineSolid;
unsigned long NotSolid = DC_NOTSOLIDLINE;
unsigned long opt = d->options&NotSolid;
- if (opt == DC_DASH)
+ if (opt == DC_DASH) {
lineOpt = wDrawLineDash;
- else if(opt == DC_DOT)
+ } else if(opt == DC_DOT) {
lineOpt = wDrawLineDot;
- else if(opt == DC_DASHDOT)
+ } else if(opt == DC_DASHDOT) {
lineOpt = wDrawLineDashDot;
- else if (opt == DC_DASHDOTDOT)
+ } else if (opt == DC_DASHDOTDOT) {
lineOpt = wDrawLineDashDotDot;
- else if(opt == DC_CENTER)
+ } else if(opt == DC_CENTER) {
lineOpt = wDrawLineCenter;
- else if (opt == DC_PHANTOM)
+ } else if (opt == DC_PHANTOM) {
lineOpt = wDrawLinePhantom;
- wDrawPolygon( d->d, &wpts(0), &wtype(0), cnt, color, width, lineOpt, (wDrawOpts)d->funcs->options, fill, open );
+ }
+
+ wDrawOpts drawOpts = DRAWOPTS(d);
+ switch ( eFillOpt ) {
+ case DRAW_OPEN:
+ open = 1;
+ break;
+ case DRAW_CLOSED:
+ break;
+ case DRAW_FILL:
+ fill = 1;
+ break;
+ case DRAW_TRANSPARENT:
+ fill = 1;
+ drawOpts |= wDrawOptTransparent;
+ break;
+ default:
+ CHECK(FALSE);
+ }
+ wDrawPolygon( d->d, &wpts(0), &wtype(0), cnt, color, width, lineOpt, drawOpts,
+ fill, open );
}
static void DDrawFillCircle(
- drawCmd_p d,
- coOrd p,
- DIST_T r,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p,
+ DIST_T r,
+ wDrawColor color )
{
- wPos_t x, y;
+ wDrawPix_t x, y;
DIST_T rr;
- if (d == &mapD && !mapVisible)
+ if (d == &mapD && !mapVisible) {
return;
+ }
rr = (r / d->scale) * d->dpi + 0.5;
if (rr > wDrawGetMaxRadius(d->d)) {
-#ifdef LATER
- da = (maxArcSegStraightLen * 180) / (M_PI * rr);
- cnt = (int)(angle1/da) + 1;
- da = angle1 / cnt;
- PointOnCircle( &p0, p, r, angle0 );
- for ( i=1; i<=cnt; i++ ) {
- angle0 += da;
- PointOnCircle( &p1, p, r, angle0 );
- DrawLine( d, p0, p1, width, color );
- p0 = p1;
- }
-#endif
+ // Circle too big
return;
}
d->CoOrd2Pix(d,p,&x,&y);
+ wWinPix_t w, h;
+ wDrawGetSize( d->d, &w, &h );
+ if ( d->options & DC_TICKS ) {
+ if ( x+rr < LBORDER || x-rr > w-RBORDER ||
+ y+rr < BBORDER || y-rr > h-TBORDER ) {
+ return;
+ }
+ } else {
+ if ( x+rr < 0 || x-rr > w ||
+ y+rr < 0 || y-rr > h ) {
+ return;
+ }
+ }
drawCount++;
if (drawEnable) {
- wDrawFilledCircle( d->d, x, y, (wPos_t)(rr),
- color, (wDrawOpts)d->funcs->options );
+ wDrawFilledCircle( d->d, x, y, (wDrawPix_t)(rr),
+ color, DRAWOPTS(d) );
}
}
-EXPORT void DrawHilight( drawCmd_p d, coOrd p, coOrd s, BOOL_T add )
+static void DDrawRectangle(
+ drawCmd_p d,
+ coOrd orig,
+ coOrd size,
+ wDrawColor color,
+ drawFill_e eFillOpt )
{
- wPos_t x, y, w, h;
- if (d == &mapD && !mapVisible)
+ wDrawPix_t x, y, w, h;
+
+ if (d == &mapD && !mapVisible) {
return;
- w = (wPos_t)((s.x/d->scale)*d->dpi+0.5);
- h = (wPos_t)((s.y/d->scale)*d->dpi+0.5);
- d->CoOrd2Pix(d,p,&x,&y);
- if ( add )
- wDrawFilledRectangle( d->d, x, y, w, h, drawColorPowderedBlue, wDrawOptTemp|wDrawOptTransparent );
- else
- wDrawFilledRectangle( d->d, x, y, w, h, selectedColor, wDrawOptTemp|wDrawOptTransparent );
+ }
+ d->CoOrd2Pix(d,orig,&x,&y);
+ w = (wDrawPix_t)((size.x/d->scale)*d->dpi+0.5);
+ h = (wDrawPix_t)((size.y/d->scale)*d->dpi+0.5);
+ drawCount++;
+ if (drawEnable) {
+ wDrawOpts opts = DRAWOPTS(d);
+ coOrd p1, p2;
+ switch (eFillOpt) {
+ case DRAW_CLOSED:
+ // 1 2
+ // 0 3
+ p1.x = orig.x;
+ p1.y = orig.y+size.y;
+ DrawLine( d, orig, p1, 0, color );
+ p2.x = orig.x+size.x;
+ p2.y = p1.y;
+ DrawLine( d, p1, p2, 0, color );
+ p1.x = p2.x;
+ p1.y = orig.y;
+ DrawLine( d, p2, p1, 0, color );
+ DrawLine( d, p1, orig, 0, color );
+ break;
+ case DRAW_TRANSPARENT:
+ opts |= wDrawOptTransparent;
+ // Fallthru
+ case DRAW_FILL:
+ if ( d->options & DC_ROUND ) {
+ x = round(x);
+ y = round(y);
+ }
+ wDrawFilledRectangle( d->d, x, y, w, h, color, opts );
+ break;
+ default:
+ CHECK(FALSE);
+ }
+ }
+}
+
+EXPORT void DrawHilight( drawCmd_p d, coOrd p, coOrd s, BOOL_T add )
+{
+ unsigned long options = d->options;
+ d->options |= DC_TEMP;
+ wBool_t bTemp = wDrawSetTempMode( d->d, TRUE );
+ DrawRectangle( d, p, s, add?drawColorPowderedBlue:selectedColor,
+ DRAW_TRANSPARENT );
+ wDrawSetTempMode( d->d, bTemp );
+ d->options = options;
}
EXPORT void DrawHilightPolygon( drawCmd_p d, coOrd *p, int cnt )
{
- wPos_t q[4][2];
- int i;
-#ifdef LATER
- if (d->options&DC_TEMPSEGS) {
- return;
- }
- if (d->options&DC_PRINT)
- return;
-#endif
- ASSERT( cnt <= 4 );
- for (i=0; i<cnt; i++) {
- d->CoOrd2Pix(d,p[i],&q[i][0],&q[i][1]);
- }
+ CHECK( cnt <= 4 );
static wDrawColor color = 0;
- if ( color == 0 )
+ if ( color == 0 ) {
color = wDrawColorGray( 70 );
- wDrawPolygon( d->d, q, NULL, cnt, color, 0, 0, wDrawOptTemp|wDrawOptTransparent, 1, 0 );
+ }
+ DrawPoly( d, cnt, p, NULL, color, 0, DRAW_TRANSPARENT );
}
EXPORT void DrawMultiString(
- drawCmd_p d,
- coOrd pos,
- char * text,
- wFont_p fp,
- wFontSize_t fs,
- wDrawColor color,
- ANGLE_T a,
- coOrd * lo,
- coOrd * hi,
- BOOL_T boxed)
+ drawCmd_p d,
+ coOrd pos,
+ char * text,
+ wFont_p fp,
+ wFontSize_t fs,
+ wDrawColor color,
+ ANGLE_T a,
+ coOrd * lo,
+ coOrd * hi,
+ BOOL_T boxed)
{
char * cp;
char * cp1;
@@ -623,21 +710,24 @@ EXPORT void DrawMultiString(
cp = line; // Build up message to hold all of the strings separated by nulls
while (*text) {
cp1 = cp;
- while (*text != '\0' && *text != '\n')
+ while (*text != '\0' && *text != '\n') {
*cp++ = *text++;
+ }
*cp = '\0';
DrawTextSize2( &mainD, cp1, fp, fs, TRUE, &textsize, &descent, &ascent);
lineW = textsize.x;
- if (lineW>size.x)
+ if (lineW>size.x) {
size.x = lineW;
+ }
posl.x = pos.x;
posl.y = pos.y;
Rotate( &posl, orig, a);
DrawString( d, posl, a, cp1, fp, fs, color );
pos.y -= lineH;
size.y += lineH;
- if (*text == '\0')
+ if (*text == '\0') {
break;
+ }
text++;
cp++;
}
@@ -655,117 +745,143 @@ EXPORT void DrawMultiString(
size.y = fabs(orig.y-posl.y)+bh*d->scale/d->dpi;
size.y += descent+ascent;
coOrd p[4];
- p[0] = orig; p[0].x -= (bw-br)*d->scale/d->dpi; p[0].y += (bh-bb)*d->scale/d->dpi+ascent;
+ p[0] = orig; p[0].x -= (bw-br)*d->scale/d->dpi;
+ p[0].y += (bh-bb)*d->scale/d->dpi+ascent;
p[1] = p[0]; p[1].x += size.x;
p[2] = p[1]; p[2].y -= size.y;
p[3] = p[2]; p[3].x = p[0].x;
- for (int i=0;i<4;i++) {
+ for (int i=0; i<4; i++) {
Rotate( &p[i], orig, a);
}
- DrawLine( d, p[0], p[1], 0, color );
- DrawLine( d, p[1], p[2], 0, color );
- DrawLine( d, p[2], p[3], 0, color );
- DrawLine( d, p[3], p[0], 0, color );
+ DrawPoly( d, 4, p, NULL, color, 0, DRAW_CLOSED );
}
free(line);
}
+/**
+ * Draw some text inside a box. The layout of the box can be defined using the style
+ * parameter. Possibilities are complete frame, underline only, omit background or
+ * draw inversed.
+ * The background is drawn in white if not disabled
+ *
+ * \param style style of box framed, underlined, no background, inverse
+ * \param d drawing command
+ * \param pos position
+ * \param text text to draw
+ * \param fp font
+ * \param fs font size
+ * \param color text color
+ * \param a angle
+ */
EXPORT void DrawBoxedString(
- int style,
- drawCmd_p d,
- coOrd pos,
- char * text,
- wFont_p fp, wFontSize_t fs,
- wDrawColor color,
- ANGLE_T a )
-{
- coOrd size, p[4], p0=pos, p1, p2;
- static int bw=2, bh=2, br=1, bb=1;
+ int style,
+ drawCmd_p d,
+ coOrd pos,
+ char* text,
+ wFont_p fp, wFontSize_t fs,
+ wDrawColor color,
+ ANGLE_T a)
+{
+ coOrd size, p[4], p0 = pos, p1, p2;
+ static int bw = 2, bh = 2, br = 1, bb = 1;
static double arrowScale = 0.5;
- unsigned long options = d->options;
POS_T descent, ascent;
- /*DrawMultiString( d, pos, text, fp, fs, color, a, &lo, &hi );*/
- if ( fs < 2*d->scale )
+ if (fs < 2 * d->scale) {
return;
+ }
#ifndef WINDOWS
- if ( ( d->options & DC_PRINT) != 0 ) {
- double scale = ((FLOAT_T)fs)/((FLOAT_T)drawMaxTextFontSize)/72.0;
- wPos_t w, h, d, a;
- wDrawGetTextSize( &w, &h, &d, &a, mainD.d, text, fp, drawMaxTextFontSize );
- size.x = w*scale;
- size.y = h*scale;
- descent = d*scale;
- ascent = a*scale;
+ if ((d->options & DC_PRINT) != 0) {
+ double scale = ((FLOAT_T)fs) / ((FLOAT_T)drawMaxTextFontSize) / mainD.dpi;
+ wDrawPix_t w, h, d, a;
+ wDrawGetTextSize(&w, &h, &d, &a, mainD.d, text, fp, drawMaxTextFontSize);
+ size.x = w * scale;
+ size.y = h * scale;
+ descent = d * scale;
+ ascent = a * scale;
} else
#endif
- DrawTextSize2( &mainD, text, fp, fs, TRUE, &size, &descent, &ascent );
-#ifdef WINDOWS
- /*h -= 15;*/
-#endif
- p0.x -= size.x/2.0;
- p0.y -= size.y/2.0;
+ DrawTextSize2(&mainD, text, fp, fs, TRUE, &size, &descent, &ascent);
+
+ p0.x -= size.x / 2.0;
+ p0.y -= size.y / 2.0;
if (style == BOX_NONE || d == &mapD) {
- DrawString( d, p0, 0.0, text, fp, fs, color );
+ DrawString(d, p0, 0.0, text, fp, fs, color);
return;
}
- size.x += bw*d->scale/d->dpi;
- size.y += bh*d->scale/d->dpi;
+ size.x += bw * d->scale / d->dpi;
+ size.y += bh * d->scale / d->dpi;
p[0] = p0;
- p[0].x -= br*d->scale/d->dpi;
- p[0].y -= (bb*d->scale/d->dpi+descent);
+ p[0].x -= br * d->scale / d->dpi; //Top of box
+ p[0].y += (bb * d->scale / d->dpi + ascent);
p[1].y = p[0].y;
- p[2].y = p[3].y = p[0].y + size.y;
+ p[2].y = p[3].y = p[0].y - size.y - descent; //Bottom of box
p[1].x = p[2].x = p[0].x + size.x;
p[3].x = p[0].x;
d->options &= ~DC_DASH;
switch (style) {
case BOX_ARROW:
- Translate( &p1, pos, a, size.x+size.y );
- ClipLine( &pos, &p1, p[0], 0.0, size );
- Translate( &p2, p1, a, size.y*arrowScale );
- DrawLine( d, p1, p2, 0, color );
- Translate( &p1, p2, a+150, size.y*0.7*arrowScale );
- DrawLine( d, p1, p2, 0, color );
- Translate( &p1, p2, a-150, size.y*0.7*arrowScale );
- DrawLine( d, p1, p2, 0, color );
+ case BOX_ARROW_BACKGROUND:
+ // Reset size to actual size of the box
+ size.x = p[2].x - p[0].x;
+ size.y = p[0].y - p[2].y;
+ // Pick a point (p1) outside of Box in arrow direction
+ Translate(&p1, pos, a, size.x + size.y);
+ // Find point on edge of Box (p1)
+ ClipLine(&pos, &p1, p[3], 0.0, size);
+ // Draw line from edge (p1) to Arrow head (p2)
+ Translate(&p2, p1, a, size.y * arrowScale);
+ DrawLine(d, p1, p2, 0, color);
+ // Draw Arrow edges
+ Translate(&p1, p2, a + 150, size.y * 0.7 * arrowScale);
+ DrawLine(d, p1, p2, 0, color);
+ Translate(&p1, p2, a - 150, size.y * 0.7 * arrowScale);
+ DrawLine(d, p1, p2, 0, color);
+ /* no break */
case BOX_BOX:
- DrawLine( d, p[1], p[2], 0, color );
- DrawLine( d, p[2], p[3], 0, color );
- DrawLine( d, p[3], p[0], 0, color );
+ case BOX_BOX_BACKGROUND:
+ if (style == BOX_ARROW_BACKGROUND || style == BOX_BOX_BACKGROUND) {
+ DrawPoly(d, 4, p, NULL, wDrawColorWhite, 0,
+ DRAW_FILL); //Clear background for box and box-arrow
+ }
+ DrawLine(d, p[1], p[2], 0, color);
+ DrawLine(d, p[2], p[3], 0, color);
+ DrawLine(d, p[3], p[0], 0, color);
+ /* no break */
case BOX_UNDERLINE:
- DrawLine( d, p[0], p[1], 0, color );
- DrawString( d, p0, 0.0, text, fp, fs, color );
+ DrawLine(d, p[0], p[1], 0, color);
+ DrawString(d, p0, 0.0, text, fp, fs, color);
break;
case BOX_INVERT:
- DrawPoly( d, 4, p, NULL, color, 0, 1, 0);
- if ( color != wDrawColorWhite )
- DrawString( d, p0, 0.0, text, fp, fs, wDrawColorGray( 94 ) );
+ DrawPoly(d, 4, p, NULL, color, 0, DRAW_FILL);
+ if (color != wDrawColorWhite) {
+ DrawString(d, p0, 0.0, text, fp, fs, wDrawColorGray(94));
+ }
break;
case BOX_BACKGROUND:
- DrawPoly( d, 4, p, NULL, wDrawColorWhite, 0, 1, 0 );
- DrawString( d, p0, 0.0, text, fp, fs, color );
+ DrawPoly(d, 4, p, NULL, wDrawColorWhite, 0, DRAW_FILL);
+ DrawString(d, p0, 0.0, text, fp, fs, color);
break;
}
- d->options = options;
}
EXPORT void DrawTextSize2(
- drawCmd_p dp,
- char * text,
- wFont_p fp,
- wFontSize_t fs,
- BOOL_T relative,
- coOrd * size,
- POS_T * descent,
- POS_T * ascent)
-{
- wPos_t w, h, d, a;
+ drawCmd_p dp,
+ char * text,
+ wFont_p fp,
+ wFontSize_t fs,
+ BOOL_T relative,
+ coOrd * size,
+ POS_T * descent,
+ POS_T * ascent)
+{
+ wDrawPix_t w, h, d, a;
FLOAT_T scale = 1.0;
- if ( relative )
+ if ( relative ) {
fs /= dp->scale;
+ }
if ( fs > drawMaxTextFontSize ) {
scale = ((FLOAT_T)fs)/((FLOAT_T)drawMaxTextFontSize);
fs = drawMaxTextFontSize;
@@ -781,29 +897,29 @@ EXPORT void DrawTextSize2(
*descent *= dp->scale;
*ascent *=dp->scale;
}
-/* printf( "DTS2(\"%s\",%0.3f,%d) = (w%d,h%d,d%d) *%0.3f x%0.3f y%0.3f %0.3f\n", text, fs, relative, w, h, d, scale, size->x, size->y, *descent );*/
+ /* printf( "DTS2(\"%s\",%0.3f,%d) = (w%d,h%d,d%d) *%0.3f x%0.3f y%0.3f %0.3f\n", text, fs, relative, w, h, d, scale, size->x, size->y, *descent );*/
}
EXPORT void DrawTextSize(
- drawCmd_p dp,
- char * text,
- wFont_p fp,
- wFontSize_t fs,
- BOOL_T relative,
- coOrd * size )
+ drawCmd_p dp,
+ char * text,
+ wFont_p fp,
+ wFontSize_t fs,
+ BOOL_T relative,
+ coOrd * size )
{
POS_T descent, ascent;
DrawTextSize2( dp, text, fp, fs, relative, size, &descent, &ascent );
}
EXPORT void DrawMultiLineTextSize(
- drawCmd_p dp,
- char * text,
- wFont_p fp,
- wFontSize_t fs,
- BOOL_T relative,
- coOrd * size,
- coOrd * lastline )
+ drawCmd_p dp,
+ char * text,
+ wFont_p fp,
+ wFontSize_t fs,
+ BOOL_T relative,
+ coOrd * size,
+ coOrd * lastline )
{
POS_T descent, ascent, lineW, lineH;
coOrd textsize, blocksize;
@@ -819,14 +935,16 @@ EXPORT void DrawMultiLineTextSize(
lastline->y = 0;
while (text && *text != '\0' ) {
cp = line;
- while (*text != '\0' && *text != '\n')
+ while (*text != '\0' && *text != '\n') {
*cp++ = *text++;
+ }
*cp = '\0';
blocksize.y += lineH;
DrawTextSize2( &mainD, line, fp, fs, TRUE, &textsize, &descent, &ascent);
lineW = textsize.x;
- if (lineW>blocksize.x)
+ if (lineW>blocksize.x) {
blocksize.x = lineW;
+ }
lastline->x = textsize.x;
if (*text =='\n') {
blocksize.y += lineH;
@@ -845,57 +963,57 @@ EXPORT void DrawMultiLineTextSize(
}
-static void DDrawBitMap( drawCmd_p d, coOrd p, wDrawBitMap_p bm, wDrawColor color)
+static void DDrawBitMap( drawCmd_p d, coOrd p, wDrawBitMap_p bm,
+ wDrawColor color)
{
- wPos_t x, y;
-#ifdef LATER
- if (d->options&DC_TEMPSEGS) {
- return;
- }
- if (d->options&DC_PRINT)
- return;
-#endif
+ wDrawPix_t x, y;
d->CoOrd2Pix( d, p, &x, &y );
- wDrawBitMap( d->d, bm, x, y, color, (wDrawOpts)d->funcs->options );
+ wDrawBitMap( d->d, bm, x, y, color, DRAWOPTS(d) );
}
static void TempSegLine(
- drawCmd_p d,
- coOrd p0,
- coOrd p1,
- wDrawWidth width,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p0,
+ coOrd p1,
+ wDrawWidth width,
+ wDrawColor color )
{
DYNARR_APPEND( trkSeg_t, tempSegs_da, 10 );
tempSegs(tempSegs_da.cnt-1).type = SEG_STRLIN;
tempSegs(tempSegs_da.cnt-1).color = color;
- if (d->options&DC_SIMPLE)
- tempSegs(tempSegs_da.cnt-1).width = 0;
- else
- tempSegs(tempSegs_da.cnt-1).width = width*d->scale/d->dpi;
+ if (d->options&DC_SIMPLE) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = 0;
+ } else if (width<0) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width;
+ } else {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width*d->scale/d->dpi;
+ }
tempSegs(tempSegs_da.cnt-1).u.l.pos[0] = p0;
tempSegs(tempSegs_da.cnt-1).u.l.pos[1] = p1;
}
static void TempSegArc(
- drawCmd_p d,
- coOrd p,
- DIST_T r,
- ANGLE_T angle0,
- ANGLE_T angle1,
- BOOL_T drawCenter,
- wDrawWidth width,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p,
+ DIST_T r,
+ ANGLE_T angle0,
+ ANGLE_T angle1,
+ BOOL_T drawCenter,
+ wDrawWidth width,
+ wDrawColor color )
{
DYNARR_APPEND( trkSeg_t, tempSegs_da, 10 );
tempSegs(tempSegs_da.cnt-1).type = SEG_CRVLIN;
tempSegs(tempSegs_da.cnt-1).color = color;
- if (d->options&DC_SIMPLE)
- tempSegs(tempSegs_da.cnt-1).width = 0;
- else
- tempSegs(tempSegs_da.cnt-1).width = width*d->scale/d->dpi;
+ if (d->options&DC_SIMPLE) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = 0;
+ } else if (width<0) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width;
+ } else {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width*d->scale/d->dpi;
+ }
tempSegs(tempSegs_da.cnt-1).u.c.center = p;
tempSegs(tempSegs_da.cnt-1).u.c.radius = r;
tempSegs(tempSegs_da.cnt-1).u.c.a0 = angle0;
@@ -904,19 +1022,19 @@ static void TempSegArc(
static void TempSegString(
- drawCmd_p d,
- coOrd p,
- ANGLE_T a,
- char * s,
- wFont_p fp,
- FONTSIZE_T fontSize,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p,
+ ANGLE_T a,
+ char * s,
+ wFont_p fp,
+ FONTSIZE_T fontSize,
+ wDrawColor color )
{
DYNARR_APPEND( trkSeg_t, tempSegs_da, 10 );
tempSegs(tempSegs_da.cnt-1).type = SEG_TEXT;
tempSegs(tempSegs_da.cnt-1).color = color;
tempSegs(tempSegs_da.cnt-1).u.t.boxed = FALSE;
- tempSegs(tempSegs_da.cnt-1).width = 0;
+ tempSegs(tempSegs_da.cnt-1).lineWidth = 0;
tempSegs(tempSegs_da.cnt-1).u.t.pos = p;
tempSegs(tempSegs_da.cnt-1).u.t.angle = a;
tempSegs(tempSegs_da.cnt-1).u.t.fontP = fp;
@@ -926,45 +1044,64 @@ static void TempSegString(
static void TempSegPoly(
- drawCmd_p d,
- int cnt,
- coOrd * pts,
- int * types,
- wDrawColor color,
- wDrawWidth width,
- int fill,
- int open )
-{
+ drawCmd_p d,
+ int cnt,
+ coOrd * pts,
+ int * types,
+ wDrawColor color,
+ wDrawWidth width,
+ drawFill_e eFillOpt )
+{
+ int fill = 0;
+ int open = 0;
+ switch (eFillOpt) {
+ case DRAW_OPEN:
+ open = 1;
+ break;
+ case DRAW_CLOSED:
+ break;
+ case DRAW_FILL:
+ fill = 1;
+ break;
+ case DRAW_TRANSPARENT:
+ fill = 1;
+ break;
+ default:
+ CHECK(FALSE);
+ }
DYNARR_APPEND( trkSeg_t, tempSegs_da, 1);
tempSegs(tempSegs_da.cnt-1).type = fill?SEG_FILPOLY:SEG_POLY;
tempSegs(tempSegs_da.cnt-1).color = color;
- if (d->options&DC_SIMPLE)
- tempSegs(tempSegs_da.cnt-1).width = 0;
- else
- tempSegs(tempSegs_da.cnt-1).width = width*d->scale/d->dpi;
+ if (d->options&DC_SIMPLE) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = 0;
+ } else if (width<0) {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width;
+ } else {
+ tempSegs(tempSegs_da.cnt-1).lineWidth = width*d->scale/d->dpi;
+ }
tempSegs(tempSegs_da.cnt-1).u.p.polyType = open?POLYLINE:FREEFORM;
tempSegs(tempSegs_da.cnt-1).u.p.cnt = cnt;
tempSegs(tempSegs_da.cnt-1).u.p.orig = zero;
tempSegs(tempSegs_da.cnt-1).u.p.angle = 0.0;
tempSegs(tempSegs_da.cnt-1).u.p.pts = (pts_t *)MyMalloc(cnt*sizeof(pts_t));
- for (int i=0;i<=cnt-1;i++) {
+ for (int i=0; i<=cnt-1; i++) {
tempSegs(tempSegs_da.cnt-1).u.p.pts[i].pt = pts[i];
- tempSegs(tempSegs_da.cnt-1).u.p.pts[i].pt_type = (d->options&DC_SIMPLE)==0?types[i]:wPolyLineStraight;
+ tempSegs(tempSegs_da.cnt-1).u.p.pts[i].pt_type = ((d->options&DC_SIMPLE)==0
+ && (types!=0))?types[i]:wPolyLineStraight;
}
-
}
static void TempSegFillCircle(
- drawCmd_p d,
- coOrd p,
- DIST_T r,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd p,
+ DIST_T r,
+ wDrawColor color )
{
DYNARR_APPEND( trkSeg_t, tempSegs_da, 10 );
tempSegs(tempSegs_da.cnt-1).type = SEG_FILCRCL;
tempSegs(tempSegs_da.cnt-1).color = color;
- tempSegs(tempSegs_da.cnt-1).width = 0;
+ tempSegs(tempSegs_da.cnt-1).lineWidth = 0;
tempSegs(tempSegs_da.cnt-1).u.c.center = p;
tempSegs(tempSegs_da.cnt-1).u.c.radius = r;
tempSegs(tempSegs_da.cnt-1).u.c.a0 = 0.0;
@@ -972,56 +1109,73 @@ static void TempSegFillCircle(
}
-static void NoDrawBitMap( drawCmd_p d, coOrd p, wDrawBitMap_p bm, wDrawColor color )
+static void TempSegRectangle(
+ drawCmd_p d,
+ coOrd orig,
+ coOrd size,
+ wDrawColor color,
+ drawFill_e eOpts )
+{
+ coOrd p[4];
+ // p1 p2
+ // p0 p3
+ p[0].x = p[1].x = orig.x;
+ p[2].x = p[3].x = orig.x+size.x;
+ p[0].y = p[3].y = orig.y;
+ p[1].y = p[2].y = orig.y+size.y;
+ TempSegPoly( d, 4, p, NULL, color, 0, eOpts );
+}
+
+
+static void NoDrawBitMap( drawCmd_p d, coOrd p, wDrawBitMap_p bm,
+ wDrawColor color )
{
}
EXPORT drawFuncs_t screenDrawFuncs = {
- 0,
- DDrawLine,
- DDrawArc,
- DDrawString,
- DDrawBitMap,
- DDrawPoly,
- DDrawFillCircle };
-
-EXPORT drawFuncs_t tempDrawFuncs = {
- wDrawOptTemp,
- DDrawLine,
- DDrawArc,
- DDrawString,
- DDrawBitMap,
- DDrawPoly,
- DDrawFillCircle };
+ DDrawLine,
+ DDrawArc,
+ DDrawString,
+ DDrawBitMap,
+ DDrawPoly,
+ DDrawFillCircle,
+ DDrawRectangle
+};
EXPORT drawFuncs_t printDrawFuncs = {
- 0,
- DDrawLine,
- DDrawArc,
- DDrawString,
- NoDrawBitMap,
- DDrawPoly,
- DDrawFillCircle };
+ DDrawLine,
+ DDrawArc,
+ DDrawString,
+ NoDrawBitMap,
+ DDrawPoly,
+ DDrawFillCircle,
+ DDrawRectangle
+};
EXPORT drawFuncs_t tempSegDrawFuncs = {
- 0,
- TempSegLine,
- TempSegArc,
- TempSegString,
- NoDrawBitMap,
- TempSegPoly,
- TempSegFillCircle };
+ TempSegLine,
+ TempSegArc,
+ TempSegString,
+ NoDrawBitMap,
+ TempSegPoly,
+ TempSegFillCircle,
+ TempSegRectangle
+};
+
EXPORT drawCmd_t mainD = {
- NULL, &screenDrawFuncs, DC_TICKS, INIT_MAIN_SCALE, 0.0, {0.0,0.0}, {0.0,0.0}, MainPix2CoOrd, MainCoOrd2Pix };
+ NULL, &screenDrawFuncs, DC_TICKS, INIT_MAIN_SCALE, 0.0, {0.0,0.0}, {0.0,0.0}, MainPix2CoOrd, MainCoOrd2Pix, 96.0
+};
EXPORT drawCmd_t tempD = {
- NULL, &tempDrawFuncs, DC_TICKS, INIT_MAIN_SCALE, 0.0, {0.0,0.0}, {0.0,0.0}, MainPix2CoOrd, MainCoOrd2Pix };
+ NULL, &screenDrawFuncs, DC_TICKS|DC_TEMP, INIT_MAIN_SCALE, 0.0, {0.0,0.0}, {0.0,0.0}, MainPix2CoOrd, MainCoOrd2Pix, 96.0
+};
EXPORT drawCmd_t mapD = {
- NULL, &screenDrawFuncs, DC_SIMPLE, INIT_MAP_SCALE, 0.0, {0.0,0.0}, {96.0,48.0}, Pix2CoOrd, CoOrd2Pix };
+ NULL, &screenDrawFuncs, DC_SIMPLE, INIT_MAP_SCALE, 0.0, {0.0,0.0}, {96.0,48.0}, Pix2CoOrd, CoOrd2Pix, 96.0
+};
/*****************************************************************************
@@ -1031,60 +1185,63 @@ EXPORT drawCmd_t mapD = {
*/
-static wPos_t info_yb_offset = 2;
-static wPos_t info_ym_offset = 3;
-static wPos_t six = 2;
-static wPos_t info_xm_offset = 2;
-static wPos_t messageOrControlX = 0;
-static wPos_t messageOrControlY = 0;
+static wWinPix_t info_yb_offset = 2;
+static wWinPix_t six = 2;
+static wWinPix_t info_xm_offset = 2;
+static wWinPix_t messageOrControlX = 0;
+static wWinPix_t messageOrControlY = 0;
#define NUM_INFOCTL (4)
static wControl_p curInfoControl[NUM_INFOCTL];
-static wPos_t curInfoLabelWidth[NUM_INFOCTL];
+static wWinPix_t curInfoLabelWidth[NUM_INFOCTL];
/**
* Determine the width of a mouse pointer position string ( coordinate plus label ).
*
* \return width of position string
*/
-static wPos_t GetInfoPosWidth( void )
+static wWinPix_t GetInfoPosWidth( void )
{
- wPos_t labelWidth;
-
+ wWinPix_t labelWidth;
+
DIST_T dist;
- if ( mapD.size.x > mapD.size.y )
- dist = mapD.size.x;
- else
- dist = mapD.size.y;
- if ( units == UNITS_METRIC ) {
- dist *= 2.54;
- if ( dist >= 1000 )
- dist = 9999.999*2.54;
- else if ( dist >= 100 )
- dist = 999.999*2.54;
- else if ( dist >= 10 )
- dist = 99.999*2.54;
- } else {
- if ( dist >= 100*12 )
- dist = 999.0*12.0+11.0+3.0/4.0-1.0/64.0;
- else if ( dist >= 10*12 )
- dist = 99.0*12.0+11.0+3.0/4.0-1.0/64.0;
- else if ( dist >= 1*12 )
- dist = 9.0*12.0+11.0+3.0/4.0-1.0/64.0;
+ if ( mapD.size.x > mapD.size.y ) {
+ dist = mapD.size.x;
+ } else {
+ dist = mapD.size.y;
+ }
+ if ( units == UNITS_METRIC ) {
+ dist *= 2.54;
+ if ( dist >= 1000 ) {
+ dist = 9999.999*2.54;
+ } else if ( dist >= 100 ) {
+ dist = 999.999*2.54;
+ } else if ( dist >= 10 ) {
+ dist = 99.999*2.54;
}
-
- labelWidth = (wStatusGetWidth( xLabel ) > wStatusGetWidth( yLabel ) ? wStatusGetWidth( xLabel ):wStatusGetWidth( yLabel ));
-
- return wStatusGetWidth( FormatDistance(dist) ) + labelWidth;
+ } else {
+ if ( dist >= 100*12 ) {
+ dist = 999.0*12.0+11.0+3.0/4.0-1.0/64.0;
+ } else if ( dist >= 10*12 ) {
+ dist = 99.0*12.0+11.0+3.0/4.0-1.0/64.0;
+ } else if ( dist >= 1*12 ) {
+ dist = 9.0*12.0+11.0+3.0/4.0-1.0/64.0;
+ }
+ }
+
+ labelWidth = (wStatusGetWidth( xLabel ) > wStatusGetWidth(
+ yLabel ) ? wStatusGetWidth( xLabel ):wStatusGetWidth( yLabel ));
+
+ return wStatusGetWidth( FormatDistance(dist) ) + labelWidth;
}
/**
* Initialize the status line at the bottom of the window.
- *
+ *
*/
EXPORT void InitInfoBar( void )
{
- wPos_t width, height, y, yb, ym, x, boxH;
+ wWinPix_t width, height, y, yb, ym, x, boxH;
wWinGetSize( mainW, &width, &height );
infoHeight = 2 + wStatusGetHeight( COMBOBOX ) + 2 ;
textHeight = wStatusGetHeight(0L);
@@ -1098,34 +1255,40 @@ EXPORT void InitInfoBar( void )
infoD.scale_w = wStatusGetWidth( "999:1" ) + wStatusGetWidth( zoomLabel );
/* we do not use the count label for the moment */
infoD.count_w = 0;
- infoD.info_w = width - 20 - infoD.pos_w*2 - infoD.scale_w - infoD.count_w - 45; // Allow Window to resize down
+ infoD.info_w = width - 20 - infoD.pos_w*2 - infoD.scale_w - infoD.count_w -
+ 45; // Allow Window to resize down
if (infoD.info_w <= 0) {
infoD.info_w = 10;
}
yb = y+info_yb_offset;
ym = y+(infoHeight-textHeight)/2;
boxH = infoHeight;
- x = 2;
- infoD.scale_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.scale_w, boxH );
- infoD.scale_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarScale", infoD.scale_w-six, zoomLabel);
- x += infoD.scale_w + 2;
- infoD.posX_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.pos_w, boxH );
- infoD.posX_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarPosX", infoD.pos_w-six, xLabel );
- x += infoD.pos_w + 2;
- infoD.posY_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.pos_w, boxH );
- infoD.posY_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarPosY", infoD.pos_w-six, yLabel );
- x += infoD.pos_w + 2;
- messageOrControlX = x+info_xm_offset; //Remember Position
- messageOrControlY = ym;
- infoD.info_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.info_w, boxH );
- infoD.info_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarStatus", infoD.info_w-six, "" );
+ x = 2;
+ infoD.scale_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.scale_w,
+ boxH );
+ infoD.scale_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarScale",
+ infoD.scale_w-six, zoomLabel);
+ x += infoD.scale_w + 2;
+ infoD.posX_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.pos_w, boxH );
+ infoD.posX_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarPosX",
+ infoD.pos_w-six, xLabel );
+ x += infoD.pos_w + 2;
+ infoD.posY_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.pos_w, boxH );
+ infoD.posY_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarPosY",
+ infoD.pos_w-six, yLabel );
+ x += infoD.pos_w + 2;
+ messageOrControlX = x+info_xm_offset; //Remember Position
+ messageOrControlY = ym;
+ infoD.info_b = wBoxCreate( mainW, x, yb, NULL, wBoxBelow, infoD.info_w, boxH );
+ infoD.info_m = wStatusCreate( mainW, x+info_xm_offset, ym, "infoBarStatus",
+ infoD.info_w-six, "" );
}
static void SetInfoBar( void )
{
- wPos_t width, height, y, yb, ym, x, boxH;
+ wWinPix_t width, height, y, yb, ym, x, boxH;
int inx;
static long oldDistanceFormat = -1;
long newDistanceFormat;
@@ -1139,58 +1302,62 @@ static void SetInfoBar( void )
wBoxSetSize( infoD.posY_b, infoD.pos_w, infoHeight-3 );
wStatusSetWidth( infoD.posY_m, infoD.pos_w-six );
}
- infoD.info_w = width - 20 - infoD.pos_w*2 - infoD.scale_w - infoD.count_w - 40 + 4;
+ infoD.info_w = width - 20 - infoD.pos_w*2 - infoD.scale_w - infoD.count_w - 40 +
+ 4;
if (infoD.info_w <= 0) {
infoD.info_w = 10;
}
yb = y+info_yb_offset;
ym = y+(infoHeight-textHeight)/2;
boxH = infoHeight;
- wWinClear( mainW, 0, y, width-20, infoHeight );
- x = 0;
- wControlSetPos( (wControl_p)infoD.scale_b, x, yb );
- wControlSetPos( (wControl_p)infoD.scale_m, x+info_xm_offset, ym );
- x += infoD.scale_w + 10;
- wControlSetPos( (wControl_p)infoD.posX_b, x, yb );
- wControlSetPos( (wControl_p)infoD.posX_m, x+info_xm_offset, ym );
- x += infoD.pos_w + 5;
- wControlSetPos( (wControl_p)infoD.posY_b, x, yb );
- wControlSetPos( (wControl_p)infoD.posY_m, x+info_xm_offset, ym );
- x += infoD.pos_w + 10;
- wControlSetPos( (wControl_p)infoD.info_b, x, yb );
- wControlSetPos( (wControl_p)infoD.info_m, x+info_xm_offset, ym );
- wBoxSetSize( infoD.info_b, infoD.info_w, boxH );
- wStatusSetWidth( infoD.info_m, infoD.info_w-six );
- messageOrControlX = x+info_xm_offset;
- messageOrControlY = ym;
- if (curInfoControl[0]) {
- for ( inx=0; curInfoControl[inx]; inx++ ) {
- x += curInfoLabelWidth[inx];
- int y_this = ym + (textHeight/2) - (wControlGetHeight( curInfoControl[inx] )/2);
- wControlSetPos( curInfoControl[inx], x, y_this );
- x += wControlGetWidth( curInfoControl[inx] )+3;
- wControlShow( curInfoControl[inx], TRUE );
- }
- wControlSetPos( (wControl_p)infoD.info_m, x+info_xm_offset, ym ); //Move to end
+ wWinClear( mainW, 0, y, width-20, infoHeight );
+ x = 0;
+ wControlSetPos( (wControl_p)infoD.scale_b, x, yb );
+ wControlSetPos( (wControl_p)infoD.scale_m, x+info_xm_offset, ym );
+ x += infoD.scale_w + 10;
+ wControlSetPos( (wControl_p)infoD.posX_b, x, yb );
+ wControlSetPos( (wControl_p)infoD.posX_m, x+info_xm_offset, ym );
+ x += infoD.pos_w + 5;
+ wControlSetPos( (wControl_p)infoD.posY_b, x, yb );
+ wControlSetPos( (wControl_p)infoD.posY_m, x+info_xm_offset, ym );
+ x += infoD.pos_w + 10;
+ wControlSetPos( (wControl_p)infoD.info_b, x, yb );
+ wControlSetPos( (wControl_p)infoD.info_m, x+info_xm_offset, ym );
+ wBoxSetSize( infoD.info_b, infoD.info_w, boxH );
+ wStatusSetWidth( infoD.info_m, infoD.info_w-six );
+ messageOrControlX = x+info_xm_offset;
+ messageOrControlY = ym;
+ if (curInfoControl[0]) {
+ for ( inx=0; curInfoControl[inx]; inx++ ) {
+ x += curInfoLabelWidth[inx];
+ wWinPix_t y_this = ym + (textHeight/2) - (wControlGetHeight(
+ curInfoControl[inx] )/2);
+ wControlSetPos( curInfoControl[inx], x, y_this );
+ x += wControlGetWidth( curInfoControl[inx] )+3;
+ wControlShow( curInfoControl[inx], TRUE );
}
+ wControlSetPos( (wControl_p)infoD.info_m, x+info_xm_offset, ym ); //Move to end
+ }
}
static void InfoScale( void )
{
- if (mainD.scale >= 1)
- sprintf( message, "%s%0.0f:1", zoomLabel, mainD.scale );
- else
- sprintf( message, "%s1:%0.0f", zoomLabel, floor(1/mainD.scale+0.5) );
+ if (mainD.scale >= 1.0) {
+ sprintf( message, "%s%.4g:1", zoomLabel, lround(mainD.scale*4.0)/4.0 );
+ } else {
+ sprintf( message, "%s1:%.4g", zoomLabel, lround((1.0/mainD.scale)*4.0)/4.0 );
+ }
+
wStatusSetValue( infoD.scale_m, message );
}
EXPORT void InfoCount( wIndex_t count )
{
-/*
- sprintf( message, "%d", count );
- wMessageSetValue( infoD.count_m, message );
-*/
+ /*
+ sprintf( message, "%d", count );
+ wMessageSetValue( infoD.count_m, message );
+ */
}
EXPORT void InfoPos( coOrd pos )
@@ -1199,7 +1366,7 @@ EXPORT void InfoPos( coOrd pos )
wStatusSetValue( infoD.posX_m, message );
sprintf( message, "%s%s", yLabel, FormatDistance(pos.y) );
wStatusSetValue( infoD.posY_m, message );
-
+
oldMarker = pos;
}
@@ -1207,10 +1374,10 @@ static wControl_p deferSubstituteControls[NUM_INFOCTL+1];
static char * deferSubstituteLabels[NUM_INFOCTL];
EXPORT void InfoSubstituteControls(
- wControl_p * controls,
- char ** labels )
+ wControl_p * controls,
+ char ** labels )
{
- wPos_t x, y;
+ wWinPix_t x, y;
int inx;
for ( inx=0; inx<NUM_INFOCTL; inx++ ) {
if (curInfoControl[inx]) {
@@ -1238,9 +1405,10 @@ EXPORT void InfoSubstituteControls(
curInfoLabelWidth[inx] = wLabelWidth(_(labels[inx]));
x += curInfoLabelWidth[inx];
#ifdef WINDOWS
- int y_this = y + (infoHeight/2) - (textHeight / 2 );
+ wWinPix_t y_this = y + (infoHeight/2) - (textHeight / 2 );
#else
- int y_this = y + (infoHeight / 2) - (wControlGetHeight(controls[inx]) / 2) - 2;
+ wWinPix_t y_this = y + (infoHeight / 2) - (wControlGetHeight(
+ controls[inx]) / 2) - 2;
#endif
wControlSetPos( controls[inx], x, y_this );
x += wControlGetWidth( controls[inx] );
@@ -1259,108 +1427,152 @@ EXPORT void SetMessage( char * msg )
wStatusSetValue( infoD.info_m, msg );
}
+/**
+ * Map Handling
+ *
+ */
-static void ChangeMapScale( BOOL_T reset )
+/*
+ * Set mapW size to fit the rescaled map
+ *
+ * \param reset IN
+ */
+static int mapBorderH = 24;
+static int mapBorderW = 24;
+static void ChangeMapScale()
{
- wPos_t w, h;
- wPos_t dw, dh;
+ wWinPix_t w, h;
FLOAT_T fw, fh;
-
- fw = (((mapD.size.x/mapD.scale)*mapD.dpi) + 0.5)+2;
- fh = (((mapD.size.y/mapD.scale)*mapD.dpi) + 0.5)+2;
-
- w = (wPos_t)fw;
- h = (wPos_t)fh;
- if (reset) {
- wGetDisplaySize( &dw, &dh );
- wSetGeometry(mapW, 50, dw, 50, dh, -1, -1, mapD.size.x/mapD.size.y);
- wWinSetSize( mapW, w+DlgSepLeft+DlgSepRight, h+DlgSepTop+DlgSepBottom);
- }
+ // Restrict map size to 1/2 of screen
+ FLOAT_T fScaleW = mapD.size.x / ( displayWidth * 0.5 / mapD.dpi );
+ FLOAT_T fScaleH = mapD.size.y / ( displayHeight * 0.5 / mapD.dpi );
+ FLOAT_T fScale = ceil( max( fScaleW, fScaleH ) );
+ if ( fScale > mapD.scale ) {
+ LOG( log_mapsize, 2, ( " ChangeMapScale incr scale from %0.3f to %0.3f\n",
+ mapD.scale, fScale ) );
+ mapD.scale = fScale;
+ }
+
+ fw = (((mapD.size.x/mapD.scale)*mapD.dpi) + 0.5)+2;
+ fh = (((mapD.size.y/mapD.scale)*mapD.dpi) + 0.5)+2;
+
+ w = (wWinPix_t)fw;
+ h = (wWinPix_t)fh;
+ LOG( log_mapsize, 2, ( " ChangeMapScale mapD.scale=%0.3f w=%ld h=%ld\n",
+ mapD.scale, w, h ) );
+ wWinSetSize( mapW, w+mapBorderW, h+mapBorderH );
+ // This should be done by wWinSetSize
wDrawSetSize( mapD.d, w, h, NULL );
}
EXPORT BOOL_T SetRoomSize( coOrd size )
{
- if (size.x < 12.0)
- size.x = 12.0;
- if (size.y < 12.0)
- size.y = 12.0;
+ LOG( log_mapsize, 2, ( "SetRoomSize NEW:%0.3fx%0.3f OLD:%0.3fx%0.3f\n", size.x,
+ size.y, mapD.size.x, mapD.size.y ) );
+ SetLayoutRoomSize(size);
+ if (size.x < 1.0) {
+ size.x = 1.0;
+ }
+ if (size.y < 1.0) {
+ size.y = 1.0;
+ }
if ( mapD.size.x == size.x &&
- mapD.size.y == size.y )
+ mapD.size.y == size.y ) {
return TRUE;
+ }
mapD.size = size;
SetLayoutRoomSize(size);
- if ( mapW == NULL)
- return TRUE;
- ChangeMapScale(TRUE);
wPrefSetFloat( "draw", "roomsizeX", mapD.size.x );
wPrefSetFloat( "draw", "roomsizeY", mapD.size.y );
+ if ( mapW == NULL) {
+ return TRUE;
+ }
+ ChangeMapScale();
return TRUE;
}
-EXPORT void GetRoomSize( coOrd * froomSize )
-{
- *froomSize = mapD.size;
-}
-
-static void MapRedraw()
+/**
+ * Redraw the Map window using the Scale derived from the Window size and Room size
+ * \param bd [inout] Map canvas - not used
+ * \param pContext [inout] Param context - not used
+ * \param px, py [in] canvas size
+ */
+static void MapRedraw(
+ wDraw_p bd, void * pContex, wWinPix_t px, wWinPix_t py )
{
- if (inPlaybackQuit)
+ if (inPlaybackQuit) {
return;
+ }
static int cMR = 0;
LOG( log_redraw, 2, ( "MapRedraw: %d\n", cMR++ ) );
- if (!mapVisible)
+ if (!mapVisible) {
return;
- if (delayUpdate)
- wDrawDelayUpdate( mapD.d, TRUE );
+ }
+ if (delayUpdate) {
+ wDrawDelayUpdate( mapD.d, TRUE );
+ }
//wSetCursor( mapD.d, wCursorWait );
+ wBool_t bTemp = wDrawSetTempMode( mapD.d, FALSE );
+ if ( bTemp ) {
+ printf( "MapRedraw TempMode\n" );
+ }
+
+ if ( log_mapsize >= 2 ) {
+ lprintf( " MapRedraw: parm=%ldx%ld", px, py );
+ wWinPix_t tx, ty;
+ if ( mapW ) {
+ wWinGetSize( mapW, &tx, &ty );
+ lprintf( " win=%ldx%ld", tx, ty );
+ }
+ if ( mapD.d ) {
+ wDrawGetSize( mapD.d, &tx, &ty );
+ lprintf( " draw=%ldx%ld", tx, ty );
+ }
+ lprintf( "\n" );
+ }
+
+ // Find new mapD.scale
+ if ( ( px <= 0 || py <= 0 ) && mapD.d ) {
+ wDrawGetSize( mapD.d, &px, &py );
+ px += 2;
+ py += 2;
+ }
+ if ( px > 0 && py > 0 ) {
+ FLOAT_T scaleX = mapD.size.x * mapD.dpi / px;
+ FLOAT_T scaleY = mapD.size.y * mapD.dpi / py;
+ FLOAT_T scale;
+
+ // Find largest scale
+ if (scaleX>scaleY) { scale = scaleX; }
+ else { scale = scaleY; }
+
+ if (scale > MAX_MAIN_SCALE) { scale = MAX_MAIN_SCALE; }
+ if (scale < MIN_MAIN_MACRO) { scale = MIN_MAIN_MACRO; }
+
+ scale = ceil( scale ); // Round up
+ LOG( log_mapsize, 2,
+ ( " %ldx%ld mapD.scale=%0.3f, scaleX=%0.3f scaleY=%0.3f scale=%0.3f\n",
+ px, py, mapD.scale, scaleX, scaleY, scale ) );
+ mapD.scale = scale;
+ } else {
+ LOG( log_mapsize, 2, ( " 0x0 mapD.scale=%0.3f\n", mapD.scale ) );
+ }
wDrawClear( mapD.d );
DrawTracks( &mapD, mapD.scale, mapD.orig, mapD.size );
DrawMapBoundingBox( TRUE );
//wSetCursor( mapD.d, defaultCursor );
+ wDrawSetTempMode( mapD.d, bTemp );
wDrawDelayUpdate( mapD.d, FALSE );
}
-static void MapResize( void )
-{
- mapD.scale = mapScale;
- ChangeMapScale(TRUE);
- MapRedraw();
-}
-
-#ifdef LATER
-static void MapProc( wWin_p win, winProcEvent e, void * data )
-{
- switch( e ) {
- case wResize_e:
- if (mapD.d == NULL)
- return;
- DrawMapBoundingBox( FALSE );
- ChangeMapScale();
- break;
- case wClose_e:
- mapVisible = FALSE;
- break;
- /*case wRedraw_e:
- if (mapD.d == NULL)
- break;
- MapRedraw();
- break;*/
- default:
- break;
- }
-}
-#endif
-
-
EXPORT void SetMainSize( void )
{
- wPos_t ww, hh;
+ wWinPix_t ww, hh;
DIST_T w, h;
wDrawGetSize( mainD.d, &ww, &hh );
ww -= LBORDER+RBORDER;
@@ -1372,28 +1584,55 @@ EXPORT void SetMainSize( void )
tempD.size = mainD.size;
}
-// Hack to switch between TempRedraw and MainRedraw
-extern wBool_t wDrawDoTempDraw;
/* Update temp_surface after executing a command
*/
-EXPORT void TempRedraw( void ) {
+EXPORT void TempRedraw( void )
+{
static int cTR = 0;
LOG( log_redraw, 2, ( "TempRedraw: %d\n", cTR++ ) );
-if (wDrawDoTempDraw == FALSE) {
- // Remove this after windows supports GTK
- MainRedraw(); // TempRedraw - windows
-} else {
- wDrawDelayUpdate( tempD.d, TRUE );
- wDrawSetTempMode( tempD.d, TRUE );
- DrawMarkers();
- DoCurCommand( C_REDRAW, zero );
- RulerRedraw( FALSE );
- RedrawPlaybackCursor(); //If in playback
- wDrawSetTempMode( tempD.d, FALSE );
- wDrawDelayUpdate( tempD.d, FALSE );
+ if (wDrawDoTempDraw == FALSE) {
+ // Remove this after windows supports GTK
+ MainRedraw(); // TempRedraw - windows
+ } else {
+ wDrawDelayUpdate( tempD.d, TRUE );
+ wDrawSetTempMode( tempD.d, TRUE );
+ DrawMarkers();
+ DoCurCommand( C_REDRAW, zero );
+ RulerRedraw( FALSE );
+ RedrawPlaybackCursor(); //If in playback
+ wDrawSetTempMode( tempD.d, FALSE );
+ wDrawDelayUpdate( tempD.d, FALSE );
+ }
}
+
+/**
+ * Calculate position and size of background bitmap
+ *
+ * \param [in] drawP destination drawing area
+ * \param [in] origX x origin of drawing area
+ * \param [in] origY y origin of drawing area
+ * \param [out] posX x position of bitmap
+ * \param [out] posY y position of bitmap
+ * \param [out] pWidth width of bitmap in destination coordinates
+ *
+ * \returns true on success, false otherwise
+ */
+
+void
+TranslateBackground(drawCmd_p drawP, POS_T origX, POS_T origY, wWinPix_t* posX,
+ wWinPix_t* posY, wWinPix_t* pWidth)
+{
+ coOrd back_pos = GetLayoutBackGroundPos();
+
+ *pWidth = (wWinPix_t)(GetLayoutBackGroundSize() / drawP->scale *
+ drawP->dpi);
+
+ *posX = (wWinPix_t)((back_pos.x - origX) / drawP->scale *
+ drawP->dpi);
+ *posY = (wWinPix_t)((back_pos.y - origY) / drawP->scale *
+ drawP->dpi);
}
/*
@@ -1404,30 +1643,39 @@ EXPORT void MainRedraw( void )
coOrd orig, size;
static int cMR = 0;
- LOG( log_redraw, 1, ( "MainRedraw: %d\n", cMR++ ) );
- if (delayUpdate)
- wDrawDelayUpdate( mainD.d, TRUE );
+ LOG( log_redraw, 1, ( "MainRedraw: %d %0.1fx%0.1f\n", cMR++, mainD.size.x,
+ mainD.size.y ) );
+ unsigned long time0 = wGetTimer();
+ if (delayUpdate) {
+ wDrawDelayUpdate( mainD.d, TRUE );
+ }
+ wDrawSetTempMode( mainD.d, FALSE );
wDrawClear( mainD.d );
- //mainD.d->option = 0;
- //mainD.options = 0;
- mainD.funcs->options = 0; //Force MainD back from Temp
-
orig = mainD.orig;
size = mainD.size;
orig.x -= LBORDER/mainD.dpi*mainD.scale;
orig.y -= BBORDER/mainD.dpi*mainD.scale;
- wPos_t back_x,back_y;
- coOrd back_pos = GetLayoutBackGroundPos();
- back_x = (wPos_t)((back_pos.x-orig.x)/mainD.scale*mainD.dpi);
- back_y = (wPos_t)((back_pos.y-orig.y)/mainD.scale*mainD.dpi);
- wPos_t back_width = (wPos_t)(GetLayoutBackGroundSize()/mainD.scale*mainD.dpi);
DrawRoomWalls( TRUE );
if (GetLayoutBackGroundScreen() < 100.0 && GetLayoutBackGroundVisible()) {
- wDrawShowBackground( mainD.d, back_x, back_y, back_width, GetLayoutBackGroundAngle(), GetLayoutBackGroundScreen());
+ wWinPix_t bitmapPosX;
+ wWinPix_t bitmapPosY;
+ wWinPix_t bitmapWidth;
+
+ TranslateBackground(&mainD, orig.x, orig.y, &bitmapPosX, &bitmapPosY,
+ &bitmapWidth);
+
+ wDrawShowBackground(mainD.d,
+ bitmapPosX,
+ bitmapPosY,
+ bitmapWidth,
+ GetLayoutBackGroundAngle(),
+ GetLayoutBackGroundScreen());
}
+ DrawSnapGrid( &mainD, mapD.size, TRUE );
+
orig = mainD.orig;
size = mainD.size;
orig.x -= RBORDER/mainD.dpi*mainD.scale;
@@ -1436,12 +1684,14 @@ EXPORT void MainRedraw( void )
size.y += (BBORDER+TBORDER)/mainD.dpi*mainD.scale;
DrawTracks( &mainD, mainD.scale, orig, size );
- DrawRoomWalls( FALSE );
+ DrawRoomWalls( FALSE ); //No background, just rulers
+
currRedraw++;
- DrawSnapGrid( &mainD, mapD.size, TRUE );
//wSetCursor( mainD.d, defaultCursor );
InfoScale();
+ LOG( log_timemainredraw, 1, ( "MainRedraw time = %lu mS\n",
+ wGetTimer()-time0 ) );
// The remainder is from TempRedraw
wDrawSetTempMode( tempD.d, TRUE );
DrawMarkers();
@@ -1459,79 +1709,76 @@ EXPORT void MainRedraw( void )
* \param bNoBorder Don't allow mainD.orig to go negative
*/
EXPORT void MainLayout(
- wBool_t bRedraw,
- wBool_t bNoBorder )
+ wBool_t bRedraw,
+ wBool_t bNoBorder )
{
-#ifdef LATER
- wPos_t ww, hh;
- DIST_T w, h;
-#endif
-
DIST_T t1;
- if (inPlaybackQuit)
+ if (inPlaybackQuit) {
return;
+ }
static int cML = 0;
- LOG( log_redraw, 1, ( "MainLayout: %d\n", cML++ ) );
+ LOG( log_redraw, 1, ( "MainLayout: %d %s %s\n", cML++, bRedraw?"RDW":"---",
+ bNoBorder?"NBR":"---" ) );
-#ifdef LATER
- wDrawGetSize( mainD.d, &ww, &hh );
- w = ww/mainD.dpi;
- h = hh/mainD.dpi;
-#endif
SetMainSize();
-#ifdef LATER
- /*wDrawClip( mainD.d, 0, 0, w, h );*/
-#endif
t1 = mainD.dpi/mainD.scale;
if (units == UNITS_ENGLISH) {
t1 /= 2.0;
for ( pixelBins=0.25; pixelBins<t1; pixelBins*=2.0 );
} else {
- pixelBins = 50.8;
- if (pixelBins >= t1)
- while (1) {
- if ( pixelBins <= t1 )
+ t1 /= 2.0;
+ pixelBins = 0.127;
+ while (1) {
+ pixelBins *= 2.0;
+ if ( pixelBins >= t1 ) {
break;
- pixelBins /= 2.0;
- if ( pixelBins <= t1 )
+ }
+ pixelBins *= 2.0;
+ if ( pixelBins >= t1 ) {
break;
- pixelBins /= 2.5;
- if ( pixelBins <= t1 )
+ }
+ pixelBins *= 2.5;
+ if ( pixelBins >= t1 ) {
break;
- pixelBins /= 2.0;
+ }
}
}
- ConstraintOrig( &mainD.orig, mainD.size, bNoBorder, FALSE );
+ LOG( log_pan, 2, ( "PixelBins=%0.6f\n", pixelBins ) );
+ ConstraintOrig( &mainD.orig, mainD.size, bNoBorder, TRUE );
tempD.orig = mainD.orig;
tempD.size = mainD.size;
mainCenter.x = mainD.orig.x + mainD.size.x/2.0;
mainCenter.y = mainD.orig.y + mainD.size.y/2.0;
DrawMapBoundingBox( TRUE );
- if ( bRedraw )
+ if ( bRedraw ) {
MainRedraw();
+ }
if ( bRedraw && wDrawDoTempDraw ) { // Temporary until mswlib supports TempDraw
wAction_t action = wActionMove;
coOrd pos;
- if ( mouseState == mouseLeft )
+ if ( mouseState == mouseLeft ) {
action = wActionLDrag;
- if ( mouseState == mouseRight )
+ }
+ if ( mouseState == mouseRight ) {
action = wActionRDrag;
+ }
mainD.Pix2CoOrd( &mainD, mousePositionx, mousePositiony, &pos );
// Prevent recursion if curCommand calls MainLayout when action if a Move or Drag
// ie CmdPan
static int iRecursion = 0;
iRecursion++;
- if ( iRecursion == 1 )
+ if ( iRecursion == 1 ) {
DoMouse( action, pos );
+ }
iRecursion--;
}
}
/**
* The wlib event handler for the main window.
- *
+ *
* \param win wlib window information
* \param e the wlib event
* \param data additional data (unused)
@@ -1539,26 +1786,36 @@ EXPORT void MainLayout(
void MainProc( wWin_p win, winProcEvent e, void * refresh, void * data )
{
- wPos_t width, height;
+ static int cMP = 0;
+ wWinPix_t width, height;
switch( e ) {
case wResize_e:
- if (mainD.d == NULL)
+ if (mainD.d == NULL) {
return;
+ }
wWinGetSize( mainW, &width, &height );
+ LOG( log_redraw, 1, ( "MainProc/Resize: %d %s %ld %ld\n", cMP++,
+ refresh==NULL?"RDW":"---", width, height ) );
LayoutToolBar(refresh);
height -= (toolbarHeight+max(infoHeight,textHeight)+10);
if (height >= 0) {
+ wBool_t bTemp = wDrawSetTempMode(mainD.d, FALSE );
+ if ( bTemp ) {
+ printf( "MainProc TempMode\n" );
+ }
wDrawSetSize( mainD.d, width-20, height, refresh );
wControlSetPos( (wControl_p)mainD.d, 0, toolbarHeight );
SetMainSize();
SetInfoBar();
panCenter.x = mainD.orig.x + mainD.size.x/2.0;
panCenter.y = mainD.orig.y + mainD.size.y/2.0;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
MainLayout( !refresh, TRUE ); // MainProc: wResize_e event
- wPrefSetInteger( "draw", "mainwidth", width );
- wPrefSetInteger( "draw", "mainheight", height );
- } else DrawMapBoundingBox( TRUE );
+ wPrefSetInteger( "draw", "mainwidth", (int)width );
+ wPrefSetInteger( "draw", "mainheight", (int)height );
+ wDrawSetTempMode( mainD.d, bTemp );
+ } else { DrawMapBoundingBox( TRUE ); }
break;
case wState_e:
wPrefSetInteger( "draw", "maximized", wWinIsMaximized(win) );
@@ -1568,7 +1825,7 @@ void MainProc( wWin_p win, winProcEvent e, void * refresh, void * data )
break;
case wClose_e:
/* shutdown the application via "close window" button */
- DoQuit();
+ DoQuit(NULL);
break;
default:
break;
@@ -1576,38 +1833,12 @@ void MainProc( wWin_p win, winProcEvent e, void * refresh, void * data )
}
-#ifdef WINDOWS
-int profRedraw = 0;
-void
-#ifndef WIN32
-_far _pascal
-#endif
-ProfStart( void );
-void
-#ifndef WIN32
-_far _pascal
-#endif
-ProfStop( void );
-#endif
-
EXPORT void DoRedraw( void )
{
-#ifdef WINDOWS
-#ifndef WIN32
- if (profRedraw)
- ProfStart();
-#endif
-#endif
- MapRedraw();
+ LOG( log_mapsize, 2, ( "DoRedraw\n" ) );
+ ChangeMapScale();
+ MapRedraw( mapD.d, NULL, 0, 0 );
MainRedraw(); // DoRedraw
-#ifdef WINDOWS
-#ifndef WIN32
- if (profRedraw)
- ProfStop();
-#endif
-#endif
-
-
}
/*****************************************************************************
@@ -1619,112 +1850,93 @@ EXPORT void DoRedraw( void )
static void DrawRoomWalls( wBool_t drawBackground )
{
- coOrd p00, p01, p11, p10;
- int p0,p1,p2,p3;
-
- if (mainD.d == NULL)
+ if (mainD.d == NULL) {
return;
+ }
if (drawBackground) {
- mainD.CoOrd2Pix(&mainD,mainD.orig,&p0,&p1);
- coOrd end;
- end.x = mainD.orig.x + mainD.size.x;
- end.y = mainD.orig.y + mainD.size.y;
- mainD.CoOrd2Pix(&mainD,end,&p2,&p3);
- p2 -= p0;
- p3 -= p1;
- wDrawFilledRectangle( mainD.d, p0, p1, p2, p3, drawColorGrey80, 0 );
-
- mainD.CoOrd2Pix(&mainD,zero,&p0,&p1);
- mainD.CoOrd2Pix(&mainD,mapD.size,&p2,&p3);
- p2 -= p0;
- p3 -= p1;
- wDrawFilledRectangle( mainD.d, p0, p1, p2, p3, drawColorWhite, 0 );
+ DrawRectangle( &mainD, mainD.orig, mainD.size, drawColorGrey80, DRAW_FILL );
+ DrawRectangle( &mainD, zero, mapD.size, wDrawColorWhite, DRAW_FILL );
} else {
-
+ coOrd p[4];
DrawTicks( &mainD, mapD.size );
-
- p00.x = 0.0; p00.y = 0.0;
- p01.x = p10.y = 0.0;
- p11.x = p10.x = mapD.size.x;
- p01.y = p11.y = mapD.size.y;
-
- DrawLine( &mainD, p01, p11, 3, borderColor );
- DrawLine( &mainD, p11, p10, 3, borderColor );
- DrawLine( &mainD, p00, p01, 3, borderColor );
- DrawLine( &mainD, p00, p10, 3, borderColor );
+ p[0].x = p[0].y = p[1].x = p[3].y = 0.0;
+ p[2].x = p[3].x = mapD.size.x;
+ p[1].y = p[2].y = mapD.size.y;
+ DrawPoly( &mainD, 4, p, NULL, borderColor, 3, DRAW_CLOSED );
}
}
static void DrawMarkers( void )
{
- wPos_t x, y;
- mainD.CoOrd2Pix(&mainD,oldMarker,&x,&y);
- wDrawLine( tempD.d, 0, y, (wPos_t)LBORDER, y,
- 0, wDrawLineSolid, markerColor, wDrawOptTemp );
- wDrawLine( tempD.d, x, 0, x, (wPos_t)BBORDER,
- 0, wDrawLineSolid, markerColor, wDrawOptTemp );
+ coOrd p0, p1;
+ p0.x = p1.x = oldMarker.x;
+ p0.y = mainD.orig.y;
+ p1.y = mainD.orig.y-BBORDER*mainD.scale/mainD.dpi;
+ DrawLine( &tempD, p0, p1, 0, markerColor );
+ p0.y = p1.y = oldMarker.y;
+ p0.x = mainD.orig.x;
+ p1.x = mainD.orig.x-LBORDER*mainD.scale/mainD.dpi;
+ DrawLine( &tempD, p0, p1, 0, markerColor );
}
static DIST_T rulerFontSize = 12.0;
EXPORT void DrawRuler(
- drawCmd_p d,
- coOrd pos0,
- coOrd pos1,
- DIST_T offset,
- int number,
- int tickSide,
- wDrawColor color )
+ drawCmd_p d,
+ coOrd pos0,
+ coOrd pos1,
+ DIST_T offset,
+ int number,
+ int tickSide,
+ wDrawColor color )
{
coOrd orig = pos0;
wAngle_t a, aa;
DIST_T start, end;
long inch, lastInch;
- wPos_t len;
+ DIST_T len;
int digit;
char quote;
- char message[10];
+ char message[STR_SHORT_SIZE];
coOrd d_orig, d_size;
wFontSize_t fs;
- long mm, mm0, mm1, power;
- wPos_t x0, y0, x1, y1;
-
- static double lengths[16] = {
- 0, 2.0, 4.0, 2.0, 6.0, 2.0, 4.0, 2.0, 8.0, 2.0, 4.0, 2.0, 6.0, 2.0, 4.0, 2.0 };
+ long mm, mm0, mm1, power, skip;
+
+ static double lengths[] = {
+ 0, 2.0, 4.0, 2.0, 6.0, 2.0, 4.0, 2.0, 8.0, 2.0, 4.0, 2.0, 6.0, 2.0, 4.0, 2.0, 0.0
+ };
int fraction, incr, firstFraction, lastFraction;
int majorLength;
coOrd p0, p1;
- FLOAT_T sin_aa;
a = FindAngle( pos0, pos1 );
Translate( &pos0, pos0, a, offset );
Translate( &pos1, pos1, a, offset );
aa = NormalizeAngle(a+(tickSide==0?+90:-90));
- sin_aa = sin(D2R(aa));
end = FindDistance( pos0, pos1 );
- if (end < 0.1)
+ if (end < 0.1) {
return;
- d_orig.x = d->orig.x - 0.001;
- d_orig.y = d->orig.y - 0.001;
- d_size.x = d->size.x + 0.002;
- d_size.y = d->size.y + 0.002;
- if (!ClipLine( &pos0, &pos1, d_orig, d->angle, d_size ))
+ }
+ d_orig.x = d->orig.x - 0.1;
+ d_orig.y = d->orig.y - 0.1;
+ d_size.x = d->size.x + 0.2;
+ d_size.y = d->size.y + 0.2;
+ if (!ClipLine( &pos0, &pos1, d_orig, d->angle, d_size )) {
return;
+ }
start = FindDistance( orig, pos0 );
- if (offset < 0)
+ if (offset < 0) {
start = -start;
+ }
end = FindDistance( orig, pos1 );
- d->CoOrd2Pix( d, pos0, &x0, &y0 );
- d->CoOrd2Pix( d, pos1, &x1, &y1 );
- wDrawLine( d->d, x0, y0, x1, y1,
- 0, wDrawLineSolid, color, (wDrawOpts)d->funcs->options );
+ DrawLine( d, pos0, pos1, 0, color );
if (units == UNITS_METRIC) {
mm0 = (int)ceil(start*25.4-0.5);
@@ -1739,23 +1951,31 @@ EXPORT void DrawRuler(
} else {
power = 1000;
}
+
+ // Label interval for scale > 40
+ if (d->scale <= 200) {
+ skip = 2000;
+ } else if (d->scale <= 400) {
+ skip = 5000;
+ } else {
+ skip = 10000;
+ }
+
for ( ; power<=1000; power*=10,len+=3 ) {
- if (power == 1000)
+ if (power == 1000) {
len = 10;
+ }
for (mm=((mm0+(mm0>0?power-1:0))/power)*power; mm<=mm1; mm+=power) {
if (power==1000 || mm%(power*10) != 0) {
Translate( &p0, orig, a, mm/25.4 );
Translate( &p1, p0, aa, len*d->scale/mainD.dpi );
- d->CoOrd2Pix( d, p0, &x0, &y0 );
- d->CoOrd2Pix( d, p1, &x1, &y1 );
- wDrawLine( d->d, x0, y0, x1, y1,
- 0, wDrawLineSolid, color, (wDrawOpts)d->funcs->options );
-
- if (!number || (d->scale>40 && mm != 0.0))
+ DrawLine( d, p0, p1, 0, color );
+ if (!number || (d->scale > 40 && mm % skip != 0.0)) {
continue;
+ }
if ( (power>=1000) ||
- (d->scale<=8 && power>=100) ||
- (d->scale<=1 && power>=10) ) {
+ (d->scale<=8 && power>=100) ||
+ (d->scale<=1 && power>=10) ) {
if (mm%100 != 0) {
sprintf(message, "%ld", mm/10%10 );
fs = rulerFontSize*2/3;
@@ -1771,28 +1991,26 @@ EXPORT void DrawRuler(
//p0.x = p0.x+((-(LBORDER-2)/2)+((LBORDER-2)/2+2)*sin_aa)*d->scale/mainD.dpi;
//p0.y = p1.y+dyn*d->scale/mainD.dpi;
}
- d->CoOrd2Pix( d, p0, &x0, &y0 );
- if (x0<0) x0 = 0;
- if (y0<0) y0 = 0;
- wDrawString( d->d, x0, y0, d->angle, message, rulerFp,
- fs, color, (wDrawOpts)d->funcs->options );
+ DrawString( d, p0, 0.0, message, rulerFp, fs*d->scale, color );
}
}
}
}
} else {
- if (d->scale <= 1)
- incr = 1; //16ths
- else if (d->scale <= 3)
- incr = 2; //8ths
- else if (d->scale <= 5)
- incr = 4; //4ths
- else if (d->scale <= 7)
- incr = 8; //1/2ths
- else if (d->scale <= 48)
+ if (d->scale <= 1) {
+ incr = 1; //16ths
+ } else if (d->scale <= 3) {
+ incr = 2; //8ths
+ } else if (d->scale <= 5) {
+ incr = 4; //4ths
+ } else if (d->scale <= 7) {
+ incr = 8; //1/2ths
+ } else if (d->scale <= 48) {
incr = 32;
- else
- incr = 16; //Inches
+ } else {
+ incr = 16; //Inches
+ }
+
lastInch = (int)floor(end);
lastFraction = 16;
inch = (int)ceil(start);
@@ -1801,20 +2019,20 @@ EXPORT void DrawRuler(
inch--;
firstFraction = 16 - firstFraction;
}
- for ( ; inch<=lastInch; inch++){
- if (inch % 12 == 0) {
+ for ( ; inch<=lastInch; inch++) {
+ if(inch % 12 == 0) {
lengths[0] = 12;
majorLength = 16;
digit = (int)(inch/12);
fs = rulerFontSize;
quote = '\'';
- } else if (d->scale <= 8) {
+ } else if (d->scale <= 12) { // 8
lengths[0] = 12;
majorLength = 16;
digit = (int)(inch%12);
fs = rulerFontSize*(2.0/3.0);
quote = '"';
- } else if (d->scale <= 16){
+ } else if (d->scale <= 24) { // 16
lengths[0] = 10;
majorLength = 12;
digit = (int)(inch%12);
@@ -1822,34 +2040,49 @@ EXPORT void DrawRuler(
} else {
continue;
}
- if (inch == lastInch)
+ if (inch == lastInch) {
lastFraction = (((int)((end - lastInch)*16)) / incr) * incr;
- for ( fraction = firstFraction; fraction<=lastFraction; fraction += incr ) {
- Translate( &p0, orig, a, inch+fraction/16.0 );
- Translate( &p1, p0, aa, lengths[fraction]*d->scale/72.0 );
- d->CoOrd2Pix( d, p0, &x0, &y0 );
- d->CoOrd2Pix( d, p1, &x1, &y1 );
- wDrawLine( d->d, x0, y0, x1, y1,
- 0, wDrawLineSolid, color,
- (wDrawOpts)d->funcs->options );
-#ifdef KLUDGEWINDOWS
- /* KLUDGE: can't draw invertable strings on windows */
- if ( (opts&DO_TEMP) == 0)
-#endif
- if (fraction == 0) {
- if ( (number == TRUE && d->scale<40) || (digit==0)) {
- if (inch % 12 == 0 || d->scale <= 2) {
- Translate( &p0, p0, aa, majorLength*d->scale/mainD.dpi );
- Translate( &p0, p0, 225, fs*d->scale/mainD.dpi );
- sprintf(message, "%d%c", digit, quote );
- d->CoOrd2Pix( d, p0, &x0, &y0 );
- if (x0<0) x0 = 0;
- if (y0<0) y0 = 0;
- wDrawString( d->d, x0, y0, d->angle, message, rulerFp, fs, color, (wDrawOpts)d->funcs->options );
+ }
+ for ( fraction = firstFraction; fraction <= lastFraction; fraction += incr ) {
+ // Tick interval for scale > 128
+ skip = 0;
+ if(d->scale > 512) {
+ skip = (inch % 120 != 0);
+ } else if(d->scale > 256) {
+ skip = (inch % 60 != 0);
+ } else if(d->scale > 128) {
+ skip = (inch % 24 != 0);
+ } else if(d->scale > 64) {
+ skip = (inch % 12 != 0);
+ }
+ if(!skip) {
+ Translate( &p0, orig, a, inch+fraction/16.0 );
+ Translate( &p1, p0, aa, lengths[fraction]*d->scale/mainD.dpi );
+ DrawLine( d, p0, p1, 0, color );
+ }
+ if (fraction == 0) {
+ // Label interval for scale > 40
+ if (d->scale <= 80) {
+ skip = 2;
+ } else if (d->scale <= 120) {
+ skip = 5;
+ } else if (d->scale <= 240) {
+ skip = 10;
+ } else if (d->scale <= 480) {
+ skip = 20;
+ } else {
+ skip = 50;
+ }
+ if ( number == TRUE && ((d->scale <= 40) || (digit % skip == 0.0)) ) {
+ if (inch % 12 == 0 || d->scale <= 2) {
+ Translate( &p0, p0, aa, majorLength*d->scale/mainD.dpi );
+ Translate( &p0, p0, 225, fs*d->scale/mainD.dpi );
+ sprintf(message, "%d%c", digit, quote );
+ DrawString( d, p0, 0.0, message, rulerFp, fs*d->scale, color );
+ }
}
}
- }
- firstFraction = 0;
+ firstFraction = 0;
}
}
}
@@ -1863,17 +2096,17 @@ static void DrawTicks( drawCmd_p d, coOrd size )
offset = 0.0;
- double blank_zone = 40*d->scale/72.0;
+ double blank_zone = 40*d->scale/mainD.dpi;
if ( d->orig.x<0.0-blank_zone ) {
- p0.y = 0.0; p1.y = mapD.size.y;
- p0.x = p1.x = 0.0;
- DrawRuler( d, p0, p1, offset, FALSE, TRUE, borderColor );
+ p0.y = 0.0; p1.y = mapD.size.y;
+ p0.x = p1.x = 0.0;
+ DrawRuler( d, p0, p1, offset, FALSE, TRUE, borderColor );
}
if (d->orig.x+d->size.x>mapD.size.x+blank_zone) {
- p0.y = 0.0; p1.y = mapD.size.y;
- p0.x = p1.x = mapD.size.x;
- DrawRuler( d, p0, p1, offset, FALSE, FALSE, borderColor );
+ p0.y = 0.0; p1.y = mapD.size.y;
+ p0.x = p1.x = mapD.size.x;
+ DrawRuler( d, p0, p1, offset, FALSE, FALSE, borderColor );
}
p0.x = 0.0; p1.x = d->size.x;
offset = d->orig.x;
@@ -1890,9 +2123,9 @@ static void DrawTicks( drawCmd_p d, coOrd size )
DrawRuler( d, p0, p1, offset, FALSE, FALSE, borderColor );
}
if (d->orig.y+d->size.y>mapD.size.y+blank_zone) {
- p0.x = 0.0; p1.x = mapD.size.x;
- p0.y = p1.y = mapD.size.y;
- DrawRuler( d, p0, p1, offset, FALSE, TRUE, borderColor );
+ p0.x = 0.0; p1.x = mapD.size.x;
+ p0.y = p1.y = mapD.size.y;
+ DrawRuler( d, p0, p1, offset, FALSE, TRUE, borderColor );
}
p0.y = 0.0; p1.y = d->size.y;
offset = d->orig.y;
@@ -1910,26 +2143,28 @@ static void DrawTicks( drawCmd_p d, coOrd size )
EXPORT coOrd mainCenter;
-
static void DrawMapBoundingBox( BOOL_T set )
{
- if (mainD.d == NULL || mapD.d == NULL)
+ CHECK( mainD.d );
+ CHECK( mapD.d );
+ if (!mapVisible) {
return;
- wDrawSetTempMode( mapD.d, TRUE );
+ }
DrawHilight( &mapD, mainD.orig, mainD.size, TRUE );
- wDrawSetTempMode( mapD.d, FALSE );
}
-static void ConstraintOrig( coOrd * orig, coOrd size, wBool_t bNoBorder, wBool_t round )
+static void ConstraintOrig( coOrd * orig, coOrd size, wBool_t bNoBorder,
+ wBool_t bRound )
{
-LOG( log_pan, 2, ( "ConstraintOrig [ %0.3f, %0.3f ] RoomSize(%0.3f %0.3f), WxH=%0.3fx%0.3f",
- orig->x, orig->y, mapD.size.x, mapD.size.y,
- size.x, size.y ) )
+ LOG( log_pan, 2,
+ ( "ConstraintOrig [ %0.6f, %0.6f ] RoomSize(%0.3f %0.3f), WxH=%0.3fx%0.3f",
+ orig->x, orig->y, mapD.size.x, mapD.size.y,
+ size.x, size.y ) )
coOrd bound = zero;
- if ( !bNoBorder ) {
+ if ( !bNoBorder ) {
bound.x = size.x/2;
bound.y = size.y/2;
}
@@ -1943,8 +2178,9 @@ LOG( log_pan, 2, ( "ConstraintOrig [ %0.3f, %0.3f ] RoomSize(%0.3f %0.3f), WxH=%
}
}
- if (orig->x < (0-bound.x))
- orig->x = 0-bound.x;
+ if (orig->x < (0-bound.x)) {
+ orig->x = 0-bound.x;
+ }
if (orig->y > 0.0) {
if ((orig->y+size.y) > (mapD.size.y+bound.y) ) {
@@ -1954,36 +2190,20 @@ LOG( log_pan, 2, ( "ConstraintOrig [ %0.3f, %0.3f ] RoomSize(%0.3f %0.3f), WxH=%
}
}
- if (orig->y < (0-bound.y))
- orig->y = 0-bound.y;
+ if (orig->y < (0-bound.y)) {
+ orig->y = 0-bound.y;
+ }
- if (round) {
- if (mainD.scale >= 1.0) {
- if (units == UNITS_ENGLISH) {
- orig->x = floor(orig->x*4)/4; //>1:1 = 1/4 inch
- orig->y = floor(orig->y*4)/4;
- } else {
- orig->x = floor(orig->x*2.54*2)/(2.54*2); //>1:1 = 0.5 cm
- orig->y = floor(orig->y*2.54*2)/(2.54*2);
- }
- } else {
- if (units == UNITS_ENGLISH) {
- orig->x = floor(orig->x*64)/64; //<1:1 = 1/64 inch
- orig->y = floor(orig->y*64)/64;
- } else {
- orig->x = floor(orig->x*25.4*2)/(25.4*2); //>1:1 = 0.5 mm
- orig->y = floor(orig->y*25.4*2)/(25.4*2);
- }
- }
+ if (bRound) {
+ orig->x = round(orig->x*pixelBins)/pixelBins;
+ orig->y = round(orig->y*pixelBins)/pixelBins;
}
- //orig->x = (long)(orig->x*pixelBins+0.5)/pixelBins;
- //orig->y = (long)(orig->y*pixelBins+0.5)/pixelBins;
- LOG( log_pan, 2, ( " = [ %0.3f %0.3f ]\n", orig->y, orig->y ) )
+ LOG( log_pan, 2, ( " = [ %0.6f %0.6f ]\n", orig->x, orig->y ) )
}
/**
- * Initialize the menu for setting zoom factors.
- *
+ * Initialize the menu for setting zoom factors.
+ *
* \param IN zoomM Menu to which radio button is added
* \param IN zoomSubM Second menu to which radio button is added, ignored if NULL
* \param IN ctxMenu1
@@ -1991,31 +2211,34 @@ LOG( log_pan, 2, ( "ConstraintOrig [ %0.3f, %0.3f ] RoomSize(%0.3f %0.3f), WxH=%
*
*/
-EXPORT void InitCmdZoom( wMenu_p zoomM, wMenu_p zoomSubM, wMenu_p ctxMenu1, wMenu_p panMenu )
+EXPORT void InitCmdZoom( wMenu_p zoomM, wMenu_p zoomSubM, wMenu_p ctxMenu1,
+ wMenu_p panMenu )
{
int inx;
-
- for ( inx=0; inx<sizeof zoomList/sizeof zoomList[0]; inx++ ) {
- if( (zoomList[ inx ].value >= 1.0 && zoomList[ inx ].value<=10 ) ||
- (ceil(log2(zoomList[ inx ].value)) == floor(log2(zoomList[ inx ].value))))
- {
- if (zoomM)
- zoomList[inx].btRadio = wMenuRadioCreate( zoomM, "cmdZoom", zoomList[inx].name, 0, (wMenuCallBack_p)DoZoom, (void *)(&(zoomList[inx].value)));
- if( zoomSubM )
- zoomList[inx].pdRadio = wMenuRadioCreate( zoomSubM, "cmdZoom", zoomList[inx].name, 0, (wMenuCallBack_p)DoZoom, (void *)(&(zoomList[inx].value)));
- if (panMenu)
- zoomList[inx].panRadio = wMenuRadioCreate( panMenu, "cmdZoom", zoomList[inx].name, 0, (wMenuCallBack_p)DoZoom, (void *)(&(zoomList[inx].value)));
+
+ for ( inx=0; inx<COUNT( zoomList ); inx++ ) {
+ if (zoomM) {
+ zoomList[inx].btRadio = wMenuRadioCreate( zoomM, "cmdZoom", zoomList[inx].name,
+ 0, DoZoom, (&(zoomList[inx].value)));
+ }
+ if( zoomSubM ) {
+ zoomList[inx].pdRadio = wMenuRadioCreate( zoomSubM, "cmdZoom",
+ zoomList[inx].name, 0, DoZoom, (&(zoomList[inx].value)));
}
- if ((zoomList[inx].value >=1.0 && zoomList[inx].value <= 10.0) || (ceil(log2(zoomList[ inx ].value)) == floor(log2(zoomList[ inx ].value)))) {
- if (ctxMenu1)
- zoomList[inx].ctxRadio1 = wMenuRadioCreate( ctxMenu1, "cmdZoom", zoomList[inx].name, 0, (wMenuCallBack_p)DoZoom, (void *)(&(zoomList[inx].value)));
+ if (panMenu) {
+ zoomList[inx].panRadio = wMenuRadioCreate( panMenu, "cmdZoom",
+ zoomList[inx].name, 0, DoZoom, (&(zoomList[inx].value)));
+ }
+ if (ctxMenu1) {
+ zoomList[inx].ctxRadio1 = wMenuRadioCreate( ctxMenu1, "cmdZoom",
+ zoomList[inx].name, 0, DoZoom, (&(zoomList[inx].value)));
}
}
}
/**
* Set radio button(s) corresponding to current scale.
- *
+ *
* \param IN scale current scale
*
*/
@@ -2023,95 +2246,126 @@ EXPORT void InitCmdZoom( wMenu_p zoomM, wMenu_p zoomSubM, wMenu_p ctxMenu1, wMen
static void SetZoomRadio( DIST_T scale )
{
int inx;
- long curScale = (long)scale;
-
- for ( inx=0; inx<sizeof zoomList/sizeof zoomList[0]; inx++ ) {
- if( curScale == zoomList[inx].value ) {
- if (zoomList[inx].btRadio)
+
+ for ( inx=0; inx<COUNT( zoomList ); inx++ ) {
+ if( scale == zoomList[inx].value ) {
+ if (zoomList[inx].btRadio) {
wMenuRadioSetActive( zoomList[inx].btRadio );
- if( zoomList[inx].pdRadio )
+ }
+ if( zoomList[inx].pdRadio ) {
wMenuRadioSetActive( zoomList[inx].pdRadio );
- if (zoomList[inx].ctxRadio1)
+ }
+ if (zoomList[inx].ctxRadio1) {
wMenuRadioSetActive( zoomList[inx].ctxRadio1 );
- if (zoomList[inx].panRadio)
+ }
+ if (zoomList[inx].panRadio) {
wMenuRadioSetActive( zoomList[inx].panRadio );
- /* activate / deactivate zoom buttons when appropriate */
+ }
+ /* activate / deactivate zoom buttons when appropriate */
wControlLinkedActive( (wControl_p)zoomUpB, ( inx != 0 ) );
- wControlLinkedActive( (wControl_p)zoomDownB, ( inx < (sizeof zoomList/sizeof zoomList[0] - 1)));
+ wControlLinkedActive( (wControl_p)zoomDownB, ( inx < (COUNT( zoomList ) - 1)));
}
}
-}
+}
/**
- * Find current scale
+ * Find current scale
*
* \param IN scale current scale
* \return index in scale table or -1 if error
*
*/
-
+
static int ScaleInx( DIST_T scale )
{
int inx;
-
- for ( inx=0; inx<sizeof zoomList/sizeof zoomList[0]; inx++ ) {
+
+ for ( inx=0; inx<COUNT( zoomList); inx++ ) {
if( scale == zoomList[inx].value ) {
return inx;
}
}
- return -1;
+ return -1;
}
/*
* Find Nearest Scale
*/
-static int NearestScaleInx ( DIST_T scale, BOOL_T larger ) {
+static int NearestScaleInx ( DIST_T scale, BOOL_T larger )
+{
int inx;
- for ( inx=0; inx<sizeof zoomList/sizeof zoomList[0]; inx++ ) {
+ //scale = rintf(scale*4.0)/4.0;
+
+ if (larger) {
+ for ( inx=0; inx<COUNT( zoomList )-1; inx++ ) {
if( scale == zoomList[inx].value ) {
return inx;
}
- if (scale < zoomList[inx].value) return inx;
+ if (scale < zoomList[inx].value) {
+ return inx;
+ }
}
return inx-1;
+ } else {
+ for ( inx=COUNT( zoomList)-1; inx>=0; inx-- ) {
+ if( scale == zoomList[inx].value ) {
+ return inx;
+ }
+ if (scale > zoomList[inx].value ) {
+ return inx;
+ }
+ }
+ }
+ return 0;
}
/**
- * Set up for new drawing scale. After the scale was changed, eg. via zoom button, everything
- * is set up for the new scale.
+ * Set up for new drawing scale. After the scale was changed, eg. via zoom button, everything
+ * is set up for the new scale.
*
* \param scale IN new scale
*/
-
+
static void DoNewScale( DIST_T scale )
{
char tmp[20];
- if (scale > MAX_MAIN_SCALE)
+ static BOOL_T in_use = 0; //lock for recursion to avoid additional setting.
+
+ if (in_use) { return; }
+
+ in_use = 1; //set lock
+
+ if (scale > MAX_MAIN_SCALE) {
scale = MAX_MAIN_SCALE;
+ }
+
+ if (scale < zoomList[0].value) {
+ scale = zoomList[0].value;
+ }
tempD.scale = mainD.scale = scale;
mainD.dpi = wDrawGetDPI( mainD.d );
- if ( mainD.dpi == 75 ) {
- mainD.dpi = 72.0;
- } else if ( scale > 1.0 && scale <= 12.0 ) {
- mainD.dpi = floor( (mainD.dpi + scale/2)/scale) * scale;
- }
+ //if ( scale > 1.0 && scale <= 12.0 ) {
+ // mainD.dpi = floor( (mainD.dpi + scale/2)/scale) * scale;
+ //}
tempD.dpi = mainD.dpi;
- SetZoomRadio( scale );
+ SetZoomRadio( scale ); //This routine causes a re-drive of the DoNewScale.
+
InfoScale();
- SetMainSize();
- PanHere( (void*)1 );
-LOG( log_zoom, 1, ( "center = [%0.3f %0.3f]\n", mainCenter.x, mainCenter.y ) )
+ SetMainSize();
+ PanHere( I2VP(1) );
+ LOG( log_zoom, 1, ( "center = [%0.3f %0.3f]\n", mainCenter.x, mainCenter.y ) )
sprintf( tmp, "%0.3f", mainD.scale );
wPrefSetString( "draw", "zoom", tmp );
if (recordF) {
fprintf( recordF, "ORIG %0.3f %0.3f %0.3f\n",
- mainD.scale, mainD.orig.x, mainD.orig.y );
+ mainD.scale, mainD.orig.x, mainD.orig.y );
}
+ in_use=0; //release lock
}
@@ -2125,48 +2379,91 @@ EXPORT void DoZoomUp( void * mode )
{
long newScale;
int i;
-
+
LOG( log_zoom, 2, ( "DoZoomUp KS:%x\n", MyGetKeyState() ) );
if ( mode != NULL || (MyGetKeyState()&WKEY_SHIFT) == 0) {
i = ScaleInx( mainD.scale );
- if (i < 0) i = NearestScaleInx(mainD.scale, TRUE);
- /*
- * Zooming into macro mode happens when we are at scale 1:1.
+ if (i < 0) { i = NearestScaleInx(mainD.scale, FALSE); }
+ /*
+ * Zooming into macro mode happens when we are at scale 1:1.
* To jump into macro mode, the CTRL-key has to be pressed and held.
*/
if( mainD.scale != 1.0 || (mainD.scale == 1.0 && (MyGetKeyState()&WKEY_CTRL))) {
if( i ) {
- if (mainD.scale <=1.0)
+ if (mainD.scale <=1.0) {
InfoMessage(_("Macro Zoom Mode"));
- else
+ } else {
InfoMessage("");
- DoNewScale( zoomList[ i - 1 ].value );
-
- } else InfoMessage("Minimum Macro Zoom");
+ }
+ DoNewScale( zoomList[ i - 1 ].value );
+
+ } else { InfoMessage("Minimum Macro Zoom"); }
} else {
InfoMessage(_("Scale 1:1 - Use Ctrl+ to go to Macro Zoom Mode"));
}
} else if ( (MyGetKeyState()&WKEY_CTRL) == 0 ) {
wPrefGetInteger( "misc", "zoomin", &newScale, 4 );
- InfoMessage(_("Preset Zoom In Value selected. Shift+Ctrl+PageDwn to reset value"));
+ InfoMessage(
+ _("Preset Zoom In Value selected. Shift+Ctrl+PageDwn to reset value"));
DoNewScale( newScale );
} else {
wPrefSetInteger( "misc", "zoomin", (long)mainD.scale );
- InfoMessage( _("Zoom In Program Value %ld:1, Shift+PageDwn to use"), (long)mainD.scale );
+ InfoMessage( _("Zoom In Program Value %ld:1, Shift+PageDwn to use"),
+ (long)mainD.scale );
}
}
-EXPORT void DoZoomExtents( void * mode) {
+/*
+ * Mode - 0 = Extents are Map size
+ * Mode - 1 = Extents are Selected size
+ */
+EXPORT void DoZoomExtents( void * mode)
+{
DIST_T scale_x, scale_y;
- scale_x = mapD.size.x/(mainD.size.x/mainD.scale);
- scale_y = mapD.size.y/(mainD.size.y/mainD.scale);
- if (scale_x<scale_y)
+ if ( 1 == VP2L(mode) ) {
+ if ( selectedTrackCount == 0 ) {
+ return;
+ }
+ track_p trk = NULL;
+ coOrd bot, top;
+ BOOL_T first = TRUE;
+ while ( TrackIterate( &trk ) ) {
+ if(GetTrkSelected(trk)) {
+ coOrd hi, lo;
+ GetBoundingBox(trk,&hi,&lo);
+ if (first) {
+ first = FALSE;
+ bot = lo;
+ top = hi;
+ } else {
+ if (lo.x < bot.x) { bot.x = lo.x; }
+ if (lo.y < bot.y) { bot.y = lo.y; }
+ if (hi.x > top.x) { top.x = hi.x; }
+ if (hi.y > top.y) { top.y = hi.y; }
+ }
+ }
+ }
+ panCenter.x = (top.x/2)+(bot.x)/2;
+ panCenter.y = (top.y/2)+(bot.y)/2;
+ PanHere(I2VP(1));
+ scale_x = (top.x-bot.x)*1.5/(mainD.size.x/mainD.scale);
+ scale_y = (top.y-bot.y)*1.5/(mainD.size.y/mainD.scale);
+ } else {
+ scale_x = mapD.size.x/(mainD.size.x/mainD.scale);
+ scale_y = mapD.size.y/(mainD.size.y/mainD.scale);
+ }
+
+
+ if (scale_x<scale_y) {
scale_x = scale_y;
+ }
scale_x = ceil(scale_x);
- if (scale_x < 1) scale_x = 1;
- if (scale_x > MAX_MAIN_SCALE) scale_x = MAX_MAIN_SCALE;
- mainD.orig = zero;
+ if (scale_x < 1) { scale_x = 1; }
+ if (scale_x > MAX_MAIN_SCALE) { scale_x = MAX_MAIN_SCALE; }
+ if (1 != (intptr_t)1) {
+ mainD.orig = zero;
+ }
DoNewScale(scale_x);
MainLayout(TRUE,TRUE);
@@ -2183,64 +2480,67 @@ EXPORT void DoZoomDown( void * mode)
{
long newScale;
int i;
-
+
LOG( log_zoom, 2, ( "DoZoomDown KS:%x\n", MyGetKeyState() ) );
if ( mode != NULL || (MyGetKeyState()&WKEY_SHIFT) == 0 ) {
i = ScaleInx( mainD.scale );
- if (i < 0) i = NearestScaleInx(mainD.scale, TRUE);
- if( i>= 0 && i < ( sizeof zoomList/sizeof zoomList[0] - 1 )) {
+ if (i < 0) { i = NearestScaleInx(mainD.scale, TRUE); }
+ if( i >= 0 && i < ( COUNT( zoomList ) - 1 )) {
InfoMessage("");
DoNewScale( zoomList[ i + 1 ].value );
- } else
+ } else {
InfoMessage(_("At Maximum Zoom Out"));
-
-
+ }
+
+
} else if ( (MyGetKeyState()&WKEY_CTRL) == 0 ) {
wPrefGetInteger( "misc", "zoomout", &newScale, 16 );
- InfoMessage(_("Preset Zoom Out Value selected. Shift+Ctrl+PageUp to reset value"));
+ InfoMessage(
+ _("Preset Zoom Out Value selected. Shift+Ctrl+PageUp to reset value"));
DoNewScale( newScale );
} else {
wPrefSetInteger( "misc", "zoomout", (long)mainD.scale );
- InfoMessage( _("Zoom Out Program Value %ld:1 set, Shift+PageUp to use"), (long)mainD.scale );
+ InfoMessage( _("Zoom Out Program Value %ld:1 set, Shift+PageUp to use"),
+ (long)mainD.scale );
}
}
/**
- * Zoom to user selected value. This is the callback function for the
- * user-selectable preset zoom values.
+ * Zoom to user selected value. This is the callback function for the
+ * user-selectable preset zoom values.
*
* \param IN scale current pScale
*
*/
-
-EXPORT void DoZoom( DIST_T *pScale )
+static void DoZoom( void * pScaleVP )
{
+ DIST_T *pScale = pScaleVP;
DIST_T scale = *pScale;
- if( scale != mainD.scale )
+ if( scale != mainD.scale ) {
DoNewScale( scale );
+ }
}
-
EXPORT void Pix2CoOrd(
- drawCmd_p d,
- wPos_t x,
- wPos_t y,
- coOrd * pos )
+ drawCmd_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ coOrd * pos )
{
pos->x = (((DIST_T)x)/d->dpi)*d->scale+d->orig.x;
pos->y = (((DIST_T)y)/d->dpi)*d->scale+d->orig.y;
}
EXPORT void CoOrd2Pix(
- drawCmd_p d,
- coOrd pos,
- wPos_t * x,
- wPos_t * y )
+ drawCmd_p d,
+ coOrd pos,
+ wDrawPix_t * x,
+ wDrawPix_t * y )
{
- *x = (wPos_t)((pos.x-d->orig.x)/d->scale*d->dpi);
- *y = (wPos_t)((pos.y-d->orig.y)/d->scale*d->dpi);
+ *x = (wDrawPix_t)((pos.x-d->orig.x)/d->scale*d->dpi);
+ *y = (wDrawPix_t)((pos.y-d->orig.y)/d->scale*d->dpi);
}
/*
@@ -2253,31 +2553,34 @@ EXPORT void CoOrd2Pix(
* - 2: same as 0, plus liveMap
* - 3: Take position from menuPos
*/
-EXPORT void PanHere(void * mode) {
- if ( 3 == (long)mode) {
+EXPORT void PanHere(void * mode)
+{
+ if ( 3 == VP2L(mode ) ) {
panCenter = menuPos;
- LOG( log_pan, 2, ( "MCenter:Mod-%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "MCenter:Mod-%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ }
+ wBool_t bLiveMap = TRUE;
+ if ( 2 == VP2L(mode) ) {
+ bLiveMap = liveMap;
}
mainD.orig.x = panCenter.x - mainD.size.x/2.0;
mainD.orig.y = panCenter.y - mainD.size.y/2.0;
wBool_t bNoBorder = (constrainMain != 0);
- if ( 1 != (long)mode )
- if ( (MyGetKeyState()&WKEY_CTRL)!= 0 )
+ if ( 1 != VP2L(mode) )
+ if ( (MyGetKeyState()&WKEY_CTRL)!= 0 ) {
bNoBorder = !bNoBorder;
- wBool_t bLiveMap = TRUE;
- if ( 2 == (long)mode )
- bLiveMap = liveMap;
+ }
MainLayout( bLiveMap, bNoBorder ); // PanHere
}
-static void DoPanKeyAction( wAction_t action )
+static int DoPanKeyAction( wAction_t action )
{
- switch ((wAccelKey_e)(action>>8)) {
+ switch ((wAccelKey_e)(action>>8)&0xFF) {
case wAccelKey_Del:
- SelectDelete();
- return;
+ return SelectDelete();
#ifndef WINDOWS
case wAccelKey_Pgdn:
DoZoomUp(NULL);
@@ -2289,50 +2592,59 @@ static void DoPanKeyAction( wAction_t action )
case wAccelKey_Right:
panCenter.x = mainD.orig.x + mainD.size.x/2;
panCenter.y = mainD.orig.y + mainD.size.y/2;
- if ((MyGetKeyState() & WKEY_SHIFT) != 0)
- panCenter.x += 0.25*mainD.scale; //~1cm in 1::1, 1ft in 30:1, 1mm in 10:1
- else
+ if ((MyGetKeyState() & WKEY_SHIFT) != 0) {
+ panCenter.x += 0.25*mainD.scale; //~1cm in 1::1, 1ft in 30:1, 1mm in 10:1
+ } else {
panCenter.x += mainD.size.x/2;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ }
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(0));
break;
case wAccelKey_Left:
panCenter.x = mainD.orig.x + mainD.size.x/2;
panCenter.y = mainD.orig.y + mainD.size.y/2;
- if ((MyGetKeyState() & WKEY_SHIFT) != 0)
+ if ((MyGetKeyState() & WKEY_SHIFT) != 0) {
panCenter.x -= 0.25*mainD.scale;
- else
+ } else {
panCenter.x -= mainD.size.x/2;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ }
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(0));
break;
case wAccelKey_Up:
panCenter.x = mainD.orig.x + mainD.size.x/2;
panCenter.y = mainD.orig.y + mainD.size.y/2;
- if ((MyGetKeyState() & WKEY_SHIFT) != 0)
+ if ((MyGetKeyState() & WKEY_SHIFT) != 0) {
panCenter.y += 0.25*mainD.scale;
- else
+ } else {
panCenter.y += mainD.size.y/2;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ }
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(0));
break;
case wAccelKey_Down:
panCenter.x = mainD.orig.x + mainD.size.x/2;
panCenter.y = mainD.orig.y + mainD.size.y/2;
- if ((MyGetKeyState() & WKEY_SHIFT) != 0)
+ if ((MyGetKeyState() & WKEY_SHIFT) != 0) {
panCenter.y -= 0.25*mainD.scale;
- else
+ } else {
panCenter.y -= mainD.size.y/2;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ }
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(0));
break;
default:
- return;
+ return 0;
}
+ return 0;
}
@@ -2342,82 +2654,98 @@ static void DoMapPan( wAction_t action, coOrd pos )
static coOrd size;
static DIST_T xscale, yscale;
static enum { noPan, movePan, resizePan } mode = noPan;
- wPos_t x, y;
+ wDrawPix_t x, y;
switch (action & 0xFF) {
case C_DOWN:
- if ( mode == noPan )
+ if ( mode == noPan ) {
mode = movePan;
- else
+ } else {
break;
+ }
case C_MOVE:
- if ( mode != movePan )
+ if ( mode != movePan ) {
break;
+ }
// mainD.orig.x = pos.x - mainD.size.x/2.0;
// mainD.orig.y = pos.y - mainD.size.y/2.0;
panCenter = pos;
-LOG( log_pan, 1, ( "%s = [ %0.3f, %0.3f ]\n", action == C_DOWN? "START":"MOVE", mainD.orig.x, mainD.orig.y ) )
- PanHere( (void*)2 );
+ LOG( log_pan, 1, ( "%s = [ %0.3f, %0.3f ]\n", action == C_DOWN? "START":"MOVE",
+ mainD.orig.x, mainD.orig.y ) )
+ PanHere( I2VP(2));
break;
case C_UP:
- if ( mode != movePan )
+ if ( mode != movePan ) {
break;
+ }
panCenter = pos;
- PanHere( (void*)0 );
-LOG( log_pan, 1, ( "FINAL = [ %0.3f, %0.3f ]\n", mainD.orig.x, mainD.orig.y ) )
+ PanHere( I2VP(0));
+ LOG( log_pan, 1, ( "FINAL = [ %0.3f, %0.3f ]\n", mainD.orig.x, mainD.orig.y ) )
mode = noPan;
break;
case C_RDOWN:
- if ( mode == noPan )
+ if ( mode == noPan ) {
mode = resizePan;
- else
+ } else {
break;
+ }
mapOrig = pos;
size.x = mainD.size.x/mainD.scale; //How big screen?
size.y = mainD.size.y/mainD.scale;
xscale = mainD.scale; //start at current
panCenter = pos;
-LOG( log_pan, 1, ( "START %0.3fx%0.3f %0.3f+%0.3f\n", mapOrig.x, mapOrig.y, size.x, size.y ) )
+ LOG( log_pan, 1, ( "START %0.3fx%0.3f %0.3f+%0.3f\n", mapOrig.x, mapOrig.y,
+ size.x, size.y ) )
break;
case C_RMOVE:
- if ( mode != resizePan )
+ if ( mode != resizePan ) {
break;
- if (pos.x < 0)
+ }
+ if (pos.x < 0) {
pos.x = 0;
- if (pos.x > mapD.size.x)
+ }
+ if (pos.x > mapD.size.x) {
pos.x = mapD.size.x;
- if (pos.y < 0)
+ }
+ if (pos.y < 0) {
pos.y = 0;
- if (pos.y > mapD.size.y)
+ }
+ if (pos.y > mapD.size.y) {
pos.y = mapD.size.y;
+ }
xscale = fabs((pos.x-mapOrig.x)*2.0/size.x);
yscale = fabs((pos.y-mapOrig.y)*2.0/size.y);
- if (xscale < yscale)
+ if (xscale < yscale) {
xscale = yscale;
+ }
xscale = ceil( xscale );
- if (xscale < 0.01)
+ if (xscale < 0.01) {
xscale = 0.01;
- if (xscale > 64)
+ }
+ if (xscale > 64) {
xscale = 64;
+ }
mainD.size.x = size.x * xscale;
mainD.size.y = size.y * xscale;
mainD.orig.x = mapOrig.x - mainD.size.x / 2.0;
mainD.orig.y = mapOrig.y - mainD.size.y / 2.0;
tempD.scale = mainD.scale = xscale;
- PanHere( (void*)2 );
-LOG( log_pan, 1, ( "MOVE SCL:%0.3f %0.3fx%0.3f %0.3f+%0.3f\n", xscale, mainD.orig.x, mainD.orig.y, mainD.size.x, mainD.size.y ) )
+ PanHere( I2VP(2));
+ LOG( log_pan, 1, ( "MOVE SCL:%0.3f %0.3fx%0.3f %0.3f+%0.3f\n", xscale,
+ mainD.orig.x, mainD.orig.y, mainD.size.x, mainD.size.y ) )
InfoScale();
- break;
+ break;
case C_RUP:
- if ( mode != resizePan )
+ if ( mode != resizePan ) {
break;
+ }
DoNewScale( xscale );
mode = noPan;
break;
@@ -2435,12 +2763,15 @@ LOG( log_pan, 1, ( "MOVE SCL:%0.3f %0.3fx%0.3f %0.3f+%0.3f\n", xscale, mainD.ori
}
+/*
+* IsClose
+* is distance smaller than 10 pixels at 72 DPI?
+* is distance smaller than 0.1" at 1:1?
+*/
EXPORT BOOL_T IsClose(
- DIST_T d )
+ DIST_T d )
{
- wPos_t pd;
- pd = (wPos_t)(d/mainD.scale * mainD.dpi);
- return pd <= closePixels;
+ return d <= closeDist*mainD.scale;
}
/*****************************************************************************
@@ -2467,11 +2798,11 @@ EXPORT void FakeDownMouseState( void )
*
* \param x OUT pointer x position
* \param y OUT pointer y position
- * \return
+ * \return
*/
void
-GetMousePosition( int *x, int *y )
+GetMousePosition( wDrawPix_t *x, wDrawPix_t *y )
{
if( x && y ) {
*x = mousePositionx;
@@ -2479,7 +2810,8 @@ GetMousePosition( int *x, int *y )
}
}
-coOrd minIncrementSizes() {
+coOrd minIncrementSizes()
+{
double x,y;
if (mainD.scale >= 1.0) {
if (units == UNITS_ENGLISH) {
@@ -2491,11 +2823,11 @@ coOrd minIncrementSizes() {
}
} else {
if (units == UNITS_ENGLISH) {
- x = 1/64; //<1:1 = 1/64 inch
- y = 1/64;
+ x = 1.0/64.0; //<1:1 = 1/64 inch
+ y = 1.0/64.0;
} else {
- x = 1/(25.4*2); //>1:1 = 0.5 mm
- y = 1/(25.4*2);
+ x = 1.0/(25.4*2); //>1:1 = 0.5 mm
+ y = 1.0/(25.4*2);
}
}
coOrd ret;
@@ -2508,10 +2840,14 @@ static void DoMouse( wAction_t action, coOrd pos )
{
BOOL_T rc;
- wPos_t x, y;
+ wDrawPix_t x, y;
static BOOL_T ignoreCommands;
+ // Middle button pan state
+ static BOOL_T panActive = FALSE;
+ static coOrd panOrigin, panStart;
- LOG( log_mouse, 2, ( "DoMouse( %d, %0.3f, %0.3f )\n", action, pos.x, pos.y ) )
+ LOG( log_mouse, (action == wActionMove)?2:1,
+ ( "DoMouse( %d, %0.3f, %0.3f )\n", action, pos.x, pos.y ) )
if (recordF) {
RecordMouse( "MOUSE", action, pos.x, pos.y );
@@ -2521,8 +2857,9 @@ static void DoMouse( wAction_t action, coOrd pos )
switch (action&0xFF) {
case C_UP:
- if (mouseState != mouseLeft)
+ if (mouseState != mouseLeft) {
return;
+ }
if (ignoreCommands) {
ignoreCommands = FALSE;
return;
@@ -2530,29 +2867,43 @@ static void DoMouse( wAction_t action, coOrd pos )
mouseState = mouseNone;
break;
case C_RUP:
- if (mouseState != mouseRight)
+ if (mouseState != mouseRight) {
return;
+ }
if (ignoreCommands) {
ignoreCommands = FALSE;
return;
}
mouseState = mouseNone;
break;
+ case C_MUP:
+ if ( !panActive ) {
+ return;
+ }
+ if (ignoreCommands) {
+ ignoreCommands = FALSE;
+ return;
+ }
+ break;
case C_MOVE:
if (mouseState == mouseLeftPending ) {
action = C_DOWN;
mouseState = mouseLeft;
}
- if (mouseState != mouseLeft)
+ if (mouseState != mouseLeft) {
+ return;
+ }
+ if (ignoreCommands) {
return;
- if (ignoreCommands)
- return;
+ }
break;
case C_RMOVE:
- if (mouseState != mouseRight)
+ if (mouseState != mouseRight) {
+ return;
+ }
+ if (ignoreCommands) {
return;
- if (ignoreCommands)
- return;
+ }
break;
case C_DOWN:
mouseState = mouseLeft;
@@ -2560,11 +2911,19 @@ static void DoMouse( wAction_t action, coOrd pos )
case C_RDOWN:
mouseState = mouseRight;
break;
+ case C_MDOWN:
+ // Set up state for Middle button pan
+ panActive = TRUE;
+ panOrigin = panCenter;
+ panStart.x = pos.x-mainD.orig.x;
+ panStart.y = pos.y-mainD.orig.y;
+ break;
}
inError = FALSE;
- if ( deferSubstituteControls[0] )
+ if ( deferSubstituteControls[0] ) {
InfoSubstituteControls( deferSubstituteControls, deferSubstituteLabels );
+ }
// panCenter.y = mainD.orig.y + mainD.size.y/2;
// panCenter.x = mainD.orig.x + mainD.size.x/2;
@@ -2573,114 +2932,142 @@ static void DoMouse( wAction_t action, coOrd pos )
coOrd min = minIncrementSizes();
switch ( action&0xFF ) {
- case C_DOWN:
- case C_RDOWN:
- tempSegs_da.cnt = 0;
- break;
- case wActionMove:
- InfoPos( pos );
- if ( ignoreMoves )
- return;
- break;
- case wActionExtKey:
- mainD.CoOrd2Pix(&mainD,pos,&x,&y);
- if ((MyGetKeyState() &
- (WKEY_SHIFT | WKEY_CTRL)) == (WKEY_SHIFT | WKEY_CTRL) &&
- ( action>>8 == wAccelKey_Up ||
- action>>8 == wAccelKey_Down ||
- action>>8 == wAccelKey_Left ||
- action>>8 == wAccelKey_Right ))
- break; //Allow SHIFT+CTRL for Move
- if (((action>>8)&0xFF) == wAccelKey_LineFeed) {
- action = C_TEXT+((int)(0x0A<<8));
- break;
- }
- DoPanKeyAction( action );
+ case C_DOWN:
+ case C_RDOWN:
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ break;
+ case C_MDOWN:
+ break;
+ case wActionMove:
+ InfoPos( pos );
+ if ( ignoreMoves ) {
return;
- case C_TEXT:
- if ((action>>8) == 0x0D) {
- action = C_OK;
- } else if ((action>>8) == 0x1B) {
- ConfirmReset( TRUE );
- return;
- }
- case C_MODKEY:
- case C_MOVE:
- case C_UP:
- case C_RMOVE:
- case C_RUP:
- case C_LDOUBLE:
- InfoPos( pos );
- /*DrawTempTrack();*/
- break;
- case C_WUP:
- DoZoomUp((void *)1L);
- break;
- case C_WDOWN:
- DoZoomDown((void *)1L);
- break;
- case C_SCROLLUP:
- panCenter.y = panCenter.y + ((mainD.size.y/20>min.y)?mainD.size.y/20:min.y);
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)1);
- break;
- case C_SCROLLDOWN:
- panCenter.y = panCenter.y - ((mainD.size.y/20>min.y)?mainD.size.y/20:min.y);
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)1);
- break;
- case C_SCROLLLEFT:
- panCenter.x = panCenter.x - ((mainD.size.x/20>min.x)?mainD.size.x/20:min.x);
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)1);
- break;
- case C_SCROLLRIGHT:
- panCenter.x = panCenter.x + ((mainD.size.x/20>min.x)?mainD.size.x/20:min.x);
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)1);
- break;
- default:
- NoticeMessage( MSG_DOMOUSE_BAD_OP, _("Ok"), NULL, action&0xFF );
- break;
}
- if (delayUpdate)
- wDrawDelayUpdate( mainD.d, TRUE );
- rc = DoCurCommand( action, pos );
- wDrawDelayUpdate( mainD.d, FALSE );
- switch( rc ) {
- case C_CONTINUE:
- /*DrawTempTrack();*/
- break;
- case C_ERROR:
- ignoreCommands = TRUE;
- inError = TRUE;
- Reset();
- LOG( log_mouse, 1, ( "Mouse returns Error\n" ) )
- break;
- case C_TERMINATE:
- Reset();
- DoCurCommand( C_START, zero );
+ break;
+ case wActionExtKey:
+ mainD.CoOrd2Pix(&mainD,pos,&x,&y);
+ if ((MyGetKeyState() &
+ (WKEY_SHIFT | WKEY_CTRL)) == (WKEY_SHIFT | WKEY_CTRL) &&
+ ( action>>8 == wAccelKey_Up ||
+ action>>8 == wAccelKey_Down ||
+ action>>8 == wAccelKey_Left ||
+ action>>8 == wAccelKey_Right )) {
+ break; //Allow SHIFT+CTRL for Move
+ }
+ if (((action>>8)&0xFF) == wAccelKey_LineFeed) {
+ action = C_TEXT+((int)(0x0A<<8));
break;
- case C_INFO:
- Reset();
+ }
+ int rc = DoPanKeyAction(action);
+ if (rc!=1) { return; }
+ break;
+ case C_TEXT:
+ if ((action>>8) == 0x0D) {
+ action = C_OK;
+ } else if ((action>>8) == 0x1B) {
+ ConfirmReset( TRUE );
+ return;
+ }
+ /*no break */
+ case C_MODKEY:
+ case C_MOVE:
+ case C_UP:
+ case C_RMOVE:
+ case C_RUP:
+ case C_LDOUBLE:
+ case C_MUP:
+ InfoPos( pos );
+ /*DrawTempTrack();*/
+ break;
+ case C_WUP:
+ DoZoomUp(I2VP(1L));
+ break;
+ case C_WDOWN:
+ DoZoomDown(I2VP(1L));
+ break;
+ case C_SCROLLUP:
+ panCenter.y = panCenter.y + ((mainD.size.y/20>min.y)?mainD.size.y/20:min.y);
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(1));
+ break;
+ case C_SCROLLDOWN:
+ panCenter.y = panCenter.y - ((mainD.size.y/20>min.y)?mainD.size.y/20:min.y);
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(1));
+ break;
+ case C_SCROLLLEFT:
+ panCenter.x = panCenter.x - ((mainD.size.x/20>min.x)?mainD.size.x/20:min.x);
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(1));
+ break;
+ case C_SCROLLRIGHT:
+ panCenter.x = panCenter.x + ((mainD.size.x/20>min.x)?mainD.size.x/20:min.x);
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere(I2VP(1));
+ break;
+ case C_MMOVE:
+ // Middle button pan
+ if ( !panActive ) {
break;
}
+ panCenter.x = panOrigin.x + (panStart.x - ( pos.x - mainD.orig.x ) );
+ panCenter.y = panOrigin.y + (panStart.y - ( pos.y - mainD.orig.y ) );
+ if ( panCenter.x < 0 ) { panCenter.x = 0; }
+ if ( panCenter.x > mapD.size.x ) { panCenter.x = mapD.size.x; }
+ if ( panCenter.y < 0 ) { panCenter.y = 0; }
+ if ( panCenter.y > mapD.size.y ) { panCenter.y = mapD.size.y; }
+ LOG( log_pan, 1, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__,
+ panCenter.x, panCenter.y ) );
+ PanHere(I2VP(1));
+ break;
+ default:
+ NoticeMessage( MSG_DOMOUSE_BAD_OP, _("Ok"), NULL, action&0xFF );
+ break;
+ }
+ if (delayUpdate) {
+ wDrawDelayUpdate( mainD.d, TRUE );
+ }
+ rc = DoCurCommand( action, pos );
+ wDrawDelayUpdate( mainD.d, FALSE );
+ switch( rc ) {
+ case C_CONTINUE:
+ /*DrawTempTrack();*/
+ break;
+ case C_ERROR:
+ ignoreCommands = TRUE;
+ inError = TRUE;
+ Reset();
+ LOG( log_mouse, 1, ( "Mouse returns Error\n" ) )
+ break;
+ case C_TERMINATE:
+ Reset();
+ DoCurCommand( C_START, zero );
+ break;
+ case C_INFO:
+ Reset();
+ break;
+ }
}
-wPos_t autoPanFactor = 10;
-static void DoMousew( wDraw_p d, void * context, wAction_t action, wPos_t x, wPos_t y )
+wDrawPix_t autoPanFactor = 10;
+static void DoMousew( wDraw_p d, void * context, wAction_t action, wDrawPix_t x,
+ wDrawPix_t y )
{
coOrd pos;
coOrd orig;
- wPos_t w, h;
- static wPos_t lastX, lastY;
+ wWinPix_t w, h;
+ static wDrawPix_t lastX, lastY;
DIST_T minDist;
-
+ wDrawGetSize( mainD.d, &w, &h );
if ( autoPan && !inPlayback ) {
- wDrawGetSize( mainD.d, &w, &h );
- if ( action == wActionLDown || action == wActionRDown ||
- (action == wActionLDrag && mouseState == mouseLeftPending ) /*||
+ if ( action == wActionLDown || action == wActionRDown
+ || action == wActionScrollDown ||
+ (action == wActionLDrag && mouseState == mouseLeftPending ) /*||
(action == wActionRDrag && mouseState == mouseRightPending ) */ ) {
lastX = x;
lastY = y;
@@ -2688,39 +3075,45 @@ static void DoMousew( wDraw_p d, void * context, wAction_t action, wPos_t x, wPo
if ( action == wActionLDrag || action == wActionRDrag ) {
orig = mainD.orig;
if ( ( x < 10 && x < lastX ) ||
- ( x > w-10 && x > lastX ) ||
- ( y < 10 && y < lastY ) ||
- ( y > h-10 && y > lastY ) ) {
+ ( x > w-10 && x > lastX ) ||
+ ( y < 10 && y < lastY ) ||
+ ( y > h-10 && y > lastY ) ) {
mainD.Pix2CoOrd( &mainD, x, y, &pos );
- orig.x = mainD.orig.x + (pos.x - (mainD.orig.x + mainD.size.x/2.0) )/autoPanFactor;
- orig.y = mainD.orig.y + (pos.y - (mainD.orig.y + mainD.size.y/2.0) )/autoPanFactor;
+ orig.x = mainD.orig.x + (pos.x - (mainD.orig.x +
+ mainD.size.x/2.0) )/autoPanFactor;
+ orig.y = mainD.orig.y + (pos.y - (mainD.orig.y +
+ mainD.size.y/2.0) )/autoPanFactor;
if ( orig.x != mainD.orig.x || orig.y != mainD.orig.y ) {
if ( mainD.scale >= 1 ) {
- if ( units == UNITS_ENGLISH )
+ if ( units == UNITS_ENGLISH ) {
minDist = 1.0;
- else
+ } else {
minDist = 1.0/2.54;
+ }
if ( orig.x != mainD.orig.x ) {
if ( fabs( orig.x-mainD.orig.x ) < minDist ) {
- if ( orig.x < mainD.orig.x )
+ if ( orig.x < mainD.orig.x ) {
orig.x -= minDist;
- else
+ } else {
orig.x += minDist;
+ }
}
}
if ( orig.y != mainD.orig.y ) {
if ( fabs( orig.y-mainD.orig.y ) < minDist ) {
- if ( orig.y < mainD.orig.y )
+ if ( orig.y < mainD.orig.y ) {
orig.y -= minDist;
- else
+ } else {
orig.y += minDist;
+ }
}
}
}
mainD.orig = orig;
panCenter.x = mainD.orig.x + mainD.size.x/2.0;
panCenter.y = mainD.orig.y + mainD.size.y/2.0;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
MainLayout( TRUE, TRUE ); // DoMouseW: autopan
tempD.orig = mainD.orig;
wFlush();
@@ -2740,6 +3133,7 @@ static void DoMousew( wDraw_p d, void * context, wAction_t action, wPos_t x, wPo
case wActionRDrag:
case wActionRUp:
case wActionLDownDouble:
+ case wActionMDrag:
mousePositionx = x;
mousePositiony = y;
break;
@@ -2748,6 +3142,10 @@ static void DoMousew( wDraw_p d, void * context, wAction_t action, wPos_t x, wPo
}
DoMouse( action, pos );
+
+ if (( x < 20 ) || ( x > w-20 ) || ( y < 20 ) || ( y > h-20 ) ) {
+ wSetCursor(mainD.d,defaultCursor); //Add system cursor if close to edges
+ }
}
static wBool_t PlaybackMain( char * line )
@@ -2755,17 +3153,17 @@ static wBool_t PlaybackMain( char * line )
int rc;
int action;
coOrd pos;
- char *oldLocale = NULL;
- oldLocale = SaveLocale("C");
+ SetCLocale();
- rc=sscanf( line, "%d " SCANF_FLOAT_FORMAT SCANF_FLOAT_FORMAT, &action, &pos.x, &pos.y);
- RestoreLocale(oldLocale);
+ rc=sscanf( line, "%d " SCANF_FLOAT_FORMAT SCANF_FLOAT_FORMAT, &action, &pos.x,
+ &pos.y);
+ SetUserLocale();
if (rc != 3) {
SyntaxError( "MOUSE", rc, 3 );
} else {
- PlaybackMouse( DoMouse, &mainD, (wAction_t)action, pos, wDrawColorBlack );
+ PlaybackMouse( DoMouse, &tempD, (wAction_t)action, pos, wDrawColorBlack );
}
return TRUE;
}
@@ -2775,18 +3173,18 @@ static wBool_t PlaybackKey( char * line )
int rc;
int action = C_TEXT;
coOrd pos;
- char *oldLocale = NULL;
int c;
- oldLocale = SaveLocale("C");
- rc=sscanf( line, "%d " SCANF_FLOAT_FORMAT SCANF_FLOAT_FORMAT, &c, &pos.x, &pos.y );
- RestoreLocale(oldLocale);
+ SetCLocale();
+ rc=sscanf( line, "%d " SCANF_FLOAT_FORMAT SCANF_FLOAT_FORMAT, &c, &pos.x,
+ &pos.y );
+ SetUserLocale();
if (rc != 3) {
SyntaxError( "MOUSE", rc, 3 );
} else {
- action = action||c<<8;
- PlaybackMouse( DoMouse, &mainD, (wAction_t)action, pos, wDrawColorBlack );
+ action = action|c<<8;
+ PlaybackMouse( DoMouse, &tempD, (wAction_t)action, pos, wDrawColorBlack );
}
return TRUE;
}
@@ -2797,52 +3195,11 @@ static wBool_t PlaybackKey( char * line )
*
*/
-static paramDrawData_t mapDrawData = { 100, 100, (wDrawRedrawCallBack_p)MapRedraw, DoMapPan, &mapD };
+static paramDrawData_t mapDrawData = { 50, 50, MapRedraw, DoMapPan, &mapD };
static paramData_t mapPLs[] = {
- { PD_DRAW, NULL, "canvas", 0, &mapDrawData } };
-static paramGroup_t mapPG = { "map", PGO_NODEFAULTPROC, mapPLs, sizeof mapPLs/sizeof mapPLs[0] };
-
-static void MapDlgUpdate(
- paramGroup_p pg,
- int inx,
- void * valueP )
-{
- int width,height;
- switch(inx) {
- case wResize_e:
- if (mapD.d == NULL)
- return;
- wWinGetSize( mapW, &width, &height );
- if (height >= 100) {
- wControlSetPos( (wControl_p)mapD.d, 0, 0 );
- double scaleX = (mapD.size.x/((width-DlgSepLeft-DlgSepRight-10)/mapD.dpi));
- double scaleY = (mapD.size.y/((height-DlgSepTop-DlgSepBottom-10)/mapD.dpi));
- double scale;
-
- if (scaleX<scaleY) scale = scaleX;
- else scale = scaleY;
-
- if (scale > 256.0) scale = 256.0;
- if (scale < 0.01) scale = 0.01;
-
- mapScale = (long)scale;
-
- mapD.scale = mapScale;
- ChangeMapScale(FALSE);
-
- if (mapVisible) {
- MapRedraw();
- }
- wPrefSetInteger( "draw", "mapscale", (long)mapD.scale );
- }
- break;
- case -1:
- MapWindowShow( FALSE );
- break;
- default:
- break;
- }
-}
+ { PD_DRAW, NULL, "canvas", PDO_DLGRESIZE, &mapDrawData }
+};
+static paramGroup_t mapPG = { "map", PGO_NODEFAULTPROC, mapPLs, COUNT( mapPLs ) };
static void DrawChange( long changes )
@@ -2850,39 +3207,96 @@ static void DrawChange( long changes )
if (changes & CHANGE_MAIN) {
MainLayout( TRUE, FALSE ); // DrawChange: CHANGE_MAIN
}
- if (changes &CHANGE_UNITS)
+ if (changes &CHANGE_UNITS) {
SetInfoBar();
- if (changes & CHANGE_MAP)
- MapResize();
+ }
+ if (changes & CHANGE_MAP) {
+ LOG( log_mapsize, 2, ( "CHANGE_MAP: mapD.scale=%0.3f\n", mapD.scale ) );
+ ChangeMapScale();
+ }
}
static void MainLayoutCB(
- wDraw_p bd, void * pContex, wPos_t px, wPos_t py )
+ wDraw_p bd, void * pContex, wWinPix_t px, wWinPix_t py )
{
MainLayout( TRUE, FALSE );
}
+EXPORT void InitColor( void )
+{
+ drawColorBlack = wDrawFindColor( wRGB( 0, 0, 0) );
+ drawColorWhite = wDrawFindColor( wRGB(255,255,255) );
+ drawColorRed = wDrawFindColor( wRGB(255, 0, 0) );
+ drawColorBlue = wDrawFindColor( wRGB( 0, 0,255) );
+ drawColorGreen = wDrawFindColor( wRGB( 0,255, 0) );
+ drawColorAqua = wDrawFindColor( wRGB( 0,255,255) );
+ drawColorDkRed = wDrawFindColor( wRGB(128, 0, 0) );
+ drawColorDkBlue = wDrawFindColor( wRGB( 0, 0,128) );
+ drawColorDkGreen= wDrawFindColor( wRGB( 0,128, 0) );
+ drawColorDkAqua = wDrawFindColor( wRGB( 0,128,128) );
+
+ // Last component of spectial color must be > 3
+ drawColorPreviewSelected = wDrawFindColor( wRGB ( 6, 6, 255) ); //Special Blue
+ drawColorPreviewUnselected = wDrawFindColor( wRGB( 255, 215,
+ 6)); //Special Yellow
+
+ drawColorPowderedBlue = wDrawFindColor( wRGB(129, 212, 250) );
+ drawColorPurple = wDrawFindColor( wRGB(128, 0,128) );
+ drawColorMagenta = wDrawFindColor( wRGB(255, 0, 255) );
+ drawColorGold = wDrawFindColor( wRGB(255,215, 0) );
+ drawColorGrey10 = wDrawFindColor( wRGB(26,26,26) );
+ drawColorGrey20 = wDrawFindColor( wRGB(51,51,51) );
+ drawColorGrey30 = wDrawFindColor( wRGB(72,72,72) );
+ drawColorGrey40 = wDrawFindColor( wRGB(102,102,102) );
+ drawColorGrey50 = wDrawFindColor( wRGB(128,128,128) );
+ drawColorGrey60 = wDrawFindColor( wRGB(153,153,153) );
+ drawColorGrey70 = wDrawFindColor( wRGB(179,179,179) );
+ drawColorGrey80 = wDrawFindColor( wRGB(204,204,204) );
+ drawColorGrey90 = wDrawFindColor( wRGB(230,230,230) );
+ snapGridColor = drawColorGreen;
+ markerColor = drawColorRed;
+ borderColor = drawColorBlack;
+ crossMajorColor = drawColorRed;
+ crossMinorColor = drawColorBlue;
+ selectedColor = drawColorRed;
+ normalColor = drawColorBlack;
+ elevColorIgnore = drawColorBlue;
+ elevColorDefined = drawColorGold;
+ profilePathColor = drawColorPurple;
+ exceptionColor = wDrawFindColor(wRGB(255, 89, 0 ));
+ tieColor = wDrawFindColor(wRGB(153, 89, 68));
+}
+
+
EXPORT void DrawInit( int initialZoom )
{
- wPos_t w, h;
+ wWinPix_t w, h;
+ log_pan = LogFindIndex( "pan" );
+ log_zoom = LogFindIndex( "zoom" );
+ log_mouse = LogFindIndex( "mouse" );
+ log_redraw = LogFindIndex( "redraw" );
+ log_timemainredraw = LogFindIndex( "timemainredraw" );
+ log_mapsize = LogFindIndex( "mapsize" );
+// InitColor();
wWinGetSize( mainW, &w, &h );
/*LayoutToolBar();*/
h = h - (toolbarHeight+max(textHeight,infoHeight)+10);
- if ( w <= 0 ) w = 1;
- if ( h <= 0 ) h = 1;
- tempD.d = mainD.d = wDrawCreate( mainW, 0, toolbarHeight, "", BD_TICKS|BD_MODKEYS,
- w, h, &mainD,
- (wDrawRedrawCallBack_p)MainLayoutCB, DoMousew );
+ if ( w <= 0 ) { w = 1; }
+ if ( h <= 0 ) { h = 1; }
+ tempD.d = mainD.d = wDrawCreate( mainW, 0, toolbarHeight, "",
+ BD_TICKS|BD_MODKEYS,
+ w, h, &mainD,
+ MainLayoutCB, DoMousew );
if (initialZoom == 0) {
WDOUBLE_T tmpR;
wPrefGetFloat( "draw", "zoom", &tmpR, mainD.scale );
mainD.scale = tmpR;
- } else {
+ } else {
while (initialZoom > 0 && mainD.scale < MAX_MAIN_SCALE) {
mainD.scale *= 2;
initialZoom--;
@@ -2894,9 +3308,7 @@ EXPORT void DrawInit( int initialZoom )
}
tempD.scale = mainD.scale;
mainD.dpi = wDrawGetDPI( mainD.d );
- if ( mainD.dpi == 75 ) {
- mainD.dpi = 72.0;
- } else if ( mainD.scale > 1.0 && mainD.scale <= 12.0 ) {
+ if ( mainD.scale > 1.0 && mainD.scale <= 12.0 ) {
mainD.dpi = floor( (mainD.dpi + mainD.scale/2)/mainD.scale) * mainD.scale;
}
tempD.dpi = mainD.dpi;
@@ -2904,40 +3316,33 @@ EXPORT void DrawInit( int initialZoom )
SetMainSize();
panCenter.x = mainD.size.x/2 +mainD.orig.x;
panCenter.y = mainD.size.y/2 +mainD.orig.y;
- mapD.scale = mapScale;
- /*w = (wPos_t)((mapD.size.x/mapD.scale)*mainD.dpi + 0.5)+2;*/
- /*h = (wPos_t)((mapD.size.y/mapD.scale)*mainD.dpi + 0.5)+2;*/
+ /*w = (wWinPix_t)((mapD.size.x/mapD.scale)*mainD.dpi + 0.5)+2;*/
+ /*h = (wWinPix_t)((mapD.size.y/mapD.scale)*mainD.dpi + 0.5)+2;*/
ParamRegister( &mapPG );
- mapW = ParamCreateDialog( &mapPG, MakeWindowTitle(_("Map")), NULL, NULL, NULL, FALSE, NULL, F_RESIZE, MapDlgUpdate );
- ChangeMapScale(TRUE);
+ LOG( log_mapsize, 2, ( "DrawInit/ParamCreateDialog(&mapPG\n" ) );
+ mapW = ParamCreateDialog( &mapPG, MakeWindowTitle(_("Map")), NULL, NULL, NULL,
+ FALSE, NULL, F_RESIZE, NULL );
+ ChangeMapScale();
- log_pan = LogFindIndex( "pan" );
- log_zoom = LogFindIndex( "zoom" );
- log_mouse = LogFindIndex( "mouse" );
- log_redraw = LogFindIndex( "redraw" );
AddPlaybackProc( "MOUSE ", (playbackProc_p)PlaybackMain, NULL );
AddPlaybackProc( "KEY ", (playbackProc_p)PlaybackKey, NULL );
rulerFp = wStandardFont( F_HELV, FALSE, FALSE );
- SetZoomRadio( mainD.scale );
+ SetZoomRadio( mainD.scale );
InfoScale();
SetInfoBar();
InfoPos( zero );
RegisterChangeNotification( DrawChange );
-#ifdef LATER
- wAttachAccelKey( wAccelKey_Pgup, 0, (wAccelKeyCallBack_p)doZoomUp, NULL );
- wAttachAccelKey( wAccelKey_Pgdn, 0, (wAccelKeyCallBack_p)doZoomDown, NULL );
-#endif
}
-#include "bitmaps/pan.xpm"
+#include "bitmaps/pan-zoom.xpm3"
-EXPORT static wMenu_p panPopupM;
+static wMenu_p panPopupM;
static STATUS_T CmdPan(
- wAction_t action,
- coOrd pos )
+ wAction_t action,
+ coOrd pos )
{
static enum { PAN, ZOOM, NONE } panmode;
@@ -2955,10 +3360,11 @@ static STATUS_T CmdPan(
switch (action&0xFF) {
case C_START:
start_pos = zero;
- panmode = NONE;
- InfoMessage(_("Left-Drag to pan, Ctrl+Left-Drag to zoom, 0 to set origin to zero, 1-9 to zoom#, e to set to extents"));
- wSetCursor(mainD.d,wCursorSizeAll);
- break;
+ panmode = NONE;
+ InfoMessage(
+ _("Left-Drag to pan, Ctrl+Left-Drag to zoom, 0 to set origin to zero, 1-9 to zoom#, e to set to extents"));
+ wSetCursor(mainD.d,wCursorSizeAll);
+ break;
case C_DOWN:
if ((MyGetKeyState()&WKEY_CTRL) == 0) {
panmode = PAN;
@@ -2975,33 +3381,36 @@ static STATUS_T CmdPan(
break;
case C_MOVE:
if (panmode == PAN) {
- double min_inc;
- if (mainD.scale >= 1.0) {
- if (units == UNITS_ENGLISH) {
- min_inc = 1/4; //>1:1 = 1/4 inch
- } else {
- min_inc = 1/(2.54*2); //>1:1 = 0.5 cm
- }
+ double min_inc;
+ if (mainD.scale >= 1.0) {
+ if (units == UNITS_ENGLISH) {
+ min_inc = 1.0/4.0; //>1:1 = 1/4 inch
} else {
- if (units == UNITS_ENGLISH) {
- min_inc = 1/64; //<1:1 = 1/64 inch
- } else {
- min_inc = 1/(25.4*2); //>1:1 = 0.5 mm
- }
+ min_inc = 1.0/(2.54*2); //>1:1 = 0.5 cm
}
- if ((fabs(pos.x-start_pos.x) > min_inc) || (fabs(pos.y-start_pos.y) > min_inc)) {
- coOrd oldOrig = mainD.orig;
- mainD.orig.x -= (pos.x - start_pos.x);
- mainD.orig.y -= (pos.y - start_pos.y);
- if ((MyGetKeyState()&WKEY_SHIFT) != 0)
- ConstraintOrig(&mainD.orig,mainD.size,TRUE,FALSE);
- if ((oldOrig.x == mainD.orig.x) && (oldOrig.y == mainD.orig.y))
- InfoMessage(_("Can't move any further in that direction"));
- else
- InfoMessage(_("Left click to pan, right click to zoom, 'o' for origin, 'e' for extents"));
+ } else {
+ if (units == UNITS_ENGLISH) {
+ min_inc = 1.0/64.0; //<1:1 = 1/64 inch
+ } else {
+ min_inc = 1.0/(25.4*2); //>1:1 = 0.5 mm
}
}
- else if (panmode == ZOOM) {
+ if ((fabs(pos.x-start_pos.x) > min_inc)
+ || (fabs(pos.y-start_pos.y) > min_inc)) {
+ coOrd oldOrig = mainD.orig;
+ mainD.orig.x -= (pos.x - start_pos.x);
+ mainD.orig.y -= (pos.y - start_pos.y);
+ if ((MyGetKeyState()&WKEY_SHIFT) != 0) {
+ ConstraintOrig(&mainD.orig,mainD.size,TRUE,TRUE);
+ }
+ if ((oldOrig.x == mainD.orig.x) && (oldOrig.y == mainD.orig.y)) {
+ InfoMessage(_("Can't move any further in that direction"));
+ } else {
+ InfoMessage(
+ _("Left click to pan, right click to zoom, 'o' for origin, 'e' for extents"));
+ }
+ }
+ } else if (panmode == ZOOM) {
base = start_pos;
size.x = pos.x - base.x;
if (size.x < 0) {
@@ -3016,41 +3425,43 @@ static STATUS_T CmdPan(
}
panCenter.x = mainD.orig.x + mainD.size.x/2.0;
panCenter.y = mainD.orig.y + mainD.size.y/2.0;
- PanHere( (void*)0 );
+ PanHere( I2VP(0));
break;
case C_UP:
if (panmode == ZOOM) {
scale_x = size.x/mainD.size.x*mainD.scale;
scale_y = size.y/mainD.size.y*mainD.scale;
- DIST_T oldScale = mainD.scale;
-
- if (scale_x<scale_y)
- scale_x = scale_y;
- if (scale_x>1) scale_x = ceil( scale_x );
- else scale_x = 1/(ceil(1/scale_x));
+ if (scale_x<scale_y) {
+ scale_x = scale_y;
+ }
+ if (scale_x>1) { scale_x = ceil( scale_x ); }
+ else { scale_x = 1/(ceil(1/scale_x)); }
- if (scale_x > MAX_MAIN_SCALE) scale_x = MAX_MAIN_SCALE;
- if (scale_x < MIN_MAIN_MACRO) scale_x = MIN_MAIN_MACRO;
+ if (scale_x > MAX_MAIN_SCALE) { scale_x = MAX_MAIN_SCALE; }
+ if (scale_x < MIN_MAIN_MACRO) { scale_x = MIN_MAIN_MACRO; }
mainD.orig.x = base.x;
mainD.orig.y = base.y;
panmode = NONE;
- InfoMessage(_("Left Drag to Pan, +CTRL to Zoom, 0 to set Origin to 0,0, 1-9 to Zoom#, e to set to Extent"));
+ InfoMessage(
+ _("Left Drag to Pan, +CTRL to Zoom, 0 to set Origin to 0,0, 1-9 to Zoom#, e to set to Extent"));
DoNewScale(scale_x);
break;
} else if (panmode == PAN) {
panCenter.x = mainD.orig.x + mainD.size.x/2.0;
panCenter.y = mainD.orig.y + mainD.size.y/2.0;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
panmode = NONE;
}
break;
case C_REDRAW:
if (panmode == ZOOM) {
- if (base.x && base.y && size.x && size.y)
+ if (base.x && base.y && size.x && size.y) {
DrawHilight( &tempD, base, size, TRUE );
+ }
}
break;
case C_CANCEL:
@@ -3061,20 +3472,24 @@ static STATUS_T CmdPan(
panmode = NONE;
if ((action>>8) == 'e') { //"e"
- DoZoomExtents(0);
+ DoZoomExtents(I2VP(0));
+ } else if((action>>8) == 's') {
+ DoZoomExtents(I2VP(1));
} else if (((action>>8) == '0') || ((action>>8) == 'o')) { //"0" or "o"
mainD.orig = zero;
panCenter.x = mainD.size.x/2.0;
panCenter.y = mainD.size.y/2.0;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
MainLayout( TRUE, TRUE ); // CmdPan C_TEXT '0' 'o'
} else if ((action>>8) >= '1' && (action>>8) <= '9') { //"1" to "9"
scale_x = (action>>8)&0x0F;
DoNewScale(scale_x);
} else if ((action>>8) == 'c') { // "c"
panCenter = pos;
- LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere( (void*)0 ); // CmdPan C_TEXT 'c'
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
+ PanHere( I2VP(0)); // CmdPan C_TEXT 'c'
}
if ((action>>8) == 0x0D) {
@@ -3095,44 +3510,59 @@ static STATUS_T CmdPan(
return C_CONTINUE;
}
static wMenuPush_p zoomExtents,panOrig,panHere;
-static wMenuPush_p zoomLvl1,zoomLvl2,zoomLvl3,zoomLvl4,zoomLvl5,zoomLvl6,zoomLvl7,zoomLvl8,zoomLvl9;
+static wMenuPush_p zoomLvl1,zoomLvl2,zoomLvl3,zoomLvl4,zoomLvl5,zoomLvl6,
+ zoomLvl7,zoomLvl8,zoomLvl9;
-EXPORT void PanMenuEnter(int key) {
+EXPORT void PanMenuEnter( void * keyVP )
+{
+ int key = (int)VP2L(keyVP);
int action;
action = C_TEXT;
action |= key<<8;
CmdPan(action,zero);
}
-extern wIndex_t selectCmdInx;
-extern wIndex_t describeCmdInx;
-extern wIndex_t joinCmdInx;
-extern wIndex_t modifyCmdInx;
EXPORT void InitCmdPan( wMenu_p menu )
{
- panCmdInx = AddMenuButton( menu, CmdPan, "cmdPan", _("Pan/Zoom"), wIconCreatePixMap(pan_xpm),
- LEVEL0, IC_CANCEL|IC_POPUP|IC_LCLICK|IC_CMDMENU, ACCL_PAN, NULL );
+ panCmdInx = AddMenuButton( menu, CmdPan, "cmdPan", _("Pan/Zoom"),
+ wIconCreatePixMap(pan_zoom_xpm3[iconSize]),
+ LEVEL0, IC_CANCEL|IC_POPUP|IC_LCLICK|IC_CMDMENU, ACCL_PAN, NULL );
}
EXPORT void InitCmdPan2( wMenu_p menu )
{
panPopupM = MenuRegister( "Pan Options" );
- wMenuPushCreate(panPopupM, "cmdSelectMode", GetBalloonHelpStr("cmdSelectMode"), 0, DoCommandB, (void*) (intptr_t) selectCmdInx);
- wMenuPushCreate(panPopupM, "cmdDescribeMode", GetBalloonHelpStr("cmdDescribeMode"), 0, DoCommandB, (void*) (intptr_t) describeCmdInx);
- wMenuPushCreate(panPopupM, "cmdModifyMode", GetBalloonHelpStr("cmdModifyMode"), 0, DoCommandB, (void*) (intptr_t) modifyCmdInx);
+ wMenuPushCreate(panPopupM, "cmdSelectMode", GetBalloonHelpStr("cmdSelectMode"),
+ 0, DoCommandB, I2VP(selectCmdInx));
+ wMenuPushCreate(panPopupM, "cmdDescribeMode",
+ GetBalloonHelpStr("cmdDescribeMode"), 0, DoCommandB, I2VP(describeCmdInx));
+ wMenuPushCreate(panPopupM, "cmdModifyMode", GetBalloonHelpStr("cmdModifyMode"),
+ 0, DoCommandB, I2VP(modifyCmdInx));
wMenuSeparatorCreate(panPopupM);
- zoomExtents = wMenuPushCreate( panPopupM, "", _("Zoom to extents - 'e'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) 'e');
- zoomLvl1 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:1 - '1'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '1');
- zoomLvl2 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:2 - '2'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '2');
- zoomLvl3 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:3 - '3'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '3');
- zoomLvl4 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:4 - '4'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '4');
- zoomLvl5 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:5 - '5'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '5');
- zoomLvl6 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:6 - '6'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '6');
- zoomLvl7 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:7 - '7'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '7');
- zoomLvl8 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:8 - '8'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '8');
- zoomLvl9 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:9 - '9'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) '9');
- panOrig = wMenuPushCreate( panPopupM, "", _("Pan to Origin - 'o'/'0'"), 0, (wMenuCallBack_p)PanMenuEnter, (void*) 'o');
+ zoomExtents = wMenuPushCreate( panPopupM, "", _("Zoom to extents - 'e'"), 0,
+ PanMenuEnter, I2VP( 'e'));
+ zoomLvl1 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:1 - '1'"), 0,
+ PanMenuEnter, I2VP( '1'));
+ zoomLvl2 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:2 - '2'"), 0,
+ PanMenuEnter, I2VP( '2'));
+ zoomLvl3 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:3 - '3'"), 0,
+ PanMenuEnter, I2VP( '3'));
+ zoomLvl4 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:4 - '4'"), 0,
+ PanMenuEnter, I2VP( '4'));
+ zoomLvl5 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:5 - '5'"), 0,
+ PanMenuEnter, I2VP( '5'));
+ zoomLvl6 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:6 - '6'"), 0,
+ PanMenuEnter, I2VP( '6'));
+ zoomLvl7 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:7 - '7'"), 0,
+ PanMenuEnter, I2VP( '7'));
+ zoomLvl8 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:8 - '8'"), 0,
+ PanMenuEnter, I2VP( '8'));
+ zoomLvl9 = wMenuPushCreate( panPopupM, "", _("Zoom to 1:9 - '9'"), 0,
+ PanMenuEnter, I2VP( '9'));
+ panOrig = wMenuPushCreate( panPopupM, "", _("Pan to Origin - 'o'/'0'"), 0,
+ PanMenuEnter, I2VP( 'o'));
wMenu_p zoomPanM = wMenuMenuCreate(panPopupM, "", _("&Zoom"));
InitCmdZoom(NULL, NULL, NULL, zoomPanM);
- panHere = wMenuPushCreate( panPopupM, "", _("Pan center here - 'c'"), 0, (wMenuCallBack_p)PanHere, (void*) 3);
+ panHere = wMenuPushCreate( panPopupM, "", _("Pan center here - 'c'"), 0,
+ PanHere, I2VP( 3));
}