-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
aaaeef9
commit faf8b6b
Showing
128 changed files
with
8,526 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,226 @@ | ||
<?php | ||
|
||
namespace Intervention\Image; | ||
|
||
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 \Intervention\Image\Exception\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 \Intervention\Image\Exception\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 \Intervention\Image\Exception\NotReadableException( | ||
"Unable to read color ({$value})." | ||
); | ||
} | ||
|
||
return $result; | ||
} | ||
} |
Oops, something went wrong.