| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- namespace Intervention\Image;
- use Intervention\Image\Exception\NotReadableException;
- use Intervention\Image\Exception\NotSupportedException;
- abstract class AbstractColor
- {
- /**
- * Initiates color object from integer
- *
- * @param int $value
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromInteger($value);
- /**
- * Initiates color object from given array
- *
- * @param array $value
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromArray($value);
- /**
- * Initiates color object from given string
- *
- * @param string $value
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromString($value);
- /**
- * Initiates color object from given ImagickPixel object
- *
- * @param ImagickPixel $value
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromObject($value);
- /**
- * Initiates color object from given R, G and B values
- *
- * @param int $r
- * @param int $g
- * @param int $b
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromRgb($r, $g, $b);
- /**
- * Initiates color object from given R, G, B and A values
- *
- * @param int $r
- * @param int $g
- * @param int $b
- * @param float $a
- * @return \Intervention\Image\AbstractColor
- */
- abstract public function initFromRgba($r, $g, $b, $a);
- /**
- * Calculates integer value of current color instance
- *
- * @return int
- */
- abstract public function getInt();
- /**
- * Calculates hexadecimal value of current color instance
- *
- * @param string $prefix
- * @return string
- */
- abstract public function getHex($prefix);
- /**
- * Calculates RGB(A) in array format of current color instance
- *
- * @return array
- */
- abstract public function getArray();
- /**
- * Calculates RGBA in string format of current color instance
- *
- * @return string
- */
- abstract public function getRgba();
- /**
- * Determines if current color is different from given color
- *
- * @param AbstractColor $color
- * @param int $tolerance
- * @return boolean
- */
- abstract public function differs(AbstractColor $color, $tolerance = 0);
- /**
- * Creates new instance
- *
- * @param mixed $value
- */
- public function __construct($value = null)
- {
- $this->parse($value);
- }
- /**
- * Parses given value as color
- *
- * @param mixed $value
- * @return \Intervention\Image\AbstractColor
- */
- public function parse($value)
- {
- switch (true) {
- case is_string($value):
- $this->initFromString($value);
- break;
- case is_int($value):
- $this->initFromInteger($value);
- break;
- case is_array($value):
- $this->initFromArray($value);
- break;
- case is_object($value):
- $this->initFromObject($value);
- break;
- case is_null($value):
- $this->initFromArray([255, 255, 255, 0]);
- break;
- default:
- throw new NotReadableException(
- "Color format ({$value}) cannot be read."
- );
- }
- return $this;
- }
- /**
- * Formats current color instance into given format
- *
- * @param string $type
- * @return mixed
- */
- public function format($type)
- {
- switch (strtolower($type)) {
- case 'rgba':
- return $this->getRgba();
- case 'hex':
- return $this->getHex('#');
- case 'int':
- case 'integer':
- return $this->getInt();
- case 'array':
- return $this->getArray();
- case 'obj':
- case 'object':
- return $this;
- default:
- throw new NotSupportedException(
- "Color format ({$type}) is not supported."
- );
- }
- }
- /**
- * Reads RGBA values from string into array
- *
- * @param string $value
- * @return array
- */
- protected function rgbaFromString($value)
- {
- $result = false;
- // parse color string in hexidecimal format like #cccccc or cccccc or ccc
- $hexPattern = '/^#?([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i';
- // parse color string in format rgb(140, 140, 140)
- $rgbPattern = '/^rgb ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})\)$/i';
- // parse color string in format rgba(255, 0, 0, 0.5)
- $rgbaPattern = '/^rgba ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9.]{1,4})\)$/i';
- if (preg_match($hexPattern, $value, $matches)) {
- $result = [];
- $result[0] = strlen($matches[1]) == '1' ? hexdec($matches[1].$matches[1]) : hexdec($matches[1]);
- $result[1] = strlen($matches[2]) == '1' ? hexdec($matches[2].$matches[2]) : hexdec($matches[2]);
- $result[2] = strlen($matches[3]) == '1' ? hexdec($matches[3].$matches[3]) : hexdec($matches[3]);
- $result[3] = 1;
- } elseif (preg_match($rgbPattern, $value, $matches)) {
- $result = [];
- $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0;
- $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0;
- $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0;
- $result[3] = 1;
- } elseif (preg_match($rgbaPattern, $value, $matches)) {
- $result = [];
- $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0;
- $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0;
- $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0;
- $result[3] = ($matches[4] >= 0 && $matches[4] <= 1) ? $matches[4] : 0;
- } else {
- throw new NotReadableException(
- "Unable to read color ({$value})."
- );
- }
- return $result;
- }
- }
|