source: spip-zone/_plugins_/image_responsive/image_responsive_fonctions.php @ 115278

Last change on this file since 115278 was 115278, checked in by arno@…, 7 weeks ago

Gros changement de qualité sur écrans Retina: on va directement chercher l’image deux fois plus grande mais avec le taux de compression JPG usuel. Possibilité de revenir à la version précédente (images Retina super-compressées) avec:
define("_IMAGE_RESPONSIVE_RETINA_HQ", false);

File size: 22.7 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7function image_responsive_insert_head_css($flux) {
8        $flux .= "\n<link rel='stylesheet' type='text/css' media='all' href='" . find_in_path("image_responsive.css") . "'>\n";
9        return $flux;
10}
11
12/**
13 * Indique si le fichier htaccess est actif
14 *
15 * Le fichier htaccess est considéré actif si un jeu d'URL de SPIP
16 * qui nécessite la présente du fichier htaccess est utilisé
17 * (arbo, libre, propre, etc). Dans ce cas le fichier
18 * htaccess fourni par SPIP doit être complété par les instructions
19 * présentes dans `ajouter_a_htaccess.txt` de ce plugin.
20 *
21 * Il est possible de forcer l'état (par exemple si on utilise
22 * un jeu d'URL spécifique (et que l'on a bien modifié le htaccess),
23 * en déclarant la constante `_IMAGE_RESPONSIVE_HTACCESS` à 1.
24 *
25 * @return int. 1 si le htaccess est utilisable. 0 sinon.
26 */
27function image_responsive_htaccess_actif() {
28        if (defined('_IMAGE_RESPONSIVE_HTACCESS')) {
29                return _IMAGE_RESPONSIVE_HTACCESS;
30        }
31        $type_urls = lire_meta("type_urls");
32        $htactif = 0;
33        if (preg_match(",^(arbo|libres|html|propres|propres2)$,", $type_urls)) {
34                $htactif = 1;
35        }
36        return $htactif;
37}
38
39function image_responsive_insert_head($flux) {
40        $htactif = image_responsive_htaccess_actif();
41        $flux .= "<script>htactif=$htactif;document.createElement('picture'); var image_responsive_retina_hq = 0;</script>";
42        if (_IMAGE_RESPONSIVE_RETINA_HQ) $flux .= "<script>image_responsive_retina_hq = 1;</script>";
43        $flux .= "
44<script type='text/javascript' src='" . find_in_path("javascript/rAF.js") . "'></script>
45<script type='text/javascript' src='" . find_in_path("javascript/jquery.smartresize.js") . "'></script>
46<script type='text/javascript' src='" . find_in_path("javascript/image_responsive.js") . "'></script>
47<script type='text/javascript' src='" . find_in_path("javascript/picturefill.js") . "'></script>
48                ";
49
50        return $flux;
51}
52
53function image_responsive_header_prive($flux) {
54        $flux .= "\n<link rel='stylesheet' type='text/css' media='all' href='" . find_in_path("image_responsive.css") . "'>\n";
55        $flux .= "<script>htactif=false;document.createElement('picture');</script>";
56        $flux .= "<script>htactif=$htactif;document.createElement('picture'); var image_responsive_retina_hq = 0;</script>";
57        if (_IMAGE_RESPONSIVE_RETINA_HQ) $flux .= "<script>image_responsive_retina_hq = 1;</script>";
58
59        $flux .= "
60<script type='text/javascript' src='" . find_in_path("javascript/rAF.js") . "'></script>
61<script type='text/javascript' src='" . find_in_path("javascript/jquery.smartresize.js") . "'></script>
62<script type='text/javascript' src='" . find_in_path("javascript/image_responsive.js") . "'></script>
63<script type='text/javascript' src='" . find_in_path("javascript/picturefill.js") . "'></script>
64                ";
65
66        return $flux;
67}
68
69
70function _image_responsive($img, $taille = -1, $lazy = 0, $vertical = 0, $medias = "", $proportions = "") {
71        $taille_defaut = -1;
72
73        if ($taille == -1) {
74                $taille_defaut = 120;
75                $taille = "";
76        }
77
78
79        if (preg_match(",^0$|^0\/,", $taille)) {
80                $taille_defaut = 0;
81                $taille = preg_replace(",^0$|^0\/,", "", $taille);
82        }
83
84
85        $tailles = explode("/", $taille);
86
87        if ($taille_defaut < 0) {
88                if (count($tailles) > 0) $taille_defaut = $tailles[0];
89                else $taille_defaut = $taille;
90        }
91
92//      $img = $img[0];
93        $htactif = (bool)image_responsive_htaccess_actif();
94        $source = extraire_attribut($img, "src");
95        $source = preg_replace(",\?[0-9]*$,", "", $source);
96        if (file_exists($source)) {
97                $l = largeur($source);
98                $h = hauteur($source);
99                $timestamp = filemtime($source);
100
101                $img = vider_attribut($img, "width");
102                $img = vider_attribut($img, "height");
103                $img = vider_attribut($img, "style");
104
105                $alt = extraire_attribut($img, "alt");
106                if (strlen($alt) == 0) $img = inserer_attribut($img, "alt", "");
107
108
109                // Récupérer les proportions et éventuellement recadrer
110                $proportions = explode("/", $proportions);
111                $p = array();
112                if (count($proportions) > 0) {
113                        $i = 0;
114                        foreach ($proportions as $prop) {
115                                $i++;
116                                $prop = trim($prop);
117                                $regs_l = false;
118                                $regs_h = false;
119                                if (preg_match(",^([0-9\.]+\%?)(x([0-9\.]+\%?))?(x([a-z]*))?(x([0-9\.]*))?$,", $prop, $regs)) {
120
121                                        if ($regs[1] == "0") $p[$i]["l"] = $l;
122                                        else $p[$i]["l"] = $regs[1];
123
124                                        if ($regs[3] == "0") $p[$i]["h"] = $h;
125                                        else $p[$i]["h"] = $regs[3];
126
127
128                                        $p[$i]["f"] = $regs[5];
129                                        $p[$i]["z"] = $regs[7];
130
131                                        // Gérer les dimensions en pourcentages
132                                        preg_match(",([0-9\.]+)\%$,", $regs[1], $regs_l);
133                                        preg_match(",([0-9\.]+)\%$,", $regs[3], $regs_h);
134
135                                        if ($regs_l[1] > 0 OR $regs_h[1] > 0) {
136                                                if ($regs_l[1] > 0) $p[$i]["l"] = $l * $regs_l[1] / 100;
137                                                else $p[$i]["l"] = $l;
138                                                if ($regs_h[1] > 0) $p[$i]["h"] = $h * $regs_h[1] / 100;
139                                                else $p[$i]["h"] = $h;
140                                        }
141
142
143                                        if (!$regs[5]) $p[$i]["f"] = "center";
144                                        if (!$regs[7]) $p[$i]["z"] = 1;
145                                }
146                        }
147                }
148                if (count($p) == 1) {
149                        $source = image_proportions($source, $p[1]["l"], $p[1]["h"], $p[1]["f"], $p[1]["z"]);
150                        $source = extraire_attribut($source, "src");
151                }
152
153                $medias = explode("/", $medias);
154                $pad_bot_styles = array();
155
156                if (count($p) > 1) {
157                        $i = 0;
158                        foreach ($tailles as $t) {
159                                $m = trim($medias[$i]);
160                                $i++;
161                                if (count($p[$i]) > 1) {
162                                        $pad_bot_styles[$m] = "padding-bottom:" . (($p[$i]["h"] / $p[$i]["l"]) * 100) . "%!important";
163                                }
164                        }
165                }
166
167                //$img = inserer_attribut($img, "src", $src);
168                $img = inserer_attribut($img, "data-src", $source);
169                $classe = "image_responsive";
170
171                if ($vertical == 1) {
172                        $classe .= " image_responsive_v";
173                        $v = "v";
174                        if ($h < $taille_defaut) $taille_defaut = $h;
175                } else {
176                        $v = "";
177                        if ($l < $taille_defaut) $taille_defaut = $l;
178                }
179
180                if ($taille_defaut == 0) {
181                        $src = find_in_path("rien.gif");
182                } else {
183                        if (_IMAGE_RESPONSIVE_CALCULER) {
184                                $src = retour_image_responsive($source, $taille_defaut, 1, 0, "file");
185                        } else {
186                                if ($htactif) {
187                                        $src = preg_replace(",\.(jpg|png|gif)$,", "-resp$taille_defaut$v.$1?$timestamp", $source);
188                                } else {
189                                        $src = "index.php?action=image_responsive&amp;img=$source&amp;taille=$taille_defaut$v&amp;$timestamp";
190                                }
191                        }
192                }
193
194                if ($lazy == 1) $classe .= " lazy";
195                $img = inserer_attribut($img, "data-l", $l);
196                $img = inserer_attribut($img, "data-h", $h);
197                $sources = '';
198                $autorisees = array();
199
200                // Gérer les tailles autorisées
201                if (count($tailles) > 0) {
202                        include_spip("inc/json");
203
204                        $img = inserer_attribut($img, "data-tailles", addslashes(json_encode($tailles)));
205
206
207                        $i = 0;
208
209                        foreach ($tailles as $t) {
210                                $m = trim($medias[$i]);
211                                $i++;
212                                $source_tmp = $source;
213
214                                if (count($p) > 1 && count($p[$i]) > 1) {
215                                        if ($p[$i]["l"] != $l || $p[$i]["h"] != $h) { // Pas de redimension si on est au format source (0x0)
216                                                $source_tmp = image_proportions($source_tmp, $p[$i]["l"], $p[$i]["h"], $p[$i]["f"], $p[$i]["z"]);
217                                                $source_tmp = extraire_attribut($source_tmp, "src");
218                                        }
219                                }
220                                if ($vertical && $t > $h) $t = $h;
221                                else if (!$vertical && $t > $l) $t = $l;
222                                if (_IMAGE_RESPONSIVE_RETINA_HQ) {
223                                        $t2  = $t*2;
224                                        if ($vertical && $t2 > $h) $t2 = $h;
225                                        else if (!$vertical && $t2 > $l) $t2 = $l;
226                               
227                                }
228
229                                if (_IMAGE_RESPONSIVE_CALCULER) {
230                                        $fichiers[$i][1] = retour_image_responsive($source_tmp, "$t$v", 1, 0, "file");
231                                        if (_IMAGE_RESPONSIVE_RETINA_HQ) $fichiers[$i][2] = retour_image_responsive($source_tmp, "$t2$v", 1, 0, "file");
232                                        else  $fichiers[$i][2] = retour_image_responsive($source_tmp, "$t$v", 2, 0, "file");
233                                } else {
234                                        if ($htactif) {
235                                                $fichiers[$i][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v.$1?$timestamp", $source_tmp);
236                                                if (_IMAGE_RESPONSIVE_RETINA_HQ) $fichiers[$i][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t2$v.$1?$timestamp", $source_tmp);
237                                                else $fichiers[$i][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v-2.$1?$timestamp", $source_tmp);
238                                        } else {
239                                                $fichiers[$i][1] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v&amp;$timestamp";
240                                                if (_IMAGE_RESPONSIVE_RETINA_HQ) $fichiers[$i][2] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t2$v&amp;$timestamp";
241                                                else $fichiers[$i][2] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v&amp;dpr=2&amp;$timestamp";
242                                        }
243                                }
244
245                        }
246
247                        // Fabriquer automatiquement un srcset s'il n'y a qu'une seule taille d'image (pour 1x et 2x)
248                        if (count($tailles) == 1 && $lazy != 1) { // Pas de srcset sur les images lazy
249                                $t = $tailles[0];
250                                if ($t != 0 ) {
251                                        $srcset[] = $fichiers[1][1] . " 1x";
252                                        $srcset[] = $fichiers[1][2] . " 2x";
253                                }
254                        }
255
256
257                        // Fabriquer des <source> s'il y a plus d'une taille associée à des sizes
258                        if (count($tailles) > 1) {
259                                if (count($tailles) == count($medias) && $lazy != 1) {
260                                        $i = 0;
261                                        foreach ($tailles as $t) {
262                                                $m = trim($medias[$i]);
263                                                $i++;
264
265                                                if ($vertical) $t = min($t, $h);
266                                                else $t = min($t, $l);
267
268
269                                                $source_tmp = $source;
270                                                $set = $fichiers[$i][1] . " 1x";
271                                                $set .= "," . $fichiers[$i][2] . " 2x";
272
273                                                if (strlen($m) > 0) {
274                                                        $insm = " media='$m'";
275                                                        $sources .= "<source$insm srcset='$set'>";
276                                                } else {
277
278                                                        //$sources .= "<source srcset='$set'>";
279                                                        //$set = find_in_path("rien.gif");
280                                                        $srcset[] = $set;
281                                                }
282
283
284                                        }
285                                } else {
286                                        // Tailles déterminées, pas de @media
287                                        // dans le cas où l'on force précalcule
288                                        $i = 0;
289                                        foreach ($tailles as $t) {
290                                                $i++;
291                                                if ($vertical && $t > $h) $t = $h;
292                                                else if (!$vertical && $t > $l) $t = $l;
293
294
295                                                $autorisees[$t][1] = $fichiers[$i][1];
296                                                $autorisees[$t][2] = $fichiers[$i][2];
297                                        }
298                                }
299                        }
300                }
301
302
303                // Gérer le srcset
304                if ($sources || $srcset) $classe .= " avec_picturefill";
305
306                if ($autorisees) {
307                        $autorisees = json_encode($autorisees);
308                        $img = inserer_attribut($img, "data-autorisees", $autorisees);
309                }
310
311
312                $img = inserer_attribut($img, "src", $src);
313                if ($lazy) $img = inserer_attribut($img, "data-src-lazy", $src);
314
315                $img = inserer_attribut($img, "class", $classe);
316                if ($srcset) {
317                        $srcset = join($srcset, ",");
318                        $img = inserer_attribut($img, "srcset", $srcset);
319                }
320
321                if ($sources) {
322                        $sources = "<!--[if IE 9]><video style='display: none;'><![endif]-->$sources<!--[if IE 9]></video><![endif]-->";
323                }
324
325
326                $styles = $nom_class = '';
327                if ($pad_bot_styles) {
328
329                        ksort($pad_bot_styles);
330
331                        foreach ($pad_bot_styles as $m => $pad) {
332                                $style = "##classe##{" . $pad . "}";
333                                if ($m) $style = "\n@media $m {" . $style . "}";
334                                $styles .= $style;
335                        }
336                        $styles = "<style>$styles</style>";
337                        $nom_class = "class" . md5($styles);
338                        $styles = str_replace("##classe##", "picture." . $nom_class, $styles);
339                        // pour affichage dans la classe de picture
340                        $nom_class = " " . $nom_class;
341                }
342
343                if ($vertical == 0) {
344                        if (count($p) == 1) $r = ($p[1]["h"] / $p[1]["l"]) * 100;
345                        else if (count($p) == 0) $r = (($h / $l) * 100);
346
347                        if ($r) $aff_r = "padding-bottom:$r%";
348                        $img = "<picture style='padding:0;$aff_r' class='conteneur_image_responsive_h$nom_class'>$sources$img</picture>";
349                } else {
350                        $r = (($h / $l) * 100);
351                        $img = "<picture class='conteneur_image_responsive_v$nom_class'>$sources$img</picture>";
352                }
353                $img = $img . $styles;
354        }
355
356        if (_SPIP_LIER_RESSOURCES && $fichiers) {
357                foreach ($fichiers as $f) {
358                        $img .= "\n<link href='" . $f[1] . "' rel='attachment' property='url'>"
359                                . "\n<link href='" . $f[2] . "' rel='attachment' property='url'>";
360                }
361        }
362
363
364        return $img;
365}
366
367
368function image_responsive($texte, $taille = -1, $lazy = 0, $vertical = 0, $medias = '', $proportions = '') {
369        if (!preg_match("/^<img /i", $texte)) {
370                if (strlen($texte) < 256 && file_exists($texte)) $texte = "<img src='$texte'>";
371                else return $texte;
372        }
373        if (defined('PHP_VERSION_ID') and PHP_VERSION_ID > 50300) {
374               
375                /* ATTENTION, cette version plante les scripts en PHP 5.2.6. Page blanche.
376                return preg_replace_callback(
377                        ",(<img\ [^>]*>),",
378                        function($matches) use ($taille, $lazy, $vertical, $medias, $proportions) {
379                                return _image_responsive($matches[0], $taille, $lazy, $vertical, $medias, $proportions);
380                        },
381                        $texte
382                );*/
383                return preg_replace_callback(
384                        ",(<img\ [^>]*>),",
385                        create_function('$matches',
386                                'return _image_responsive($matches[0],"' . $taille . '",' . $lazy . ',' . $vertical . ',"' . $medias . '","' . $proportions . '");'
387                        ),
388                        $texte
389                );
390
391        } else {
392                return preg_replace_callback(
393                        ",(<img\ [^>]*>),",
394                        create_function('$matches',
395                                'return _image_responsive($matches[0],"' . $taille . '",' . $lazy . ',' . $vertical . ',"' . $medias . '","' . $proportions . '");'
396                        ),
397                        $texte
398                );
399        }
400}
401
402
403function image_responsive_svg($img, $taille = -1, $lazy = 0, $vertical = 0) {
404        $taille_defaut = -1;
405
406        if ($taille == -1) {
407                $taille_defaut = 120;
408                $taille = "";
409        }
410        if (preg_match(",^0$|^0\/,", $taille)) {
411                $taille_defaut = 0;
412                $taille = preg_replace(",^0$|^0\/,", "", $taille);
413        }
414
415
416        $tailles = explode("/", $taille);
417
418        if ($taille_defaut < 0) {
419                if (count($tailles) > 0) $taille_defaut = $tailles[0];
420                else $taille_defaut = $taille;
421        }
422
423        $htactif = (bool)image_responsive_htaccess_actif();
424
425        if (preg_match("/^<img /i", $img)) {
426                $img = extraire_attribut($img, "src");
427        }
428        $img = preg_replace(",\?[0-9]*$,", "", $img);
429
430        $source = $img;
431
432        $classe = "image_responsive_svg";
433
434
435        if (file_exists($source)) {
436                $l = largeur($source);
437                $h = hauteur($source);
438                if ($vertical == 1) {
439                        $classe .= " image_responsive_svg_v";
440                        $v = "v";
441                        if ($h < $taille_defaut) $taille_defaut = $h;
442                } else {
443                        $v = "";
444                        if ($l < $taille_defaut) $taille_defaut = $l;
445                }
446                if ($taille_defaut == 0) {
447                        $src = find_in_path("rien.gif");
448                } else {
449                        if (_IMAGE_RESPONSIVE_CALCULER) {
450                                $src = retour_image_responsive($source, $taille_defaut, 1, 0, "file");
451                        } else {
452                                if ($htactif) {
453                                        $src = preg_replace(",\.(jpg|png|gif)$,", "-resp$taille_defaut$v.$1", $source);
454                                } else {
455                                        $src = "index.php?action=image_responsive&amp;img=$source&amp;taille=$taille_defaut$v";
456                                }
457                        }
458                }
459
460                if ($lazy == 1) $classe .= " lazy";
461
462                if (count($tailles) > 0) {
463                        sort($tailles);
464                        include_spip("inc/json");
465
466                        $data_tailles = " data-tailles='" . addslashes(json_encode($tailles)) . "'";
467
468
469                        $i = 0;
470
471                        foreach ($tailles as $t) {
472                                $m = trim($medias[$i]);
473                                $i++;
474                                $source_tmp = $source;
475
476                                if (count($p) > 1 && count($p[$i]) > 1) {
477                                        $source_tmp = image_proportions($source_tmp, $p[$i]["l"], $p[$i]["h"], $p[$i]["f"], $p[$i]["z"]);
478                                        $source_tmp = extraire_attribut($source_tmp, "src");
479                                }
480
481                                if ($vertical && $t > $h) $t = $h;
482                                else if (!$vertical && $t > $l) $t = $l;
483
484
485                                if (_IMAGE_RESPONSIVE_CALCULER) {
486                                        $fichiers[$t][1] = retour_image_responsive($source_tmp, "$t$v", 1, 0, "file");
487                                        $fichiers[$t][2] = retour_image_responsive($source_tmp, "$t$v", 2, 0, "file");
488                                } else {
489                                        if ($htactif) {
490                                                $fichiers[$t][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v.$1", $source_tmp);
491                                                $fichiers[$t][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v-2.$1", $source_tmp);
492                                        } else {
493                                                $fichiers[$t][1] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v";
494                                                $fichiers[$t][2] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v&amp;dpr=2";
495                                        }
496                                }
497
498                        }
499                        foreach ($tailles as $t) {
500                                if ($vertical && $t > $h) $t = $h;
501                                else if (!$vertical && $t > $l) $t = $l;
502
503
504                                $autorisees[$t][1] = $fichiers[$t][1];
505                                $autorisees[$t][2] = $fichiers[$t][2];
506                        }
507
508                        if ($autorisees) {
509                                $data_autorisees = " data-autorisees='" . json_encode($autorisees) . "'";
510                        }
511
512                }
513
514                $ret = "<image class='$classe' width='100%' height='100%' preserveAspectRatio='xMinYMin meet' xlink:href='$src' data-src='$source' data-l='$l' data-h='$h'$data_tailles$data_autorisees></image>";
515
516        }
517
518
519        return $ret;
520}
521
522
523function background_responsive($src, $taille = 120, $lazy = 0, $align = "") {
524
525        if (preg_match("/^<img /i", $src)) {
526                $src = extraire_attribut($src, "src");
527        }
528
529
530        $tailles = explode("/", $taille);
531        if (count($tailles) > 1) $taille_defaut = $tailles[0];
532        else $taille_defaut = $taille;
533
534//      $img = $img[0];
535        $htactif = (bool)image_responsive_htaccess_actif();
536        $src = preg_replace(",\?[0-9]*$,", "", $src);
537
538        if (file_exists($src)) {
539                include_spip("filtres/images_transforme");
540
541                $l = largeur($src);
542                $h = hauteur($src);
543
544                $mtime = filemtime($src);
545                $ins .= " data-mtime='$mtime'";
546
547
548                $img = $src;
549
550                if ($l > $h) {
551                        $ins .= " data-italien-src='$src'";
552                        $ins .= " data-italien-l='$l'";
553                        $ins .= " data-italien-h='$h'";
554
555                        $srcp = image_proportions($srcp, 3, 4, $align);
556                        $srcp = image_reduire($src, 0, 2400);
557                        $srcp = extraire_attribut($srcp, "src");
558                        $lp = largeur($srcp);
559                        $hp = hauteur($srcp);
560
561                        $ins .= " data-portrait-src='$srcp'";
562                        $ins .= " data-portrait-l='$lp'";
563                        $ins .= " data-portrait-h='$hp'";
564
565                        $l_italien = $l;
566                        $s_italien = $src;
567                        $l_portrait = $lp;
568                        $s_portrait = $srcp;
569
570                } else {
571                        $ins .= " data-portrait-src='$src'";
572                        $ins .= " data-portrait-l='$l'";
573                        $ins .= " data-portrait-h='$h'";
574
575
576                        $srcp = image_proportions($srcp, 4, 3, $align);
577                        $srcp = image_reduire($src, 2400, 0);
578                        $srcp = extraire_attribut($srcp, "src");
579                        $lp = largeur($srcp);
580                        $hp = hauteur($srcp);
581
582                        $ins .= " data-italien-src='$srcp'";
583                        $ins .= " data-italien-l='$lp'";
584                        $ins .= " data-italien-h='$hp'";
585
586                        $l_italien = $lp;
587                        $s_italien = $srcp;
588                        $l_portrait = $l;
589                        $s_portrait = $src;
590
591                }
592
593                $ins .= " data-responsive='background'";
594
595
596                if ($l < $taille_defaut) $taille_defaut = $l;
597                $v = "";
598
599
600                if ($htactif) {
601                        $src = preg_replace(",\.(jpg|png|gif)$,", "-resp$taille_defaut$v.$1", $src);
602                } else {
603                        $src = "index.php?action=image_responsive&amp;img=$src&amp;taille=$taille_defaut$v";
604                }
605
606
607                if ($taille_defaut == 0) $src = find_in_path("rien.gif");
608                if ($lazy == 1) $ins .= " data-lazy='lazy'";
609
610                if ($class) $ins .= " class='$class'";
611
612                if (count($tailles) > 1) {
613                        sort($tailles);
614                        include_spip("inc/json");
615
616
617                        foreach ($tailles as $t) {
618
619                                $t_italien = min($t, $l_italien);
620                                if (_IMAGE_RESPONSIVE_CALCULER) {
621                                        $fichiers[$t_italien]["i"][1] = retour_image_responsive($s_italien, "$t_italien", 1, 0, "file");
622                                        $fichiers[$t_italien]["i"][2] = retour_image_responsive($s_italien, "$t_italien", 2, 0, "file");
623                                } else {
624                                        if ($htactif) {
625                                                $fichiers[$t_italien]["i"][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_italien.$1", $s_italien) . "?$mtime";
626                                                $fichiers[$t_italien]["i"][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_italien-2.$1", $s_italien) . "?$mtime";
627                                        } else {
628                                                $fichiers[$t_italien]["i"][1] = "index.php?action=image_responsive&amp;img=$s_italien&amp;taille=$t_italien&mtime=$mtime";
629                                                $fichiers[$t_italien]["i"][2] = "index.php?action=image_responsive&amp;img=$s_italien&amp;taille=$t_italien&amp;dpr=2&mtime=$mtime";
630                                        }
631                                }
632
633                                $t_portrait = min($t, $l_portrait);
634                                if (_IMAGE_RESPONSIVE_CALCULER) {
635                                        $fichiers[$t_portrait]["p"][1] = retour_image_responsive($s_portrait, "$t_portrait", 1, 0, "file");
636                                        $fichiers[$t_portrait]["p"][2] = retour_image_responsive($s_portrait, "$t_portrait", 2, 0, "file");
637                                } else {
638                                        if ($htactif) {
639                                                $fichiers[$t_portrait]["p"][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_portrait.$1", $s_portrait) . "?$mtime";
640                                                $fichiers[$t_portrait]["p"][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_portrait-2.$1", $s_portrait) . "?$mtime";
641                                        } else {
642                                                $fichiers[$t_portrait]["p"][1] = "index.php?action=image_responsive&amp;img=$s_portrait&amp;taille=$t_portrait&mtime=$mtime";
643                                                $fichiers[$t_portrait]["p"][2] = "index.php?action=image_responsive&amp;img=$s_portrait&amp;taille=$t_portrait&amp;dpr=2&mtime=$mtime";
644                                        }
645                                }
646
647                        }
648
649                        $ins .= " data-tailles='" . addslashes(json_encode($tailles)) . "'";
650                        $ins .= " data-autorisees='" . addslashes(json_encode($fichiers)) . "'";
651
652                        if (_SPIP_LIER_RESSOURCES && $fichiers) {
653                                foreach ($fichiers as $f) {
654                                        $links .= "background-image:url(" . $f["i"][1] . ");"
655                                                . "background-image:url(" . $f["i"][2] . ");"
656                                                . "background-image:url(" . $f["p"][1] . ");"
657                                                . "background-image:url(" . $f["p"][2] . ");";
658                                }
659                        }
660
661                        if ($align) {
662                                if ($align == "focus") {
663                                        $style_align = "background-position: " . (centre_image_x($img) * 100) . "% " . (centre_image_y($img) * 100) . "%;";
664                                } else {
665                                        $style_align = "background-position: $align;";
666                                }
667                        }
668
669                }
670
671                $ins .= " style='" . $style_align . $links . "background-image:url($src)'";
672
673                return $ins;
674        }
675
676
677}
678
679
680function image_proportions($img, $largeur = 16, $hauteur = 9, $align = "center", $zoom = 1) {
681        $mode = $align;
682
683        if (!$img) return;
684
685
686        $l_img = largeur($img);
687        $h_img = hauteur($img);
688
689        if ($largeur == 0 OR $hauteur == 0) {
690                $largeur = $l_img;
691                $hauteur = $h_img;
692        }
693
694
695        if ($l_img == 0 OR $h_img == 0) return $img;
696
697        $r_img = $h_img / $l_img;
698        $r = $hauteur / $largeur;
699
700        if ($r_img < $r) {
701                $l_dest = $h_img / $r;
702                $h_dest = $h_img;
703        } else if ($r_img > $r) {
704                $l_dest = $l_img;
705                $h_dest = $l_img * $r;
706        }
707
708
709        // Si align est "focus" ou "focus-center", on va aller chercher le «point d'intérêt» de l'image
710        // avec la fonction centre_image du plugin «centre_image»
711
712        // Avec "focus", point d'intérêt reste décentré
713        // Avec "focus-center", point d'intérêt aussi centré que possible
714        if (($align == "focus" || $align == "focus-center") && function_exists('centre_image')) {
715                $dx = centre_image_x($img);
716                $dy = centre_image_y($img);
717
718                if ($r_img > $r) {
719                        $h_dest = round(($l_img * $r) / $zoom);
720                        $l_dest = round($l_img / $zoom);
721                } else {
722                        $h_dest = round($h_img / $zoom);
723                        $l_dest = round(($h_img / $r) / $zoom);
724                }
725                $h_centre = $h_img * $dy;
726                $l_centre = $l_img * $dx;
727                if ($align == "focus-center") $top = round($h_centre - ($h_dest * 0.5));
728                // ici on n'applique pas *$dy directement, car effet exagéré,
729                // alors on pondère
730                else  $top = round($h_centre - ($h_dest * ((2 * $dy + 0.5) / 3)));
731
732                $l_centre = $l_img * $dx;
733                if ($align == "focus-center") $left = round($l_centre - ($l_dest * 0.5));
734                else  $left = round($l_centre - ($l_dest * ((2 * $dx + 0.5) / 3)));
735
736
737                if ($top < 0) $top = 0;
738                if ($top + $h_dest > $h_img) $top = $h_img - $h_dest;
739                if ($left < 0) $left = 0;
740                if ($left + $l_dest > $l_img) $left = $l_img - $l_dest;
741
742                //echo "<li>$dx x $dy - $l_img x $h_img - $l_dest x $h_dest - $l_centre x $h_centre - $left x $top</li>";
743                $align = "top=$top, left=$left";
744        }
745
746        include_spip("filtres/images_transforme");
747        $img = image_recadre($img, $l_dest, $h_dest, $align);
748
749        // Second passage si $zoom (on verra plus tard si c'est intéressant de le traiter en amont)
750        if ($zoom > 1 && $mode != "focus" && $mode != "focus-center") {
751                $l_img = largeur($img) / 2;
752                $h_img = hauteur($img) / 2;
753
754                $img = image_recadre($img, $l_img, $h_img);
755
756        }
757
758        return $img;
759}
760
761
762function image_responsive_affiche_milieu($flux, $effacer = false) {
763
764        $exec = $flux["args"]["exec"];
765
766
767        if ($exec == "admin_vider") {
768                $retour = recuperer_fond("squelettes/admin_vider_responsive");
769
770                $flux["data"] .= $retour;
771        }
772
773        return $flux;
774}
775
776
Note: See TracBrowser for help on using the repository browser.