-function drawTrack() {
- if (gDrawing) { return; }
- gDrawing = true;
- if (gTrackContext && (document.hidden != true)) { // Only draw if we're actually visible.
- gLastDrawnPoint = null;
- gCurPosMapCache = undefined;
- gTrackContext.clearRect(0, 0, gTrackCanvas.width, gTrackCanvas.height);
- if (gTrack.length) {
- for (var i = 0; i < gTrack.length; i++) {
- drawTrackPoint(gTrack[i].coords.latitude, gTrack[i].coords.longitude,
- (i + 1 >= gTrack.length || gTrack[i+1].beginSegment));
- }
- }
- }
- gDrawing = false;
-}
-
-function drawTrackPoint(aLatitude, aLongitude, aLastPoint) {
- var trackpoint = {"worldpos": gps2xy(aLatitude, aLongitude)};
- var update_drawnpoint = true;
- // lastPoint is for optimizing (not actually executing the draw until the last)
- trackpoint.segmentEnd = (aLastPoint === true);
- trackpoint.optimized = (aLastPoint === false);
- trackpoint.mappos = {x: Math.round((trackpoint.worldpos.x - gMap.pos.x) / gMap.zoomFactor + gMap.width / 2),
- y: Math.round((trackpoint.worldpos.y - gMap.pos.y) / gMap.zoomFactor + gMap.height / 2)};
- trackpoint.skip_drawing = false;
- if (gLastDrawnPoint) {
- // Lines completely outside the current display should not be drawn.
- if ((trackpoint.mappos.x < 0 && gLastDrawnPoint.mappos.x < 0) ||
- (trackpoint.mappos.x > gMap.width && gLastDrawnPoint.mappos.x > gMap.width) ||
- (trackpoint.mappos.y < 0 && gLastDrawnPoint.mappos.y < 0) ||
- (trackpoint.mappos.y > gMap.height && gLastDrawnPoint.mappos.y > gMap.height)) {
- trackpoint.skip_drawing = true;
- }
- }
- if (!gLastDrawnPoint || !gLastDrawnPoint.optimized) {
- gTrackContext.strokeStyle = gTrackColor;
- gTrackContext.fillStyle = gTrackContext.strokeStyle;
- gTrackContext.lineWidth = gTrackWidth;
- gTrackContext.lineCap = "round";
- gTrackContext.lineJoin = "round";
- }
- // This breaks optimiziation, so make sure to reset optimization.
- if (trackpoint.skip_drawing || !gLastDrawnPoint) {
- trackpoint.optimized = false;
- // Close path if one was open.
- if (gLastDrawnPoint && gLastDrawnPoint.optimized) {
- gTrackContext.stroke();
- }
- }
- if (!trackpoint.skip_drawing) {
- if (gLastDrawnPoint && gLastDrawnPoint.skip_drawing && !gLastDrawnPoint.segmentEnd) {
- // If the last point was skipped but the current one isn't, draw a segment start
- // for the off-screen previous one as well as a connection line.
- gTrackContext.beginPath();
- gTrackContext.arc(gLastDrawnPoint.mappos.x, gLastDrawnPoint.mappos.y,
- gTrackContext.lineWidth, 0, Math.PI * 2, false);
- gTrackContext.fill();
- gTrackContext.lineTo(trackpoint.mappos.x, trackpoint.mappos.y);
- }
- else if (!gLastDrawnPoint || !gLastDrawnPoint.optimized) {
- // Start drawing a segment with the current point.
- gTrackContext.beginPath();
- gTrackContext.arc(trackpoint.mappos.x, trackpoint.mappos.y,
- gTrackContext.lineWidth, 0, Math.PI * 2, false);
- gTrackContext.fill();
- }
- else if (!trackpoint.segmentEnd && gLastDrawnPoint &&
- (Math.abs(gLastDrawnPoint.mappos.x - trackpoint.mappos.x) <= 1) &&
- (Math.abs(gLastDrawnPoint.mappos.y - trackpoint.mappos.y) <= 1)) {
- // We would draw the same or almost the same point, don't do any actual drawing.
- update_drawnpoint = false;
- }
- else {
- // Continue drawing segment, close if needed.
- gTrackContext.lineTo(trackpoint.mappos.x, trackpoint.mappos.y);
- if (!trackpoint.optimized)
- gTrackContext.stroke();
- }
- }
- if (update_drawnpoint) {
- gLastDrawnPoint = trackpoint;
- }
-}
-
-function drawCurrentLocation(trackPoint) {
- var locpoint = gps2xy(trackPoint.coords.latitude, trackPoint.coords.longitude);
- var circleRadius = Math.round(gCurLocSize / 2);
- var mappos = {x: Math.round((locpoint.x - gMap.pos.x) / gMap.zoomFactor + gMap.width / 2),
- y: Math.round((locpoint.y - gMap.pos.y) / gMap.zoomFactor + gMap.height / 2)};
-
- undrawCurrentLocation();
-
- // Cache overdrawn area.
- gCurPosMapCache =
- {point: locpoint,
- radius: circleRadius,
- data: gTrackContext.getImageData(mappos.x - circleRadius,
- mappos.y - circleRadius,
- circleRadius * 2, circleRadius * 2)};
-
- gTrackContext.strokeStyle = gCurLocColor;
- gTrackContext.fillStyle = gTrackContext.strokeStyle;
- gTrackContext.beginPath();
- gTrackContext.arc(mappos.x, mappos.y,
- circleRadius, 0, Math.PI * 2, false);
- gTrackContext.fill();
-}
-
-function undrawCurrentLocation() {
- if (gCurPosMapCache) {
- var oldpoint = gCurPosMapCache.point;
- var oldmp = {x: Math.round((oldpoint.x - gMap.pos.x) / gMap.zoomFactor + gMap.width / 2),
- y: Math.round((oldpoint.y - gMap.pos.y) / gMap.zoomFactor + gMap.height / 2)};
- gTrackContext.putImageData(gCurPosMapCache.data,
- oldmp.x - gCurPosMapCache.radius,
- oldmp.y - gCurPosMapCache.radius);
- gCurPosMapCache = undefined;
- }
-}
-