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

Last change on this file since 111504 was 111504, checked in by marcimat@…, 2 years ago

Compatibilité PHP 7.2 : utiliser des fonctions anonymes dès PHP 5.3 de préférence. (Pas certain qu’il reste des sites en dessous de cette version cela dit, mais le plugin est compatible SPIP 3.0)

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