HuasoFoundries/jpgraph

View on GitHub
src/util/RGB.php

Summary

Maintainability
F
1 mo
Test Coverage
<?php

/**
 * JPGraph v4.0.3
 */

namespace Amenadiel\JpGraph\Util;

/**
 * File:        JPGRAPH_RGB.INC.PHP
 * // Description: Class to handle RGb color space specification and
 * //              named colors
 * // Created:     2001-01-08 (Refactored to separate file 2008-08-01)
 * // Ver:         $Id: jpgraph_rgb.inc.php 1893 2009-10-02 23:15:25Z ljp $
 * //
 * // Copyright (c) Asial Corporation. All rights reserved.
 */

/**
 * @class RGB
 * // Description: Color definitions as RGB triples
 */
class RGB
{
    public $rgb_table;
    public $img;

    public function __construct($aImg = null)
    {
        $this->img = $aImg;

        // Conversion array between color names and RGB
        $this->rgb_table = [
            'aqua'                 => [0, 255, 255],
            'lime'                 => [0, 255, 0],
            'teal'                 => [0, 128, 128],
            'whitesmoke'           => [245, 245, 245],
            'gainsboro'            => [220, 220, 220],
            'oldlace'              => [253, 245, 230],
            'linen'                => [250, 240, 230],
            'antiquewhite'         => [250, 235, 215],
            'papayawhip'           => [255, 239, 213],
            'blanchedalmond'       => [255, 235, 205],
            'bisque'               => [255, 228, 196],
            'peachpuff'            => [255, 218, 185],
            'navajowhite'          => [255, 222, 173],
            'moccasin'             => [255, 228, 181],
            'cornsilk'             => [255, 248, 220],
            'ivory'                => [255, 255, 240],
            'lemonchiffon'         => [255, 250, 205],
            'seashell'             => [255, 245, 238],
            'mintcream'            => [245, 255, 250],
            'azure'                => [240, 255, 255],
            'aliceblue'            => [240, 248, 255],
            'lavender'             => [230, 230, 250],
            'lavenderblush'        => [255, 240, 245],
            'mistyrose'            => [255, 228, 225],
            'white'                => [255, 255, 255],
            'black'                => [0, 0, 0],
            'darkslategray'        => [47, 79, 79],
            'dimgray'              => [105, 105, 105],
            'slategray'            => [112, 128, 144],
            'lightslategray'       => [119, 136, 153],
            'gray'                 => [190, 190, 190],
            'lightgray'            => [211, 211, 211],
            'midnightblue'         => [25, 25, 112],
            'navy'                 => [0, 0, 128],
            'indigo'               => [75, 0, 130],
            'electricindigo'       => [102, 0, 255],
            'deepindigo'           => [138, 43, 226],
            'pigmentindigo'        => [75, 0, 130],
            'indigodye'            => [0, 65, 106],
            'cornflowerblue'       => [100, 149, 237],
            'darkslateblue'        => [72, 61, 139],
            'slateblue'            => [106, 90, 205],
            'mediumslateblue'      => [123, 104, 238],
            'lightslateblue'       => [132, 112, 255],
            'mediumblue'           => [0, 0, 205],
            'royalblue'            => [65, 105, 225],
            'blue'                 => [0, 0, 255],
            'dodgerblue'           => [30, 144, 255],
            'deepskyblue'          => [0, 191, 255],
            'skyblue'              => [135, 206, 235],
            'lightskyblue'         => [135, 206, 250],
            'steelblue'            => [70, 130, 180],
            'lightred'             => [211, 167, 168],
            'lightsteelblue'       => [176, 196, 222],
            'lightblue'            => [173, 216, 230],
            'powderblue'           => [176, 224, 230],
            'paleturquoise'        => [175, 238, 238],
            'darkturquoise'        => [0, 206, 209],
            'mediumturquoise'      => [72, 209, 204],
            'turquoise'            => [64, 224, 208],
            'cyan'                 => [0, 255, 255],
            'lightcyan'            => [224, 255, 255],
            'cadetblue'            => [95, 158, 160],
            'mediumaquamarine'     => [102, 205, 170],
            'aquamarine'           => [127, 255, 212],
            'darkgreen'            => [0, 100, 0],
            'darkolivegreen'       => [85, 107, 47],
            'darkseagreen'         => [143, 188, 143],
            'seagreen'             => [46, 139, 87],
            'mediumseagreen'       => [60, 179, 113],
            'lightseagreen'        => [32, 178, 170],
            'palegreen'            => [152, 251, 152],
            'springgreen'          => [0, 255, 127],
            'lawngreen'            => [124, 252, 0],
            'green'                => [0, 255, 0],
            'chartreuse'           => [127, 255, 0],
            'mediumspringgreen'    => [0, 250, 154],
            'greenyellow'          => [173, 255, 47],
            'limegreen'            => [50, 205, 50],
            'yellowgreen'          => [154, 205, 50],
            'forestgreen'          => [34, 139, 34],
            'olivedrab'            => [107, 142, 35],
            'darkkhaki'            => [189, 183, 107],
            'khaki'                => [240, 230, 140],
            'palegoldenrod'        => [238, 232, 170],
            'lightgoldenrodyellow' => [250, 250, 210],
            'lightyellow'          => [255, 255, 200],
            'yellow'               => [255, 255, 0],
            'gold'                 => [255, 215, 0],
            'lightgoldenrod'       => [238, 221, 130],
            'goldenrod'            => [218, 165, 32],
            'darkgoldenrod'        => [184, 134, 11],
            'rosybrown'            => [188, 143, 143],
            'indianred'            => [205, 92, 92],
            'saddlebrown'          => [139, 69, 19],
            'sienna'               => [160, 82, 45],
            'peru'                 => [205, 133, 63],
            'burlywood'            => [222, 184, 135],
            'beige'                => [245, 245, 220],
            'wheat'                => [245, 222, 179],
            'sandybrown'           => [244, 164, 96],
            'tan'                  => [210, 180, 140],
            'chocolate'            => [210, 105, 30],
            'firebrick'            => [178, 34, 34],
            'brown'                => [165, 42, 42],
            'darksalmon'           => [233, 150, 122],
            'salmon'               => [250, 128, 114],
            'lightsalmon'          => [255, 160, 122],
            'orange'               => [255, 165, 0],
            'darkorange'           => [255, 140, 0],
            'coral'                => [255, 127, 80],
            'lightcoral'           => [240, 128, 128],
            'tomato'               => [255, 99, 71],
            'orangered'            => [255, 69, 0],
            'red'                  => [255, 0, 0],
            'hotpink'              => [255, 105, 180],
            'deeppink'             => [255, 20, 147],
            'pink'                 => [255, 192, 203],
            'lightpink'            => [255, 182, 193],
            'palevioletred'        => [219, 112, 147],
            'maroon'               => [176, 48, 96],
            'mediumvioletred'      => [199, 21, 133],
            'violetred'            => [208, 32, 144],
            'magenta'              => [255, 0, 255],
            'violet'               => [238, 130, 238],
            'plum'                 => [221, 160, 221],
            'orchid'               => [218, 112, 214],
            'mediumorchid'         => [186, 85, 211],
            'darkorchid'           => [153, 50, 204],
            'darkviolet'           => [148, 0, 211],
            'blueviolet'           => [138, 43, 226],
            'purple'               => [160, 32, 240],
            'mediumpurple'         => [147, 112, 219],
            'thistle'              => [216, 191, 216],
            'snow1'                => [255, 250, 250],
            'snow2'                => [238, 233, 233],
            'snow3'                => [205, 201, 201],
            'snow4'                => [139, 137, 137],
            'seashell1'            => [255, 245, 238],
            'seashell2'            => [238, 229, 222],
            'seashell3'            => [205, 197, 191],
            'seashell4'            => [139, 134, 130],
            'AntiqueWhite1'        => [255, 239, 219],
            'AntiqueWhite2'        => [238, 223, 204],
            'AntiqueWhite3'        => [205, 192, 176],
            'AntiqueWhite4'        => [139, 131, 120],
            'bisque1'              => [255, 228, 196],
            'bisque2'              => [238, 213, 183],
            'bisque3'              => [205, 183, 158],
            'bisque4'              => [139, 125, 107],
            'peachPuff1'           => [255, 218, 185],
            'peachpuff2'           => [238, 203, 173],
            'peachpuff3'           => [205, 175, 149],
            'peachpuff4'           => [139, 119, 101],
            'navajowhite1'         => [255, 222, 173],
            'navajowhite2'         => [238, 207, 161],
            'navajowhite3'         => [205, 179, 139],
            'navajowhite4'         => [139, 121, 94],
            'lemonchiffon1'        => [255, 250, 205],
            'lemonchiffon2'        => [238, 233, 191],
            'lemonchiffon3'        => [205, 201, 165],
            'lemonchiffon4'        => [139, 137, 112],
            'ivory1'               => [255, 255, 240],
            'ivory2'               => [238, 238, 224],
            'ivory3'               => [205, 205, 193],
            'ivory4'               => [139, 139, 131],
            'honeydew'             => [193, 205, 193],
            'lavenderblush1'       => [255, 240, 245],
            'lavenderblush2'       => [238, 224, 229],
            'lavenderblush3'       => [205, 193, 197],
            'lavenderblush4'       => [139, 131, 134],
            'mistyrose1'           => [255, 228, 225],
            'mistyrose2'           => [238, 213, 210],
            'mistyrose3'           => [205, 183, 181],
            'mistyrose4'           => [139, 125, 123],
            'azure1'               => [240, 255, 255],
            'azure2'               => [224, 238, 238],
            'azure3'               => [193, 205, 205],
            'azure4'               => [131, 139, 139],
            'slateblue1'           => [131, 111, 255],
            'slateblue2'           => [122, 103, 238],
            'slateblue3'           => [105, 89, 205],
            'slateblue4'           => [71, 60, 139],
            'royalblue1'           => [72, 118, 255],
            'royalblue2'           => [67, 110, 238],
            'royalblue3'           => [58, 95, 205],
            'royalblue4'           => [39, 64, 139],
            'dodgerblue1'          => [30, 144, 255],
            'dodgerblue2'          => [28, 134, 238],
            'dodgerblue3'          => [24, 116, 205],
            'dodgerblue4'          => [16, 78, 139],
            'steelblue1'           => [99, 184, 255],
            'steelblue2'           => [92, 172, 238],
            'steelblue3'           => [79, 148, 205],
            'steelblue4'           => [54, 100, 139],
            'deepskyblue1'         => [0, 191, 255],
            'deepskyblue2'         => [0, 178, 238],
            'deepskyblue3'         => [0, 154, 205],
            'deepskyblue4'         => [0, 104, 139],
            'skyblue1'             => [135, 206, 255],
            'skyblue2'             => [126, 192, 238],
            'skyblue3'             => [108, 166, 205],
            'skyblue4'             => [74, 112, 139],
            'lightskyblue1'        => [176, 226, 255],
            'lightskyblue2'        => [164, 211, 238],
            'lightskyblue3'        => [141, 182, 205],
            'lightskyblue4'        => [96, 123, 139],
            'slategray1'           => [198, 226, 255],
            'slategray2'           => [185, 211, 238],
            'slategray3'           => [159, 182, 205],
            'slategray4'           => [108, 123, 139],
            'lightsteelblue1'      => [202, 225, 255],
            'lightsteelblue2'      => [188, 210, 238],
            'lightsteelblue3'      => [162, 181, 205],
            'lightsteelblue4'      => [110, 123, 139],
            'lightblue1'           => [191, 239, 255],
            'lightblue2'           => [178, 223, 238],
            'lightblue3'           => [154, 192, 205],
            'lightblue4'           => [104, 131, 139],
            'lightcyan1'           => [224, 255, 255],
            'lightcyan2'           => [209, 238, 238],
            'lightcyan3'           => [180, 205, 205],
            'lightcyan4'           => [122, 139, 139],
            'paleturquoise1'       => [187, 255, 255],
            'paleturquoise2'       => [174, 238, 238],
            'paleturquoise3'       => [150, 205, 205],
            'paleturquoise4'       => [102, 139, 139],
            'cadetblue1'           => [152, 245, 255],
            'cadetblue2'           => [142, 229, 238],
            'cadetblue3'           => [122, 197, 205],
            'cadetblue4'           => [83, 134, 139],
            'turquoise1'           => [0, 245, 255],
            'turquoise2'           => [0, 229, 238],
            'turquoise3'           => [0, 197, 205],
            'turquoise4'           => [0, 134, 139],
            'cyan1'                => [0, 255, 255],
            'cyan2'                => [0, 238, 238],
            'cyan3'                => [0, 205, 205],
            'cyan4'                => [0, 139, 139],
            'darkslategray1'       => [151, 255, 255],
            'darkslategray2'       => [141, 238, 238],
            'darkslategray3'       => [121, 205, 205],
            'darkslategray4'       => [82, 139, 139],
            'aquamarine1'          => [127, 255, 212],
            'aquamarine2'          => [118, 238, 198],
            'aquamarine3'          => [102, 205, 170],
            'aquamarine4'          => [69, 139, 116],
            'darkseagreen1'        => [193, 255, 193],
            'darkseagreen2'        => [180, 238, 180],
            'darkseagreen3'        => [155, 205, 155],
            'darkseagreen4'        => [105, 139, 105],
            'seagreen1'            => [84, 255, 159],
            'seagreen2'            => [78, 238, 148],
            'seagreen3'            => [67, 205, 128],
            'seagreen4'            => [46, 139, 87],
            'palegreen1'           => [154, 255, 154],
            'palegreen2'           => [144, 238, 144],
            'palegreen3'           => [124, 205, 124],
            'palegreen4'           => [84, 139, 84],
            'springgreen1'         => [0, 255, 127],
            'springgreen2'         => [0, 238, 118],
            'springgreen3'         => [0, 205, 102],
            'springgreen4'         => [0, 139, 69],
            'chartreuse1'          => [127, 255, 0],
            'chartreuse2'          => [118, 238, 0],
            'chartreuse3'          => [102, 205, 0],
            'chartreuse4'          => [69, 139, 0],
            'olivedrab1'           => [192, 255, 62],
            'olivedrab2'           => [179, 238, 58],
            'olivedrab3'           => [154, 205, 50],
            'olivedrab4'           => [105, 139, 34],
            'darkolivegreen1'      => [202, 255, 112],
            'darkolivegreen2'      => [188, 238, 104],
            'darkolivegreen3'      => [162, 205, 90],
            'darkolivegreen4'      => [110, 139, 61],
            'khaki1'               => [255, 246, 143],
            'khaki2'               => [238, 230, 133],
            'khaki3'               => [205, 198, 115],
            'khaki4'               => [139, 134, 78],
            'lightgoldenrod1'      => [255, 236, 139],
            'lightgoldenrod2'      => [238, 220, 130],
            'lightgoldenrod3'      => [205, 190, 112],
            'lightgoldenrod4'      => [139, 129, 76],
            'yellow1'              => [255, 255, 0],
            'yellow2'              => [238, 238, 0],
            'yellow3'              => [205, 205, 0],
            'yellow4'              => [139, 139, 0],
            'gold1'                => [255, 215, 0],
            'gold2'                => [238, 201, 0],
            'gold3'                => [205, 173, 0],
            'gold4'                => [139, 117, 0],
            'goldenrod1'           => [255, 193, 37],
            'goldenrod2'           => [238, 180, 34],
            'goldenrod3'           => [205, 155, 29],
            'goldenrod4'           => [139, 105, 20],
            'darkgoldenrod1'       => [255, 185, 15],
            'darkgoldenrod2'       => [238, 173, 14],
            'darkgoldenrod3'       => [205, 149, 12],
            'darkgoldenrod4'       => [139, 101, 8],
            'rosybrown1'           => [255, 193, 193],
            'rosybrown2'           => [238, 180, 180],
            'rosybrown3'           => [205, 155, 155],
            'rosybrown4'           => [139, 105, 105],
            'indianred1'           => [255, 106, 106],
            'indianred2'           => [238, 99, 99],
            'indianred3'           => [205, 85, 85],
            'indianred4'           => [139, 58, 58],
            'sienna1'              => [255, 130, 71],
            'sienna2'              => [238, 121, 66],
            'sienna3'              => [205, 104, 57],
            'sienna4'              => [139, 71, 38],
            'burlywood1'           => [255, 211, 155],
            'burlywood2'           => [238, 197, 145],
            'burlywood3'           => [205, 170, 125],
            'burlywood4'           => [139, 115, 85],
            'wheat1'               => [255, 231, 186],
            'wheat2'               => [238, 216, 174],
            'wheat3'               => [205, 186, 150],
            'wheat4'               => [139, 126, 102],
            'tan1'                 => [255, 165, 79],
            'tan2'                 => [238, 154, 73],
            'tan3'                 => [205, 133, 63],
            'tan4'                 => [139, 90, 43],
            'chocolate1'           => [255, 127, 36],
            'chocolate2'           => [238, 118, 33],
            'chocolate3'           => [205, 102, 29],
            'chocolate4'           => [139, 69, 19],
            'firebrick1'           => [255, 48, 48],
            'firebrick2'           => [238, 44, 44],
            'firebrick3'           => [205, 38, 38],
            'firebrick4'           => [139, 26, 26],
            'brown1'               => [255, 64, 64],
            'brown2'               => [238, 59, 59],
            'brown3'               => [205, 51, 51],
            'brown4'               => [139, 35, 35],
            'salmon1'              => [255, 140, 105],
            'salmon2'              => [238, 130, 98],
            'salmon3'              => [205, 112, 84],
            'salmon4'              => [139, 76, 57],
            'lightsalmon1'         => [255, 160, 122],
            'lightsalmon2'         => [238, 149, 114],
            'lightsalmon3'         => [205, 129, 98],
            'lightsalmon4'         => [139, 87, 66],
            'orange1'              => [255, 165, 0],
            'orange2'              => [238, 154, 0],
            'orange3'              => [205, 133, 0],
            'orange4'              => [139, 90, 0],
            'darkorange1'          => [255, 127, 0],
            'darkorange2'          => [238, 118, 0],
            'darkorange3'          => [205, 102, 0],
            'darkorange4'          => [139, 69, 0],
            'coral1'               => [255, 114, 86],
            'coral2'               => [238, 106, 80],
            'coral3'               => [205, 91, 69],
            'coral4'               => [139, 62, 47],
            'tomato1'              => [255, 99, 71],
            'tomato2'              => [238, 92, 66],
            'tomato3'              => [205, 79, 57],
            'tomato4'              => [139, 54, 38],
            'orangered1'           => [255, 69, 0],
            'orangered2'           => [238, 64, 0],
            'orangered3'           => [205, 55, 0],
            'orangered4'           => [139, 37, 0],
            'deeppink1'            => [255, 20, 147],
            'deeppink2'            => [238, 18, 137],
            'deeppink3'            => [205, 16, 118],
            'deeppink4'            => [139, 10, 80],
            'hotpink1'             => [255, 110, 180],
            'hotpink2'             => [238, 106, 167],
            'hotpink3'             => [205, 96, 144],
            'hotpink4'             => [139, 58, 98],
            'pink1'                => [255, 181, 197],
            'pink2'                => [238, 169, 184],
            'pink3'                => [205, 145, 158],
            'pink4'                => [139, 99, 108],
            'lightpink1'           => [255, 174, 185],
            'lightpink2'           => [238, 162, 173],
            'lightpink3'           => [205, 140, 149],
            'lightpink4'           => [139, 95, 101],
            'palevioletred1'       => [255, 130, 171],
            'palevioletred2'       => [238, 121, 159],
            'palevioletred3'       => [205, 104, 137],
            'palevioletred4'       => [139, 71, 93],
            'maroon1'              => [255, 52, 179],
            'maroon2'              => [238, 48, 167],
            'maroon3'              => [205, 41, 144],
            'maroon4'              => [139, 28, 98],
            'violetred1'           => [255, 62, 150],
            'violetred2'           => [238, 58, 140],
            'violetred3'           => [205, 50, 120],
            'violetred4'           => [139, 34, 82],
            'magenta1'             => [255, 0, 255],
            'magenta2'             => [238, 0, 238],
            'magenta3'             => [205, 0, 205],
            'magenta4'             => [139, 0, 139],
            'mediumred'            => [140, 34, 34],
            'orchid1'              => [255, 131, 250],
            'orchid2'              => [238, 122, 233],
            'orchid3'              => [205, 105, 201],
            'orchid4'              => [139, 71, 137],
            'plum1'                => [255, 187, 255],
            'plum2'                => [238, 174, 238],
            'plum3'                => [205, 150, 205],
            'plum4'                => [139, 102, 139],
            'mediumorchid1'        => [224, 102, 255],
            'mediumorchid2'        => [209, 95, 238],
            'mediumorchid3'        => [180, 82, 205],
            'mediumorchid4'        => [122, 55, 139],
            'darkorchid1'          => [191, 62, 255],
            'darkorchid2'          => [178, 58, 238],
            'darkorchid3'          => [154, 50, 205],
            'darkorchid4'          => [104, 34, 139],
            'purple1'              => [155, 48, 255],
            'purple2'              => [145, 44, 238],
            'purple3'              => [125, 38, 205],
            'purple4'              => [85, 26, 139],
            'mediumpurple1'        => [171, 130, 255],
            'mediumpurple2'        => [159, 121, 238],
            'mediumpurple3'        => [137, 104, 205],
            'mediumpurple4'        => [93, 71, 139],
            'thistle1'             => [255, 225, 255],
            'thistle2'             => [238, 210, 238],
            'thistle3'             => [205, 181, 205],
            'thistle4'             => [139, 123, 139],
            'gray1'                => [10, 10, 10],
            'gray2'                => [40, 40, 30],
            'gray3'                => [70, 70, 70],
            'gray4'                => [100, 100, 100],
            'gray5'                => [130, 130, 130],
            'gray6'                => [160, 160, 160],
            'gray7'                => [190, 190, 190],
            'gray8'                => [210, 210, 210],
            'gray9'                => [240, 240, 240],
            'darkgray'             => [100, 100, 100],
            'darkblue'             => [0, 0, 139],
            'darkcyan'             => [0, 139, 139],
            'darkmagenta'          => [139, 0, 139],
            'darkred'              => [139, 0, 0],
            'silver'               => [192, 192, 192],
            'eggplant'             => [144, 176, 168],
            'lightgreen'           => [144, 238, 144], ];
    }

    //==================================
    // PUBLIC METHODS
    // Colors can be specified as either
    // 1. #xxxxxx   HTML style
    // 2. "colorname"  as a named color
    // 3. array(r,g,b) RGB triple
    // This function translates this to a native RGB format and returns an
    // RGB triple.

    public function Color($aColor)
    {
        if (is_string($aColor)) {
            $matches = [];
            // this regex will parse a color string and fill the $matches array as such:
            // 0: the full match if any
            // 1: a hex string preceded by a hash, can be 3 characters (#fff) or 6 (#ffffff) (4 or 5 also accepted but...)
            // 2,3,4: r,g,b values in hex if the first character of the string is #
            // 5: all alpha-numeric characters at the beginning of the string if string does not start with #
            // 6: alpha value prefixed by @ if supplied
            // 7: alpha value with @ stripped
            // 8: adjust value prefixed with : if supplied
            // 9: adjust value with : stripped
            $regex = '/(#([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2}))?([\w]+)?(@([\d\.,]+))?(:([\d\.,]+))?/';
            if (!preg_match($regex, $aColor, $matches)) {
                JpGraphError::RaiseL(25078, $aColor); //(" Unknown color: $aColor");
            }
            if (empty($matches[5])) {
                $r = strlen($matches[2]) == 1 ? $matches[2] . $matches[2] : $matches[2];
                $g = strlen($matches[3]) == 1 ? $matches[3] . $matches[3] : $matches[3];
                $b = strlen($matches[4]) == 1 ? $matches[4] . $matches[4] : $matches[4];
                $r = hexdec($r);
                $g = hexdec($g);
                $b = hexdec($b);
            } else {
                if (!isset($this->rgb_table[$matches[5]])) {
                    JpGraphError::RaiseL(25078, $aColor); //(" Unknown color: $aColor");
                }
                $r = $this->rgb_table[$matches[5]][0];
                $g = $this->rgb_table[$matches[5]][1];
                $b = $this->rgb_table[$matches[5]][2];
            }
            $alpha = isset($matches[7]) ? str_replace(',', '.', $matches[7]) : 0;
            $adj   = isset($matches[9]) ? str_replace(',', '.', $matches[9]) : 1.0;

            if ($adj < 0) {
                JpGraphError::RaiseL(25077); //('Adjustment factor for color must be > 0');
            }

            // Scale adj so that an adj=2 always
            // makes the color 100% white (i.e. 255,255,255.
            // and adj=1 neutral and adj=0 black.
            if ($adj == 1) {
                return [$r, $g, $b, $alpha];
            }
            if ($adj > 1) {
                $m = ($adj - 1.0) * (255 - min(255, min($r, min($g, $b))));

                return [min(255, $r + $m), min(255, $g + $m), min(255, $b + $m), $alpha];
            }
            if ($adj < 1) {
                $m = ($adj - 1.0) * max(255, max($r, max($g, $b)));

                return [max(0, $r + $m), max(0, $g + $m), max(0, $b + $m), $alpha];
            }
        } elseif (is_array($aColor)) {
            if (!isset($aColor[3])) {
                $aColor[3] = 0;
            }

            return $aColor;
        } else {
            JpGraphError::RaiseL(25079, $aColor, safe_count($aColor)); //(" Unknown color specification: $aColor , size=". safe_count($aColor));
        }
    }

    // Compare two colors
    // return true if equal
    public function Equal($aCol1, $aCol2)
    {
        $c1 = $this->Color($aCol1);
        $c2 = $this->Color($aCol2);

        return $c1[0] == $c2[0] && $c1[1] == $c2[1] && $c1[2] == $c2[2];
    }

    // Allocate a new color in the current image
    // Return new color index, -1 if no more colors could be allocated
    public function Allocate($aColor, $aAlpha = 0.0)
    {
        list($r, $g, $b, $a) = $this->color($aColor);
        // If alpha is specified in the color string then this
        // takes precedence over the second argument
        if ($a > 0) {
            $aAlpha = $a;
        }
        if ($aAlpha < 0 || $aAlpha > 1) {
            JpGraphError::RaiseL(25080); //('Alpha parameter for color must be between 0.0 and 1.0');
        }

        return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127));
    }

    // Try to convert an array with three valid numbers to the corresponding hex array
    // This is currenly only used in processing the colors for barplots in order to be able
    // to handle the case where the color might be specified as an array of colros as well.
    // In that case we must be able to find out if an array of values should be interpretated as
    // a single color (specifeid as an RGB triple)
    public static function tryHexConversion($aColor)
    {
        if (is_array($aColor)) {
            if (safe_count($aColor) == 3) {
                if (is_numeric($aColor[0]) && is_numeric($aColor[1]) && is_numeric($aColor[2])) {
                    if (($aColor[0] >= 0 && $aColor[0] <= 255) &&
                        ($aColor[1] >= 0 && $aColor[1] <= 255) &&
                        ($aColor[2] >= 0 && $aColor[2] <= 255)) {
                        return sprintf('#%02x%02x%02x', $aColor[0], $aColor[1], $aColor[2]);
                    }
                }
            }
        }

        return $aColor;
    }

    // Return a RGB tripple corresponding to a position in the normal light spectrum
    // The argumen values is in the range [0, 1] where a value of 0 correponds to blue and
    // a value of 1 corresponds to red. Values in betwen is mapped to a linear interpolation
    // of the constituting colors in the visible color spectra.
    // The $aDynamicRange specified how much of the dynamic range we shold use
    // a value of 1.0 give the full dyanmic range and a lower value give more dark
    // colors. In the extreme of 0.0 then all colors will be black.
    public static function GetSpectrum($aVal, $aDynamicRange = 1.0)
    {
        if ($aVal < 0 || $aVal > 1.0001) {
            return [0, 0, 0]; // Invalid case - just return black
        }

        $sat = round(255 * $aDynamicRange);
        $a   = 0.25;
        if ($aVal <= 0.25) {
            return [0, round($sat * $aVal / $a), $sat];
        }
        if ($aVal <= 0.5) {
            return [0, $sat, round($sat - $sat * ($aVal - 0.25) / $a)];
        }
        if ($aVal <= 0.75) {
            return [round($sat * ($aVal - 0.5) / $a), $sat, 0];
        }

        return [$sat, round($sat - $sat * ($aVal - 0.75) / $a), 0];
    }
} // @class