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

Last change on this file since 111518 was 111518, checked in by root, 10 months ago

Attention, la modif 111504 plante sous PHP 5.2.6. Je mets cette modif commentaire, sinon j’ai des sites plantés…

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