HuasoFoundries /
jpgraph
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * JPGraph v4.0.3 |
||
| 5 | */ |
||
| 6 | |||
| 7 | namespace Amenadiel\JpGraph\Image; |
||
| 8 | |||
| 9 | use Amenadiel\JpGraph\Util; |
||
| 10 | |||
| 11 | /* |
||
| 12 | * File: JPGRAPH_LED.PHP |
||
| 13 | * // Description: Module to generate Dotted LED-like digits |
||
| 14 | * // Created: 2006-11-26 |
||
| 15 | * // Ver: $Id: jpgraph_led.php 1674 2009-07-22 19:42:23Z ljp $ |
||
| 16 | * // |
||
| 17 | * // Copyright 2006 (c) Asial Corporation. All rights reserved. |
||
| 18 | * // |
||
| 19 | * // Changed: 2007-08-06 by Alexander Kurochkin ([email protected]) |
||
| 20 | */ |
||
| 21 | // Constants for color schema |
||
| 22 | define('LEDC_RED', 0); |
||
| 23 | define('LEDC_GREEN', 1); |
||
| 24 | define('LEDC_BLUE', 2); |
||
| 25 | define('LEDC_YELLOW', 3); |
||
| 26 | define('LEDC_GRAY', 4); |
||
| 27 | define('LEDC_CHOCOLATE', 5); |
||
| 28 | define('LEDC_PERU', 6); |
||
| 29 | define('LEDC_GOLDENROD', 7); |
||
| 30 | define('LEDC_KHAKI', 8); |
||
| 31 | define('LEDC_OLIVE', 9); |
||
| 32 | define('LEDC_LIMEGREEN', 10); |
||
| 33 | define('LEDC_FORESTGREEN', 11); |
||
| 34 | define('LEDC_TEAL', 12); |
||
| 35 | define('LEDC_STEELBLUE', 13); |
||
| 36 | define('LEDC_NAVY', 14); |
||
| 37 | define('LEDC_INVERTGRAY', 15); |
||
| 38 | |||
| 39 | // Check that mb_strlen() is available |
||
| 40 | if (!function_exists('mb_strlen')) { |
||
| 41 | Util\JpGraphError::RaiseL(25500); |
||
| 42 | //'Multibyte strings must be enabled in the PHP installation in order to run the LED module |
||
| 43 | // so that the function mb_strlen() is available. See PHP documentation for more information.' |
||
| 44 | } |
||
| 45 | |||
| 46 | /** |
||
| 47 | * @class DigitalLED74 |
||
| 48 | * // Description: |
||
| 49 | * // Construct a number as an image that looks like LED numbers in a |
||
| 50 | * // 7x4 digital matrix |
||
| 51 | */ |
||
| 52 | class DigitalLED74 |
||
| 53 | { |
||
| 54 | private $iLED_X = 4; |
||
| 55 | private $iLED_Y = 7; |
||
| 56 | private $iColorSchema = [ |
||
| 57 | LEDC_RED => ['red', 'darkred:0.9', 'red:0.3'], // 0 |
||
| 58 | LEDC_GREEN => ['green', 'darkgreen', 'green:0.3'], // 1 |
||
| 59 | LEDC_BLUE => ['lightblue:0.9', 'darkblue:0.85', 'darkblue:0.7'], // 2 |
||
| 60 | LEDC_YELLOW => ['yellow', 'yellow:0.4', 'yellow:0.3'], // 3 |
||
| 61 | LEDC_GRAY => ['gray:1.4', 'darkgray:0.85', 'darkgray:0.7'], |
||
| 62 | LEDC_CHOCOLATE => ['chocolate', 'chocolate:0.7', 'chocolate:0.5'], |
||
| 63 | LEDC_PERU => ['peru:0.95', 'peru:0.6', 'peru:0.5'], |
||
| 64 | LEDC_GOLDENROD => ['goldenrod', 'goldenrod:0.6', 'goldenrod:0.5'], |
||
| 65 | LEDC_KHAKI => ['khaki:0.7', 'khaki:0.4', 'khaki:0.3'], |
||
| 66 | LEDC_OLIVE => ['#808000', '#808000:0.7', '#808000:0.6'], |
||
| 67 | LEDC_LIMEGREEN => ['limegreen:0.9', 'limegreen:0.5', 'limegreen:0.4'], |
||
| 68 | LEDC_FORESTGREEN => ['forestgreen', 'forestgreen:0.7', 'forestgreen:0.5'], |
||
| 69 | LEDC_TEAL => ['teal', 'teal:0.7', 'teal:0.5'], |
||
| 70 | LEDC_STEELBLUE => ['steelblue', 'steelblue:0.65', 'steelblue:0.5'], |
||
| 71 | LEDC_NAVY => ['navy:1.3', 'navy:0.95', 'navy:0.8'], //14 |
||
| 72 | LEDC_INVERTGRAY => ['darkgray', 'lightgray:1.5', 'white'], //15 |
||
| 73 | ]; |
||
| 74 | private $iLEDSpec = [ |
||
| 75 | 0 => [6, 9, 11, 15, 13, 9, 6], |
||
| 76 | 1 => [2, 6, 10, 2, 2, 2, 2], |
||
| 77 | 2 => [6, 9, 1, 2, 4, 8, 15], |
||
| 78 | 3 => [6, 9, 1, 6, 1, 9, 6], |
||
| 79 | 4 => [1, 3, 5, 9, 15, 1, 1], |
||
| 80 | 5 => [15, 8, 8, 14, 1, 9, 6], |
||
| 81 | 6 => [6, 8, 8, 14, 9, 9, 6], |
||
| 82 | 7 => [15, 1, 1, 2, 4, 4, 4], |
||
| 83 | 8 => [6, 9, 9, 6, 9, 9, 6], |
||
| 84 | 9 => [6, 9, 9, 7, 1, 1, 6], |
||
| 85 | '!' => [4, 4, 4, 4, 4, 0, 4], |
||
| 86 | '?' => [6, 9, 1, 2, 2, 0, 2], |
||
| 87 | '#' => [0, 9, 15, 9, 15, 9, 0], |
||
| 88 | '@' => [6, 9, 11, 11, 10, 9, 6], |
||
| 89 | '-' => [0, 0, 0, 15, 0, 0, 0], |
||
| 90 | '_' => [0, 0, 0, 0, 0, 0, 15], |
||
| 91 | '=' => [0, 0, 15, 0, 15, 0, 0], |
||
| 92 | '+' => [0, 0, 4, 14, 4, 0, 0], |
||
| 93 | '|' => [4, 4, 4, 4, 4, 4, 4], //vertical line, used for simulate rus 'Ы' |
||
| 94 | ',' => [0, 0, 0, 0, 0, 12, 4], |
||
| 95 | '.' => [0, 0, 0, 0, 0, 12, 12], |
||
| 96 | ':' => [12, 12, 0, 0, 0, 12, 12], |
||
| 97 | ';' => [12, 12, 0, 0, 0, 12, 4], |
||
| 98 | '[' => [3, 2, 2, 2, 2, 2, 3], |
||
| 99 | ']' => [12, 4, 4, 4, 4, 4, 12], |
||
| 100 | '(' => [1, 2, 2, 2, 2, 2, 1], |
||
| 101 | ')' => [8, 4, 4, 4, 4, 4, 8], |
||
| 102 | '{' => [3, 2, 2, 6, 2, 2, 3], |
||
| 103 | '}' => [12, 4, 4, 6, 4, 4, 12], |
||
| 104 | '<' => [1, 2, 4, 8, 4, 2, 1], |
||
| 105 | '>' => [8, 4, 2, 1, 2, 4, 8], |
||
| 106 | '*' => [9, 6, 15, 6, 9, 0, 0], |
||
| 107 | '"' => [10, 10, 0, 0, 0, 0, 0], |
||
| 108 | '\'' => [4, 4, 0, 0, 0, 0, 0], |
||
| 109 | '`' => [4, 2, 0, 0, 0, 0, 0], |
||
| 110 | '~' => [13, 11, 0, 0, 0, 0, 0], |
||
| 111 | '^' => [4, 10, 0, 0, 0, 0, 0], |
||
| 112 | '\\' => [8, 8, 4, 6, 2, 1, 1], |
||
| 113 | '/' => [1, 1, 2, 6, 4, 8, 8], |
||
| 114 | '%' => [1, 9, 2, 6, 4, 9, 8], |
||
| 115 | '&' => [0, 4, 10, 4, 11, 10, 5], |
||
| 116 | '$' => [2, 7, 8, 6, 1, 14, 4], |
||
| 117 | ' ' => [0, 0, 0, 0, 0, 0, 0], |
||
| 118 | '•' => [0, 0, 6, 6, 0, 0, 0], //149 |
||
| 119 | '°' => [14, 10, 14, 0, 0, 0, 0], //176 |
||
| 120 | '†' => [4, 4, 14, 4, 4, 4, 4], //134 |
||
| 121 | '‡' => [4, 4, 14, 4, 14, 4, 4], //135 |
||
| 122 | '±' => [0, 4, 14, 4, 0, 14, 0], //177 |
||
| 123 | '‰' => [0, 4, 2, 15, 2, 4, 0], //137 show right arrow |
||
| 124 | '™' => [0, 2, 4, 15, 4, 2, 0], //156 show left arrow |
||
| 125 | 'Ў' => [0, 0, 8, 8, 0, 0, 0], //159 show small hi-stick - that need for simulate rus 'Ф' |
||
| 126 | "\t" => [8, 8, 8, 0, 0, 0, 0], //show hi-stick - that need for simulate rus 'У' |
||
| 127 | "\r" => [8, 8, 8, 8, 8, 8, 8], //vertical line - that need for simulate 'M', 'W' and rus 'М','Ш' ,'Щ' |
||
| 128 | "\n" => [15, 15, 15, 15, 15, 15, 15], //fill up - that need for simulate rus 'Ж' |
||
| 129 | 'Ґ' => [10, 5, 10, 5, 10, 5, 10], //chess |
||
| 130 | 'µ' => [15, 0, 15, 0, 15, 0, 15], //4 horizontal lines |
||
| 131 | // latin |
||
| 132 | 'A' => [6, 9, 9, 15, 9, 9, 9], |
||
| 133 | 'B' => [14, 9, 9, 14, 9, 9, 14], |
||
| 134 | 'C' => [6, 9, 8, 8, 8, 9, 6], |
||
| 135 | 'D' => [14, 9, 9, 9, 9, 9, 14], |
||
| 136 | 'E' => [15, 8, 8, 14, 8, 8, 15], |
||
| 137 | 'F' => [15, 8, 8, 14, 8, 8, 8], |
||
| 138 | 'G' => [6, 9, 8, 8, 11, 9, 6], |
||
| 139 | 'H' => [9, 9, 9, 15, 9, 9, 9], |
||
| 140 | 'I' => [14, 4, 4, 4, 4, 4, 14], |
||
| 141 | 'J' => [15, 1, 1, 1, 1, 9, 6], |
||
| 142 | 'K' => [8, 9, 10, 12, 12, 10, 9], |
||
| 143 | 'L' => [8, 8, 8, 8, 8, 8, 15], |
||
| 144 | 'M' => [8, 13, 10, 8, 8, 8, 8], // need to add \r |
||
| 145 | 'N' => [9, 9, 13, 11, 9, 9, 9], |
||
| 146 | 'O' => [6, 9, 9, 9, 9, 9, 6], |
||
| 147 | 'P' => [14, 9, 9, 14, 8, 8, 8], |
||
| 148 | 'Q' => [6, 9, 9, 9, 13, 11, 6], |
||
| 149 | 'R' => [14, 9, 9, 14, 12, 10, 9], |
||
| 150 | 'S' => [6, 9, 8, 6, 1, 9, 6], |
||
| 151 | 'T' => [14, 4, 4, 4, 4, 4, 4], |
||
| 152 | 'U' => [9, 9, 9, 9, 9, 9, 6], |
||
| 153 | 'V' => [0, 0, 0, 10, 10, 10, 4], |
||
| 154 | 'W' => [8, 8, 8, 8, 10, 13, 8], // need to add \r |
||
| 155 | 'X' => [9, 9, 6, 6, 6, 9, 9], |
||
| 156 | 'Y' => [10, 10, 10, 10, 4, 4, 4], |
||
| 157 | 'Z' => [15, 1, 2, 6, 4, 8, 15], |
||
| 158 | // russian utf-8 |
||
| 159 | 'А' => [6, 9, 9, 15, 9, 9, 9], |
||
| 160 | 'Б' => [14, 8, 8, 14, 9, 9, 14], |
||
| 161 | 'В' => [14, 9, 9, 14, 9, 9, 14], |
||
| 162 | 'Г' => [15, 8, 8, 8, 8, 8, 8], |
||
| 163 | 'Д' => [14, 9, 9, 9, 9, 9, 14], |
||
| 164 | 'Е' => [15, 8, 8, 14, 8, 8, 15], |
||
| 165 | 'Ё' => [6, 15, 8, 14, 8, 8, 15], |
||
| 166 | //Ж is combine: >\n< |
||
| 167 | 'З' => [6, 9, 1, 2, 1, 9, 6], |
||
| 168 | 'И' => [9, 9, 9, 11, 13, 9, 9], |
||
| 169 | 'Й' => [13, 9, 9, 11, 13, 9, 9], |
||
| 170 | 'К' => [9, 10, 12, 10, 9, 9, 9], |
||
| 171 | 'Л' => [7, 9, 9, 9, 9, 9, 9], |
||
| 172 | 'М' => [8, 13, 10, 8, 8, 8, 8], // need to add \r |
||
| 173 | 'Н' => [9, 9, 9, 15, 9, 9, 9], |
||
| 174 | 'О' => [6, 9, 9, 9, 9, 9, 6], |
||
| 175 | 'П' => [15, 9, 9, 9, 9, 9, 9], |
||
| 176 | 'Р' => [14, 9, 9, 14, 8, 8, 8], |
||
| 177 | 'С' => [6, 9, 8, 8, 8, 9, 6], |
||
| 178 | 'Т' => [14, 4, 4, 4, 4, 4, 4], |
||
| 179 | 'У' => [9, 9, 9, 7, 1, 9, 6], |
||
| 180 | 'Ф' => [2, 7, 10, 10, 7, 2, 2], // need to add Ў |
||
| 181 | 'Х' => [9, 9, 6, 6, 6, 9, 9], |
||
| 182 | 'Ц' => [10, 10, 10, 10, 10, 15, 1], |
||
| 183 | 'Ч' => [9, 9, 9, 7, 1, 1, 1], |
||
| 184 | 'Ш' => [10, 10, 10, 10, 10, 10, 15], // \r |
||
| 185 | 'Щ' => [10, 10, 10, 10, 10, 15, 0], // need to add \r |
||
| 186 | 'Ъ' => [12, 4, 4, 6, 5, 5, 6], |
||
| 187 | 'Ы' => [8, 8, 8, 14, 9, 9, 14], // need to add | |
||
| 188 | 'Ь' => [8, 8, 8, 14, 9, 9, 14], |
||
| 189 | 'Э' => [6, 9, 1, 7, 1, 9, 6], |
||
| 190 | 'Ю' => [2, 2, 2, 3, 2, 2, 2], // need to add O |
||
| 191 | 'Я' => [7, 9, 9, 7, 3, 5, 9], |
||
| 192 | ]; |
||
| 193 | private $iSuperSampling = 3; |
||
| 194 | private $iMarg = 1; |
||
| 195 | private $iRad = 4; |
||
| 196 | |||
| 197 | public function __construct($aRadius = 2, $aMargin = 0.6) |
||
| 198 | { |
||
| 199 | $this->iRad = $aRadius; |
||
| 200 | $this->iMarg = $aMargin; |
||
| 201 | } |
||
| 202 | |||
| 203 | public function SetSupersampling($aSuperSampling = 2) |
||
| 204 | { |
||
| 205 | $this->iSuperSampling = $aSuperSampling; |
||
| 206 | } |
||
| 207 | |||
| 208 | public function _GetLED($aLedIdx, $aColor = 0) |
||
| 209 | { |
||
| 210 | $width = $this->iLED_X * $this->iRad * 2 + ($this->iLED_X + 1) * $this->iMarg + $this->iRad; |
||
| 211 | $height = $this->iLED_Y * $this->iRad * 2 + ($this->iLED_Y) * $this->iMarg + $this->iRad * 2; |
||
| 212 | |||
| 213 | // Adjust radious for supersampling |
||
| 214 | $rad = $this->iRad * $this->iSuperSampling; |
||
| 215 | |||
| 216 | // Margin in between "Led" dots |
||
| 217 | $marg = $this->iMarg * $this->iSuperSampling; |
||
| 218 | |||
| 219 | $swidth = $width * $this->iSuperSampling; |
||
| 220 | $sheight = $height * $this->iSuperSampling; |
||
| 221 | |||
| 222 | $simg = new RotImage($swidth, $sheight, 0, DEFAULT_GFORMAT, false); |
||
| 223 | $simg->SetColor($this->iColorSchema[$aColor][2]); |
||
| 224 | $simg->FilledRectangle(0, 0, $swidth - 1, $sheight - 1); |
||
| 225 | |||
| 226 | if (array_key_exists($aLedIdx, $this->iLEDSpec)) { |
||
| 227 | $d = $this->iLEDSpec[$aLedIdx]; |
||
| 228 | } else { |
||
| 229 | $d = [0, 0, 0, 0, 0, 0, 0]; |
||
| 230 | } |
||
| 231 | |||
| 232 | for ($r = 0; $r < 7; ++$r) { |
||
| 233 | $dr = $d[$r]; |
||
| 234 | for ($c = 0; $c < 4; ++$c) { |
||
| 235 | if (($dr & pow(2, 3 - $c)) !== 0) { |
||
| 236 | $color = $this->iColorSchema[$aColor][0]; |
||
| 237 | } else { |
||
| 238 | $color = $this->iColorSchema[$aColor][1]; |
||
| 239 | } |
||
| 240 | |||
| 241 | $x = 2 * $rad * $c + $rad + ($c + 1) * $marg + $rad; |
||
| 242 | $y = 2 * $rad * $r + $rad + ($r + 1) * $marg + $rad; |
||
| 243 | |||
| 244 | $simg->SetColor($color); |
||
| 245 | $simg->FilledCircle($x, $y, $rad); |
||
| 246 | } |
||
| 247 | } |
||
| 248 | |||
| 249 | $img = new Image($width, $height, DEFAULT_GFORMAT, false); |
||
| 250 | $img->Copy($simg->img, 0, 0, 0, 0, $width, $height, $swidth, $sheight); |
||
| 251 | $simg->Destroy(); |
||
| 252 | unset($simg); |
||
| 253 | |||
| 254 | return $img; |
||
| 255 | } |
||
| 256 | |||
| 257 | public function Stroke($aValStr, $aColor = 0, $aFileName = '') |
||
| 258 | { |
||
| 259 | $this->StrokeNumber($aValStr, $aColor, $aFileName); |
||
| 260 | } |
||
| 261 | |||
| 262 | public function StrokeNumber($aValStr, $aColor = 0, $aFileName = '') |
||
| 263 | { |
||
| 264 | if ($aColor < 0 || $aColor >= safe_count($this->iColorSchema)) { |
||
| 265 | $aColor = 0; |
||
| 266 | } |
||
| 267 | |||
| 268 | if (($n = mb_strlen($aValStr, 'utf8')) == 0) { |
||
| 269 | $aValStr = ' '; |
||
| 270 | $n = 1; |
||
| 271 | } |
||
| 272 | |||
| 273 | for ($i = 0; $i < $n; ++$i) { |
||
| 274 | $d = mb_substr($aValStr, $i, 1, 'utf8'); |
||
| 275 | if (ctype_digit($d)) { |
||
| 276 | $d = (int) $d; |
||
| 277 | } else { |
||
| 278 | $d = strtoupper($d); |
||
| 279 | } |
||
| 280 | $digit_img[$i] = $this->_GetLED($d, $aColor); |
||
| 281 | } |
||
| 282 | |||
| 283 | $w = imagesx($digit_img[0]->img); |
||
|
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
Loading history...
|
|||
| 284 | $h = imagesy($digit_img[0]->img); |
||
| 285 | |||
| 286 | $number_img = new Image\Image($w * $n, $h, DEFAULT_GFORMAT, false); |
||
| 287 | |||
| 288 | for ($i = 0; $i < $n; ++$i) { |
||
| 289 | $number_img->Copy($digit_img[$i]->img, $i * $w, 0, 0, 0, $w, $h, $w, $h); |
||
| 290 | } |
||
| 291 | |||
| 292 | if ($aFileName != '') { |
||
| 293 | $number_img->Stream($aFileName); |
||
| 294 | } else { |
||
| 295 | $number_img->Headers(); |
||
| 296 | $number_img->Stream(); |
||
| 297 | } |
||
| 298 | } |
||
| 299 | } |
||
| 300 |