blob: e026da3070a6abd490fbe12b0ea9b78a949086a9 [file] [log] [blame]
<?php
/**
* File containing the ezcGraphColor 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 Graph
* @version //autogentag//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* ezcGraphColor
*
* Struct for representing colors in ezcGraph. A color is defined using the
* common RGBA model with integer values between 0 and 255. An alpha value
* of zero means full opacity, while 255 means full transparency.
*
* @property integer $red
* Red RGBA value of color.
* @property integer $green
* Green RGBA value of color.
* @property integer $blue
* Blue RGBA value of color.
* @property integer $alpha
* Alpha RGBA value of color.
*
* @version //autogentag//
* @package Graph
*/
class ezcGraphColor extends ezcBaseOptions
{
/**
* Constructor
*
* @param array $options Default option array
* @return void
* @ignore
*/
public function __construct( array $options = array() )
{
$this->properties['red'] = 0;
$this->properties['green'] = 0;
$this->properties['blue'] = 0;
$this->properties['alpha'] = 0;
parent::__construct( $options );
}
/**
* __set
*
* @param mixed $propertyName
* @param mixed $propertyValue
* @throws ezcBaseValueException
* If a submitted parameter was out of range or type.
* @throws ezcBasePropertyNotFoundException
* If a the value for the property options is not an instance of
* @return void
* @ignore
*/
public function __set( $propertyName, $propertyValue )
{
switch ( $propertyName )
{
case 'red':
case 'green':
case 'blue':
case 'alpha':
if ( !is_numeric( $propertyValue ) ||
( $propertyValue < 0 ) ||
( $propertyValue > 255 ) )
{
throw new ezcBaseValueException( $propertyName, $propertyValue, '0 <= int <= 255' );
}
$this->properties[$propertyName] = (int) $propertyValue;
break;
default:
throw new ezcBasePropertyNotFoundException( $propertyName );
break;
}
}
/**
* Creates an ezcGraphColor object from a hexadecimal color representation
*
* @param mixed $string Hexadecimal color representation
* @return ezcGraphColor
*/
static public function fromHex( $string )
{
// Remove trailing #
if ( $string[0] === '#' )
{
$string = substr( $string, 1 );
}
// Iterate over chunks and convert to integer
$color = new ezcGraphColor();
$keys = array( 'red', 'green', 'blue', 'alpha' );
foreach ( str_split( $string, 2) as $nr => $hexValue )
{
if ( isset( $keys[$nr] ) )
{
$key = $keys[$nr];
$color->$key = hexdec( $hexValue ) % 256;
}
}
// Set missing values to zero
for ( ++$nr; $nr < count( $keys ); ++$nr )
{
$key = $keys[$nr];
$color->$key = 0;
}
return $color;
}
/**
* Creates an ezcGraphColor object from an array of integers
*
* @param array $array Array of integer color values
* @return ezcGraphColor
*/
static public function fromIntegerArray( array $array )
{
// Iterate over array elements
$color = new ezcGraphColor();
$keys = array( 'red', 'green', 'blue', 'alpha' );
$nr = 0;
foreach ( $array as $colorValue )
{
if ( isset( $keys[$nr] ) )
{
$key = $keys[$nr++];
$color->$key = ( (int) $colorValue ) % 256;
}
}
// Set missing values to zero
for ( $nr; $nr < count( $keys ); ++$nr )
{
$key = $keys[$nr];
$color->$key = 0;
}
return $color;
}
/**
* Creates an ezcGraphColor object from an array of floats
*
* @param array $array Array of float color values
* @return ezcGraphColor
*/
static public function fromFloatArray( array $array )
{
// Iterate over array elements
$color = new ezcGraphColor();
$keys = array( 'red', 'green', 'blue', 'alpha' );
$nr = 0;
foreach ( $array as $colorValue )
{
if ( isset( $keys[$nr] ) )
{
$key = $keys[$nr++];
$color->$key = ( (float) $colorValue * 255 ) % 256;
}
}
// Set missing values to zero
for ( $nr; $nr < count( $keys ); ++$nr )
{
$key = $keys[$nr];
$color->$key = 0;
}
return $color;
}
/**
* Tries to parse provided color value
*
* This method can be used to create a color struct from arbritrary color
* representations. The following values are accepted
*
* - Hexadecimal color definitions, like known from HTML, CSS and SVG
*
* Color definitions like #FF0000, with and and without number sign,
* where each pair of bytes is interpreted as a color value for the
* channels RGB(A). These color values may contain up to 4 values, where
* the last value is considered as the alpha channel.
*
* - Array of integers
*
* If an array of integers is provided as input teh value in each channel
* may be in the span [0 - 255] and is assigned to the color channels
* RGB(A). Up to four values are used from the array.
*
* - Array of floats
*
* If an array of floats is provided as input teh value in each channel
* may be in the span [0 - 1] and is assigned to the color channels
* RGB(A). Up to four values are used from the array.
*
* @param mixed $color Some kind of color definition
* @return ezcGraphColor
*/
static public function create( $color )
{
if ( $color instanceof ezcGraphColor )
{
return $color;
}
elseif ( is_string( $color ) )
{
return ezcGraphColor::fromHex( $color );
}
elseif ( is_array( $color ) )
{
$testElement = reset( $color );
if ( is_int( $testElement ) )
{
return ezcGraphColor::fromIntegerArray( $color );
}
else
{
return ezcGraphColor::fromFloatArray( $color );
}
}
else
{
throw new ezcGraphUnknownColorDefinitionException( $color );
}
}
/**
* Returns a copy of the current color made more transparent by the given
* factor
*
* @param mixed $value Percent to make color mor transparent
* @return ezcGraphColor New color
*/
public function transparent( $value )
{
$color = clone $this;
$color->alpha = 255 - (int) round( ( 255 - $this->alpha ) * ( 1 - $value ) );
return $color;
}
/**
* Inverts and returns a copy of the current color
*
* @return ezcGraphColor New Color
*/
public function invert()
{
$color = new ezcGraphColor();
$color->red = 255 - $this->red;
$color->green = 255 - $this->green;
$color->blue = 255 - $this->blue;
$color->alpha = $this->alpha;
return $color;
}
/**
* Returns a copy of the current color darkened by the given factor
*
* @param float $value Percent to darken the color
* @return ezcGraphColor New color
*/
public function darken( $value )
{
$color = clone $this;
$value = 1 - $value;
$color->red = min( 255, max( 0, (int) round( $this->red * $value ) ) );
$color->green = min( 255, max( 0, (int) round( $this->green * $value ) ) );
$color->blue = min( 255, max( 0, (int) round( $this->blue * $value ) ) );
return $color;
}
}
?>