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