+ drawGL: function(aPixels, aOverdraw) {
+ if (!gMap.gl) { return; }
+ // aPixels is an object with left/right/top/bottom members telling how many
+ // pixels on the borders should actually be drawn.
+ // aOverdraw is a bool that tells if we should draw placeholders or draw
+ // straight over the existing content.
+ // XXX: Both those optimizations are OFF for GL right now!
+ //if (!aPixels)
+ aPixels = {left: gMap.gl.drawingBufferWidth, right: gMap.gl.drawingBufferWidth,
+ top: gMap.gl.drawingBufferHeight, bottom: gMap.gl.drawingBufferHeight};
+ //if (!aOverdraw)
+ aOverdraw = false;
+
+ document.getElementById("zoomLevel").textContent = gMap.pos.z;
+ gMap.zoomFactor = Math.pow(2, gMap.maxZoom - gMap.pos.z);
+ var wid = gMap.gl.drawingBufferWidth * gMap.zoomFactor; // Width in level 18 pixels.
+ var ht = gMap.gl.drawingBufferHeight * gMap.zoomFactor; // Height in level 18 pixels.
+ var size = gMap.tileSize * gMap.zoomFactor; // Tile size in level 18 pixels.
+
+ var xMin = gMap.pos.x - wid / 2; // Corners of the window in level 18 pixels.
+ var yMin = gMap.pos.y - ht / 2;
+ var xMax = gMap.pos.x + wid / 2;
+ var yMax = gMap.pos.y + ht / 2;
+
+ if (gMapPrefsLoaded && mainDB)
+ gPrefs.set("position", gMap.pos);
+
+ var tiles = {left: Math.ceil((xMin + aPixels.left * gMap.zoomFactor) / size) -
+ (aPixels.left ? 0 : 1),
+ right: Math.floor((xMax - aPixels.right * gMap.zoomFactor) / size) -
+ (aPixels.right ? 1 : 0),
+ top: Math.ceil((yMin + aPixels.top * gMap.zoomFactor) / size) -
+ (aPixels.top ? 0 : 1),
+ bottom: Math.floor((yMax - aPixels.bottom * gMap.zoomFactor) / size) -
+ (aPixels.bottom ? 1 : 0)};
+
+ // Go through all the tiles in the map, find out if to draw them and do so.
+ for (var x = Math.floor(xMin / size); x < Math.ceil(xMax / size); x++) {
+ for (var y = Math.floor(yMin / size); y < Math.ceil(yMax / size); y++) { // slow script warnings on the tablet appear here!
+ // Only go to the drawing step if we need to draw this tile.
+ if (x < tiles.left || x > tiles.right ||
+ y < tiles.top || y > tiles.bottom) {
+ // Round here is **CRUCIAL** otherwise the images are filtered
+ // and the performance sucks (more than expected).
+ var xoff = Math.round((x * size - xMin) / gMap.zoomFactor);
+ var yoff = Math.round((y * size - yMin) / gMap.zoomFactor);
+ // Draw placeholder tile unless we overdraw.
+ if (!aOverdraw &&
+ (x < tiles.left -1 || x > tiles.right + 1 ||
+ y < tiles.top -1 || y > tiles.bottom + 1))
+ gMap.drawTileGL(xoff, yoff);
+/*
+ // Initiate loading/drawing of the actual tile.
+ gTileService.get(gMap.activeMap, {x: x, y: y, z: gMap.pos.z},
+ function(aImage, aStyle, aCoords) {
+ // Only draw if this applies for the current view.
+ if ((aStyle == gMap.activeMap) && (aCoords.z == gMap.pos.z)) {
+ var ixMin = gMap.pos.x - wid / 2;
+ var iyMin = gMap.pos.y - ht / 2;
+ var ixoff = Math.round((aCoords.x * size - ixMin) / gMap.zoomFactor);
+ var iyoff = Math.round((aCoords.y * size - iyMin) / gMap.zoomFactor);
+ var URL = window.URL;
+ var imgURL = URL.createObjectURL(aImage);
+ var imgObj = new Image();
+ imgObj.src = imgURL;
+ imgObj.onload = function() {
+ gMapContext.drawImage(imgObj, ixoff, iyoff);
+ URL.revokeObjectURL(imgURL);
+ }
+ }
+ });
+*/
+ }
+ }
+ }
+ //drawTrack();
+ },