Support named sizes in permalink image urls
[bookreader.git] / BookReaderIA / datanode / BookReaderImages.inc.php
index 9d2f45e..1c9c44b 100644 (file)
@@ -54,15 +54,15 @@ class BookReaderImages
 
     // Keys in the image permalink urls, e.g. http://www.archive.org/download/itemid/page/cover_{keyval}_{keyval}.jpg
     public static $imageUrlKeys = array(
-        'r' => 'reduce',
+        //'r' => 'reduce',
         's' => 'scale',
         'region' => 'region',
         'tile' => 'tile',
         'w' => 'width',
-        'h' => 'height'
+        'h' => 'height',
+        'rotate' => 'rotate'
     );
     
-    
     // Paths to command-line tools
     var $exiftool = '/petabox/sw/books/exiftool/exiftool';
     var $kduExpand = '/petabox/sw/bin/kdu_expand';
@@ -177,10 +177,12 @@ class BookReaderImages
             'ext' => 'jpg',
         );
         
-        if ($pageInfo['reduce']) {
-            $requestEnv['reduce'] = $pageInfo['reduce'];
-        }
-        // $$$ handle scale, other sizes, rotation, etc
+        // remove non-passthrough keys from pageInfo
+        unset($pageInfo['type']);
+        unset($pageInfo['value']);
+        
+        // add pageinfo to request
+        $requestEnv = array_merge($pageInfo, $requestEnv);
 
         // Return image data - will check privs        
         $this->serveRequest($requestEnv);
@@ -266,6 +268,8 @@ class BookReaderImages
         
         // The pbmreduce reduction factor produces an image with dimension 1/n
         // The kakadu reduction factor produceds an image with dimension 1/(2^n)
+        
+        // Set scale from height or width if set
         if (isset($requestEnv['height'])) {
             $powReduce = $this->nearestPow2Reduce($requestEnv['height'], $imageInfo['height']);
             $scale = pow(2, $powReduce);
@@ -276,11 +280,16 @@ class BookReaderImages
         } else {
             // $$$ could be cleaner
             // Provide next smaller power of two reduction
+            
+            // Set scale from 'scale' if set
             $scale = $requestEnv['scale'];
             if (!$scale) {
                 $scale = 1;
             }
-            if (array_key_exists($scale, $this->imageSizes)) {
+            
+            // Set scale from named size (e.g. 'large') if set
+            $size = $requestEnv['size'];
+            if ( $size && array_key_exists($size, self::$imageSizes)) {
                 $srcRatio = floatval($imageInfo['width']) / floatval($imageInfo['height']);
                 if ($srcRatio > 1) {
                     // wide
@@ -288,10 +297,13 @@ class BookReaderImages
                 } else {
                     $dimension = 'height';
                 }
-                $powReduce = $this->nearestPow2Reduce($this->imageSizes[$scale], $imageInfo[$dimension]);
+                $powReduce = $this->nearestPow2Reduce(self::$imageSizes[$size], $imageInfo[$dimension]);
             } else {
-                $powReduce = $this->nearestPow2ForScale($scale);
+                // No named size - update powReduce from scale
+                $powReduce = $this->nearestPow2ForScale($sale);
             }
+            
+            // Make sure scale matches powReduce
             $scale = pow(2, $powReduce);
         }
         
@@ -791,7 +803,7 @@ class BookReaderImages
         
         // Look for other known parts
         foreach ($parts as $part) {
-            if ( in_array($part, $imageSizes) ) {
+            if ( array_key_exists($part, self::$imageSizes) ) {
                 $pageInfo['size'] = $part;
                 continue;
             }