<?php /** @file */


require_once('include/photo/photo_driver.php');


class photo_gd extends photo_driver {

	function supportedTypes() {
		$t = array();
		$t['image/jpeg'] ='jpg';
		if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
		if (imagetypes() & IMG_GIF) $t['image/gif'] = 'gif';
		return $t;

	}

	function load($data, $type) {
		$this->valid = false;
		if(! $data)
			return;

		$this->image = @imagecreatefromstring($data);
		if($this->image !== FALSE) {
			$this->valid  = true;
			$this->setDimensions();
			imagealphablending($this->image, false);
			imagesavealpha($this->image, true);
		}
	}

	function setDimensions() {
		$this->width  = imagesx($this->image);
		$this->height = imagesy($this->image);
	}


	public function destroy() {
		if($this->is_valid()) {
			imagedestroy($this->image);
		}
	}

	public function getImage() {
		if(!$this->is_valid())
			return FALSE;

		return $this->image;
	}

	public function doScaleImage($dest_width,$dest_height) {

		$dest = imagecreatetruecolor( $dest_width, $dest_height );
		$width = imagesx($this->image);
		$height = imagesy($this->image);

		imagealphablending($dest, false);
		imagesavealpha($dest, true);
		if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
		imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
		if($this->image)
			imagedestroy($this->image);
		$this->image = $dest;
		$this->setDimensions();
	}

	public function rotate($degrees) {
		if(!$this->is_valid())
			return FALSE;

		$this->image  = imagerotate($this->image,$degrees,0);
		$this->setDimensions();
	}

	public function flip($horiz = true, $vert = false) {
		if(!$this->is_valid())
			return FALSE;

		$w = imagesx($this->image);
		$h = imagesy($this->image);
		$flipped = imagecreate($w, $h);
		if($horiz) {
			for ($x = 0; $x < $w; $x++) {
				imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
			}
		}
		if($vert) {
			for ($y = 0; $y < $h; $y++) {
				imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
			}
		}
		$this->image = $flipped;
		$this->setDimensions(); // Shouldn't really be necessary
	}

	public function cropImage($max,$x,$y,$w,$h) {
		if(!$this->is_valid())
			return FALSE;

		$dest = imagecreatetruecolor( $max, $max );
		imagealphablending($dest, false);
		imagesavealpha($dest, true);
		if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
		imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
		if($this->image)
			imagedestroy($this->image);
		$this->image = $dest;
		$this->setDimensions();
	}

	public function cropImageRect($maxx,$maxy,$x,$y,$w,$h) {
		if(!$this->is_valid())
			return FALSE;

		$dest = imagecreatetruecolor( $maxx, $maxy );
		imagealphablending($dest, false);
		imagesavealpha($dest, true);
		if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
		imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $maxx, $maxy, $w, $h);
		if($this->image)
			imagedestroy($this->image);
		$this->image = $dest;
		$this->setDimensions();
	}



	public function imageString() {
		if(!$this->is_valid())
			return FALSE;

		$quality = FALSE;

		ob_start();

		switch($this->getType()){
			case "image/png":
				$quality = get_config('system','png_quality');
				if((! $quality) || ($quality > 9))
					$quality = PNG_QUALITY;
				imagepng($this->image,NULL, $quality);
				break;
			case "image/jpeg":
			default:
				$quality = get_config('system','jpeg_quality');
				if((! $quality) || ($quality > 100))
					$quality = JPEG_QUALITY;
				imagejpeg($this->image,NULL,$quality);
				break;
		}
		$string = ob_get_contents();
		ob_end_clean();

		return $string;
	}

}
