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