From e3d4a7c17ad71f0c26631ab5142c940172ec9356 Mon Sep 17 00:00:00 2001
From: Demian Katz <demian.katz@villanova.edu>
Date: Tue, 25 Oct 2016 13:33:46 -0400
Subject: [PATCH] Allow separate dynamic cover settings for different sizes.
 (#821)

---
 config/vufind/config.ini                  |  9 ++++-
 module/VuFind/src/VuFind/Cover/Loader.php | 40 ++++++++++++++++++-----
 2 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/config/vufind/config.ini b/config/vufind/config.ini
index 3d00dfdea5e..3f4b04ea4c8 100644
--- a/config/vufind/config.ini
+++ b/config/vufind/config.ini
@@ -783,6 +783,11 @@ authors         = Wikipedia
 
 ; This section controls the behavior of the cover generator when makeDynamicCovers
 ; above is non-false.
+;
+; Note that any of these settings may be filtered to be size-specific by subscripting
+; the key with a size. You can use a key of * for a default to use when a specific
+; size is not matched. This allows adjustment of certain elements for different
+; thumbnail sizes. See the "size" setting below for an example.
 [DynamicCovers]
 ; This controls the background layer of the generated image; options:
 ; - solid: display a solid color
@@ -846,7 +851,9 @@ authors         = Wikipedia
 ; defines a WxH rectangle. wrapWidth constrains the text size (and must be no
 ; larger than the width of the canvas). topPadding and bottomPadding push the
 ; text away from the edges of the canvas.
-;size = 128
+;size[*] = 128
+;size[medium] = 200
+;size[large] = 500
 ;topPadding = 19
 ;bottomPadding = 3
 ;wrapWidth = 110
diff --git a/module/VuFind/src/VuFind/Cover/Loader.php b/module/VuFind/src/VuFind/Cover/Loader.php
index 14f549b5d11..28c4477cb7d 100644
--- a/module/VuFind/src/VuFind/Cover/Loader.php
+++ b/module/VuFind/src/VuFind/Cover/Loader.php
@@ -150,11 +150,11 @@ class Loader extends \VuFind\ImageLoader
     }
 
     /**
-     * Get Cover Generator Object
+     * Get settings for the cover generator.
      *
-     * @return VuFind\Cover\Generator
+     * @return array
      */
-    public function getCoverGenerator()
+    protected function getCoverGeneratorSettings()
     {
         $settings = isset($this->config->DynamicCovers)
             ? $this->config->DynamicCovers->toArray() : [];
@@ -163,7 +163,33 @@ class Loader extends \VuFind\ImageLoader
         ) {
             $settings['backgroundMode'] = $this->config->Content->makeDynamicCovers;
         }
-        return new \VuFind\Cover\Generator($this->themeTools, $settings);
+        $size = $this->size;
+        $pickSize = function ($setting) use ($size) {
+            if (isset($setting[$size])) {
+                return $setting[$size];
+            }
+            if (isset($setting['*'])) {
+                return $setting['*'];
+            }
+            return $setting;
+        };
+        return array_map($pickSize, $settings);
+    }
+
+    /**
+     * Get Cover Generator Object (or return false if disabled)
+     *
+     * @return VuFind\Cover\Generator|bool
+     */
+    public function getCoverGenerator()
+    {
+        if (isset($this->config->Content->makeDynamicCovers)
+            && $this->config->Content->makeDynamicCovers
+        ) {
+            $settings = $this->getCoverGeneratorSettings();
+            return new \VuFind\Cover\Generator($this->themeTools, $settings);
+        }
+        return false;
     }
 
     /**
@@ -260,10 +286,8 @@ class Loader extends \VuFind\ImageLoader
         } else if (!$this->fetchFromAPI()
             && !$this->fetchFromContentType()
         ) {
-            if (isset($this->config->Content->makeDynamicCovers)
-                && $this->config->Content->makeDynamicCovers
-            ) {
-                $this->image = $this->getCoverGenerator()->generate(
+            if ($generator = $this->getCoverGenerator()) {
+                $this->image = $generator->generate(
                     $settings['title'], $settings['author'], $settings['callnumber']
                 );
                 $this->contentType = 'image/png';
-- 
GitLab