X-Git-Url: https://git-public.kairo.at/?p=lantea.git;a=blobdiff_plain;f=js%2Fmap.js;h=732197ded38206e384cac185afd39412bb00a469;hp=b63aea5fe1272ffd773cc4464cc02781765b6e4b;hb=260c3861f7330f343bf5b8fedbfdc41b4b20332a;hpb=aec007a668b2b61312c0974a8548ab0f616e704c diff --git a/js/map.js b/js/map.js index b63aea5..732197d 100644 --- a/js/map.js +++ b/js/map.js @@ -91,6 +91,7 @@ var gDragTouchID, gPinchStartWidth; var gGeoWatchID, gGPSWakeLock; var gTrack = []; var gLastTrackPoint, gLastDrawnPoint; +var gDrawing = false; var gCenterPosition = true; var gCurPosMapCache; @@ -706,6 +707,8 @@ function decodeIndex(encodedIdx) { } function drawTrack() { + if (gDrawing) { return; } + gDrawing = true; if (gTrackContext && (document.hidden != true)) { // Only draw if we're actually visible. gLastDrawnPoint = null; gCurPosMapCache = undefined; @@ -717,15 +720,27 @@ function drawTrack() { } } } + gDrawing = false; } -function drawTrackPoint(aLatitude, aLongitude, lastPoint) { - var trackpoint = gps2xy(aLatitude, aLongitude); +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.optimized = (lastPoint === false); - var mappos = {x: Math.round((trackpoint.x - gMap.pos.x) / gMap.zoomFactor + gMap.width / 2), - y: Math.round((trackpoint.y - gMap.pos.y) / gMap.zoomFactor + gMap.height / 2)}; - + 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; @@ -734,27 +749,46 @@ function drawTrackPoint(aLatitude, aLongitude, lastPoint) { gTrackContext.lineJoin = "round"; } // This breaks optimiziation, so make sure to reset optimization. - if (!gLastDrawnPoint || gLastDrawnPoint == trackpoint) { + if (trackpoint.skip_drawing || !gLastDrawnPoint) { trackpoint.optimized = false; // Close path if one was open. if (gLastDrawnPoint && gLastDrawnPoint.optimized) { gTrackContext.stroke(); } } - if (!gLastDrawnPoint || (gLastDrawnPoint == trackpoint) || !gLastDrawnPoint.optimized) { - // Start drawing a segment. - gTrackContext.beginPath(); - gTrackContext.arc(mappos.x, mappos.y, - gTrackContext.lineWidth, 0, Math.PI * 2, false); - gTrackContext.fill(); + 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(); + } } - else { - // Continue drawing segment, close if needed. - gTrackContext.lineTo(mappos.x, mappos.y); - if (!trackpoint.optimized) - gTrackContext.stroke(); + if (update_drawnpoint) { + gLastDrawnPoint = trackpoint; } - gLastDrawnPoint = trackpoint; } function drawCurrentLocation(trackPoint) { @@ -1204,6 +1238,24 @@ function clearTrack() { drawTrack(); } +function loadTrack(aTrackId) { + fetchBackend("track_json?id=" + encodeURIComponent(aTrackId), "GET", null, + function(aResult, aStatusCode) { + if (aStatusCode >= 400 || !aResult) { + console.log("loading track failed: " + aStatusCode + ", result: " + aResult.message); + } + else { + console.log("loading track with " + aResult.length + " points."); + gTrack = aResult; + for (var i = 0; i < gTrack.length; i++) { + try { gTrackStore.push(gTrack[i]); } catch(e) {} + } + drawTrack(); + } + } + ); +} + var gTileService = { objStore: "tilecache",