source: spip-zone/_plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/Ellipse.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.6 KB
Line 
1<?php
2
3// Generated by Haxe 3.4.7
4class geometrize_shape_Ellipse implements geometrize_shape_Shape {
5
6        /**
7         * @var int
8         */
9        protected $x;
10
11        /**
12         * @var int
13         */
14        protected $y;
15
16        /**
17         * @var int
18         */
19        protected $rx;
20
21        /**
22         * @var int
23         */
24        protected $ry;
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->x = mt_rand(0, $xBound-1);
49                $this->y = mt_rand(0, $yBound-1);
50                $this->rx = mt_rand(1, 32);
51                $this->ry = mt_rand(1, 32);
52                $this->xBound = $xBound;
53                $this->yBound = $yBound;
54        }
55
56        /**
57         * Rasterize the shape
58         * @return array
59         * @throws HException
60         */
61        public function rasterize(){
62                if (!$this->lines){
63                        $this->lines = [];
64
65                        $aspect = $this->rx/$this->ry;
66                        $w = $this->xBound;
67                        $h = $this->yBound;
68
69                        for ($dy = 0; $dy<$this->ry; $dy++) {
70                                $y1 = $this->y-$dy;
71                                $y2 = $this->y+$dy;
72
73                                $s = null;
74                                if ($y1>=0 or $y2<$h){
75                                        $s = intval(sqrt($this->ry*$this->ry-$dy*$dy)*$aspect);
76                                        $x1 = max($this->x-$s, 0);
77                                        $x2 = min($this->x+$s, $w-1);
78                                }
79
80                                if ($y1>=0){
81                                        $this->lines[] = new geometrize_rasterizer_Scanline($y1, $x1, $x2);
82                                }
83                                if ($y2<$h){
84                                        $this->lines[] = new geometrize_rasterizer_Scanline($y2, $x1, $x2);
85                                }
86                        }
87                }
88                return $this->lines;
89        }
90
91        /**
92         * Mutate the shape
93         * @throws HException
94         */
95        public function mutate(){
96                $r = mt_rand(0, 2);
97                switch ($r) {
98                        case 0:
99                                $this->x += mt_rand(-16, +16);
100                                $this->x = max(min($this->x, $this->xBound-1),0);
101                                $this->y += mt_rand(-16, +16);
102                                $this->y = max(min($this->y, $this->yBound-1),0);
103                                break;
104
105                        case 1:
106                                $this->rx += mt_rand(-16, +16);
107                                $this->rx = max(min($this->rx, $this->xBound-1),1);
108                                break;
109                        case 2:
110                                $this->ry += mt_rand(-16, +16);
111                                $this->ry = max(min($this->ry, $this->yBound-1),1);
112                                break;
113                }
114
115                // force to rasterize the new shape
116                $this->lines = null;
117
118        }
119
120        /**
121         * @param int $xBound
122         * @param int $yBound
123         */
124        public function rescale($xBound, $yBound){
125                $xScale = ($xBound-1) / ($this->xBound-1);
126                $yScale = ($yBound-1) / ($this->yBound-1);
127                $this->xBound = $xBound;
128                $this->yBound = $yBound;
129                $this->x = intval(round($this->x*$xScale));
130                $this->y = intval(round($this->y*$yScale));
131                $this->rx = intval(round($this->rx*$xScale));
132                $this->ry = intval(round($this->ry*$yScale));
133
134                if ($this->lines) {
135                        foreach ($this->lines as &$line) {
136                                $line->rescale($xScale, $yScale);
137                        }
138                }
139        }
140
141        public function hclone(){
142                return clone $this;
143        }
144
145        public function __clone() {
146                if ($this->lines) {
147                        foreach ($this->lines as $k=>&$line) {
148                                $this->lines[$k] = clone $line;
149                        }
150                }
151  }
152
153        public function getType(){
154                return geometrize_shape_ShapeTypes::T_ELLIPSE;
155        }
156
157        /**
158         * @return array
159         */
160        public function getRawShapeData(){
161                return [
162                        $this->x,
163                        $this->y,
164                        $this->rx,
165                        $this->ry
166                ];
167        }
168
169        public function getSvgShapeData(){
170                return "<ellipse cx=\"" . $this->x . "\" cy=\"" . $this->y . "\" rx=\"" . $this->rx . "\" ry=\"" . $this->ry . "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
171        }
172
173        public function __call($m, $a){
174                if (isset($this->$m) && is_callable($this->$m)){
175                        return call_user_func_array($this->$m, $a);
176                } else {
177                        if (isset($this->__dynamics[$m]) && is_callable($this->__dynamics[$m])){
178                                return call_user_func_array($this->__dynamics[$m], $a);
179                        } else {
180                                if ('toString'==$m){
181                                        return $this->__toString();
182                                } else {
183                                        throw new HException('Unable to call <' . $m . '>');
184                                }
185                        }
186                }
187        }
188
189        function __toString(){
190                return 'geometrize.shape.Ellipse';
191        }
192}
Note: See TracBrowser for help on using the repository browser.