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

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

Changer la façon de calculer les tailles autorisées.

File size: 21.1 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        return preg_replace_callback(",(<img\ [^>]*>),", create_function('$matches', 'return _image_responsive($matches[0],"' . $taille . '",' . $lazy . ',' . $vertical . ',"' . $medias . '","' . $proportions . '");'), $texte);
363}
364
365
366function image_responsive_svg($img, $taille = -1, $lazy = 0, $vertical = 0) {
367        $taille_defaut = -1;
368
369        if ($taille == -1) {
370                $taille_defaut = 120;
371                $taille = "";
372        }
373        if (preg_match(",^0$|^0\/,", $taille)) {
374                $taille_defaut = 0;
375                $taille = preg_replace(",^0$|^0\/,", "", $taille);
376        }
377
378
379        $tailles = explode("/", $taille);
380
381        if ($taille_defaut < 0) {
382                if (count($tailles) > 0) $taille_defaut = $tailles[0];
383                else $taille_defaut = $taille;
384        }
385
386        $htactif = (bool)image_responsive_htaccess_actif();
387
388        if (preg_match("/^<img /i", $img)) {
389                $img = extraire_attribut($img, "src");
390        }
391        $img = preg_replace(",\?[0-9]*$,", "", $img);
392
393        $source = $img;
394
395        $classe = "image_responsive_svg";
396
397
398        if (file_exists($source)) {
399                $l = largeur($source);
400                $h = hauteur($source);
401                if ($vertical == 1) {
402                        $classe .= " image_responsive_svg_v";
403                        $v = "v";
404                        if ($h < $taille_defaut) $taille_defaut = $h;
405                } else {
406                        $v = "";
407                        if ($l < $taille_defaut) $taille_defaut = $l;
408                }
409                if ($taille_defaut == 0) {
410                        $src = find_in_path("rien.gif");
411                } else {
412                        if (_IMAGE_RESPONSIVE_CALCULER) {
413                                $src = retour_image_responsive($source, $taille_defaut, 1, 0, "file");
414                        } else {
415                                if ($htactif) {
416                                        $src = preg_replace(",\.(jpg|png|gif)$,", "-resp$taille_defaut$v.$1", $source);
417                                } else {
418                                        $src = "index.php?action=image_responsive&amp;img=$source&amp;taille=$taille_defaut$v";
419                                }
420                        }
421                }
422
423                if ($lazy == 1) $classe .= " lazy";
424
425                if (count($tailles) > 0) {
426                        sort($tailles);
427                        include_spip("inc/json");
428
429                        $data_tailles = " data-tailles='" . addslashes(json_encode($tailles)) . "'";
430
431
432                        $i = 0;
433
434                        foreach ($tailles as $t) {
435                                $m = trim($medias[$i]);
436                                $i++;
437                                $source_tmp = $source;
438
439                                if (count($p) > 1 && count($p[$i]) > 1) {
440                                        $source_tmp = image_proportions($source_tmp, $p[$i]["l"], $p[$i]["h"], $p[$i]["f"], $p[$i]["z"]);
441                                        $source_tmp = extraire_attribut($source_tmp, "src");
442                                }
443
444                                if ($vertical && $t > $h) $t = $h;
445                                else if (!$vertical && $t > $l) $t = $l;
446
447
448                                if (_IMAGE_RESPONSIVE_CALCULER) {
449                                        $fichiers[$t][1] = retour_image_responsive($source_tmp, "$t$v", 1, 0, "file");
450                                        $fichiers[$t][2] = retour_image_responsive($source_tmp, "$t$v", 2, 0, "file");
451                                } else {
452                                        if ($htactif) {
453                                                $fichiers[$t][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v.$1", $source_tmp);
454                                                $fichiers[$t][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t$v-2.$1", $source_tmp);
455                                        } else {
456                                                $fichiers[$t][1] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v";
457                                                $fichiers[$t][2] = "index.php?action=image_responsive&amp;img=$source_tmp&amp;taille=$t$v&amp;dpr=2";
458                                        }
459                                }
460
461                        }
462                        foreach ($tailles as $t) {
463                                if ($vertical && $t > $h) $t = $h;
464                                else if (!$vertical && $t > $l) $t = $l;
465
466
467                                $autorisees[$t][1] = $fichiers[$t][1];
468                                $autorisees[$t][2] = $fichiers[$t][2];
469                        }
470
471                        if ($autorisees) {
472                                $data_autorisees = " data-autorisees='" . json_encode($autorisees) . "'";
473                        }
474
475                }
476
477                $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>";
478
479        }
480
481
482        return $ret;
483}
484
485
486function background_responsive($src, $taille = 120, $lazy = 0, $align = "") {
487
488        if (preg_match("/^<img /i", $src)) {
489                $src = extraire_attribut($src, "src");
490        }
491
492
493        $tailles = explode("/", $taille);
494        if (count($tailles) > 1) $taille_defaut = $tailles[0];
495        else $taille_defaut = $taille;
496
497//      $img = $img[0];
498        $htactif = (bool)image_responsive_htaccess_actif();
499        $src = preg_replace(",\?[0-9]*$,", "", $src);
500
501        if (file_exists($src)) {
502                include_spip("filtres/images_transforme");
503
504                $l = largeur($src);
505                $h = hauteur($src);
506
507                $mtime = filemtime($src);
508                $ins .= " data-mtime='$mtime'";
509
510
511                $img = $src;
512
513                if ($l > $h) {
514                        $ins .= " data-italien-src='$src'";
515                        $ins .= " data-italien-l='$l'";
516                        $ins .= " data-italien-h='$h'";
517
518                        $srcp = image_proportions($srcp, 3, 4, $align);
519                        $srcp = image_reduire($src, 0, 2400);
520                        $srcp = extraire_attribut($srcp, "src");
521                        $lp = largeur($srcp);
522                        $hp = hauteur($srcp);
523
524                        $ins .= " data-portrait-src='$srcp'";
525                        $ins .= " data-portrait-l='$lp'";
526                        $ins .= " data-portrait-h='$hp'";
527
528                        $l_italien = $l;
529                        $s_italien = $src;
530                        $l_portrait = $lp;
531                        $s_portrait = $srcp;
532
533                } else {
534                        $ins .= " data-portrait-src='$src'";
535                        $ins .= " data-portrait-l='$l'";
536                        $ins .= " data-portrait-h='$h'";
537
538
539                        $srcp = image_proportions($srcp, 4, 3, $align);
540                        $srcp = image_reduire($src, 2400, 0);
541                        $srcp = extraire_attribut($srcp, "src");
542                        $lp = largeur($srcp);
543                        $hp = hauteur($srcp);
544
545                        $ins .= " data-italien-src='$srcp'";
546                        $ins .= " data-italien-l='$lp'";
547                        $ins .= " data-italien-h='$hp'";
548
549                        $l_italien = $lp;
550                        $s_italien = $srcp;
551                        $l_portrait = $l;
552                        $s_portrait = $src;
553
554                }
555
556                $ins .= " data-responsive='background'";
557
558
559                if ($l < $taille_defaut) $taille_defaut = $l;
560                $v = "";
561
562
563                if ($htactif) {
564                        $src = preg_replace(",\.(jpg|png|gif)$,", "-resp$taille_defaut$v.$1", $src);
565                } else {
566                        $src = "index.php?action=image_responsive&amp;img=$src&amp;taille=$taille_defaut$v";
567                }
568
569
570                if ($taille_defaut == 0) $src = find_in_path("rien.gif");
571                if ($lazy == 1) $ins .= " data-lazy='lazy'";
572
573                if ($class) $ins .= " class='$class'";
574
575                if (count($tailles) > 1) {
576                        sort($tailles);
577                        include_spip("inc/json");
578
579
580                        foreach ($tailles as $t) {
581
582                                $t_italien = min($t, $l_italien);
583                                if (_IMAGE_RESPONSIVE_CALCULER) {
584                                        $fichiers[$t_italien]["i"][1] = retour_image_responsive($s_italien, "$t_italien", 1, 0, "file");
585                                        $fichiers[$t_italien]["i"][2] = retour_image_responsive($s_italien, "$t_italien", 2, 0, "file");
586                                } else {
587                                        if ($htactif) {
588                                                $fichiers[$t_italien]["i"][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_italien.$1", $s_italien) . "?$mtime";
589                                                $fichiers[$t_italien]["i"][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_italien-2.$1", $s_italien) . "?$mtime";
590                                        } else {
591                                                $fichiers[$t_italien]["i"][1] = "index.php?action=image_responsive&amp;img=$s_italien&amp;taille=$t_italien&mtime=$mtime";
592                                                $fichiers[$t_italien]["i"][2] = "index.php?action=image_responsive&amp;img=$s_italien&amp;taille=$t_italien&amp;dpr=2&mtime=$mtime";
593                                        }
594                                }
595
596                                $t_portrait = min($t, $l_portrait);
597                                if (_IMAGE_RESPONSIVE_CALCULER) {
598                                        $fichiers[$t_portrait]["p"][1] = retour_image_responsive($s_portrait, "$t_portrait", 1, 0, "file");
599                                        $fichiers[$t_portrait]["p"][2] = retour_image_responsive($s_portrait, "$t_portrait", 2, 0, "file");
600                                } else {
601                                        if ($htactif) {
602                                                $fichiers[$t_portrait]["p"][1] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_portrait.$1", $s_portrait) . "?$mtime";
603                                                $fichiers[$t_portrait]["p"][2] = preg_replace(",\.(jpg|png|gif)$,", "-resp$t_portrait-2.$1", $s_portrait) . "?$mtime";
604                                        } else {
605                                                $fichiers[$t_portrait]["p"][1] = "index.php?action=image_responsive&amp;img=$s_portrait&amp;taille=$t_portrait&mtime=$mtime";
606                                                $fichiers[$t_portrait]["p"][2] = "index.php?action=image_responsive&amp;img=$s_portrait&amp;taille=$t_portrait&amp;dpr=2&mtime=$mtime";
607                                        }
608                                }
609
610                        }
611
612                        $ins .= " data-tailles='" . addslashes(json_encode($tailles)) . "'";
613                        $ins .= " data-autorisees='" . addslashes(json_encode($fichiers)) . "'";
614
615                        if (_SPIP_LIER_RESSOURCES && $fichiers) {
616                                foreach ($fichiers as $f) {
617                                        $links .= "background-image:url(" . $f["i"][1] . ");"
618                                                . "background-image:url(" . $f["i"][2] . ");"
619                                                . "background-image:url(" . $f["p"][1] . ");"
620                                                . "background-image:url(" . $f["p"][2] . ");";
621                                }
622                        }
623
624                        if ($align) {
625                                if ($align == "focus") {
626                                        $style_align = "background-position: " . (centre_image_x($img) * 100) . "% " . (centre_image_y($img) * 100) . "%;";
627                                } else {
628                                        $style_align = "background-position: $align;";
629                                }
630                        }
631
632                }
633
634                $ins .= " style='" . $style_align . $links . "background-image:url($src)'";
635
636                return $ins;
637        }
638
639
640}
641
642
643function image_proportions($img, $largeur = 16, $hauteur = 9, $align = "center", $zoom = 1) {
644        $mode = $align;
645
646        if (!$img) return;
647
648
649        $l_img = largeur($img);
650        $h_img = hauteur($img);
651
652        if ($largeur == 0 OR $hauteur == 0) {
653                $largeur = $l_img;
654                $hauteur = $h_img;
655        }
656
657
658        if ($l_img == 0 OR $h_img == 0) return $img;
659
660        $r_img = $h_img / $l_img;
661        $r = $hauteur / $largeur;
662
663        if ($r_img < $r) {
664                $l_dest = $h_img / $r;
665                $h_dest = $h_img;
666        } else if ($r_img > $r) {
667                $l_dest = $l_img;
668                $h_dest = $l_img * $r;
669        }
670
671
672        // Si align est "focus" ou "focus-center", on va aller chercher le «point d'intérêt» de l'image
673        // avec la fonction centre_image du plugin «centre_image»
674
675        // Avec "focus", point d'intérêt reste décentré
676        // Avec "focus-center", point d'intérêt aussi centré que possible
677        if (($align == "focus" || $align == "focus-center") && function_exists('centre_image')) {
678                $dx = centre_image_x($img);
679                $dy = centre_image_y($img);
680
681                if ($r_img > $r) {
682                        $h_dest = round(($l_img * $r) / $zoom);
683                        $l_dest = round($l_img / $zoom);
684                } else {
685                        $h_dest = round($h_img / $zoom);
686                        $l_dest = round(($h_img / $r) / $zoom);
687                }
688                $h_centre = $h_img * $dy;
689                $l_centre = $l_img * $dx;
690                if ($align == "focus-center") $top = round($h_centre - ($h_dest * 0.5));
691                // ici on n'applique pas *$dy directement, car effet exagéré,
692                // alors on pondère
693                else  $top = round($h_centre - ($h_dest * ((2 * $dy + 0.5) / 3)));
694
695                $l_centre = $l_img * $dx;
696                if ($align == "focus-center") $left = round($l_centre - ($l_dest * 0.5));
697                else  $left = round($l_centre - ($l_dest * ((2 * $dx + 0.5) / 3)));
698
699
700                if ($top < 0) $top = 0;
701                if ($top + $h_dest > $h_img) $top = $h_img - $h_dest;
702                if ($left < 0) $left = 0;
703                if ($left + $l_dest > $l_img) $left = $l_img - $l_dest;
704
705                //echo "<li>$dx x $dy - $l_img x $h_img - $l_dest x $h_dest - $l_centre x $h_centre - $left x $top</li>";
706                $align = "top=$top, left=$left";
707        }
708
709        include_spip("filtres/images_transforme");
710        $img = image_recadre($img, $l_dest, $h_dest, $align);
711
712        // Second passage si $zoom (on verra plus tard si c'est intéressant de le traiter en amont)
713        if ($zoom > 1 && $mode != "focus" && $mode != "focus-center") {
714                $l_img = largeur($img) / 2;
715                $h_img = hauteur($img) / 2;
716
717                $img = image_recadre($img, $l_img, $h_img);
718
719        }
720
721        return $img;
722}
723
724
725function image_responsive_affiche_milieu($flux, $effacer = false) {
726
727        $exec = $flux["args"]["exec"];
728
729
730        if ($exec == "admin_vider") {
731                $retour = recuperer_fond("squelettes/admin_vider_responsive");
732
733                $flux["data"] .= $retour;
734        }
735
736        return $flux;
737}
738
739
Note: See TracBrowser for help on using the repository browser.