<?php
/**
 * File containing the ezcImageAnalyzerHandler class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package ImageAnalysis
 * @version //autogentag//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @filesource
 */

/**
 * This base class has to be extended by all ezcImageAnalyzerHandler classes.
 * An object of an ezcImageAnalyzerHandler class must implement this interface
 * to work properly as a handler for ezcImageAnalyzer.
 *
 * @package ImageAnalysis
 * @version //autogentag//
 */
abstract class ezcImageAnalyzerHandler
{
    /**
     * Image is built with a palette and consists of indexed values per pixel.
     */
    const MODE_INDEXED = 1;

    /**
     * Image consists of RGB value per pixel.
     */
    const MODE_TRUECOLOR = 2;

    /**
     * No parts of image is transparent.
     */
    const TRANSPARENCY_OPAQUE = 1;

    /*
     * Selected palette entries are completely see-through.
     */
    const TRANSPARENCY_TRANSPARENT = 2;

    /**
     * Transparency determined pixel per pixel with a fuzzy value.
     */
    const TRANSPARENCY_TRANSLUCENT = 3;

    /**
     * Options for the handler.
     *
     * Usually this is empty, but some handlers need special options
     * e.g. {@link ezcImageAnalyzerImagemagickHandler}.
     *
     * @var array(string=>mixed)
     */
    protected $options = array();

    /**
     * Create an ezcImageAnalyzerHandler to analyze a file.
     *
     * The constructor can optionally receive an array of options. Which
     * options are utilized by the handler depends on it's implementation.
     * To determine this, please refer to the specific handler.
     *
     * @throws ezcImageAnalyzerException
     *         If the handler is not able to work.
     * @param array $options Possible options for the handler.
     */
    public function __construct( array $options = array() )
    {
        $this->options = $options;
    }

    /**
     * Checks wether the given handler is available for analyzing images.
     *
     * Each ezcImageAnalyzerHandler must implement this method in order to
     * check if the handler is available on the system. The method has to
     * return true, if the handle is currently available to analyze images
     * (e.g. if the GD extension is available, for the
     * {@link ezcImageAnalyzerPhpHandler}).
     *
     * @return bool True if the handler is available.
     */
    abstract public function isAvailable();

    /**
     * Analyzes the image type.
     *
     * This method analyzes image data to determine the MIME type. Each
     * ezcImageAnalyzerHandler must at least be capable of performing this
     * operation on a file. This method has to return the MIME type of the
     * file to analyze in lowercase letters (e.g. "image/jpeg") or false, if
     * the images MIME type could not be determined.
     *
     * @param string $file The file to analyze.
     * @return string|bool The MIME type if analyzation suceeded or false.
     */
    abstract public function analyzeType( $file );

    /**
     * Analyze the image for detailed information.
     *
     * This may return various information about the image, depending on it's
     * type and the implemented facilities of the handler. All information is
     * collected in the struct {@link ezcImageAnalyzerData}. Which information
     * is set about an image in the returned data struct, depends on the image
     * type and the capabilities of the handler. At least the
     * {@link ezcImageAnalyzerData::$mime} attribute must be set. Most handlers
     * also provide additional information like the image dimensions and the size
     * of the image file.
     *
     * @throws ezcImageAnalyzerFileNotProcessableException
     *         If image file can not be processed.
     * @param string $file The file to analyze.
     * @return ezcImageAnalyzerData
     */
    abstract public function analyzeImage( $file );

    /**
     * Returns if the handler can analyze a given MIME type.
     *
     * This method returns if the driver is capable of analyzing a given MIME
     * type. This method should be called before trying to actually analyze an
     * image using the drivers {@link self::analyzeImage()} method.
     *
     * @param string $mime The MIME type to check for.
     * @return bool True if the handler is able to analyze the MIME type.
     */
    abstract public function canAnalyze( $mime );
}
?>
