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); |
|
|
|
|
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
|
|
|
|