HuasoFoundries /
jpgraph
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * JPGraph v4.0.3 |
||
| 5 | */ |
||
| 6 | |||
| 7 | namespace Amenadiel\JpGraph\Text; |
||
| 8 | |||
| 9 | use Amenadiel\JpGraph\Util; |
||
| 10 | |||
| 11 | /** |
||
| 12 | * @class TextProperty |
||
| 13 | * // Description: Holds properties for a text |
||
| 14 | */ |
||
| 15 | class TextProperty |
||
| 16 | { |
||
| 17 | public $iShow = true; |
||
| 18 | public $csimtarget = ''; |
||
| 19 | public $csimwintarget = ''; |
||
| 20 | public $csimalt = ''; |
||
| 21 | private $iFFamily = FF_FONT1; |
||
| 22 | private $iFStyle = FS_NORMAL; |
||
| 23 | private $iFSize = 10; |
||
| 24 | private $iFontArray = []; |
||
| 25 | private $iColor = 'black'; |
||
| 26 | private $iText = ''; |
||
| 27 | private $iHAlign = 'left'; |
||
| 28 | private $iVAlign = 'bottom'; |
||
| 29 | |||
| 30 | /** |
||
| 31 | * CONSTRUCTOR. |
||
| 32 | * |
||
| 33 | * @param mixed $aTxt |
||
| 34 | */ |
||
| 35 | public function __construct($aTxt = '') |
||
| 36 | { |
||
| 37 | $this->iText = $aTxt; |
||
| 38 | } |
||
| 39 | |||
| 40 | /** |
||
| 41 | * PUBLIC METHODS. |
||
| 42 | * |
||
| 43 | * @param mixed $aTxt |
||
| 44 | */ |
||
| 45 | public function Set($aTxt) |
||
| 46 | { |
||
| 47 | $this->iText = $aTxt; |
||
| 48 | } |
||
| 49 | |||
| 50 | public function SetCSIMTarget($aTarget, $aAltText = '', $aWinTarget = '') |
||
| 51 | { |
||
| 52 | if (is_string($aTarget)) { |
||
| 53 | $aTarget = [$aTarget]; |
||
| 54 | } |
||
| 55 | |||
| 56 | $this->csimtarget = $aTarget; |
||
| 57 | |||
| 58 | if (is_string($aWinTarget)) { |
||
| 59 | $aWinTarget = [$aWinTarget]; |
||
| 60 | } |
||
| 61 | |||
| 62 | $this->csimwintarget = $aWinTarget; |
||
| 63 | |||
| 64 | if (is_string($aAltText)) { |
||
| 65 | $aAltText = [$aAltText]; |
||
| 66 | } |
||
| 67 | |||
| 68 | $this->csimalt = $aAltText; |
||
| 69 | } |
||
| 70 | |||
| 71 | public function SetCSIMAlt($aAltText) |
||
| 72 | { |
||
| 73 | if (is_string($aAltText)) { |
||
| 74 | $aAltText = [$aAltText]; |
||
| 75 | } |
||
| 76 | |||
| 77 | $this->csimalt = $aAltText; |
||
| 78 | } |
||
| 79 | |||
| 80 | // Set text color |
||
| 81 | public function SetColor($aColor) |
||
| 82 | { |
||
| 83 | $this->iColor = $aColor; |
||
| 84 | } |
||
| 85 | |||
| 86 | public function HasTabs() |
||
| 87 | { |
||
| 88 | if (is_string($this->iText)) { |
||
| 89 | return substr_count($this->iText, "\t") > 0; |
||
| 90 | } |
||
| 91 | if (is_array($this->iText)) { |
||
| 92 | return false; |
||
| 93 | } |
||
| 94 | } |
||
| 95 | |||
| 96 | // Get number of tabs in string |
||
| 97 | public function GetNbrTabs() |
||
| 98 | { |
||
| 99 | if (is_string($this->iText)) { |
||
| 100 | return substr_count($this->iText, "\t"); |
||
| 101 | } |
||
| 102 | |||
| 103 | return 0; |
||
| 104 | } |
||
| 105 | |||
| 106 | // Set alignment |
||
| 107 | public function Align($aHAlign, $aVAlign = 'bottom') |
||
| 108 | { |
||
| 109 | $this->iHAlign = $aHAlign; |
||
| 110 | $this->iVAlign = $aVAlign; |
||
| 111 | } |
||
| 112 | |||
| 113 | // Synonym |
||
| 114 | public function SetAlign($aHAlign, $aVAlign = 'bottom') |
||
| 115 | { |
||
| 116 | $this->iHAlign = $aHAlign; |
||
| 117 | $this->iVAlign = $aVAlign; |
||
| 118 | } |
||
| 119 | |||
| 120 | // Specify font |
||
| 121 | public function SetFont($aFFamily, $aFStyle = FS_NORMAL, $aFSize = 10) |
||
| 122 | { |
||
| 123 | $this->iFFamily = $aFFamily; |
||
| 124 | $this->iFStyle = $aFStyle; |
||
| 125 | $this->iFSize = $aFSize; |
||
| 126 | } |
||
| 127 | |||
| 128 | public function SetColumnFonts($aFontArray) |
||
| 129 | { |
||
| 130 | if (!is_array($aFontArray) || safe_count($aFontArray[0]) != 3) { |
||
| 131 | Util\JpGraphError::RaiseL(6033); |
||
| 132 | // 'Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)' |
||
| 133 | } |
||
| 134 | $this->iFontArray = $aFontArray; |
||
| 135 | } |
||
| 136 | |||
| 137 | public function IsColumns() |
||
| 138 | { |
||
| 139 | return is_array($this->iText); |
||
| 140 | } |
||
| 141 | |||
| 142 | // Get width of text. If text contains several columns separated by |
||
| 143 | // tabs then return both the total width as well as an array with a |
||
| 144 | // width for each column. |
||
| 145 | public function GetWidth($aImg, $aUseTabs = false, $aTabExtraMargin = 1.1) |
||
| 146 | { |
||
| 147 | $extra_margin = 4; |
||
| 148 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 149 | if (is_string($this->iText)) { |
||
| 150 | if (strlen($this->iText) == 0) { |
||
| 151 | return 0; |
||
| 152 | } |
||
| 153 | |||
| 154 | $tmp = preg_split('/\t/', $this->iText); |
||
| 155 | if (safe_count($tmp) <= 1 || !$aUseTabs) { |
||
| 156 | $w = $aImg->GetTextWidth($this->iText); |
||
| 157 | |||
| 158 | return $w + 2 * $extra_margin; |
||
| 159 | } |
||
| 160 | $tot = 0; |
||
| 161 | $n = safe_count($tmp); |
||
| 162 | for ($i = 0; $i < $n; ++$i) { |
||
| 163 | $res[$i] = $aImg->GetTextWidth($tmp[$i]); |
||
| 164 | $tot += $res[$i] * $aTabExtraMargin; |
||
|
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
Loading history...
|
|||
| 165 | } |
||
| 166 | |||
| 167 | return [round($tot), $res]; |
||
| 168 | } |
||
| 169 | if (is_object($this->iText)) { |
||
| 170 | // A single icon |
||
| 171 | return $this->iText->GetWidth() + 2 * $extra_margin; |
||
| 172 | } |
||
| 173 | if (is_array($this->iText)) { |
||
| 174 | // Must be an array of texts. In this case we return the sum of the |
||
| 175 | // length + a fixed margin of 4 pixels on each text string |
||
| 176 | $n = safe_count($this->iText); |
||
| 177 | $nf = safe_count($this->iFontArray); |
||
| 178 | for ($i = 0, $w = 0; $i < $n; ++$i) { |
||
| 179 | if ($i < $nf) { |
||
| 180 | $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); |
||
| 181 | } else { |
||
| 182 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 183 | } |
||
| 184 | $tmp = $this->iText[$i]; |
||
| 185 | if (is_string($tmp)) { |
||
| 186 | $w += $aImg->GetTextWidth($tmp) + $extra_margin; |
||
| 187 | } else { |
||
| 188 | if (is_object($tmp) === false) { |
||
| 189 | Util\JpGraphError::RaiseL(6012); |
||
| 190 | } |
||
| 191 | $w += $tmp->GetWidth() + $extra_margin; |
||
| 192 | } |
||
| 193 | } |
||
| 194 | |||
| 195 | return $w; |
||
| 196 | } |
||
| 197 | Util\JpGraphError::RaiseL(6012); |
||
| 198 | } |
||
| 199 | |||
| 200 | // for the case where we have multiple columns this function returns the width of each |
||
| 201 | // column individually. If there is no columns just return the width of the single |
||
| 202 | // column as an array of one |
||
| 203 | public function GetColWidth($aImg, $aMargin = 0) |
||
| 204 | { |
||
| 205 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 206 | if (is_array($this->iText)) { |
||
| 207 | $n = safe_count($this->iText); |
||
| 208 | $nf = safe_count($this->iFontArray); |
||
| 209 | for ($i = 0, $w = []; $i < $n; ++$i) { |
||
| 210 | $tmp = $this->iText[$i]; |
||
| 211 | if (is_string($tmp)) { |
||
| 212 | if ($i < $nf) { |
||
| 213 | $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); |
||
| 214 | } else { |
||
| 215 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 216 | } |
||
| 217 | $w[$i] = $aImg->GetTextWidth($tmp) + $aMargin; |
||
| 218 | } else { |
||
| 219 | if (is_object($tmp) === false) { |
||
| 220 | Util\JpGraphError::RaiseL(6012); |
||
| 221 | } |
||
| 222 | $w[$i] = $tmp->GetWidth() + $aMargin; |
||
| 223 | } |
||
| 224 | } |
||
| 225 | |||
| 226 | return $w; |
||
| 227 | } |
||
| 228 | |||
| 229 | return [$this->GetWidth($aImg)]; |
||
| 230 | } |
||
| 231 | |||
| 232 | // Get total height of text |
||
| 233 | public function GetHeight($aImg) |
||
| 234 | { |
||
| 235 | $nf = safe_count($this->iFontArray); |
||
| 236 | $maxheight = -1; |
||
| 237 | |||
| 238 | if ($nf > 0) { |
||
| 239 | // We have to find out the largest font and take that one as the |
||
| 240 | // height of the row |
||
| 241 | for ($i = 0; $i < $nf; ++$i) { |
||
| 242 | $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); |
||
| 243 | $height = $aImg->GetFontHeight(); |
||
| 244 | $maxheight = max($height, $maxheight); |
||
| 245 | } |
||
| 246 | } |
||
| 247 | |||
| 248 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 249 | $height = $aImg->GetFontHeight(); |
||
| 250 | $maxheight = max($height, $maxheight); |
||
| 251 | |||
| 252 | return $maxheight; |
||
| 253 | } |
||
| 254 | |||
| 255 | // Unhide/hide the text |
||
| 256 | public function Show($aShow = true) |
||
| 257 | { |
||
| 258 | $this->iShow = $aShow; |
||
| 259 | } |
||
| 260 | |||
| 261 | // Stroke text at (x,y) coordinates. If the text contains tabs then the |
||
| 262 | // x parameter should be an array of positions to be used for each successive |
||
| 263 | // tab mark. If no array is supplied then the tabs will be ignored. |
||
| 264 | public function Stroke($aImg, $aX, $aY) |
||
| 265 | { |
||
| 266 | if ($this->iShow) { |
||
| 267 | $aImg->SetColor($this->iColor); |
||
| 268 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 269 | $aImg->SetTextAlign($this->iHAlign, $this->iVAlign); |
||
| 270 | if ($this->GetNbrTabs() < 1) { |
||
| 271 | if (is_string($this->iText)) { |
||
| 272 | if (is_array($aX)) { |
||
| 273 | $aX = $aX[0]; |
||
| 274 | } |
||
| 275 | |||
| 276 | if (is_array($aY)) { |
||
| 277 | $aY = $aY[0]; |
||
| 278 | } |
||
| 279 | |||
| 280 | $aImg->StrokeText($aX, $aY, $this->iText); |
||
| 281 | } elseif (is_array($this->iText) && ($n = safe_count($this->iText)) > 0) { |
||
| 282 | $ax = is_array($aX); |
||
| 283 | $ay = is_array($aY); |
||
| 284 | if ($ax && $ay) { |
||
| 285 | // Nothing; both are already arrays |
||
| 286 | } elseif ($ax) { |
||
| 287 | $aY = array_fill(0, $n, $aY); |
||
| 288 | } elseif ($ay) { |
||
| 289 | $aX = array_fill(0, $n, $aX); |
||
| 290 | } else { |
||
| 291 | $aX = array_fill(0, $n, $aX); |
||
| 292 | $aY = array_fill(0, $n, $aY); |
||
| 293 | } |
||
| 294 | $n = min($n, safe_count($aX)); |
||
| 295 | $n = min($n, safe_count($aY)); |
||
| 296 | for ($i = 0; $i < $n; ++$i) { |
||
| 297 | $tmp = $this->iText[$i]; |
||
| 298 | if (is_object($tmp)) { |
||
| 299 | $tmp->Stroke($aImg, $aX[$i], $aY[$i]); |
||
| 300 | } else { |
||
| 301 | if ($i < safe_count($this->iFontArray)) { |
||
| 302 | $font = $this->iFontArray[$i]; |
||
| 303 | $aImg->SetFont($font[0], $font[1], $font[2]); |
||
| 304 | } else { |
||
| 305 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 306 | } |
||
| 307 | $aImg->StrokeText($aX[$i], $aY[$i], str_replace("\t", ' ', $tmp)); |
||
| 308 | } |
||
| 309 | } |
||
| 310 | } |
||
| 311 | } else { |
||
| 312 | $tmp = preg_split('/\t/', $this->iText); |
||
| 313 | $n = min(safe_count($tmp), safe_count($aX)); |
||
| 314 | for ($i = 0; $i < $n; ++$i) { |
||
| 315 | if ($i < safe_count($this->iFontArray)) { |
||
| 316 | $font = $this->iFontArray[$i]; |
||
| 317 | $aImg->SetFont($font[0], $font[1], $font[2]); |
||
| 318 | } else { |
||
| 319 | $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); |
||
| 320 | } |
||
| 321 | $aImg->StrokeText($aX[$i], $aY, $tmp[$i]); |
||
| 322 | } |
||
| 323 | } |
||
| 324 | } |
||
| 325 | } |
||
| 326 | } |
||
| 327 |