From 2276e63d4c661278aed12a25abb134bfcb8e61eb Mon Sep 17 00:00:00 2001
From: Toke Eskildsen <te@ekot.dk>
Date: Fri, 27 Sep 2013 14:45:35 +0200
Subject: [PATCH] More work on Dragon Scale. Now with less memory leaking

---
 dragonscale.html | 109 +++++++++++++++++++++++++++++++++--------------
 1 file changed, 78 insertions(+), 31 deletions(-)

diff --git a/dragonscale.html b/dragonscale.html
index 6b840ed..7d1dbe9 100644
--- a/dragonscale.html
+++ b/dragonscale.html
@@ -4,6 +4,7 @@
     <!-- Tests performance of multiple, potentially active, OpenSeadragons.
          No sample data due to immaterial rights, sorry.
          Adjust "scale_tiles" and "6448" and "9101" to your own tile data.
+         To get a lot of data, duplicate the same tiles by hard-linking.
     -->
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@@ -12,32 +13,24 @@
     <script src="openseadragon.min.js"></script>
     <script>
         var dragons = [];
+        var dormantDragons = [];
+        var maxDragons = 9999;
+        var tileIndex = 0;
+        var maxTileIndex = 199;
         var springTime = 1500; // OpenSeadragon default
         var triggerTime = 300; // Should be < springTime / dragons.length but beware performance
         var triggerCount = 0;
 
-        // Add count dragons to the page
-        function add(count) {
-            for (var i = 0 ; i < count ; i++) {
-                // Add div
-                var den = document.getElementById('dragonden');
-                var newDragonDiv = document.createElement('div');
-                newDragonDiv.setAttribute('id', 'dragon' + dragons.length);
-                newDragonDiv.setAttribute('class', 'openseadragon');
-                den.appendChild(newDragonDiv);
-
-                // Assign dragon
-                var dragon = OpenSeadragon({
-                id:             "dragon" + dragons.length,
-                maxZoomLevel:   16,
-                animationTime:  1.5,
-                zoomPerSecond:  1.5,
-                showNavigator:  false,
-                wrapHorizontal: false,
-                tileSources: {
-                    Image: {
+        function updateCount() {
+            var countSpan = document.getElementById('dragonCount');
+            countSpan.innerHTML = dragons.length == 1 ? "1 dragon" : dragons.length + " dragons";
+        }
+
+        function getTileSource() {
+            var ts = {
+                Image: {
                     xmlns:    "http://schemas.microsoft.com/deepzoom/2008",
-                    Url:      "scale_tiles/",
+                    Url:      "scale/scale_tiles_" + tileIndex + "/",
                     Format:   "png",
                     Overlap:  "4",
                     TileSize: "256",
@@ -46,21 +39,75 @@
                         Height: "9101"
                     }
                 }
+            }
+            if (tileIndex > maxTileIndex) {
+                tileIndex = 0;
+            }
+            return ts;
+        }                                              
+
+        // Wake a dormant dragon
+        function wakeDragon() {
+            // Show div
+            var dragonDiv = document.getElementById("dragon" + (dragons.length));
+            dragonDiv.style.display = 'block';
+
+            // Wake dragon
+            var dragon = dormantDragons.pop();
+            dragon.open(getTileSource());
+            dragons.push(dragon);
+            updateCount();
+       }
+
+        // Add a single dragon to the page
+        function addDragon() {
+            // Add div
+            var den = document.getElementById('dragonDen');
+            var newDragonDiv = document.createElement('div');
+            newDragonDiv.setAttribute('id', 'dragon' + dragons.length);
+            newDragonDiv.setAttribute('class', 'openseadragon');
+            den.appendChild(newDragonDiv);
+
+            // Assign dragon
+            var dragon = OpenSeadragon({
+                id:             "dragon" + dragons.length,
+                maxZoomLevel:   16,
+                animationTime:  1.5,
+                zoomPerSecond:  1.5,
+                showNavigator:  false,
+                wrapHorizontal: false,
+                tileSources: getTileSource()
+            });
+            dragons.push(dragon);
+            updateCount();
+       }
+
+        // Add count dragons to the page
+        function add(count) {
+            var count = Math.min(maxDragons - dragons.length, count);
+            for (var i = 0 ; i < count ; i++) {
+                if (dormantDragons.length > 0) {
+                    wakeDragon();
+                } else {
+                    addDragon();
                 }
-                });
-                dragons[dragons.length] = dragon;
             }
-        }
+         }
 
         // Add count dragons to the page
         function removeD(count) {
             count = Math.min(count, dragons.length);
             for (var i = 0 ; i < count ; i++) {
-                var dragonDiv = document.getElementById("dragon" + (dragons.length-1));
-                document.title = dragonDiv;
-                dragonDiv.parentNode.removeChild(dragonDiv);
-                dragons.splice(dragons.length-1, 1);
-            }
+                // First make dragon dormant
+                dragons[dragons.length-1].close();
+                dormantDragons.push(dragons.pop());
+
+                // Then hide the div
+                var dragonDiv = document.getElementById("dragon" + (dragons.length));
+                dragonDiv.style.display = 'none';
+//                dragonDiv.parentNode.removeChild(dragonDiv);
+              }
+            updateCount();
         }
 
         // Reset to default views
@@ -119,7 +166,7 @@
 
 <body class="previewpage" onLoad="init();">
 <h1>Dragon Scale</span></h1>
-<p>OpenSeadragon scaling test</p>
+<p>OpenSeadragon scaling test with <span id="dragonCount">0 dragons</span></p>
 <div class="moreless">
 <input type="button" onClick="removeD(10);" value="-10" />
 <input type="button" onClick="removeD(1);" value="-1" />
@@ -130,7 +177,7 @@
 </div>
 </p>
 
-<div id="dragonden"></div>
+<div id="dragonDen"></div>
 
 </body>
 </html>
-- 
GitLab