summaryrefslogtreecommitdiff
path: root/app/ColorGenerator.php
blob: 89c4ef64253e219248615cae2325a35adff398fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
namespace Fisharebest\Webtrees;

	/**
	 * webtrees: online genealogy
	 * Copyright (C) 2015 webtrees development team
	 * 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 3 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, see <http://www.gnu.org/licenses/>.
	 */

/**
 * Class colorGenerator
 */
class ColorGenerator {

	private $hue;
	private $basehue;
	private $saturation;
	private $lightness;
	private $baselightness;
	private $alpha;
	private $range;

	/**
	 * @param integer $hue (0Deg = Red, 120Deg = green, 240Deg = blue)
	 * @param integer $saturation
	 * @param integer $lightness
	 * @param integer $alpha
	 * @param integer $range (sign determines direction. positive = clockwise, negative = anticlockwise)
	 */
	public function __construct($hue, $saturation, $lightness, $alpha, $range) {
		$this->hue           = $hue;
		$this->basehue       = $hue;
		$this->saturation    = $saturation;
		$this->lightness     = $lightness;
		$this->baselightness = $lightness;
		$this->alpha         = $alpha;
		$this->range         = $range;
	}

	/**
	 * Function getNextColor
	 *
	 * $lightness cycles between $baselightness and 100% in $lightnessStep steps
	 * $hue cycles on each complete $lightness cycle
	 * between $basehue and $basehue + $range degrees in $hueStep degrees
	 *
	 * @param int $lightnessStep
	 * @param int $hueStep
	 * @return string
	 */
	public function getNextColor($lightnessStep = 10, $hueStep = 15) {
		$lightness = $this->lightness + $lightnessStep;
		$hue       = $this->hue;

		if ($lightness >= 100) {
			$lightness = $this->baselightness;
			$hue += $hueStep * (abs($this->range) / $this->range);
			if (($hue - $this->basehue) * ($hue - ($this->basehue + $this->range)) >= 0) {
				$hue = $this->basehue;
			}
			$this->hue = $hue;
		}
		$this->lightness = $lightness;

		return sprintf("hsla(%s, %s%%, %s%%, %s)",
			$this->hue,
			$this->saturation,
			$this->lightness,
			$this->alpha);
	}

}