From: Michael J. Rubinsky Date: Sun, 14 Feb 2010 16:48:06 +0000 (-0500) Subject: Start work on implementing an Iterator for Horde_Image for supporting multi-page... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=9191d616a5a2526646eb3a15e68c553deab8ff58;p=horde.git Start work on implementing an Iterator for Horde_Image for supporting multi-page images. Add Iterator interface to Horde_Image_Base and implement it in Horde_Image_Imagick. Other backend support to come. Allows iterating through all images in a multi-page image such as TIFF or animatted GIFs This also goes towards a solution for Request: 6022 --- diff --git a/framework/Image/lib/Horde/Image/Base.php b/framework/Image/lib/Horde/Image/Base.php index 037ff2dcf..3313dc1ce 100644 --- a/framework/Image/lib/Horde/Image/Base.php +++ b/framework/Image/lib/Horde/Image/Base.php @@ -16,7 +16,7 @@ * @TODO: - Can we depend on the Horde_Util:: class or some other solution needed? * - Exceptions */ -class Horde_Image_Base +class Horde_Image_Base Implements Iterator { /** * Background color. @@ -418,4 +418,33 @@ class Horde_Image_Base } } + /** + * Iterator interface + */ + public function rewind() + { + + } + + public function current() + + { + + } + + public function key() + { + + } + + public function next() + { + + } + + public function valid() + { + + } + } diff --git a/framework/Image/lib/Horde/Image/Imagick.php b/framework/Image/lib/Horde/Image/Imagick.php index d6a96038a..082d8cb34 100644 --- a/framework/Image/lib/Horde/Image/Imagick.php +++ b/framework/Image/lib/Horde/Image/Imagick.php @@ -12,9 +12,22 @@ */ class Horde_Image_Imagick extends Horde_Image_Base { + /** + * The underlaying Imagick object + * + * @var Imagick + */ protected $_imagick; /** + * Flag for iterator, since calling nextImage on Imagick would result in a + * fatal error if there are no more images. + * + * @var boolean + */ + private $_noMoreImages = false; + + /** * Capabilites of this driver. * * @var array @@ -125,6 +138,7 @@ class Horde_Image_Imagick extends Horde_Image_Base { parent::reset(); $this->_imagick->clear(); + $this->_noMoreImages = false; } /** @@ -520,4 +534,64 @@ class Horde_Image_Imagick extends Horde_Image_Base $border->destroy(); } + /** + * Reset the imagick iterator to the first image in the set. + * + * @return void + */ + public function rewind() + { + $this->_logDebug('Horde_Image_Imagick#rewind'); + $this->_imagick->setFirstIterator(); + $this->_noMoreImages = false; + } + + /** + * Return the current image from the internal iterator. + * + * @return Horde_Image_Imagick + */ + public function current() + { + $this->_logDebug('Horde_Image_Imagick#current'); + $params = array('data' => $this->raw()); + $context = array('tmpdir' => $this->_tmpdir, + 'logger' => $this->_logger); + $image = new Horde_Image_Imagick($params, $context); + $this->_logDebug(print_r($image, true)); + return $image; + } + + /** + * Get the index of the internal iterator. + * + * @return integer + */ + public function key() + { + $this->_logDebug('Horde_Image_Imagick#key: ' . $this->_imagick->getIteratorIndex()); + return $this->_imagick->getIteratorIndex(); + } + + /** + * Advance the iterator + * + * @return Horde_Image_Imagick + */ + public function next() + { + if ($this->_imagick->hasNextImage()) { + $this->_imagick->nextImage(); + return $this->current(); + } else { + $this->_noMoreImages = true; + return false; + } + } + + public function valid() + { + $this->_logDebug('Horde_Image_Imagick#valid:' . print_r(!$this->moreImages, true)); + return !$this->_noMoreImages; + } }