add amendments metric
[contractdashboard.git] / lib / jpgraph / jpgraph_gradient.php
blob:a/lib/jpgraph/jpgraph_gradient.php -> blob:b/lib/jpgraph/jpgraph_gradient.php
<?php <?php
/*======================================================================= /*=======================================================================
// File: JPGRAPH_GRADIENT.PHP // File: JPGRAPH_GRADIENT.PHP
// Description: Create a color gradient // Description: Create a color gradient
// Created: 2003-02-01 // Created: 2003-02-01
// Ver: $Id: jpgraph_gradient.php 1761 2009-08-01 08:31:28Z ljp $ // Ver: $Id: jpgraph_gradient.php 1761 2009-08-01 08:31:28Z ljp $
// //
// Copyright (c) Aditus Consulting. All rights reserved. // Copyright (c) Aditus Consulting. All rights reserved.
//======================================================================== //========================================================================
*/ */
   
// Styles for gradient color fill // Styles for gradient color fill
define("GRAD_VER",1); define("GRAD_VER",1);
define("GRAD_VERT",1); define("GRAD_VERT",1);
define("GRAD_HOR",2); define("GRAD_HOR",2);
define("GRAD_MIDHOR",3); define("GRAD_MIDHOR",3);
define("GRAD_MIDVER",4); define("GRAD_MIDVER",4);
define("GRAD_CENTER",5); define("GRAD_CENTER",5);
define("GRAD_WIDE_MIDVER",6); define("GRAD_WIDE_MIDVER",6);
define("GRAD_WIDE_MIDHOR",7); define("GRAD_WIDE_MIDHOR",7);
define("GRAD_LEFT_REFLECTION",8); define("GRAD_LEFT_REFLECTION",8);
define("GRAD_RIGHT_REFLECTION",9); define("GRAD_RIGHT_REFLECTION",9);
define("GRAD_RAISED_PANEL",10); define("GRAD_RAISED_PANEL",10);
define("GRAD_DIAGONAL",11); define("GRAD_DIAGONAL",11);
   
//=================================================== //===================================================
// CLASS Gradient // CLASS Gradient
// Description: Handles gradient fills. This is to be // Description: Handles gradient fills. This is to be
// considered a "friend" class of Class Image. // considered a "friend" class of Class Image.
//=================================================== //===================================================
class Gradient { class Gradient {
private $img=null, $numcolors=100; private $img=null, $numcolors=100;
//--------------- //---------------
// CONSTRUCTOR // CONSTRUCTOR
function __construct(&$img) { function __construct(&$img) {
$this->img = $img; $this->img = $img;
} }
   
   
function SetNumColors($aNum) { function SetNumColors($aNum) {
$this->numcolors=$aNum; $this->numcolors=$aNum;
} }
//--------------- //---------------
// PUBLIC METHODS // PUBLIC METHODS
// Produce a gradient filled rectangle with a smooth transition between // Produce a gradient filled rectangle with a smooth transition between
// two colors. // two colors.
// ($xl,$yt) Top left corner // ($xl,$yt) Top left corner
// ($xr,$yb) Bottom right // ($xr,$yb) Bottom right
// $from_color Starting color in gradient // $from_color Starting color in gradient
// $to_color End color in the gradient // $to_color End color in the gradient
// $style Which way is the gradient oriented? // $style Which way is the gradient oriented?
function FilledRectangle($xl,$yt,$xr,$yb,$from_color,$to_color,$style=1) { function FilledRectangle($xl,$yt,$xr,$yb,$from_color,$to_color,$style=1) {
$this->img->SetLineWeight(1); $this->img->SetLineWeight(1);
switch( $style ) { switch( $style ) {
case GRAD_VER: case GRAD_VER:
$steps = ceil(abs($xr-$xl)+1); $steps = ceil(abs($xr-$xl)+1);
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for( $i=0, $x=$xl; $i < $steps; ++$i ) { for( $i=0, $x=$xl; $i < $steps; ++$i ) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yt,$x,$yb); $this->img->Line($x,$yt,$x,$yb);
$x += $delta; $x += $delta;
} }
break; break;
   
case GRAD_HOR: case GRAD_HOR:
$steps = ceil(abs($yb-$yt)+1); $steps = ceil(abs($yb-$yt)+1);
$delta = $yb >= $yt ? 1 : -1; $delta = $yb >= $yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($i=0,$y=$yt; $i < $steps; ++$i) { for($i=0,$y=$yt; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
break; break;
   
case GRAD_MIDHOR: case GRAD_MIDHOR:
$steps = ceil(abs($yb-$yt)/2); $steps = ceil(abs($yb-$yt)/2);
$delta = $yb >= $yt ? 1 : -1; $delta = $yb >= $yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $steps; ++$i) { for($y=$yt, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
--$i; --$i;
if( abs($yb-$yt) % 2 == 1 ) { if( abs($yb-$yt) % 2 == 1 ) {
--$steps; --$steps;
} }
for($j=0; $j < $steps; ++$j, --$i) { for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
break; break;
   
case GRAD_MIDVER: case GRAD_MIDVER:
$steps = ceil(abs($xr-$xl)/2); $steps = ceil(abs($xr-$xl)/2);
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $steps; ++$i) { for($x=$xl, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
--$i; --$i;
if( abs($xr-$xl) % 2 == 1 ) { if( abs($xr-$xl) % 2 == 1 ) {
--$steps; --$steps;
} }
for($j=0; $j < $steps; ++$j, --$i) { for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
break; break;
   
case GRAD_WIDE_MIDVER: case GRAD_WIDE_MIDVER:
$diff = ceil(abs($xr-$xl)); $diff = ceil(abs($xr-$xl));
$steps = floor(abs($diff)/3); $steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ; $firststep = $diff - 2*$steps ;
$delta = $xr >= $xl ? 1 : -1; $delta = $xr >= $xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $firststep; ++$i) { for($x=$xl, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
--$i; --$i;
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
for($j=0; $j< $steps; ++$j) { for($j=0; $j< $steps; ++$j) {
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
   
for($j=0; $j < $steps; ++$j, --$i) { for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
break; break;
   
case GRAD_WIDE_MIDHOR: case GRAD_WIDE_MIDHOR:
$diff = ceil(abs($yb-$yt)); $diff = ceil(abs($yb-$yt));
$steps = floor(abs($diff)/3); $steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ; $firststep = $diff - 2*$steps ;
$delta = $yb >= $yt? 1 : -1; $delta = $yb >= $yt? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $firststep; ++$i) { for($y=$yt, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
--$i; --$i;
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
for($j=0; $j < $steps; ++$j) { for($j=0; $j < $steps; ++$j) {
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
for($j=0; $j < $steps; ++$j, --$i) { for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y); $this->img->Line($xl,$y,$xr,$y);
$y += $delta; $y += $delta;
} }
break; break;
   
case GRAD_LEFT_REFLECTION: case GRAD_LEFT_REFLECTION:
$steps1 = ceil(0.3*abs($xr-$xl)); $steps1 = ceil(0.3*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
   
$from_color = $this->img->rgb->Color($from_color); $from_color = $this->img->rgb->Color($from_color);
$adj = 1.4; $adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color2 = array(min(255,$from_color[0]+$m), $from_color2 = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
   
$this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors); $this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
$steps2 = max(1,ceil(0.08*abs($xr-$xl))); $steps2 = max(1,ceil(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color); $this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) { for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
$steps = abs($xr-$xl)-$steps1-$steps2; $steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) { for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
break; break;
   
case GRAD_RIGHT_REFLECTION: case GRAD_RIGHT_REFLECTION:
$steps1 = ceil(0.7*abs($xr-$xl)); $steps1 = ceil(0.7*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
   
$this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
$steps2 = max(1,ceil(0.08*abs($xr-$xl))); $steps2 = max(1,ceil(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color); $this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) { for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
   
$from_color = $this->img->rgb->Color($from_color); $from_color = $this->img->rgb->Color($from_color);
$adj = 1.4; $adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color = array(min(255,$from_color[0]+$m), $from_color = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
   
$steps = abs($xr-$xl)-$steps1-$steps2; $steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) { for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
break; break;
   
case GRAD_CENTER: case GRAD_CENTER:
$steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2); $steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2);
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
$dx = ($xr-$xl)/2; $dx = ($xr-$xl)/2;
$dy = ($yb-$yt)/2; $dy = ($yb-$yt)/2;
$x=$xl;$y=$yt;$x2=$xr;$y2=$yb; $x=$xl;$y=$yt;$x2=$xr;$y2=$yb;
$n = count($colors); $n = count($colors);
for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) { for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Rectangle($x,$y,$x2,$y2); $this->img->Rectangle($x,$y,$x2,$y2);
} }
$this->img->Line($x,$y,$x2,$y2); $this->img->Line($x,$y,$x2,$y2);
break; break;
   
case GRAD_RAISED_PANEL: case GRAD_RAISED_PANEL:
// right to left // right to left
$steps1 = $xr-$xl; $steps1 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors); $this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
   
// left to right // left to right
$xr -= 3; $xr -= 3;
$xl += 3; $xl += 3;
$yb -= 3; $yb -= 3;
$yt += 3; $yt += 3;
$steps2 = $xr-$xl; $steps2 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
for($x=$xl, $j=$steps2; $j >= 0; --$j) { for($x=$xl, $j=$steps2; $j >= 0; --$j) {
$this->img->current_color = $colors[$j]; $this->img->current_color = $colors[$j];
$this->img->Line($x,$yb,$x,$yt); $this->img->Line($x,$yb,$x,$yt);
$x += $delta; $x += $delta;
} }
break; break;
   
case GRAD_DIAGONAL: case GRAD_DIAGONAL:
// use the longer dimension to determine the required number of steps. // use the longer dimension to determine the required number of steps.
// first loop draws from one corner to the mid-diagonal and the second // first loop draws from one corner to the mid-diagonal and the second
// loop draws from the mid-diagonal to the opposing corner. // loop draws from the mid-diagonal to the opposing corner.
if($xr-$xl > $yb - $yt) { if($xr-$xl > $yb - $yt) {
// width is greater than height -> use x-dimension for steps // width is greater than height -> use x-dimension for steps
$steps = $xr-$xl; $steps = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1; $delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
   
for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) { for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta; $y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yt,$xl,$y); $this->img->Line($x,$yt,$xl,$y);
$x += $delta; $x += $delta;
} }
   
for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) { for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i]; $this->img->current_color = $colors[$steps+$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta; $y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yb,$xr,$y); $this->img->Line($x,$yb,$xr,$y);
$x += $delta; $x += $delta;
} }
} else { } else {
// height is greater than width -> use y-dimension for steps // height is greater than width -> use y-dimension for steps
$steps = $yb-$yt; $steps = $yb-$yt;
$delta = $yb>=$yt ? 1 : -1; $delta = $yb>=$yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors); $n = count($colors);
   
for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) { for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i]; $this->img->current_color = $colors[$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta; $x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yt,$xl,$y); $this->img->Line($x,$yt,$xl,$y);
$y += $delta; $y += $delta;
} }
   
for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) { for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i]; $this->img->current_color = $colors[$steps+$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta; $x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yb,$xr,$y); $this->img->Line($x,$yb,$xr,$y);
$x += $delta; $x += $delta;
} }
   
} }
break; break;
   
default: default:
JpGraphError::RaiseL(7001,$style); JpGraphError::RaiseL(7001,$style);
//("Unknown gradient style (=$style)."); //("