src/plot/IconPlot.php
<?php
/**
* JPGraph v4.0.3
*/
namespace Amenadiel\JpGraph\Plot;
use Amenadiel\JpGraph\Graph;
use Amenadiel\JpGraph\Image;
use Amenadiel\JpGraph\Util;
/**
* File: JPGRAPH_ICONPLOT.PHP
* // Description: Extension module to add icons to plots
* // Created: 2004-02-18
* // Ver: $Id: jpgraph_iconplot.php 1404 2009-06-28 15:25:41Z ljp $
* //
* // Copyright (c) Asial Corporation. All rights reserved.
*/
/**
* @class IconPlot
* // Description: Make it possible to add a (small) image
* // to the graph
*/
class IconPlot
{
public $iX = 0;
public $iY = 0;
public $iScale = 1.0;
public $iMix = 100;
private $iHorAnchor = 'left';
private $iVertAnchor = 'top';
private $iFile = '';
private $iAnchors = ['left', 'right', 'top', 'bottom', 'center'];
private $iCountryFlag = '';
private $iCountryStdSize = 3;
private $iScalePosY;
private $iScalePosX;
private $iImgString = '';
public function __construct($aFile = '', $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100)
{
$this->iFile = $aFile;
$this->iX = $aX;
$this->iY = $aY;
$this->iScale = $aScale;
if ($aMix < 0 || $aMix > 100) {
Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix;
}
public function SetCountryFlag($aFlag, $aX = 0, $aY = 0, $aScale = 1.0, $aMix = 100, $aStdSize = 3)
{
$this->iCountryFlag = $aFlag;
$this->iX = $aX;
$this->iY = $aY;
$this->iScale = $aScale;
if ($aMix < 0 || $aMix > 100) {
Util\JpGraphError::RaiseL(8001); //'Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix;
$this->iCountryStdSize = $aStdSize;
}
public function SetPos($aX, $aY)
{
$this->iX = $aX;
$this->iY = $aY;
}
public function CreateFromString($aStr)
{
$this->iImgString = $aStr;
}
public function SetScalePos($aX, $aY)
{
$this->iScalePosX = $aX;
$this->iScalePosY = $aY;
}
public function SetScale($aScale)
{
$this->iScale = $aScale;
}
public function SetMix($aMix)
{
if ($aMix < 0 || $aMix > 100) {
Util\JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix;
}
public function SetAnchor($aXAnchor = 'left', $aYAnchor = 'center')
{
if (!in_array($aXAnchor, $this->iAnchors, true) ||
!in_array($aYAnchor, $this->iAnchors, true)) {
Util\JpGraphError::RaiseL(8002); //("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'");
}
$this->iHorAnchor = $aXAnchor;
$this->iVertAnchor = $aYAnchor;
}
public function PreStrokeAdjust($aGraph)
{
// Nothing to do ...
}
public function DoLegend($aGraph)
{
// Nothing to do ...
}
public function Max()
{
return [false, false];
}
// The next four function are framework function tht gets called
// from Gantt and is not menaiungfull in the context of Icons but
// they must be implemented to avoid errors.
public function GetMaxDate()
{
return false;
}
public function GetMinDate()
{
return false;
}
public function GetLineNbr()
{
return 0;
}
public function GetAbsHeight()
{
return 0;
}
public function Min()
{
return [false, false];
}
public function StrokeMargin(&$aImg)
{
return true;
}
public function Stroke($aImg, $axscale = null, $ayscale = null)
{
$this->StrokeWithScale($aImg, $axscale, $ayscale);
}
public function StrokeWithScale($aImg, $axscale, $ayscale)
{
if ($this->iScalePosX === null || $this->iScalePosY === null ||
$axscale === null || $ayscale === null) {
$this->_Stroke($aImg);
} else {
$this->_Stroke(
$aImg,
round($axscale->Translate($this->iScalePosX)),
round($ayscale->Translate($this->iScalePosY))
);
}
}
public function GetWidthHeight()
{
$dummy = 0;
return $this->_Stroke($dummy, null, null, true);
}
public function _Stroke($aImg, $x = null, $y = null, $aReturnWidthHeight = false)
{
if ($this->iFile != '' && $this->iCountryFlag != '') {
Util\JpGraphError::RaiseL(8003); //('It is not possible to specify both an image file and a country flag for the same icon.');
}
if ($this->iFile != '') {
$gdimg = Graph\Graph::LoadBkgImage('', $this->iFile);
} elseif ($this->iImgString != '') {
$gdimg = Image\Image::CreateFromString($this->iImgString);
} else {
$fobj = new Image\FlagImages($this->iCountryStdSize);
$dummy = '';
$gdimg = $fobj->GetImgByName($this->iCountryFlag, $dummy);
}
$iconw = imagesx($gdimg);
$iconh = imagesy($gdimg);
if ($aReturnWidthHeight) {
return [round($iconw * $this->iScale), round($iconh * $this->iScale)];
}
if ($x !== null && $y !== null) {
$this->iX = $x;
$this->iY = $y;
}
if ($this->iX >= 0 && $this->iX <= 1.0) {
$w = imagesx($aImg->img);
$this->iX = round($w * $this->iX);
}
if ($this->iY >= 0 && $this->iY <= 1.0) {
$h = imagesy($aImg->img);
$this->iY = round($h * $this->iY);
}
if ($this->iHorAnchor == 'center') {
$this->iX -= round($iconw * $this->iScale / 2);
}
if ($this->iHorAnchor == 'right') {
$this->iX -= round($iconw * $this->iScale);
}
if ($this->iVertAnchor == 'center') {
$this->iY -= round($iconh * $this->iScale / 2);
}
if ($this->iVertAnchor == 'bottom') {
$this->iY -= round($iconh * $this->iScale);
}
$aImg->CopyMerge(
$gdimg,
$this->iX,
$this->iY,
0,
0,
round($iconw * $this->iScale),
round($iconh * $this->iScale),
$iconw,
$iconh,
$this->iMix
);
}
}