source: spip-zone/_plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Rectangle.class.php @ 115933

Last change on this file since 115933 was 115933, checked in by cedric@…, 6 weeks ago

Passage en production des methodes alternatives de generation de vignette apercu (gradients, potrace, geometrize) activable dans la page de config du plugin
+ mise a jour de la lib geometrize, en partie refactoree et optimisee
+ un mode debug activable par la config pour voir les apercus au survol des images (permet de tester sur un echantillon d'image et de choisir la methode la plus adaptee au site)

File size: 3.8 KB
Line 
1<?php
2
3// Generated by Haxe 3.4.7
4class geometrize_shape_Rectangle implements geometrize_shape_Shape {
5
6        /**
7         * @var int
8         */
9        protected $x1;
10
11        /**
12         * @var int
13         */
14        protected $y1;
15
16        /**
17         * @var int
18         */
19        protected $x2;
20
21        /**
22         * @var int
23         */
24        protected $y2;
25
26        /**
27         * @var int
28         */
29        protected $xBound;
30
31        /**
32         * @var int
33         */
34        protected $yBound;
35
36        /**
37         * @var int
38         */
39        public $color;
40
41        /**
42         * Rasterized lines
43         * @var null|array
44         */
45        protected $lines = null;
46
47        public function __construct($xBound, $yBound){
48                $this->x1 = mt_rand(0, $xBound-1);
49                $this->y1 = mt_rand(0, $yBound-1);
50
51                $this->x2 = $this->x1 + mt_rand(1, 32);
52                $this->x2 = min($this->x2, $xBound-1);
53
54                $this->y2 = $this->y1 + mt_rand(1, 32);
55                $this->y2 = min($this->y2, $yBound-1);
56
57                $this->xBound = $xBound;
58                $this->yBound = $yBound;
59        }
60
61        /**
62         * Rasterize the shape
63         * @return array
64         * @throws HException
65         */
66        public function rasterize(){
67                if (!$this->lines) {
68                        list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
69
70                        $this->lines = [];
71                        if ($xm2>$xm1){
72                                for ($y = $ym1; $y<=$ym2; $y++){
73                                        $this->lines[] = new geometrize_rasterizer_Scanline($y, $xm1, $xm2);
74                                }
75                        }
76                }
77
78                return $this->lines;
79        }
80
81        /**
82         * Mutate the shape
83         * @throws HException
84         */
85        public function mutate(){
86                $r = mt_rand(0, 1);
87                switch ($r) {
88                        case 0:
89                                $this->x1 += mt_rand(-16, +16);
90                                $this->x1 = max(min($this->x1, $this->xBound-1),0);
91                                $this->y1 += mt_rand(-16, +16);
92                                $this->y1 = max(min($this->y1, $this->yBound-1),0);
93                                break;
94                        case 1:
95                                $this->x2 += mt_rand(-16, +16);
96                                $this->x2 = max(min($this->x2, $this->xBound-1),0);
97                                $this->y2 += mt_rand(-16, +16);
98                                $this->y2 = max(min($this->y2, $this->yBound-1),0);
99                                break;
100                }
101
102                // force to rasterize the new shape
103                $this->lines = null;
104        }
105
106        public function rescale($xBound, $yBound){
107                $xScale = ($xBound-1) / ($this->xBound-1);
108                $yScale = ($yBound-1) / ($this->yBound-1);
109                $this->xBound = $xBound;
110                $this->yBound = $yBound;
111                $this->x1 = intval(round($this->x1*$xScale));
112                $this->y1 = intval(round($this->y1*$yScale));
113                $this->x2 = intval(round($this->x2*$xScale));
114                $this->y2 = intval(round($this->y2*$yScale));
115
116                if ($this->lines) {
117                        foreach ($this->lines as &$line) {
118                                $line->rescale($xScale, $yScale);
119                        }
120                }
121        }
122
123        public function hclone(){
124                return clone $this;
125        }
126
127        public function __clone() {
128                if ($this->lines) {
129                        foreach ($this->lines as $k=>&$line) {
130                                $this->lines[$k] = clone $line;
131                        }
132                }
133  }
134
135        public function getType(){
136                return geometrize_shape_ShapeTypes::T_RECTANGLE;
137        }
138
139        /**
140         * @return array
141         */
142        public function getRawShapeData(){
143                if ($this->x1<$this->x2){
144                        $xfirst = $this->x1;
145                        $xsecond = $this->x2;
146                } else {
147                        $xfirst = $this->x2;
148                        $xsecond = $this->x1;
149                }
150                if ($this->y1<$this->y2){
151                        $yfirst = $this->y1;
152                        $ysecond = $this->y2;
153                } else {
154                        $yfirst = $this->y2;
155                        $ysecond = $this->y1;
156                }
157
158                return [
159                        $xfirst,
160                        $yfirst,
161                        $xsecond,
162                        $ysecond,
163                ];
164        }
165
166        /**
167         * @return string
168         */
169        public function getSvgShapeData(){
170                // exportPolygon is able to generape a <path...> more compact than the basic <rect>
171                list($xm1, $ym1, $xm2, $ym2) = $this->getRawShapeData();
172                $points = [
173                        ["x" => $xm1, "y" => $ym1],
174                        ["x" => $xm1, "y" => $ym2],
175                        ["x" => $xm2, "y" => $ym2],
176                        ["x" => $xm2, "y" => $ym1]
177                ];
178                return geometrize_exporter_SvgExporter::exportPolygon($points);
179        }
180
181        public function __call($m, $a){
182                if (isset($this->$m) && is_callable($this->$m)){
183                        return call_user_func_array($this->$m, $a);
184                } else {
185                        if (isset($this->__dynamics[$m]) && is_callable($this->__dynamics[$m])){
186                                return call_user_func_array($this->__dynamics[$m], $a);
187                        } else {
188                                if ('toString'==$m){
189                                        return $this->__toString();
190                                } else {
191                                        throw new HException('Unable to call <' . $m . '>');
192                                }
193                        }
194                }
195        }
196
197        function __toString(){
198                return 'geometrize.shape.Rectangle';
199        }
200}
Note: See TracBrowser for help on using the repository browser.