<?php
/*
 * $RCSfile: WatermarkImage.class,v $
 *
 * Gallery - a web based photo album viewer and editor
 * Copyright (C) 2000-2005 Bharat Mediratta
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA.
 */
/**
 * @version $Revision: 1.16 $ $Date: 2005/08/23 03:49:57 $
 * @package Watermark
 * @author Alan Harder <alan.harder@sun.com>
 */

/**
 * Load the parent class
 */
GalleryCoreApi::relativeRequireOnce('modules/core/classes/GalleryEntity.class');

/**
 * Representation of an image used for watermarking
 *
 * @g2 <class-name>WatermarkImage</class-name>
 * @g2 <parent-class-name>GalleryEntity</parent-class-name>
 * @g2 <schema>
 * @g2   <schema-major>1</schema-major>
 * @g2   <schema-minor>1</schema-minor>
 * @g2 </schema>
 * @g2 <requires-id/>
 *
 * @package Watermark
 * @subpackage Classes
 */
class WatermarkImage_core extends GalleryEntity {

    /*
     * ****************************************
     *                 Members
     * ****************************************
     */

    /**
     * Should this watermark be applied to the preferred derivative?
     *
     * @g2 <member>
     * @g2   <member-name>applyToPreferred</member-name>
     * @g2   <member-type>BOOLEAN</member-type>
     * @g2 </member>
     *
     * @var bool $_applyToPreferred
     * @access private
     */
    var $_applyToPreferred;

    /**
     * Should this watermark be applied to resize derivatives?
     *
     * @g2 <member>
     * @g2   <member-name>applyToResizes</member-name>
     * @g2   <member-type>BOOLEAN</member-type>
     * @g2 </member>
     *
     * @var int $_applyToResizes
     * @access private
     */
    var $_applyToResizes;

    /**
     * Should this watermark be applied to the thumbnail derivative?
     *
     * @g2 <member>
     * @g2   <member-name>applyToThumbnail</member-name>
     * @g2   <member-type>BOOLEAN</member-type>
     * @g2 </member>
     *
     * @var int $_applyToThumbnail
     * @access private
     */
    var $_applyToThumbnail;

    /**
     * The symbolic name of this watermark, eg "My Watermark"
     *
     * @g2 <member>
     * @g2   <member-name>name</member-name>
     * @g2   <member-type>STRING</member-type>
     * @g2   <member-size>MEDIUM</member-size>
     * @g2   <required/>
     * @g2 </member>
     *
     * @var string $_name
     * @access private
     */
    var $_name;

    /**
     * The watermark image filename, in the g2data/watermark directory
     *
     * @g2 <member>
     * @g2   <member-name>fileName</member-name>
     * @g2   <member-type>STRING</member-type>
     * @g2   <member-size>MEDIUM</member-size>
     * @g2   <unique/>
     * @g2   <required/>
     * @g2 </member>
     *
     * @var string $_fileName
     * @access private
     */
    var $_fileName;

    /**
     * The mime type of the image.
     *
     * @g2 <member>
     * @g2   <member-name>mimeType</member-name>
     * @g2   <member-type>STRING</member-type>
     * @g2   <member-size>MEDIUM</member-size>
     * @g2 </member>
     *
     * @var string $_mimeType
     * @access private
     */
    var $_mimeType;

    /**
     * The size of the image file.
     *
     * @g2 <member>
     * @g2   <member-name>size</member-name>
     * @g2   <member-type>INTEGER</member-type>
     * @g2 </member>
     *
     * @var int $_size
     * @access private
     */
    var $_size;

    /**
     * The width of the image.
     *
     * @g2 <member>
     * @g2   <member-name>width</member-name>
     * @g2   <member-type>INTEGER</member-type>
     * @g2 </member>
     *
     * @var int $_width
     * @access private
     */
    var $_width;

    /**
     * The height of the image.
     *
     * @g2 <member>
     * @g2   <member-name>height</member-name>
     * @g2   <member-type>INTEGER</member-type>
     * @g2 </member>
     *
     * @var int $_height
     * @access private
     */
    var $_height;

    /**
     * The owner of the image
     *
     * @g2 <member>
     * @g2   <member-name>ownerId</member-name>
     * @g2   <member-type>INTEGER</member-type>
     * @g2 </member>
     *
     * @var int $_ownerId
     * @access private
     */
    var $_ownerId;

    /**
     * The desired location of this watermark on the target
     * image on the x-axis.  Stored as a string instead of an
     * integer so that we can have float values.
     *
     * @g2 <member>
     * @g2   <member-name>xPercentage</member-name>
     * @g2   <member-type>STRING</member-type>
     * @g2   <member-size>SMALL</member-size>
     * @g2 </member>
     *
     * @var string $_xPercentage
     * @access private
     */
    var $_xPercentage;

    /**
     * The desired location of this watermark on the target
     * image on the y-axis.  Stored as a string instead of an
     * integer so that we can have float values.
     *
     * @g2 <member>
     * @g2   <member-name>yPercentage</member-name>
     * @g2   <member-type>STRING</member-type>
     * @g2   <member-size>SMALL</member-size>
     * @g2 </member>
     *
     * @var string $_yPercentage
     * @access private
     */
    var $_yPercentage;

    /*
     * ****************************************
     *                 Methods
     * ****************************************
     */

    /**
     * Create a new instance of this type in the persistent store.
     *
     * @access public
     * @param string the path to a data file to be contained
     * @param string the mime type of the new item
     * @param string the desired name of the new item
     * @return object GalleryStatus a status code
     */
    function create($inputFileName, $mimeType, $targetName=null) {
	GalleryCoreApi::relativeRequireOnce('modules/watermark/classes/WatermarkHelper.class');
	global $gallery;
	$platform = $gallery->getPlatform();
	$dir = $this->getWatermarkDir();
	if (empty($targetName)) {
	    $targetName = basename($inputFileName);
	}

	/* Validate the input file */
	if (empty($inputFileName)) {
	    return GalleryStatus::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__);
	}
	if (!$platform->file_exists($inputFileName)) {
	    return GalleryStatus::error(ERROR_BAD_PATH, __FILE__, __LINE__);
	}

	/*
	 * Neutralize the file extension to avoid receiving an executable file
	 * (like a .php or .pl cgi script)
	 */
	$targetFilename = str_replace('.', '_', $targetName);

	/* Uniquify filename */
	while ($platform->file_exists($dir . $targetFilename)) {
	    $targetFilename = '_' . $targetFilename;
	}

	list ($ret, $watermarks) = WatermarkHelper::fetchWatermarks();
	if ($ret->isError()) {
	    return $ret->wrap(__FILE__, __LINE__);
	}
	$nameMap = array();
	foreach ($watermarks as $watermark) {
	    $nameMap[$watermark->getName()] = true;
	}

	/* Uniquify name */
	while (isset($nameMap[$targetName])) {
	    $targetName = '_' . $targetName;
	}

	$ret = parent::create();
	if ($ret->isError()) {
	    return $ret->wrap(__FILE__, __LINE__);
	}

	$this->setName($targetName);
	$this->setFileName($targetFilename);
	$this->setMimeType($mimeType);
	$this->setWidth(0);
	$this->setHeight(0);
	$this->setXPercentage(100);
	$this->setYPercentage(100);
	$this->setApplyToPreferred(false);
	$this->setApplyToResizes(true);
	$this->setApplyToThumbnail(true);
	$this->setOwnerId($gallery->getActiveUserId());

	$newFileName = $dir . $targetFilename;
	if (!$platform->copy($inputFileName, $newFileName)) {
	    return GalleryStatus::error(ERROR_PLATFORM_FAILURE, __FILE__, __LINE__);
	}
	$this->setSize($platform->filesize($newFileName));

	list ($ret, $toolkit) = GalleryCoreApi::getToolkitByProperty($mimeType, 'dimensions');
	if ($ret->isError()) {
	    return $ret->wrap(__FILE__, __LINE__);
	}

	if (isset($toolkit)) {
	    list ($ret, $dimensions) = $toolkit->getProperty($mimeType, 'dimensions', $newFileName);
	    if ($ret->isError()) {
		$ret->addErrorCode(ERROR_BAD_DATA_TYPE);
		return $ret->wrap(__FILE__, __LINE__);
	    }
	    $this->setWidth($dimensions[0]);
	    $this->setHeight($dimensions[1]);
	}

	return GalleryStatus::success();
    }

    /**
     * Delete this GalleryEntity
     *
     * @access public
     * @return object GalleryStatus a status code
     */
    function delete() {
	global $gallery;

	/* Delete myself */
	$ret = parent::delete();
	if ($ret->isError()) {
	    return $ret->wrap(__FILE__, __LINE__);
	}

	/* Delete our source file */
	$path = $this->getWatermarkDir() . $this->getFileName();
	$platform = $gallery->getPlatform();
	if (!$platform->unlink($path)) {
	    return GalleryStatus::error(ERROR_BAD_PATH, __FILE__, __LINE__, "Could not delete $path");
	}

	return GalleryStatus::success();
    }

    /**
     * Full path to image file
     *
     * @return array(object GalleryStatus a status code, string path)
     */
    function fetchPath() {
	return array(GalleryStatus::success(),
		     $this->getWatermarkDir() . $this->getFileName());
    }

    /**
     * Watermark directory
     *
     * @return string Directory where watermark images are stored
     */
    function getWatermarkDir() {
	global $gallery;
	$platform = $gallery->getPlatform();
	$slash = $platform->getDirectorySeparator();
	return $gallery->getConfig('data.gallery.plugins_data') . 'modules/watermark' . $slash;
    }

    /**
     * Render image
     *
     * @return string content
     */
    function render($format, $params) {
	global $gallery;

	switch($format) {
	case 'HTML':
	    $urlGenerator =& $gallery->getUrlGenerator();
	    $src = $urlGenerator->generateUrl(array('view' => 'core.DownloadItem',
						    'itemId' => $this->getId(),
						    'serialNumber' => $this->getSerialNumber()));

	    list ($width, $height) = array($this->getWidth(), $this->getHeight());

	    /* Shrink our dimensions if necessary */
	    if (isset($params['maxSize'])) {
		list ($width, $height) =
		    GalleryUtilities::shrinkDimensionsToFit($width, $height, $params['maxSize']);
		unset($params['maxSize']);
	    }

	    $sizeStr = ($width > 0 && $height > 0)
		? sprintf(' width="%s" height="%s"', $width, $height) : '';
	    if (!isset($params['alt'])) {
		$params['alt'] = $this->getFileName();
	    }

	    $html = sprintf('<img src="%s"%s', $src, $sizeStr);
	    unset($params['fallback']);
	    foreach ($params as $attr => $value) {
		if (isset($value)) {
		    $html .= " $attr=\"$value\"";
		}
	    }
	    return $html . '/>';

	default:
	    return null;
	}
    }
}

include(dirname(__FILE__) . '/interfaces/WatermarkImage.inc');
?>
