1<?php 2 3/* 4 * This file is part of the Assetic package, an OpenSky project. 5 * 6 * (c) 2010-2014 OpenSky Project Inc 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Assetic\Filter; 13 14use Assetic\Asset\AssetInterface; 15use Assetic\Exception\FilterException; 16use Assetic\Util\FilesystemUtils; 17 18/** 19 * Runs assets through jpegtran. 20 * 21 * @link http://jpegclub.org/jpegtran/ 22 * @author Kris Wallsmith <kris.wallsmith@gmail.com> 23 */ 24class JpegtranFilter extends BaseProcessFilter 25{ 26 const COPY_NONE = 'none'; 27 const COPY_COMMENTS = 'comments'; 28 const COPY_ALL = 'all'; 29 30 private $jpegtranBin; 31 private $optimize; 32 private $copy; 33 private $progressive; 34 private $restart; 35 36 /** 37 * Constructor. 38 * 39 * @param string $jpegtranBin Path to the jpegtran binary 40 */ 41 public function __construct($jpegtranBin = '/usr/bin/jpegtran') 42 { 43 $this->jpegtranBin = $jpegtranBin; 44 } 45 46 public function setOptimize($optimize) 47 { 48 $this->optimize = $optimize; 49 } 50 51 public function setCopy($copy) 52 { 53 $this->copy = $copy; 54 } 55 56 public function setProgressive($progressive) 57 { 58 $this->progressive = $progressive; 59 } 60 61 public function setRestart($restart) 62 { 63 $this->restart = $restart; 64 } 65 66 public function filterLoad(AssetInterface $asset) 67 { 68 } 69 70 public function filterDump(AssetInterface $asset) 71 { 72 $pb = $this->createProcessBuilder(array($this->jpegtranBin)); 73 74 if ($this->optimize) { 75 $pb->add('-optimize'); 76 } 77 78 if ($this->copy) { 79 $pb->add('-copy')->add($this->copy); 80 } 81 82 if ($this->progressive) { 83 $pb->add('-progressive'); 84 } 85 86 if (null !== $this->restart) { 87 $pb->add('-restart')->add($this->restart); 88 } 89 90 $pb->add($input = FilesystemUtils::createTemporaryFile('jpegtran')); 91 file_put_contents($input, $asset->getContent()); 92 93 $proc = $pb->getProcess(); 94 $code = $proc->run(); 95 unlink($input); 96 97 if (0 !== $code) { 98 throw FilterException::fromProcess($proc)->setInput($asset->getContent()); 99 } 100 101 $asset->setContent($proc->getOutput()); 102 } 103} 104