<?php
	/**
	 * Elgg tidypics library of resizing functions
	 * 
	 */
	 
	include dirname(__FILE__) . "/watermark.php";

	 
	/**
	 * Create thumbnails using PHP GD Library
	 *
	 * @param ElggFile holds the image that was uploaded
	 * @param string   folder to store thumbnail in
	 * @param string   name of the thumbnail
	 * @return bool    true on success
	 */
	function tp_create_gd_thumbnails($file, $prefix, $filestorename)
	{
		global $CONFIG;

		$image_sizes = get_plugin_setting('image_sizes', 'tidypics');
		if (!$image_sizes) {
			register_error(elgg_echo('tidypics:nosettings'));
			forward($_SERVER['HTTP_REFERER']);
			return false;
		}
		$image_sizes = unserialize($image_sizes);

		$thumb = new ElggFile();

		// tiny thumbail
		$thumb->setFilename($prefix."thumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_gd_resize(	$file->getFilenameOnFilestore(),
									$thumbname,
									false,
									$image_sizes['thumb_image_width'],
									$image_sizes['thumb_image_height'], 
									true);
		if (!$rtn_code)
			return false;
		$file->thumbnail = $prefix."thumb".$filestorename;


		// album thumbnail
		$thumb->setFilename($prefix."smallthumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_gd_resize(	$file->getFilenameOnFilestore(),
									$thumbname,
									false,
									$image_sizes['small_image_width'],
									$image_sizes['small_image_height'], 
									true); 
		if (!$rtn_code)
			return false;
		$file->smallthumb = $prefix."smallthumb".$filestorename;


		// main image
		$thumb->setFilename($prefix."largethumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_gd_resize(	$file->getFilenameOnFilestore(),
									$thumbname,
									true,
									$image_sizes['large_image_width'],
									$image_sizes['large_image_height'], 
									false); 
		if (!$rtn_code)
			return false;
		$file->largethumb = $prefix."largethumb".$filestorename;
		

		unset($thumb);

		return true;
	}

	/**
	 * Writes resized version of an already uploaded image - original from Elgg filestore.php 
	 * Saves it in the same format as uploaded
	 *
	 * @param string $input_name The name of the file on the disk
	 * @param string $output_name The name of the file to be written
	 * @param bool - watermark this image? 
	 * @param int $maxwidth The maximum width of the resized image
	 * @param int $maxheight The maximum height of the resized image
	 * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
	 * @return bool true on success or false on failure
	 */
	function tp_gd_resize($input_name, $output_name, $watermark, $maxwidth, $maxheight, $square = false, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) {
		
		// Get the size information from the image
		$imgsizearray = getimagesize($input_name);
		if (!imgsizearray)
			return false;
		
		// Get width and height
		$width = $imgsizearray[0];
		$height = $imgsizearray[1];
		$newwidth = $width;
		$newheight = $height;
		
		// Square the image dimensions if we're wanting a square image
		if ($square) {
			if ($width < $height) {
				$height = $width;
			} else {
				$width = $height;
			}
			
			$newwidth = $width;
			$newheight = $height;
			
		}
		
		if ($width > $maxwidth) {
			$newheight = floor($height * ($maxwidth / $width));
			$newwidth = $maxwidth;
		}
		if ($newheight > $maxheight) {
			$newwidth = floor($newwidth * ($maxheight / $newheight));
			$newheight = $maxheight; 
		}
		
		$accepted_formats = array(
										'image/jpeg' => 'jpeg',
										'image/pjpeg' => 'jpeg',
										'image/png' => 'png',
										'image/x-png' => 'png',
										'image/gif' => 'gif'
								);

		// make sure the function is available
		$function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
		if (!is_callable($function))
			return false;
		
		
		// load old image
		$oldimage = $function($input_name);
		if (!$oldimage)
			return false;
		
		// allocate the new image
		$newimage = imagecreatetruecolor($newwidth, $newheight);
		if (!$newimage)
			return false;
		
		// Crop the image if we need a square
		if ($square) {
			if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
				$widthoffset = floor(($imgsizearray[0] - $width) / 2);
				$heightoffset = floor(($imgsizearray[1] - $height) / 2);
			} else {
				$widthoffset = $x1;
				$heightoffset = $y1;
				$width = ($x2 - $x1);
				$height = $width;
			}
		} else {
			if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
				$widthoffset = 0;
				$heightoffset = 0;
			} else {
				$widthoffset = $x1;
				$heightoffset = $y1;
				$width = ($x2 - $x1);
				$height = ($y2 - $y1);
			}
		}
		
		if ($square) {
			$newheight = $maxheight;
			$newwidth = $maxwidth;
		}
		
		$rtn_code = imagecopyresampled($newimage, $oldimage, 0,0,$widthoffset,$heightoffset,$newwidth,$newheight,$width,$height);
		if (!rtn_code)
			return $rtn_code;
		
		if ($watermark)
			tp_gd_watermark($newimage);
		
		switch ($imgsizearray['mime']) {
			case 'image/jpeg':
			case 'image/pjpeg':
				$rtn_code = imagejpeg($newimage, $output_name, 85); 
				break;
			case 'image/png':
			case 'image/x-png':
				$rtn_code = imagepng($newimage, $output_name);
				break;
			case 'image/gif':
				$rtn_code = imagegif($newimage, $output_name);
				break;
		}
		
		imagedestroy($newimage);
		imagedestroy($oldimage);
		
		return $rtn_code;
	}


	/**
	 * Create thumbnails using PHP ImageMagick Library
	 *
	 * @param ElggFile holds the image that was uploaded
	 * @param string   folder to store thumbnail in
	 * @param string   name of the thumbnail
	 * @return bool    true on success 
	 */
	function tp_create_imagick_thumbnails($file, $prefix, $filestorename)
	{
		$image_sizes = get_plugin_setting('image_sizes', 'tidypics');
		if (!$image_sizes) {
			register_error(elgg_echo('tidypics:nosettings'));
			return false;
		}
		$image_sizes = unserialize($image_sizes);

		$thumb = new ElggFile();


		// tiny thumbnail
		$thumb->setFilename($prefix."thumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['thumb_image_width'],
										$image_sizes['thumb_image_height'], 
										true);
		if (!$rtn_code)
			return false;
		$file->thumbnail = $prefix."thumb".$filestorename;


		// album thumbnail
		$thumb->setFilename($prefix."smallthumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['small_image_width'],
										$image_sizes['small_image_height'], 
										true); 
		if (!$rtn_code)
			return false;
		$file->smallthumb = $prefix."smallthumb".$filestorename;


		// main image
		$thumb->setFilename($prefix."largethumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['large_image_width'],
										$image_sizes['large_image_height'], 
										false); 
		if (!$rtn_code)
			return false;
		$file->largethumb = $prefix."largethumb".$filestorename;
		
		tp_imagick_watermark($thumbname);

		unset($thumb);

		return true;
	}

	
	/**
	 * Resize using PHP ImageMagick Library
	 *
	 * Writes resized version of an already uploaded image
	 * 
	 *
	 * @param string $input_name The name of the file input field on the submission form
	 * @param string $output_name The name of the file to be written
	 * @param int $maxwidth The maximum width of the resized image
	 * @param int $maxheight The maximum height of the resized image
	 * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
	 * @return bool true on success
	 */
	function tp_imagick_resize($input_name, $output_name, $maxwidth, $maxheight, $square = false, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) {
		
		// Get the size information from the image
		$imgsizearray = getimagesize($input_name);
		if (!$imgsizearray)
			return false;
		

		// Get width and height
		$width = $imgsizearray[0];
		$height = $imgsizearray[1];
		$newwidth = $width;
		$newheight = $height;
		
		// initial guess at final dimensions for new image (doesn't check for squareness yet
		if ($newwidth > $maxwidth) {
			$newheight = floor($newheight * ($maxwidth / $newwidth));
			$newwidth = $maxwidth;
		}
		if ($newheight > $maxheight) {
			$newwidth = floor($newwidth * ($maxheight / $newheight));
			$newheight = $maxheight; 
		}
		
		// Handle squareness for both original and new image
		if ($square) {
			if ($width < $height) {
				$height = $width;
			} else {
				$width = $height;
			}
			
			if ($maxheight == $maxwidth) {
				// if input arguments = square, no need to use above calculations (which can have round-off errors)
				$newwidth = $maxwidth;
				$newheight = $maxheight;
			} else {
				if ($newwidth < $newheight) {
					$newheight = $newwidth;
				} else {
					$newwidth = $newheight;
				}
			}
		}
		
		
		// Crop the original image - this needs to be checked over
		if ($square) {
			if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
				$xoffset = floor(($imgsizearray[0] - $width) / 2);
				$yoffset = floor(($imgsizearray[1] - $height) / 2);
			} else { // assume we're being passed good croping coordinates
				$xoffset = $x1;
				$yoffset = $y1;
				$width = ($x2 - $x1);
				$height = $width;
			}
		} else {
			if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
				$xoffset = 0;
				$yoffset = 0;
			} else {
				$xoffset = $x1;
				$yoffset = $y1;
				$width = ($x2 - $x1);
				$height = ($y2 - $y1);
			}
		}


		try {
			$img = new Imagick($input_name);
		} catch (ImagickException $e) {
			return false;
		}
		
		$img->cropImage($width, $height, $xoffset, $yoffset);
		
		// use the default IM filter (windowing filter), I think 1 means default blurring or number of lobes
		$img->resizeImage($newwidth, $newheight, imagick::FILTER_LANCZOS, 1);
		$img->setImagePage($newwidth, $newheight, 0, 0);
		
		if ($img->writeImage($output_name) != true) {
			$img->destroy();
			return false;
		}
		
		$img->destroy();
		
		return true;
	}

	/**
	 * Create thumbnails using ImageMagick executables
	 *
	 * @param ElggFile holds the image that was uploaded
	 * @param string   folder to store thumbnail in
	 * @param string   name of the thumbnail
	 * @return bool    true on success 
	 */
	function tp_create_imagick_cmdline_thumbnails($file, $prefix, $filestorename)
	{
		$image_sizes = get_plugin_setting('image_sizes', 'tidypics');
		if (!$image_sizes) {
			register_error(elgg_echo('tidypics:nosettings'));
			return false;
		}
		$image_sizes = unserialize($image_sizes);

		$thumb = new ElggFile();


		// tiny thumbnail
		$thumb->setFilename($prefix."thumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_cmdline_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['thumb_image_width'],
										$image_sizes['thumb_image_height'], 
										true);
		if (!$rtn_code)
			return false;
		$file->thumbnail = $prefix."thumb".$filestorename;


		// album thumbnail
		$thumb->setFilename($prefix."smallthumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_cmdline_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['small_image_width'],
										$image_sizes['small_image_height'], 
										true); 
		if (!$rtn_code)
			return false;
		$file->smallthumb = $prefix."smallthumb".$filestorename;


		// main image
		$thumb->setFilename($prefix."largethumb".$filestorename);
		$thumbname = $thumb->getFilenameOnFilestore();
		$rtn_code = tp_imagick_cmdline_resize(	$file->getFilenameOnFilestore(),
										$thumbname,
										$image_sizes['large_image_width'],
										$image_sizes['large_image_height'], 
										false); 
		if (!$rtn_code)
			return false;
		$file->largethumb = $prefix."largethumb".$filestorename;
		
		
		tp_imagick_cmdline_watermark($thumbname);
		


		unset($thumb);

		return true;
	}

	/*
	 * Gets the jpeg contents of the resized version of an already uploaded image
	 * (Returns false if the uploaded file was not an image)
	 *
	 * @param string $input_name The name of the file input field on the submission form
	 * @param string $output_name The name of the file to be written
	 * @param int $maxwidth The maximum width of the resized image
	 * @param int $maxheight The maximum height of the resized image
	 * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
	 * @return bool
	 */
	function tp_imagick_cmdline_resize($input_name, $output_name, $maxwidth, $maxheight, $square = false, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) {
		
		
		// Get the size information from the image
		if ($imgsizearray = getimagesize($input_name)) {

			// Get width and height
			$width = $imgsizearray[0];
			$height = $imgsizearray[1];
			$newwidth = $width;
			$newheight = $height;
			
			// Square the image dimensions if we're wanting a square image
			if ($square) {
				if ($width < $height) {
					$height = $width;
				} else {
					$width = $height;
				}
				
				$newwidth = $width;
				$newheight = $height;
				
			}

			if ($width > $maxwidth) {
				$newheight = floor($height * ($maxwidth / $width));
				$newwidth = $maxwidth;
			}
			if ($newheight > $maxheight) {
				$newwidth = floor($newwidth * ($maxheight / $newheight));
				$newheight = $maxheight;
			}

			$accepted_formats = array(
										'image/jpeg' => 'jpeg',
										'image/pjpeg' => 'jpeg',
										'image/png' => 'png',
										'image/x-png' => 'png',
										'image/gif' => 'gif'
								);
			// If it's a file we can manipulate ...
			if (array_key_exists($imgsizearray['mime'],$accepted_formats)) {

				// Crop the image if we need a square
				if ($square) {
					if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
						$widthoffset = floor(($imgsizearray[0] - $width) / 2);
						$heightoffset = floor(($imgsizearray[1] - $height) / 2);
					} else {
						$widthoffset = $x1;
						$heightoffset = $y1;
						$width = ($x2 - $x1);
						$height = $width;
					}
				} else {
					if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
						$widthoffset = 0;
						$heightoffset = 0;
					} else {
						$widthoffset = $x1;
						$heightoffset = $y1;
						$width = ($x2 - $x1);
						$height = ($y2 - $y1);
					}
				}
				
				// Resize and return the image contents!
				if ($square) {
					$newheight = $maxheight;
					$newwidth = $maxwidth;
				}
				$im_path = get_plugin_setting('im_path', 'tidypics');
				if(!$im_path) {
					$im_path = "/usr/bin/";
				}
				if(substr($im_path, strlen($im_path)-1, 1) != "/") $im_path .= "/";
				$command = $im_path . "convert \"$input_name\" -resize ".$newwidth."x".$newheight."^ -gravity center -extent ".$newwidth."x".$newheight." \"$output_name\"";
				exec($command);
				return true;

			}
		}

		return false;
	}

?>