summaryrefslogtreecommitdiffstats
path: root/apps/theming/lib/Controller/IconController.php
diff options
context:
space:
mode:
authorJulius Haertl <jus@bitgrid.net>2016-08-30 09:03:06 +0200
committerJulius Haertl <jus@bitgrid.net>2016-11-18 10:23:24 +0100
commitaf8976ab03d976bba04a2442957a650728de7ecb (patch)
tree4d2d10e66a62f0999e2ec0d792823fdc8b53d18a /apps/theming/lib/Controller/IconController.php
parentb466628bfddee71b3c4d9f8d903e327269f57b4a (diff)
downloadnextcloud-server-af8976ab03d976bba04a2442957a650728de7ecb.tar.gz
nextcloud-server-af8976ab03d976bba04a2442957a650728de7ecb.zip
Add IconBuilder class to encapsulate icon generation
Signed-off-by: Julius Haertl <jus@bitgrid.net>
Diffstat (limited to 'apps/theming/lib/Controller/IconController.php')
-rw-r--r--apps/theming/lib/Controller/IconController.php117
1 files changed, 33 insertions, 84 deletions
diff --git a/apps/theming/lib/Controller/IconController.php b/apps/theming/lib/Controller/IconController.php
index 5770bd20742..78d41d621a0 100644
--- a/apps/theming/lib/Controller/IconController.php
+++ b/apps/theming/lib/Controller/IconController.php
@@ -22,6 +22,7 @@
*/
namespace OCA\Theming\Controller;
+use OCA\Theming\IconBuilder;
use OCA\Theming\Template;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller;
@@ -35,9 +36,6 @@ use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
use OCA\Theming\Util;
-use OCP\IURLGenerator;
-use Imagick;
-use ImagickPixel;
class IconController extends Controller {
/** @var ThemingDefaults */
@@ -52,7 +50,8 @@ class IconController extends Controller {
private $config;
/** @var IRootFolder */
private $rootFolder;
-
+ /** @var IconBuilder */
+ private $iconBuilder;
/**
* IconController constructor.
@@ -84,6 +83,9 @@ class IconController extends Controller {
$this->l = $l;
$this->config = $config;
$this->rootFolder = $rootFolder;
+ if(extension_loaded('imagick')) {
+ $this->iconBuilder = new IconBuilder($this->themingDefaults, $this->util);
+ }
}
/**
@@ -91,7 +93,7 @@ class IconController extends Controller {
* @NoCSRFRequired
*
* @param $app app name
- * @param $image image file name
+ * @param $image image file name (svg required)
* @return StreamResponse|DataResponse
*/
public function getThemedIcon($app, $image) {
@@ -99,10 +101,10 @@ class IconController extends Controller {
$svg = file_get_contents($image);
$color = $this->util->elementColor($this->themingDefaults->getMailHeaderColor());
$svg = $this->util->colorizeSvg($svg, $color);
-
$response = new DataDisplayResponse($svg, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);
$response->cacheFor(86400);
$response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ $response->addHeader('Pragma', 'cache');
return $response;
}
@@ -116,14 +118,21 @@ class IconController extends Controller {
* @return StreamResponse|DataResponse
*/
public function getFavicon($app="core") {
- $icon = $this->renderAppIcon($app);
- $icon->resizeImage(32, 32, Imagick::FILTER_LANCZOS, 1);
- $icon->setImageFormat("png24");
+ if($this->themingDefaults->shouldReplaceIcons()) {
+ $icon = $this->iconBuilder->getFavicon($app);
+ $response = new DataDisplayResponse($icon, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
+ $response->cacheFor(86400);
+ $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ $response->addHeader('Pragma', 'cache');
+ return $response;
+ } else {
+ $response = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND);
+ $response->cacheFor(86400);
+ $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ return $response;
+ }
+
- $response = new DataDisplayResponse($icon, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
- $response->cacheFor(86400);
- $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
- return $response;
}
/**
@@ -136,80 +145,20 @@ class IconController extends Controller {
* @return StreamResponse|DataResponse
*/
public function getTouchIcon($app="core") {
- $icon = $this->renderAppIcon($app);
- $icon->setImageFormat("png24");
-
- $response = new DataDisplayResponse($icon, Http::STATUS_OK, ['Content-Type' => 'image/png']);
- $response->cacheFor(86400);
- $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
- return $response;
- }
-
- /**
- * Render app icon on themed background color
- * fallback to logo
- *
- * @param $app app name
- * @return Imagick
- */
- private function renderAppIcon($app) {
- $appIcon = $this->util->getAppIcon($app);
- $color = $this->themingDefaults->getMailHeaderColor();
- $mime = mime_content_type($appIcon);
- // generate background image with rounded corners
- $background = '<?xml version="1.0" encoding="UTF-8"?>' .
- '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink">' .
- '<rect x="0" y="0" rx="75" ry="75" width="512" height="512" style="fill:' . $color . ';" />' .
- '</svg>';
-
- // resize svg magic as this seems broken in Imagemagick
- if($mime === "image/svg+xml") {
- $svg = file_get_contents($appIcon);
-
- $tmp = new Imagick();
- $tmp->readImageBlob($svg);
- $x = $tmp->getImageWidth();
- $y = $tmp->getImageHeight();
- $res = $tmp->getImageResolution();
- $tmp->destroy();
-
- // convert svg to resized image
- $appIconFile = new Imagick();
- $resX = (int)(512 * $res['x'] / $x * 2.53);
- $resY = (int)(512 * $res['y'] / $y * 2.53);
- $appIconFile->setResolution($resX, $resY);
- $appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
- $appIconFile->readImageBlob($svg);
+ if($this->themingDefaults->shouldReplaceIcons()) {
+ $icon = $this->iconBuilder->getTouchIcon($app);
+ $response = new DataDisplayResponse($icon, Http::STATUS_OK, ['Content-Type' => 'image/png']);
+ $response->cacheFor(86400);
+ $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ $response->addHeader('Pragma', 'cache');
+ return $response;
} else {
- $appIconFile = new Imagick();
- $appIconFile->setBackgroundColor(new ImagickPixel('transparent'));
- $appIconFile->readImageBlob(file_get_contents($appIcon));
- $appIconFile->scaleImage(512, 512, true);
+ $response = new DataDisplayResponse(null, Http::STATUS_NOT_FOUND);
+ $response->cacheFor(86400);
+ $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
+ return $response;
}
-
- // offset for icon positioning
- $border_w = (int)($appIconFile->getImageWidth() * 0.05);
- $border_h = (int)($appIconFile->getImageHeight() * 0.05);
- $innerWidth = (int)($appIconFile->getImageWidth() - $border_w * 2);
- $innerHeight = (int)($appIconFile->getImageHeight() - $border_h * 2);
- $appIconFile->adaptiveResizeImage($innerWidth, $innerHeight);
- // center icon
- $offset_w = 512 / 2 - $innerWidth / 2;
- $offset_h = 512 / 2 - $innerHeight / 2;
-
- $appIconFile->setImageFormat("png24");
-
- $finalIconFile = new Imagick();
- $finalIconFile->readImageBlob($background);
- $finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
- $finalIconFile->setImageArtifact('compose:args', "1,0,-0.5,0.5");
- $finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h);
- $finalIconFile->resizeImage(512, 512, Imagick::FILTER_LANCZOS, 1);
-
- $appIconFile->destroy();
- return $finalIconFile;
}
-
} \ No newline at end of file