Completed
Push — master ( 6c7349...d5cf11 )
by cam
04:22
created
ecrire/inc/filtres_images_lib_mini.php 2 patches
Indentation   +1307 added lines, -1307 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
 
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 include_spip('inc/filtres'); // par precaution
25 25
 include_spip('inc/filtres_images_mini'); // par precaution
@@ -39,21 +39,21 @@  discard block
 block discarded – undo
39 39
  *     Le code de la couleur en hexadécimal.
40 40
  */
41 41
 function _couleur_dec_to_hex($red, $green, $blue) {
42
-	$red = dechex($red);
43
-	$green = dechex($green);
44
-	$blue = dechex($blue);
45
-
46
-	if (strlen($red) == 1) {
47
-		$red = "0" . $red;
48
-	}
49
-	if (strlen($green) == 1) {
50
-		$green = "0" . $green;
51
-	}
52
-	if (strlen($blue) == 1) {
53
-		$blue = "0" . $blue;
54
-	}
55
-
56
-	return "$red$green$blue";
42
+    $red = dechex($red);
43
+    $green = dechex($green);
44
+    $blue = dechex($blue);
45
+
46
+    if (strlen($red) == 1) {
47
+        $red = "0" . $red;
48
+    }
49
+    if (strlen($green) == 1) {
50
+        $green = "0" . $green;
51
+    }
52
+    if (strlen($blue) == 1) {
53
+        $blue = "0" . $blue;
54
+    }
55
+
56
+    return "$red$green$blue";
57 57
 }
58 58
 
59 59
 /**
@@ -65,17 +65,17 @@  discard block
 block discarded – undo
65 65
  *     Un tableau des 3 éléments : rouge, vert, bleu.
66 66
  */
67 67
 function _couleur_hex_to_dec($couleur) {
68
-	$couleur = couleur_html_to_hex($couleur);
69
-	$couleur = ltrim($couleur, '#');
70
-	if (strlen($couleur) === 3) {
71
-		$couleur = $couleur[0] . $couleur[0] . $couleur[1] . $couleur[1] . $couleur[2] . $couleur[2];
72
-	}
73
-	$retour = [];
74
-	$retour["red"] = hexdec(substr($couleur, 0, 2));
75
-	$retour["green"] = hexdec(substr($couleur, 2, 2));
76
-	$retour["blue"] = hexdec(substr($couleur, 4, 2));
77
-
78
-	return $retour;
68
+    $couleur = couleur_html_to_hex($couleur);
69
+    $couleur = ltrim($couleur, '#');
70
+    if (strlen($couleur) === 3) {
71
+        $couleur = $couleur[0] . $couleur[0] . $couleur[1] . $couleur[1] . $couleur[2] . $couleur[2];
72
+    }
73
+    $retour = [];
74
+    $retour["red"] = hexdec(substr($couleur, 0, 2));
75
+    $retour["green"] = hexdec(substr($couleur, 2, 2));
76
+    $retour["blue"] = hexdec(substr($couleur, 4, 2));
77
+
78
+    return $retour;
79 79
 }
80 80
 
81 81
 
@@ -92,8 +92,8 @@  discard block
 block discarded – undo
92 92
  *     Le code de la couleur en hexadécimal.
93 93
  */
94 94
 function _couleur_hsl_to_hex($hue, $saturation, $lightness) {
95
-	$rgb = _couleur_hsl_to_rgb($hue, $saturation, $lightness);
96
-	return _couleur_dec_to_hex($rgb['r'], $rgb['g'], $rgb['b']);
95
+    $rgb = _couleur_hsl_to_rgb($hue, $saturation, $lightness);
96
+    return _couleur_dec_to_hex($rgb['r'], $rgb['g'], $rgb['b']);
97 97
 }
98 98
 
99 99
 /**
@@ -105,8 +105,8 @@  discard block
 block discarded – undo
105 105
  *     Un tableau des 3 éléments : teinte, saturation, luminosité.
106 106
  */
107 107
 function _couleur_hex_to_hsl($couleur) {
108
-	$rgb = _couleur_hex_to_dec($couleur);
109
-	return _couleur_rgb_to_hsl($rgb['red'], $rgb['green'], $rgb['blue']);
108
+    $rgb = _couleur_hex_to_dec($couleur);
109
+    return _couleur_rgb_to_hsl($rgb['red'], $rgb['green'], $rgb['blue']);
110 110
 }
111 111
 
112 112
 /**
@@ -121,58 +121,58 @@  discard block
 block discarded – undo
121 121
  * @return array
122 122
  */
123 123
 function _couleur_rgb_to_hsl($R, $G, $B) {
124
-	$var_R = ($R / 255); // Where RGB values = 0 ÷ 255
125
-	$var_G = ($G / 255);
126
-	$var_B = ($B / 255);
127
-
128
-	$var_Min = min($var_R, $var_G, $var_B);   //Min. value of RGB
129
-	$var_Max = max($var_R, $var_G, $var_B);   //Max. value of RGB
130
-	$del_Max = $var_Max - $var_Min;           //Delta RGB value
131
-
132
-	$L = ($var_Max + $var_Min) / 2;
133
-
134
-	if ($del_Max == 0) {
135
-		//This is a gray, no chroma...
136
-		$H = 0; //HSL results = 0 ÷ 1
137
-		$S = 0;
138
-	} else {
139
-		// Chromatic data...
140
-		if ($L < 0.5) {
141
-			$S = $del_Max / ($var_Max + $var_Min);
142
-		} else {
143
-			$S = $del_Max / (2 - $var_Max - $var_Min);
144
-		}
145
-
146
-		$del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
147
-		$del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
148
-		$del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
149
-
150
-		if ($var_R == $var_Max) {
151
-			$H = $del_B - $del_G;
152
-		} else {
153
-			if ($var_G == $var_Max) {
154
-				$H = (1 / 3) + $del_R - $del_B;
155
-			} else {
156
-				if ($var_B == $var_Max) {
157
-					$H = (2 / 3) + $del_G - $del_R;
158
-				}
159
-			}
160
-		}
161
-
162
-		if ($H < 0) {
163
-			$H += 1;
164
-		}
165
-		if ($H > 1) {
166
-			$H -= 1;
167
-		}
168
-	}
169
-
170
-	$ret = [];
171
-	$ret["h"] = $H;
172
-	$ret["s"] = $S;
173
-	$ret["l"] = $L;
174
-
175
-	return $ret;
124
+    $var_R = ($R / 255); // Where RGB values = 0 ÷ 255
125
+    $var_G = ($G / 255);
126
+    $var_B = ($B / 255);
127
+
128
+    $var_Min = min($var_R, $var_G, $var_B);   //Min. value of RGB
129
+    $var_Max = max($var_R, $var_G, $var_B);   //Max. value of RGB
130
+    $del_Max = $var_Max - $var_Min;           //Delta RGB value
131
+
132
+    $L = ($var_Max + $var_Min) / 2;
133
+
134
+    if ($del_Max == 0) {
135
+        //This is a gray, no chroma...
136
+        $H = 0; //HSL results = 0 ÷ 1
137
+        $S = 0;
138
+    } else {
139
+        // Chromatic data...
140
+        if ($L < 0.5) {
141
+            $S = $del_Max / ($var_Max + $var_Min);
142
+        } else {
143
+            $S = $del_Max / (2 - $var_Max - $var_Min);
144
+        }
145
+
146
+        $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
147
+        $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
148
+        $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
149
+
150
+        if ($var_R == $var_Max) {
151
+            $H = $del_B - $del_G;
152
+        } else {
153
+            if ($var_G == $var_Max) {
154
+                $H = (1 / 3) + $del_R - $del_B;
155
+            } else {
156
+                if ($var_B == $var_Max) {
157
+                    $H = (2 / 3) + $del_G - $del_R;
158
+                }
159
+            }
160
+        }
161
+
162
+        if ($H < 0) {
163
+            $H += 1;
164
+        }
165
+        if ($H > 1) {
166
+            $H -= 1;
167
+        }
168
+    }
169
+
170
+    $ret = [];
171
+    $ret["h"] = $H;
172
+    $ret["s"] = $S;
173
+    $ret["l"] = $L;
174
+
175
+    return $ret;
176 176
 }
177 177
 
178 178
 
@@ -188,52 +188,52 @@  discard block
 block discarded – undo
188 188
  * @return array
189 189
  */
190 190
 function _couleur_hsl_to_rgb($H, $S, $L) {
191
-	// helper
192
-	$hue_2_rgb = function($v1, $v2, $vH) {
193
-		if ($vH < 0) {
194
-			$vH += 1;
195
-		}
196
-		if ($vH > 1) {
197
-			$vH -= 1;
198
-		}
199
-		if ((6 * $vH) < 1) {
200
-			return ($v1 + ($v2 - $v1) * 6 * $vH);
201
-		}
202
-		if ((2 * $vH) < 1) {
203
-			return ($v2);
204
-		}
205
-		if ((3 * $vH) < 2) {
206
-			return ($v1 + ($v2 - $v1) * ((2 / 3) - $vH) * 6);
207
-		}
191
+    // helper
192
+    $hue_2_rgb = function($v1, $v2, $vH) {
193
+        if ($vH < 0) {
194
+            $vH += 1;
195
+        }
196
+        if ($vH > 1) {
197
+            $vH -= 1;
198
+        }
199
+        if ((6 * $vH) < 1) {
200
+            return ($v1 + ($v2 - $v1) * 6 * $vH);
201
+        }
202
+        if ((2 * $vH) < 1) {
203
+            return ($v2);
204
+        }
205
+        if ((3 * $vH) < 2) {
206
+            return ($v1 + ($v2 - $v1) * ((2 / 3) - $vH) * 6);
207
+        }
208 208
 	
209
-		return ($v1);
210
-	};
211
-
212
-	if ($S == 0) {
213
-		// HSV values = 0 -> 1
214
-		$R = $L * 255;
215
-		$G = $L * 255;
216
-		$B = $L * 255;
217
-	} else {
218
-		if ($L < 0.5) {
219
-			$var_2 = $L * (1 + $S);
220
-		} else {
221
-			$var_2 = ($L + $S) - ($S * $L);
222
-		}
223
-
224
-		$var_1 = 2 * $L - $var_2;
225
-
226
-		$R = 255 * $hue_2_rgb($var_1, $var_2, $H + (1 / 3));
227
-		$G = 255 * $hue_2_rgb($var_1, $var_2, $H);
228
-		$B = 255 * $hue_2_rgb($var_1, $var_2, $H - (1 / 3));
229
-	}
230
-
231
-	$ret = [];
232
-	$ret["r"] = floor($R);
233
-	$ret["g"] = floor($G);
234
-	$ret["b"] = floor($B);
235
-
236
-	return $ret;
209
+        return ($v1);
210
+    };
211
+
212
+    if ($S == 0) {
213
+        // HSV values = 0 -> 1
214
+        $R = $L * 255;
215
+        $G = $L * 255;
216
+        $B = $L * 255;
217
+    } else {
218
+        if ($L < 0.5) {
219
+            $var_2 = $L * (1 + $S);
220
+        } else {
221
+            $var_2 = ($L + $S) - ($S * $L);
222
+        }
223
+
224
+        $var_1 = 2 * $L - $var_2;
225
+
226
+        $R = 255 * $hue_2_rgb($var_1, $var_2, $H + (1 / 3));
227
+        $G = 255 * $hue_2_rgb($var_1, $var_2, $H);
228
+        $B = 255 * $hue_2_rgb($var_1, $var_2, $H - (1 / 3));
229
+    }
230
+
231
+    $ret = [];
232
+    $ret["r"] = floor($R);
233
+    $ret["g"] = floor($G);
234
+    $ret["b"] = floor($B);
235
+
236
+    return $ret;
237 237
 }
238 238
 
239 239
 /**
@@ -250,11 +250,11 @@  discard block
 block discarded – undo
250 250
  *     true si il faut supprimer le fichier temporaire ; false sinon.
251 251
  */
252 252
 function statut_effacer_images_temporaires($stat) {
253
-	static $statut = false; // par defaut on grave toute les images
254
-	if ($stat === 'get') {
255
-		return $statut;
256
-	}
257
-	$statut = $stat ? true : false;
253
+    static $statut = false; // par defaut on grave toute les images
254
+    if ($stat === 'get') {
255
+        return $statut;
256
+    }
257
+    $statut = $stat ? true : false;
258 258
 }
259 259
 
260 260
 
@@ -307,224 +307,224 @@  discard block
 block discarded – undo
307 307
  *     - array : tableau décrivant de l'image
308 308
  */
309 309
 function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = null, $find_in_path = false, $support_svg = false) {
310
-	static $images_recalcul = array();
311
-	if (strlen($img) == 0) {
312
-		return false;
313
-	}
314
-
315
-	$source = trim(extraire_attribut($img, 'src'));
316
-	if (strlen($source) < 1) {
317
-		$source = $img;
318
-		$img = "<img src='$source' />";
319
-	} # gerer img src="data:....base64"
320
-	elseif (preg_match('@^data:image/([^;]*);base64,(.*)$@isS', $source, $regs)
321
-	  and $extension = _image_trouver_extension_depuis_mime("image/".$regs[1])
322
-		and in_array($extension, _image_extensions_acceptees_en_entree())
323
-	) {
324
-		$local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . _image_extension_normalisee($extension);
325
-		if (!file_exists($local)) {
326
-			ecrire_fichier($local, base64_decode($regs[2]));
327
-		}
328
-		$source = $local;
329
-		$img = inserer_attribut($img, 'src', $source);
330
-		# eviter les mauvaises surprises lors de conversions de format
331
-		$img = inserer_attribut($img, 'width', '');
332
-		$img = inserer_attribut($img, 'height', '');
333
-	}
334
-
335
-	// les protocoles web prennent au moins 3 lettres
336
-	if (tester_url_absolue($source)) {
337
-		include_spip('inc/distant');
338
-		$fichier = _DIR_RACINE . copie_locale($source);
339
-		if (!$fichier) {
340
-			return "";
341
-		}
342
-	} else {
343
-		// enlever le timestamp eventuel
344
-		if (strpos($source, "?") !== false) {
345
-			$source = preg_replace(',[?][0-9]+$,', '', $source);
346
-		}
347
-		if (strpos($source, "?") !== false
348
-			and strncmp($source, _DIR_IMG, strlen(_DIR_IMG)) == 0
349
-			and file_exists($f = preg_replace(',[?].*$,', '', $source))
350
-		) {
351
-			$source = $f;
352
-		}
353
-		$fichier = $source;
354
-	}
355
-
356
-	$terminaison_dest = "";
357
-	if ($terminaison = _image_trouver_extension($fichier)) {
358
-		$terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
359
-	}
360
-
361
-	if ($forcer_format !== false
362
-		// ignorer forcer_format si on a une image svg, que le filtre appelant ne supporte pas SVG, et que le forcage est un autre format image
363
-		and ($terminaison_dest !== 'svg' or $support_svg or !in_array($forcer_format,_image_extensions_acceptees_en_sortie()))) {
364
-		$terminaison_dest = $forcer_format;
365
-	}
366
-
367
-	if (!$terminaison_dest) {
368
-		return false;
369
-	}
370
-
371
-	$nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
372
-	$fichier_dest = $nom_fichier;
373
-	if (($find_in_path and $f = find_in_path($fichier) and $fichier = $f)
374
-		or @file_exists($f = $fichier)
375
-	) {
376
-		// on passe la balise img a taille image qui exraira les attributs si possible
377
-		// au lieu de faire un acces disque sur le fichier
378
-		list($ret["hauteur"], $ret["largeur"]) = taille_image($find_in_path ? $f : $img);
379
-		$date_src = @filemtime($f);
380
-	} elseif (@file_exists($f = "$fichier.src")
381
-		and lire_fichier($f, $valeurs)
382
-		and $valeurs = unserialize($valeurs)
383
-		and isset($valeurs["hauteur_dest"])
384
-		and isset($valeurs["largeur_dest"])
385
-	) {
386
-		$ret["hauteur"] = $valeurs["hauteur_dest"];
387
-		$ret["largeur"] = $valeurs["largeur_dest"];
388
-		$date_src = $valeurs["date"];
389
-	} // pas de fichier source par la
390
-	else {
391
-		return false;
392
-	}
393
-
394
-	// pas de taille mesurable
395
-	if (!($ret["hauteur"] or $ret["largeur"])) {
396
-		return false;
397
-	}
398
-
399
-	// les images calculees dependent du chemin du fichier source
400
-	// pour une meme image source et un meme filtre on aboutira a 2 fichiers selon si l'appel est dans le public ou dans le prive
401
-	// ce n'est pas totalement optimal en terme de stockage, mais chaque image est associee a un fichier .src
402
-	// qui contient la methode de reconstrucion (le filtre + les arguments d'appel) et les arguments different entre prive et public
403
-	// la mise en commun du fichier image cree donc un bug et des problemes qui necessiteraient beaucoup de complexite de code
404
-	// alors que ca concerne peu de site au final
405
-	// la release de r23632+r23633+r23634 a provoque peu de remontee de bug attestant du peu de sites impactes
406
-	$identifiant = $fichier;
407
-
408
-	// cas general :
409
-	// on a un dossier cache commun et un nom de fichier qui varie avec l'effet
410
-	// cas particulier de reduire :
411
-	// un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi
412
-	$cache = "cache-gd2";
413
-	if (substr($effet, 0, 7) == 'reduire') {
414
-		list(, $maxWidth, $maxHeight) = explode('-', $effet);
415
-		list($destWidth, $destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight);
416
-		$ret['largeur_dest'] = $destWidth;
417
-		$ret['hauteur_dest'] = $destHeight;
418
-		$effet = "L{$destWidth}xH$destHeight";
419
-		$cache = "cache-vignettes";
420
-		$fichier_dest = basename($fichier_dest);
421
-		if (($ret['largeur'] <= $maxWidth) && ($ret['hauteur'] <= $maxHeight)) {
422
-			// on garde la terminaison initiale car image simplement copiee
423
-			// et on postfixe son nom avec un md5 du path
424
-			$terminaison_dest = $terminaison;
425
-			$fichier_dest .= '-' . substr(md5("$identifiant"), 0, 5);
426
-		} else {
427
-			$fichier_dest .= '-' . substr(md5("$identifiant-$effet"), 0, 5);
428
-		}
429
-		$cache = sous_repertoire(_DIR_VAR, $cache);
430
-		$cache = sous_repertoire($cache, $effet);
431
-	} else {
432
-		$fichier_dest = md5("$identifiant-$effet");
433
-		$cache = sous_repertoire(_DIR_VAR, $cache);
434
-		$cache = sous_repertoire($cache, substr($fichier_dest, 0, 2));
435
-		$fichier_dest = substr($fichier_dest, 2);
436
-	}
437
-
438
-	$fichier_dest = $cache . $fichier_dest . "." . $terminaison_dest;
439
-
440
-	$GLOBALS["images_calculees"][] = $fichier_dest;
441
-
442
-	$creer = true;
443
-	// si recalcul des images demande, recalculer chaque image une fois
444
-	if (defined('_VAR_IMAGES') and _VAR_IMAGES and !isset($images_recalcul[$fichier_dest])) {
445
-		$images_recalcul[$fichier_dest] = true;
446
-	} else {
447
-		if (@file_exists($f = $fichier_dest)) {
448
-			if (filemtime($f) >= $date_src) {
449
-				$creer = false;
450
-			}
451
-		} else {
452
-			if (@file_exists($f = "$fichier_dest.src")
453
-				and lire_fichier($f, $valeurs)
454
-				and $valeurs = unserialize($valeurs)
455
-				and $valeurs["date"] >= $date_src
456
-			) {
457
-				$creer = false;
458
-			}
459
-		}
460
-	}
461
-	if ($creer) {
462
-		if (!@file_exists($fichier)) {
463
-			if (!@file_exists("$fichier.src")) {
464
-				spip_log("Image absente : $fichier");
465
-
466
-				return false;
467
-			}
468
-			# on reconstruit l'image source absente a partir de la chaine des .src
469
-			reconstruire_image_intermediaire($fichier);
470
-		}
471
-	}
472
-
473
-	if ($creer) {
474
-		spip_log("filtre image " . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier",
475
-			"images" . _LOG_DEBUG);
476
-	}
477
-
478
-	$term_fonction = _image_trouver_extension_pertinente($fichier);
479
-	$ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction;
480
-	$ret["fichier"] = $fichier;
481
-	$ret["fonction_image"] = "_image_image" . $terminaison_dest;
482
-	$ret["fichier_dest"] = $fichier_dest;
483
-	$ret["format_source"] = _image_extension_normalisee($terminaison);
484
-	$ret["format_dest"] = $terminaison_dest;
485
-	$ret["date_src"] = $date_src;
486
-	$ret["creer"] = $creer;
487
-	$ret["class"] = extraire_attribut($img, 'class');
488
-	$ret["alt"] = extraire_attribut($img, 'alt');
489
-	$ret["style"] = extraire_attribut($img, 'style');
490
-	$ret["tag"] = $img;
491
-	if ($fonction_creation) {
492
-		$ret["reconstruction"] = $fonction_creation;
493
-		# ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement 
494
-		# cas de image_reduire qui finalement ne reduit pas l'image source
495
-		# ca evite d'essayer de le creer au prochain hit si il n'est pas la
496
-		#ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true);
497
-	}
498
-
499
-	$ret = pipeline('image_preparer_filtre', array(
500
-			'args' => array(
501
-				'img' => $img,
502
-				'effet' => $effet,
503
-				'forcer_format' => $forcer_format,
504
-				'fonction_creation' => $fonction_creation,
505
-				'find_in_path' => $find_in_path,
506
-			),
507
-			'data' => $ret
508
-		)
509
-	);
510
-
511
-	// une globale pour le debug en cas de crash memoire
512
-	$GLOBALS["derniere_image_calculee"] = $ret;
513
-
514
-	// traiter le cas particulier des SVG : si le filtre n'a pas annonce explicitement qu'il savait faire, on delegue
515
-	if ($term_fonction === 'svg') {
516
-		if ($creer and !$support_svg) {
517
-			process_image_svg_identite($ret);
518
-			$ret['creer'] = false;
519
-		}
520
-	}
521
-	else {
522
-		if (!function_exists($ret["fonction_imagecreatefrom"])) {
523
-			return false;
524
-		}
525
-	}
526
-
527
-	return $ret;
310
+    static $images_recalcul = array();
311
+    if (strlen($img) == 0) {
312
+        return false;
313
+    }
314
+
315
+    $source = trim(extraire_attribut($img, 'src'));
316
+    if (strlen($source) < 1) {
317
+        $source = $img;
318
+        $img = "<img src='$source' />";
319
+    } # gerer img src="data:....base64"
320
+    elseif (preg_match('@^data:image/([^;]*);base64,(.*)$@isS', $source, $regs)
321
+      and $extension = _image_trouver_extension_depuis_mime("image/".$regs[1])
322
+        and in_array($extension, _image_extensions_acceptees_en_entree())
323
+    ) {
324
+        $local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . _image_extension_normalisee($extension);
325
+        if (!file_exists($local)) {
326
+            ecrire_fichier($local, base64_decode($regs[2]));
327
+        }
328
+        $source = $local;
329
+        $img = inserer_attribut($img, 'src', $source);
330
+        # eviter les mauvaises surprises lors de conversions de format
331
+        $img = inserer_attribut($img, 'width', '');
332
+        $img = inserer_attribut($img, 'height', '');
333
+    }
334
+
335
+    // les protocoles web prennent au moins 3 lettres
336
+    if (tester_url_absolue($source)) {
337
+        include_spip('inc/distant');
338
+        $fichier = _DIR_RACINE . copie_locale($source);
339
+        if (!$fichier) {
340
+            return "";
341
+        }
342
+    } else {
343
+        // enlever le timestamp eventuel
344
+        if (strpos($source, "?") !== false) {
345
+            $source = preg_replace(',[?][0-9]+$,', '', $source);
346
+        }
347
+        if (strpos($source, "?") !== false
348
+            and strncmp($source, _DIR_IMG, strlen(_DIR_IMG)) == 0
349
+            and file_exists($f = preg_replace(',[?].*$,', '', $source))
350
+        ) {
351
+            $source = $f;
352
+        }
353
+        $fichier = $source;
354
+    }
355
+
356
+    $terminaison_dest = "";
357
+    if ($terminaison = _image_trouver_extension($fichier)) {
358
+        $terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
359
+    }
360
+
361
+    if ($forcer_format !== false
362
+        // ignorer forcer_format si on a une image svg, que le filtre appelant ne supporte pas SVG, et que le forcage est un autre format image
363
+        and ($terminaison_dest !== 'svg' or $support_svg or !in_array($forcer_format,_image_extensions_acceptees_en_sortie()))) {
364
+        $terminaison_dest = $forcer_format;
365
+    }
366
+
367
+    if (!$terminaison_dest) {
368
+        return false;
369
+    }
370
+
371
+    $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
372
+    $fichier_dest = $nom_fichier;
373
+    if (($find_in_path and $f = find_in_path($fichier) and $fichier = $f)
374
+        or @file_exists($f = $fichier)
375
+    ) {
376
+        // on passe la balise img a taille image qui exraira les attributs si possible
377
+        // au lieu de faire un acces disque sur le fichier
378
+        list($ret["hauteur"], $ret["largeur"]) = taille_image($find_in_path ? $f : $img);
379
+        $date_src = @filemtime($f);
380
+    } elseif (@file_exists($f = "$fichier.src")
381
+        and lire_fichier($f, $valeurs)
382
+        and $valeurs = unserialize($valeurs)
383
+        and isset($valeurs["hauteur_dest"])
384
+        and isset($valeurs["largeur_dest"])
385
+    ) {
386
+        $ret["hauteur"] = $valeurs["hauteur_dest"];
387
+        $ret["largeur"] = $valeurs["largeur_dest"];
388
+        $date_src = $valeurs["date"];
389
+    } // pas de fichier source par la
390
+    else {
391
+        return false;
392
+    }
393
+
394
+    // pas de taille mesurable
395
+    if (!($ret["hauteur"] or $ret["largeur"])) {
396
+        return false;
397
+    }
398
+
399
+    // les images calculees dependent du chemin du fichier source
400
+    // pour une meme image source et un meme filtre on aboutira a 2 fichiers selon si l'appel est dans le public ou dans le prive
401
+    // ce n'est pas totalement optimal en terme de stockage, mais chaque image est associee a un fichier .src
402
+    // qui contient la methode de reconstrucion (le filtre + les arguments d'appel) et les arguments different entre prive et public
403
+    // la mise en commun du fichier image cree donc un bug et des problemes qui necessiteraient beaucoup de complexite de code
404
+    // alors que ca concerne peu de site au final
405
+    // la release de r23632+r23633+r23634 a provoque peu de remontee de bug attestant du peu de sites impactes
406
+    $identifiant = $fichier;
407
+
408
+    // cas general :
409
+    // on a un dossier cache commun et un nom de fichier qui varie avec l'effet
410
+    // cas particulier de reduire :
411
+    // un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi
412
+    $cache = "cache-gd2";
413
+    if (substr($effet, 0, 7) == 'reduire') {
414
+        list(, $maxWidth, $maxHeight) = explode('-', $effet);
415
+        list($destWidth, $destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight);
416
+        $ret['largeur_dest'] = $destWidth;
417
+        $ret['hauteur_dest'] = $destHeight;
418
+        $effet = "L{$destWidth}xH$destHeight";
419
+        $cache = "cache-vignettes";
420
+        $fichier_dest = basename($fichier_dest);
421
+        if (($ret['largeur'] <= $maxWidth) && ($ret['hauteur'] <= $maxHeight)) {
422
+            // on garde la terminaison initiale car image simplement copiee
423
+            // et on postfixe son nom avec un md5 du path
424
+            $terminaison_dest = $terminaison;
425
+            $fichier_dest .= '-' . substr(md5("$identifiant"), 0, 5);
426
+        } else {
427
+            $fichier_dest .= '-' . substr(md5("$identifiant-$effet"), 0, 5);
428
+        }
429
+        $cache = sous_repertoire(_DIR_VAR, $cache);
430
+        $cache = sous_repertoire($cache, $effet);
431
+    } else {
432
+        $fichier_dest = md5("$identifiant-$effet");
433
+        $cache = sous_repertoire(_DIR_VAR, $cache);
434
+        $cache = sous_repertoire($cache, substr($fichier_dest, 0, 2));
435
+        $fichier_dest = substr($fichier_dest, 2);
436
+    }
437
+
438
+    $fichier_dest = $cache . $fichier_dest . "." . $terminaison_dest;
439
+
440
+    $GLOBALS["images_calculees"][] = $fichier_dest;
441
+
442
+    $creer = true;
443
+    // si recalcul des images demande, recalculer chaque image une fois
444
+    if (defined('_VAR_IMAGES') and _VAR_IMAGES and !isset($images_recalcul[$fichier_dest])) {
445
+        $images_recalcul[$fichier_dest] = true;
446
+    } else {
447
+        if (@file_exists($f = $fichier_dest)) {
448
+            if (filemtime($f) >= $date_src) {
449
+                $creer = false;
450
+            }
451
+        } else {
452
+            if (@file_exists($f = "$fichier_dest.src")
453
+                and lire_fichier($f, $valeurs)
454
+                and $valeurs = unserialize($valeurs)
455
+                and $valeurs["date"] >= $date_src
456
+            ) {
457
+                $creer = false;
458
+            }
459
+        }
460
+    }
461
+    if ($creer) {
462
+        if (!@file_exists($fichier)) {
463
+            if (!@file_exists("$fichier.src")) {
464
+                spip_log("Image absente : $fichier");
465
+
466
+                return false;
467
+            }
468
+            # on reconstruit l'image source absente a partir de la chaine des .src
469
+            reconstruire_image_intermediaire($fichier);
470
+        }
471
+    }
472
+
473
+    if ($creer) {
474
+        spip_log("filtre image " . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier",
475
+            "images" . _LOG_DEBUG);
476
+    }
477
+
478
+    $term_fonction = _image_trouver_extension_pertinente($fichier);
479
+    $ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction;
480
+    $ret["fichier"] = $fichier;
481
+    $ret["fonction_image"] = "_image_image" . $terminaison_dest;
482
+    $ret["fichier_dest"] = $fichier_dest;
483
+    $ret["format_source"] = _image_extension_normalisee($terminaison);
484
+    $ret["format_dest"] = $terminaison_dest;
485
+    $ret["date_src"] = $date_src;
486
+    $ret["creer"] = $creer;
487
+    $ret["class"] = extraire_attribut($img, 'class');
488
+    $ret["alt"] = extraire_attribut($img, 'alt');
489
+    $ret["style"] = extraire_attribut($img, 'style');
490
+    $ret["tag"] = $img;
491
+    if ($fonction_creation) {
492
+        $ret["reconstruction"] = $fonction_creation;
493
+        # ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement 
494
+        # cas de image_reduire qui finalement ne reduit pas l'image source
495
+        # ca evite d'essayer de le creer au prochain hit si il n'est pas la
496
+        #ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true);
497
+    }
498
+
499
+    $ret = pipeline('image_preparer_filtre', array(
500
+            'args' => array(
501
+                'img' => $img,
502
+                'effet' => $effet,
503
+                'forcer_format' => $forcer_format,
504
+                'fonction_creation' => $fonction_creation,
505
+                'find_in_path' => $find_in_path,
506
+            ),
507
+            'data' => $ret
508
+        )
509
+    );
510
+
511
+    // une globale pour le debug en cas de crash memoire
512
+    $GLOBALS["derniere_image_calculee"] = $ret;
513
+
514
+    // traiter le cas particulier des SVG : si le filtre n'a pas annonce explicitement qu'il savait faire, on delegue
515
+    if ($term_fonction === 'svg') {
516
+        if ($creer and !$support_svg) {
517
+            process_image_svg_identite($ret);
518
+            $ret['creer'] = false;
519
+        }
520
+    }
521
+    else {
522
+        if (!function_exists($ret["fonction_imagecreatefrom"])) {
523
+            return false;
524
+        }
525
+    }
526
+
527
+    return $ret;
528 528
 }
529 529
 
530 530
 
@@ -533,52 +533,52 @@  discard block
 block discarded – undo
533 533
  * @return array
534 534
  */
535 535
 function _image_extensions_acceptees_en_entree() {
536
-	static $extensions = null;
537
-	if (empty($extensions)) {
538
-		$extensions = ['png', 'gif', 'jpg', 'jpeg'];
539
-		if (!empty($GLOBALS['meta']['gd_formats'])) {
540
-			// action=tester renseigne gd_formats et detecte le support de webp
541
-			$extensions = array_merge(explode(',', $GLOBALS['meta']['gd_formats']));
542
-			$extensions = array_map('trim', $extensions);
543
-			$extensions = array_filter($extensions);
544
-			$extensions = array_unique($extensions);
545
-			if (in_array("jpg", $extensions)) $extensions[] = 'jpeg';
546
-		}
547
-		$extensions[] = 'svg'; // on le supporte toujours avec des fonctions specifiques
548
-	}
549
-
550
-	return $extensions;
536
+    static $extensions = null;
537
+    if (empty($extensions)) {
538
+        $extensions = ['png', 'gif', 'jpg', 'jpeg'];
539
+        if (!empty($GLOBALS['meta']['gd_formats'])) {
540
+            // action=tester renseigne gd_formats et detecte le support de webp
541
+            $extensions = array_merge(explode(',', $GLOBALS['meta']['gd_formats']));
542
+            $extensions = array_map('trim', $extensions);
543
+            $extensions = array_filter($extensions);
544
+            $extensions = array_unique($extensions);
545
+            if (in_array("jpg", $extensions)) $extensions[] = 'jpeg';
546
+        }
547
+        $extensions[] = 'svg'; // on le supporte toujours avec des fonctions specifiques
548
+    }
549
+
550
+    return $extensions;
551 551
 }
552 552
 
553 553
 /**
554 554
  * @return array|string[]|null
555 555
  */
556 556
 function _image_extensions_acceptees_en_sortie(){
557
-	static $extensions = null;
558
-	if (empty($extensions)){
559
-		$extensions = _image_extensions_acceptees_en_entree();
560
-		$extensions = array_diff($extensions, ['jpeg']);
561
-		if (in_array('gif', $extensions) and !function_exists('imagegif')) {
562
-			$extensions = array_diff($extensions, ['gif']);
563
-		}
564
-		if (in_array('webp', $extensions) and !function_exists('imagewebp')) {
565
-			$extensions = array_diff($extensions, ['webp']);
566
-		}
567
-	}
568
-
569
-	return $extensions;
557
+    static $extensions = null;
558
+    if (empty($extensions)){
559
+        $extensions = _image_extensions_acceptees_en_entree();
560
+        $extensions = array_diff($extensions, ['jpeg']);
561
+        if (in_array('gif', $extensions) and !function_exists('imagegif')) {
562
+            $extensions = array_diff($extensions, ['gif']);
563
+        }
564
+        if (in_array('webp', $extensions) and !function_exists('imagewebp')) {
565
+            $extensions = array_diff($extensions, ['webp']);
566
+        }
567
+    }
568
+
569
+    return $extensions;
570 570
 }
571 571
 
572 572
 function _image_extension_normalisee($extension){
573
-	$extension = strtolower($extension);
574
-	if ($extension === 'jpeg') {
575
-		$extension = 'jpg';
576
-	}
577
-	return $extension;
573
+    $extension = strtolower($extension);
574
+    if ($extension === 'jpeg') {
575
+        $extension = 'jpg';
576
+    }
577
+    return $extension;
578 578
 }
579 579
 
580 580
 function _image_extensions_conservent_transparence(){
581
-	return ['png', 'webp'];
581
+    return ['png', 'webp'];
582 582
 }
583 583
 
584 584
 
@@ -588,12 +588,12 @@  discard block
 block discarded – undo
588 588
  * @return string
589 589
  */
590 590
 function _image_trouver_extension($path) {
591
-	$preg_extensions = implode('|', _image_extensions_acceptees_en_entree());
592
-	if (preg_match(",\.($preg_extensions)($|[?]),i", $path, $regs)) {
593
-		$terminaison = strtolower($regs[1]);
594
-		return $terminaison;
595
-	}
596
-	return '';
591
+    $preg_extensions = implode('|', _image_extensions_acceptees_en_entree());
592
+    if (preg_match(",\.($preg_extensions)($|[?]),i", $path, $regs)) {
593
+        $terminaison = strtolower($regs[1]);
594
+        return $terminaison;
595
+    }
596
+    return '';
597 597
 }
598 598
 
599 599
 /**
@@ -604,33 +604,33 @@  discard block
 block discarded – undo
604 604
  * @return string Extension, dans le format attendu par les fonctions 'gd' ('jpeg' pour les .jpg par exemple)
605 605
  */
606 606
 function _image_trouver_extension_pertinente($path) {
607
-	$path = supprimer_timestamp($path);
608
-	$terminaison = _image_trouver_extension($path);
609
-	if ($terminaison == 'jpg') {
610
-		$terminaison = 'jpeg';
611
-	}
612
-
613
-	if (!file_exists($path)) {
614
-		return $terminaison;
615
-	}
616
-
617
-	if (!$info = @spip_getimagesize($path)) {
618
-		return $terminaison;
619
-	}
620
-
621
-	if (isset($info['mime'])) {
622
-		$mime = $info['mime'];
623
-	}
624
-	else {
625
-		$mime = image_type_to_mime_type($info[2]);
626
-	}
627
-
628
-	$_terminaison = _image_trouver_extension_depuis_mime($mime);
629
-	if ($_terminaison and $_terminaison !== $terminaison) {
630
-		spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", "images." . _LOG_INFO_IMPORTANTE);
631
-		$terminaison = $_terminaison;
632
-	}
633
-	return $terminaison;
607
+    $path = supprimer_timestamp($path);
608
+    $terminaison = _image_trouver_extension($path);
609
+    if ($terminaison == 'jpg') {
610
+        $terminaison = 'jpeg';
611
+    }
612
+
613
+    if (!file_exists($path)) {
614
+        return $terminaison;
615
+    }
616
+
617
+    if (!$info = @spip_getimagesize($path)) {
618
+        return $terminaison;
619
+    }
620
+
621
+    if (isset($info['mime'])) {
622
+        $mime = $info['mime'];
623
+    }
624
+    else {
625
+        $mime = image_type_to_mime_type($info[2]);
626
+    }
627
+
628
+    $_terminaison = _image_trouver_extension_depuis_mime($mime);
629
+    if ($_terminaison and $_terminaison !== $terminaison) {
630
+        spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", "images." . _LOG_INFO_IMPORTANTE);
631
+        $terminaison = $_terminaison;
632
+    }
633
+    return $terminaison;
634 634
 }
635 635
 
636 636
 /**
@@ -638,36 +638,36 @@  discard block
 block discarded – undo
638 638
  * @return string
639 639
  */
640 640
 function _image_trouver_extension_depuis_mime($mime) {
641
-	switch (strtolower($mime)) {
642
-		case 'image/png':
643
-		case 'image/x-png':
644
-			$terminaison = 'png';
645
-			break;
646
-
647
-		case 'image/jpg':
648
-		case 'image/jpeg':
649
-		case 'image/pjpeg':
650
-			$terminaison = 'jpeg';
651
-			break;
652
-
653
-		case 'image/gif':
654
-			$terminaison = 'gif';
655
-			break;
656
-
657
-		case 'image/webp':
658
-		case 'image/x-webp':
659
-			$terminaison = 'webp';
660
-			break;
661
-
662
-		case 'image/svg+xml':
663
-			$terminaison = 'svg';
664
-			break;
665
-
666
-		default:
667
-			$terminaison = '';
668
-	}
669
-
670
-	return $terminaison;
641
+    switch (strtolower($mime)) {
642
+        case 'image/png':
643
+        case 'image/x-png':
644
+            $terminaison = 'png';
645
+            break;
646
+
647
+        case 'image/jpg':
648
+        case 'image/jpeg':
649
+        case 'image/pjpeg':
650
+            $terminaison = 'jpeg';
651
+            break;
652
+
653
+        case 'image/gif':
654
+            $terminaison = 'gif';
655
+            break;
656
+
657
+        case 'image/webp':
658
+        case 'image/x-webp':
659
+            $terminaison = 'webp';
660
+            break;
661
+
662
+        case 'image/svg+xml':
663
+            $terminaison = 'svg';
664
+            break;
665
+
666
+        default:
667
+            $terminaison = '';
668
+    }
669
+
670
+    return $terminaison;
671 671
 }
672 672
 
673 673
 
@@ -687,18 +687,18 @@  discard block
 block discarded – undo
687 687
  *     Une ressource de type Image GD.
688 688
  */
689 689
 function _imagecreatefrom_func(string $func, string $filename) {
690
-	if (!function_exists($func)) {
691
-		spip_log("GD indisponible : $func inexistante. Traitement $filename impossible.", _LOG_CRITIQUE);
692
-		erreur_squelette("GD indisponible : $func inexistante. Traitement $filename impossible.");
693
-		return null;
694
-	}
695
-	$img = @$func($filename);
696
-	if (!$img) {
697
-		spip_log("Erreur lecture imagecreatefromjpeg $filename", _LOG_CRITIQUE);
698
-		erreur_squelette("Erreur lecture imagecreatefromjpeg $filename");
699
-		$img = imagecreate(10, 10);
700
-	}
701
-	return $img;
690
+    if (!function_exists($func)) {
691
+        spip_log("GD indisponible : $func inexistante. Traitement $filename impossible.", _LOG_CRITIQUE);
692
+        erreur_squelette("GD indisponible : $func inexistante. Traitement $filename impossible.");
693
+        return null;
694
+    }
695
+    $img = @$func($filename);
696
+    if (!$img) {
697
+        spip_log("Erreur lecture imagecreatefromjpeg $filename", _LOG_CRITIQUE);
698
+        erreur_squelette("Erreur lecture imagecreatefromjpeg $filename");
699
+        $img = imagecreate(10, 10);
700
+    }
701
+    return $img;
702 702
 }
703 703
 
704 704
 /**
@@ -714,7 +714,7 @@  discard block
 block discarded – undo
714 714
  *     Une ressource de type Image GD.
715 715
  */
716 716
 function _imagecreatefromjpeg($filename) {
717
-	return _imagecreatefrom_func('imagecreatefromjpeg', $filename);
717
+    return _imagecreatefrom_func('imagecreatefromjpeg', $filename);
718 718
 }
719 719
 
720 720
 /**
@@ -730,7 +730,7 @@  discard block
 block discarded – undo
730 730
  *     Une ressource de type Image GD.
731 731
  */
732 732
 function _imagecreatefrompng($filename) {
733
-	return _imagecreatefrom_func('imagecreatefrompng', $filename);
733
+    return _imagecreatefrom_func('imagecreatefrompng', $filename);
734 734
 }
735 735
 
736 736
 /**
@@ -746,7 +746,7 @@  discard block
 block discarded – undo
746 746
  *     Une ressource de type Image GD.
747 747
  */
748 748
 function _imagecreatefromgif($filename) {
749
-	return _imagecreatefrom_func('imagecreatefromgif', $filename);
749
+    return _imagecreatefrom_func('imagecreatefromgif', $filename);
750 750
 }
751 751
 
752 752
 
@@ -763,7 +763,7 @@  discard block
 block discarded – undo
763 763
  *     Une ressource de type Image GD.
764 764
  */
765 765
 function _imagecreatefromwebp($filename) {
766
-	return _imagecreatefrom_func('imagecreatefromwebp', $filename);
766
+    return _imagecreatefrom_func('imagecreatefromwebp', $filename);
767 767
 }
768 768
 
769 769
 /**
@@ -781,24 +781,24 @@  discard block
 block discarded – undo
781 781
  *     - true si une image est bien retournée.
782 782
  */
783 783
 function _image_imagepng($img, $fichier) {
784
-	if (!function_exists('imagepng')) {
785
-		return false;
786
-	}
787
-	$tmp = $fichier . ".tmp";
788
-	$ret = imagepng($img, $tmp);
789
-	if (file_exists($tmp)) {
790
-		$taille_test = getimagesize($tmp);
791
-		if ($taille_test[0] < 1) {
792
-			return false;
793
-		}
794
-
795
-		spip_unlink($fichier); // le fichier peut deja exister
796
-		@rename($tmp, $fichier);
797
-
798
-		return $ret;
799
-	}
800
-
801
-	return false;
784
+    if (!function_exists('imagepng')) {
785
+        return false;
786
+    }
787
+    $tmp = $fichier . ".tmp";
788
+    $ret = imagepng($img, $tmp);
789
+    if (file_exists($tmp)) {
790
+        $taille_test = getimagesize($tmp);
791
+        if ($taille_test[0] < 1) {
792
+            return false;
793
+        }
794
+
795
+        spip_unlink($fichier); // le fichier peut deja exister
796
+        @rename($tmp, $fichier);
797
+
798
+        return $ret;
799
+    }
800
+
801
+    return false;
802 802
 }
803 803
 
804 804
 /**
@@ -816,24 +816,24 @@  discard block
 block discarded – undo
816 816
  *     - true si une image est bien retournée.
817 817
  */
818 818
 function _image_imagegif($img, $fichier) {
819
-	if (!function_exists('imagegif')) {
820
-		return false;
821
-	}
822
-	$tmp = $fichier . ".tmp";
823
-	$ret = imagegif($img, $tmp);
824
-	if (file_exists($tmp)) {
825
-		$taille_test = getimagesize($tmp);
826
-		if ($taille_test[0] < 1) {
827
-			return false;
828
-		}
829
-
830
-		spip_unlink($fichier); // le fichier peut deja exister
831
-		@rename($tmp, $fichier);
832
-
833
-		return $ret;
834
-	}
835
-
836
-	return false;
819
+    if (!function_exists('imagegif')) {
820
+        return false;
821
+    }
822
+    $tmp = $fichier . ".tmp";
823
+    $ret = imagegif($img, $tmp);
824
+    if (file_exists($tmp)) {
825
+        $taille_test = getimagesize($tmp);
826
+        if ($taille_test[0] < 1) {
827
+            return false;
828
+        }
829
+
830
+        spip_unlink($fichier); // le fichier peut deja exister
831
+        @rename($tmp, $fichier);
832
+
833
+        return $ret;
834
+    }
835
+
836
+    return false;
837 837
 }
838 838
 
839 839
 /**
@@ -856,29 +856,29 @@  discard block
 block discarded – undo
856 856
  *     - true si une image est bien retournée.
857 857
  */
858 858
 function _image_imagejpg($img, $fichier, $qualite = _IMG_GD_QUALITE) {
859
-	if (!function_exists('imagejpeg')) {
860
-		return false;
861
-	}
862
-	$tmp = $fichier . ".tmp";
859
+    if (!function_exists('imagejpeg')) {
860
+        return false;
861
+    }
862
+    $tmp = $fichier . ".tmp";
863 863
 
864
-	// Enable interlancing
865
-	imageinterlace($img, true);
864
+    // Enable interlancing
865
+    imageinterlace($img, true);
866 866
 
867
-	$ret = imagejpeg($img, $tmp, $qualite);
867
+    $ret = imagejpeg($img, $tmp, $qualite);
868 868
 
869
-	if (file_exists($tmp)) {
870
-		$taille_test = getimagesize($tmp);
871
-		if ($taille_test[0] < 1) {
872
-			return false;
873
-		}
869
+    if (file_exists($tmp)) {
870
+        $taille_test = getimagesize($tmp);
871
+        if ($taille_test[0] < 1) {
872
+            return false;
873
+        }
874 874
 
875
-		spip_unlink($fichier); // le fichier peut deja exister
876
-		@rename($tmp, $fichier);
875
+        spip_unlink($fichier); // le fichier peut deja exister
876
+        @rename($tmp, $fichier);
877 877
 
878
-		return $ret;
879
-	}
878
+        return $ret;
879
+    }
880 880
 
881
-	return false;
881
+    return false;
882 882
 }
883 883
 
884 884
 /**
@@ -896,9 +896,9 @@  discard block
 block discarded – undo
896 896
  *     true si le fichier a bien été créé ; false sinon.
897 897
  */
898 898
 function _image_imageico($img, $fichier) {
899
-	$gd_image_array = array($img);
899
+    $gd_image_array = array($img);
900 900
 
901
-	return ecrire_fichier($fichier, phpthumb_functions::GD2ICOstring($gd_image_array));
901
+    return ecrire_fichier($fichier, phpthumb_functions::GD2ICOstring($gd_image_array));
902 902
 }
903 903
 
904 904
 
@@ -917,24 +917,24 @@  discard block
 block discarded – undo
917 917
  *     - true si une image est bien retournée.
918 918
  */
919 919
 function _image_imagewebp($img, $fichier, $qualite = _IMG_GD_QUALITE) {
920
-	if (!function_exists('imagewebp')) {
921
-		return false;
922
-	}
923
-	$tmp = $fichier . ".tmp";
924
-	$ret = imagewebp($img, $tmp, $qualite);
925
-	if (file_exists($tmp)) {
926
-		$taille_test = getimagesize($tmp);
927
-		if ($taille_test[0] < 1) {
928
-			return false;
929
-		}
930
-
931
-		spip_unlink($fichier); // le fichier peut deja exister
932
-		@rename($tmp, $fichier);
933
-
934
-		return $ret;
935
-	}
936
-
937
-	return false;
920
+    if (!function_exists('imagewebp')) {
921
+        return false;
922
+    }
923
+    $tmp = $fichier . ".tmp";
924
+    $ret = imagewebp($img, $tmp, $qualite);
925
+    if (file_exists($tmp)) {
926
+        $taille_test = getimagesize($tmp);
927
+        if ($taille_test[0] < 1) {
928
+            return false;
929
+        }
930
+
931
+        spip_unlink($fichier); // le fichier peut deja exister
932
+        @rename($tmp, $fichier);
933
+
934
+        return $ret;
935
+    }
936
+
937
+    return false;
938 938
 }
939 939
 
940 940
 /**
@@ -954,35 +954,35 @@  discard block
 block discarded – undo
954 954
  */
955 955
 function _image_imagesvg($img, $fichier) {
956 956
 
957
-	$tmp = $fichier . ".tmp";
958
-	if (strpos($img, "<") === false) {
959
-		$img = supprimer_timestamp($img);
960
-		if (!file_exists($img)) {
961
-			return false;
962
-		}
963
-		@copy($img, $tmp);
964
-		if (filesize($tmp) == filesize($img)) {
965
-			spip_unlink($fichier); // le fichier peut deja exister
966
-			@rename($tmp, $fichier);
967
-			return true;
968
-		}
969
-		return false;
970
-	}
971
-
972
-	file_put_contents($tmp, $img);
973
-	if (file_exists($tmp)) {
974
-		$taille_test = spip_getimagesize($tmp);
975
-		if ($taille_test[0] < 1) {
976
-			return false;
977
-		}
978
-
979
-		spip_unlink($fichier); // le fichier peut deja exister
980
-		@rename($tmp, $fichier);
981
-
982
-		return true;
983
-	}
984
-
985
-	return false;
957
+    $tmp = $fichier . ".tmp";
958
+    if (strpos($img, "<") === false) {
959
+        $img = supprimer_timestamp($img);
960
+        if (!file_exists($img)) {
961
+            return false;
962
+        }
963
+        @copy($img, $tmp);
964
+        if (filesize($tmp) == filesize($img)) {
965
+            spip_unlink($fichier); // le fichier peut deja exister
966
+            @rename($tmp, $fichier);
967
+            return true;
968
+        }
969
+        return false;
970
+    }
971
+
972
+    file_put_contents($tmp, $img);
973
+    if (file_exists($tmp)) {
974
+        $taille_test = spip_getimagesize($tmp);
975
+        if ($taille_test[0] < 1) {
976
+            return false;
977
+        }
978
+
979
+        spip_unlink($fichier); // le fichier peut deja exister
980
+        @rename($tmp, $fichier);
981
+
982
+        return true;
983
+    }
984
+
985
+    return false;
986 986
 }
987 987
 
988 988
 
@@ -1010,29 +1010,29 @@  discard block
 block discarded – undo
1010 1010
  *     - false sinon.
1011 1011
  */
1012 1012
 function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE, $fonction = null) {
1013
-	if (is_null($fonction)) {
1014
-		$fonction = "_image_image" . $valeurs['format_dest'];
1015
-	}
1016
-	$ret = false;
1017
-	#un flag pour reperer les images gravees
1018
-	$lock =
1019
-		!statut_effacer_images_temporaires('get') // si la fonction n'a pas ete activee, on grave tout
1020
-	or (@file_exists($valeurs['fichier_dest']) and !@file_exists($valeurs['fichier_dest'] . '.src'));
1021
-	if (
1022
-		function_exists($fonction)
1023
-		&& ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) # on a reussi a creer l'image
1024
-		&& isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant
1025
-		&& !$lock
1026
-	) {
1027
-		if (@file_exists($valeurs['fichier_dest'])) {
1028
-			// dans tous les cas mettre a jour la taille de l'image finale
1029
-			list($valeurs["hauteur_dest"], $valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']);
1030
-			$valeurs['date'] = @filemtime($valeurs['fichier_dest']); // pour la retrouver apres disparition
1031
-			ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true);
1032
-		}
1033
-	}
1034
-
1035
-	return $ret;
1013
+    if (is_null($fonction)) {
1014
+        $fonction = "_image_image" . $valeurs['format_dest'];
1015
+    }
1016
+    $ret = false;
1017
+    #un flag pour reperer les images gravees
1018
+    $lock =
1019
+        !statut_effacer_images_temporaires('get') // si la fonction n'a pas ete activee, on grave tout
1020
+    or (@file_exists($valeurs['fichier_dest']) and !@file_exists($valeurs['fichier_dest'] . '.src'));
1021
+    if (
1022
+        function_exists($fonction)
1023
+        && ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) # on a reussi a creer l'image
1024
+        && isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant
1025
+        && !$lock
1026
+    ) {
1027
+        if (@file_exists($valeurs['fichier_dest'])) {
1028
+            // dans tous les cas mettre a jour la taille de l'image finale
1029
+            list($valeurs["hauteur_dest"], $valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']);
1030
+            $valeurs['date'] = @filemtime($valeurs['fichier_dest']); // pour la retrouver apres disparition
1031
+            ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true);
1032
+        }
1033
+    }
1034
+
1035
+    return $ret;
1036 1036
 }
1037 1037
 
1038 1038
 /**
@@ -1045,26 +1045,26 @@  discard block
 block discarded – undo
1045 1045
  *     Chemin vers le fichier manquant
1046 1046
  **/
1047 1047
 function reconstruire_image_intermediaire($fichier_manquant) {
1048
-	$reconstruire = array();
1049
-	$fichier = $fichier_manquant;
1050
-	while (strpos($fichier,"://")===false
1051
-		and !@file_exists($fichier)
1052
-		and lire_fichier($src = "$fichier.src", $source)
1053
-		and $valeurs = unserialize($source)
1054
-		and ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1055
-	) {
1056
-		spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant
1057
-		$reconstruire[] = $valeurs['reconstruction'];
1058
-	}
1059
-	while (count($reconstruire)) {
1060
-		$r = array_pop($reconstruire);
1061
-		$fonction = $r[0];
1062
-		$args = $r[1];
1063
-		call_user_func_array($fonction, $args);
1064
-	}
1065
-	// cette image intermediaire est commune a plusieurs series de filtre, il faut la conserver
1066
-	// mais l'on peut nettoyer les miettes de sa creation
1067
-	ramasse_miettes($fichier_manquant);
1048
+    $reconstruire = array();
1049
+    $fichier = $fichier_manquant;
1050
+    while (strpos($fichier,"://")===false
1051
+        and !@file_exists($fichier)
1052
+        and lire_fichier($src = "$fichier.src", $source)
1053
+        and $valeurs = unserialize($source)
1054
+        and ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1055
+    ) {
1056
+        spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant
1057
+        $reconstruire[] = $valeurs['reconstruction'];
1058
+    }
1059
+    while (count($reconstruire)) {
1060
+        $r = array_pop($reconstruire);
1061
+        $fonction = $r[0];
1062
+        $args = $r[1];
1063
+        call_user_func_array($fonction, $args);
1064
+    }
1065
+    // cette image intermediaire est commune a plusieurs series de filtre, il faut la conserver
1066
+    // mais l'on peut nettoyer les miettes de sa creation
1067
+    ramasse_miettes($fichier_manquant);
1068 1068
 }
1069 1069
 
1070 1070
 /**
@@ -1084,25 +1084,25 @@  discard block
 block discarded – undo
1084 1084
  *     Chemin du fichier d'image calculé
1085 1085
  **/
1086 1086
 function ramasse_miettes($fichier) {
1087
-	if (strpos($fichier,"://")!==false
1088
-		or !lire_fichier($src = "$fichier.src", $source)
1089
-		or !$valeurs = unserialize($source)
1090
-	) {
1091
-		return;
1092
-	}
1093
-	spip_unlink($src); # on supprime la reference a sa source pour marquer cette image comme non intermediaire
1094
-	while (
1095
-		($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1096
-		and (substr($fichier, 0, strlen(_DIR_VAR)) == _DIR_VAR) # et est dans local
1097
-		and (lire_fichier($src = "$fichier.src",
1098
-			$source)) # le fichier a une source connue (c'est donc une image calculee intermediaire)
1099
-		and ($valeurs = unserialize($source))  # et valide
1100
-	) {
1101
-		# on efface le fichier
1102
-		spip_unlink($fichier);
1103
-		# mais laisse le .src qui permet de savoir comment reconstruire l'image si besoin
1104
-		#spip_unlink($src);
1105
-	}
1087
+    if (strpos($fichier,"://")!==false
1088
+        or !lire_fichier($src = "$fichier.src", $source)
1089
+        or !$valeurs = unserialize($source)
1090
+    ) {
1091
+        return;
1092
+    }
1093
+    spip_unlink($src); # on supprime la reference a sa source pour marquer cette image comme non intermediaire
1094
+    while (
1095
+        ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...)
1096
+        and (substr($fichier, 0, strlen(_DIR_VAR)) == _DIR_VAR) # et est dans local
1097
+        and (lire_fichier($src = "$fichier.src",
1098
+            $source)) # le fichier a une source connue (c'est donc une image calculee intermediaire)
1099
+        and ($valeurs = unserialize($source))  # et valide
1100
+    ) {
1101
+        # on efface le fichier
1102
+        spip_unlink($fichier);
1103
+        # mais laisse le .src qui permet de savoir comment reconstruire l'image si besoin
1104
+        #spip_unlink($src);
1105
+    }
1106 1106
 }
1107 1107
 
1108 1108
 
@@ -1127,71 +1127,71 @@  discard block
 block discarded – undo
1127 1127
  *     Code HTML de l'image
1128 1128
  **/
1129 1129
 function image_graver($img) {
1130
-	// appeler le filtre post_image_filtrer qui permet de faire
1131
-	// des traitements auto a la fin d'une serie de filtres
1132
-	$img = pipeline('post_image_filtrer', $img);
1133
-
1134
-	$fichier_ori = $fichier = extraire_attribut($img, 'src');
1135
-	if (($p = strpos($fichier, '?')) !== false) {
1136
-		$fichier = substr($fichier, 0, $p);
1137
-	}
1138
-	if (strlen($fichier) < 1) {
1139
-		$fichier = $img;
1140
-	}
1141
-	# si jamais le fichier final n'a pas ete calcule car suppose temporaire
1142
-	# et qu'il ne s'agit pas d'une URL
1143
-	if (strpos($fichier,"://")===false and !@file_exists($fichier)) {
1144
-		reconstruire_image_intermediaire($fichier);
1145
-	}
1146
-	ramasse_miettes($fichier);
1147
-
1148
-	// ajouter le timestamp si besoin
1149
-	if (strpos($fichier_ori, "?") === false) {
1150
-		// on utilise str_replace pour attraper le onmouseover des logo si besoin
1151
-		$img = str_replace($fichier_ori, timestamp($fichier_ori), $img);
1152
-	}
1153
-
1154
-	return $img;
1130
+    // appeler le filtre post_image_filtrer qui permet de faire
1131
+    // des traitements auto a la fin d'une serie de filtres
1132
+    $img = pipeline('post_image_filtrer', $img);
1133
+
1134
+    $fichier_ori = $fichier = extraire_attribut($img, 'src');
1135
+    if (($p = strpos($fichier, '?')) !== false) {
1136
+        $fichier = substr($fichier, 0, $p);
1137
+    }
1138
+    if (strlen($fichier) < 1) {
1139
+        $fichier = $img;
1140
+    }
1141
+    # si jamais le fichier final n'a pas ete calcule car suppose temporaire
1142
+    # et qu'il ne s'agit pas d'une URL
1143
+    if (strpos($fichier,"://")===false and !@file_exists($fichier)) {
1144
+        reconstruire_image_intermediaire($fichier);
1145
+    }
1146
+    ramasse_miettes($fichier);
1147
+
1148
+    // ajouter le timestamp si besoin
1149
+    if (strpos($fichier_ori, "?") === false) {
1150
+        // on utilise str_replace pour attraper le onmouseover des logo si besoin
1151
+        $img = str_replace($fichier_ori, timestamp($fichier_ori), $img);
1152
+    }
1153
+
1154
+    return $img;
1155 1155
 }
1156 1156
 
1157 1157
 
1158 1158
 if (!function_exists("imagepalettetotruecolor")) {
1159
-	/**
1160
-	 * Transforme une image à palette indexée (256 couleurs max) en "vraies" couleurs RGB
1161
-	 *
1162
-	 * @note Pour compatibilité avec PHP < 5.5
1163
-	 *
1164
-	 * @link http://php.net/manual/fr/function.imagepalettetotruecolor.php
1165
-	 *
1166
-	 * @param ressource $img
1167
-	 * @return bool
1168
-	 *     - true si l'image est déjà en vrai RGB ou peut être transformée
1169
-	 *     - false si la transformation ne peut être faite.
1170
-	 **/
1171
-	function imagepalettetotruecolor(&$img) {
1172
-		if (!$img or !function_exists('imagecreatetruecolor')) {
1173
-			return false;
1174
-		} elseif (!imageistruecolor($img)) {
1175
-			$w = imagesx($img);
1176
-			$h = imagesy($img);
1177
-			$img1 = imagecreatetruecolor($w, $h);
1178
-			//Conserver la transparence si possible
1179
-			if (function_exists('ImageCopyResampled')) {
1180
-				if (function_exists("imageAntiAlias")) {
1181
-					imageAntiAlias($img1, true);
1182
-				}
1183
-				@imagealphablending($img1, false);
1184
-				@imagesavealpha($img1, true);
1185
-				@ImageCopyResampled($img1, $img, 0, 0, 0, 0, $w, $h, $w, $h);
1186
-			} else {
1187
-				imagecopy($img1, $img, 0, 0, 0, 0, $w, $h);
1188
-			}
1189
-
1190
-			$img = $img1;
1191
-		}
1192
-
1193
-		return true;
1194
-	}
1159
+    /**
1160
+     * Transforme une image à palette indexée (256 couleurs max) en "vraies" couleurs RGB
1161
+     *
1162
+     * @note Pour compatibilité avec PHP < 5.5
1163
+     *
1164
+     * @link http://php.net/manual/fr/function.imagepalettetotruecolor.php
1165
+     *
1166
+     * @param ressource $img
1167
+     * @return bool
1168
+     *     - true si l'image est déjà en vrai RGB ou peut être transformée
1169
+     *     - false si la transformation ne peut être faite.
1170
+     **/
1171
+    function imagepalettetotruecolor(&$img) {
1172
+        if (!$img or !function_exists('imagecreatetruecolor')) {
1173
+            return false;
1174
+        } elseif (!imageistruecolor($img)) {
1175
+            $w = imagesx($img);
1176
+            $h = imagesy($img);
1177
+            $img1 = imagecreatetruecolor($w, $h);
1178
+            //Conserver la transparence si possible
1179
+            if (function_exists('ImageCopyResampled')) {
1180
+                if (function_exists("imageAntiAlias")) {
1181
+                    imageAntiAlias($img1, true);
1182
+                }
1183
+                @imagealphablending($img1, false);
1184
+                @imagesavealpha($img1, true);
1185
+                @ImageCopyResampled($img1, $img, 0, 0, 0, 0, $w, $h, $w, $h);
1186
+            } else {
1187
+                imagecopy($img1, $img, 0, 0, 0, 0, $w, $h);
1188
+            }
1189
+
1190
+            $img = $img1;
1191
+        }
1192
+
1193
+        return true;
1194
+    }
1195 1195
 }
1196 1196
 
1197 1197
 /**
@@ -1218,32 +1218,32 @@  discard block
 block discarded – undo
1218 1218
  *     Code html modifié de la balise.
1219 1219
  **/
1220 1220
 function _image_tag_changer_taille($tag, $width, $height, $style = false) {
1221
-	if ($style === false) {
1222
-		$style = extraire_attribut($tag, 'style');
1223
-	}
1224
-
1225
-	// enlever le width et height du style
1226
-	$style = preg_replace(",(^|;)\s*(width|height)\s*:\s*[^;]+,ims", "", $style);
1227
-	if ($style and $style[0] == ';') {
1228
-		$style = substr($style, 1);
1229
-	}
1230
-
1231
-	// mettre des attributs de width et height sur les images, 
1232
-	// ca accelere le rendu du navigateur
1233
-	// ca permet aux navigateurs de reserver la bonne taille 
1234
-	// quand on a desactive l'affichage des images.
1235
-	$tag = inserer_attribut($tag, 'width', round($width));
1236
-	$tag = inserer_attribut($tag, 'height', round($height));
1237
-
1238
-	// attributs deprecies. Transformer en CSS
1239
-	if ($espace = extraire_attribut($tag, 'hspace')) {
1240
-		$style = "margin:${espace}px;" . $style;
1241
-		$tag = inserer_attribut($tag, 'hspace', '');
1242
-	}
1243
-
1244
-	$tag = inserer_attribut($tag, 'style', $style, true, $style ? false : true);
1245
-
1246
-	return $tag;
1221
+    if ($style === false) {
1222
+        $style = extraire_attribut($tag, 'style');
1223
+    }
1224
+
1225
+    // enlever le width et height du style
1226
+    $style = preg_replace(",(^|;)\s*(width|height)\s*:\s*[^;]+,ims", "", $style);
1227
+    if ($style and $style[0] == ';') {
1228
+        $style = substr($style, 1);
1229
+    }
1230
+
1231
+    // mettre des attributs de width et height sur les images, 
1232
+    // ca accelere le rendu du navigateur
1233
+    // ca permet aux navigateurs de reserver la bonne taille 
1234
+    // quand on a desactive l'affichage des images.
1235
+    $tag = inserer_attribut($tag, 'width', round($width));
1236
+    $tag = inserer_attribut($tag, 'height', round($height));
1237
+
1238
+    // attributs deprecies. Transformer en CSS
1239
+    if ($espace = extraire_attribut($tag, 'hspace')) {
1240
+        $style = "margin:${espace}px;" . $style;
1241
+        $tag = inserer_attribut($tag, 'hspace', '');
1242
+    }
1243
+
1244
+    $tag = inserer_attribut($tag, 'style', $style, true, $style ? false : true);
1245
+
1246
+    return $tag;
1247 1247
 }
1248 1248
 
1249 1249
 
@@ -1269,71 +1269,71 @@  discard block
 block discarded – undo
1269 1269
  *     Retourne le code HTML de l'image
1270 1270
  **/
1271 1271
 function _image_ecrire_tag($valeurs, $surcharge = array()) {
1272
-	$valeurs = pipeline('image_ecrire_tag_preparer', $valeurs);
1273
-
1274
-	// fermer les tags img pas bien fermes;
1275
-	$tag = str_replace(">", "/>", str_replace("/>", ">", $valeurs['tag']));
1276
-
1277
-	// le style
1278
-	$style = $valeurs['style'];
1279
-	if (isset($surcharge['style'])) {
1280
-		$style = $surcharge['style'];
1281
-		unset($surcharge['style']);
1282
-	}
1283
-
1284
-	// traiter specifiquement la largeur et la hauteur
1285
-	$width = $valeurs['largeur'];
1286
-	if (isset($surcharge['width'])) {
1287
-		$width = $surcharge['width'];
1288
-		unset($surcharge['width']);
1289
-	}
1290
-	$height = $valeurs['hauteur'];
1291
-	if (isset($surcharge['height'])) {
1292
-		$height = $surcharge['height'];
1293
-		unset($surcharge['height']);
1294
-	}
1295
-
1296
-	$tag = _image_tag_changer_taille($tag, $width, $height, $style);
1297
-	// traiter specifiquement le src qui peut etre repris dans un onmouseout
1298
-	// on remplace toute les ref a src dans le tag
1299
-	$src = extraire_attribut($tag, 'src');
1300
-	if (isset($surcharge['src'])) {
1301
-		$tag = str_replace($src, $surcharge['src'], $tag);
1302
-		// si il y a des & dans src, alors ils peuvent provenir d'un &amp
1303
-		// pas garanti comme methode, mais mieux que rien
1304
-		if (strpos($src, '&') !== false) {
1305
-			$tag = str_replace(str_replace("&", "&amp;", $src), $surcharge['src'], $tag);
1306
-		}
1307
-		$src = $surcharge['src'];
1308
-		unset($surcharge['src']);
1309
-	}
1310
-
1311
-	$class = $valeurs['class'];
1312
-	if (isset($surcharge['class'])) {
1313
-		$class = $surcharge['class'];
1314
-		unset($surcharge['class']);
1315
-	}
1316
-	if (strlen($class)) {
1317
-		$tag = inserer_attribut($tag, 'class', $class);
1318
-	}
1319
-
1320
-	if (count($surcharge)) {
1321
-		foreach ($surcharge as $attribut => $valeur) {
1322
-			$tag = inserer_attribut($tag, $attribut, $valeur);
1323
-		}
1324
-	}
1325
-
1326
-	$tag = pipeline('image_ecrire_tag_finir',
1327
-		array(
1328
-			'args' => array(
1329
-				'valeurs' => $valeurs,
1330
-				'surcharge' => $surcharge,
1331
-			),
1332
-			'data' => $tag
1333
-		)
1334
-	);
1335
-
1336
-	return $tag;
1272
+    $valeurs = pipeline('image_ecrire_tag_preparer', $valeurs);
1273
+
1274
+    // fermer les tags img pas bien fermes;
1275
+    $tag = str_replace(">", "/>", str_replace("/>", ">", $valeurs['tag']));
1276
+
1277
+    // le style
1278
+    $style = $valeurs['style'];
1279
+    if (isset($surcharge['style'])) {
1280
+        $style = $surcharge['style'];
1281
+        unset($surcharge['style']);
1282
+    }
1283
+
1284
+    // traiter specifiquement la largeur et la hauteur
1285
+    $width = $valeurs['largeur'];
1286
+    if (isset($surcharge['width'])) {
1287
+        $width = $surcharge['width'];
1288
+        unset($surcharge['width']);
1289
+    }
1290
+    $height = $valeurs['hauteur'];
1291
+    if (isset($surcharge['height'])) {
1292
+        $height = $surcharge['height'];
1293
+        unset($surcharge['height']);
1294
+    }
1295
+
1296
+    $tag = _image_tag_changer_taille($tag, $width, $height, $style);
1297
+    // traiter specifiquement le src qui peut etre repris dans un onmouseout
1298
+    // on remplace toute les ref a src dans le tag
1299
+    $src = extraire_attribut($tag, 'src');
1300
+    if (isset($surcharge['src'])) {
1301
+        $tag = str_replace($src, $surcharge['src'], $tag);
1302
+        // si il y a des & dans src, alors ils peuvent provenir d'un &amp
1303
+        // pas garanti comme methode, mais mieux que rien
1304
+        if (strpos($src, '&') !== false) {
1305
+            $tag = str_replace(str_replace("&", "&amp;", $src), $surcharge['src'], $tag);
1306
+        }
1307
+        $src = $surcharge['src'];
1308
+        unset($surcharge['src']);
1309
+    }
1310
+
1311
+    $class = $valeurs['class'];
1312
+    if (isset($surcharge['class'])) {
1313
+        $class = $surcharge['class'];
1314
+        unset($surcharge['class']);
1315
+    }
1316
+    if (strlen($class)) {
1317
+        $tag = inserer_attribut($tag, 'class', $class);
1318
+    }
1319
+
1320
+    if (count($surcharge)) {
1321
+        foreach ($surcharge as $attribut => $valeur) {
1322
+            $tag = inserer_attribut($tag, $attribut, $valeur);
1323
+        }
1324
+    }
1325
+
1326
+    $tag = pipeline('image_ecrire_tag_finir',
1327
+        array(
1328
+            'args' => array(
1329
+                'valeurs' => $valeurs,
1330
+                'surcharge' => $surcharge,
1331
+            ),
1332
+            'data' => $tag
1333
+        )
1334
+    );
1335
+
1336
+    return $tag;
1337 1337
 }
1338 1338
 
1339 1339
 /**
@@ -1356,253 +1356,253 @@  discard block
 block discarded – undo
1356 1356
  *     Description de l'image, sinon null.
1357 1357
  **/
1358 1358
 function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO', $force = false) {
1359
-	// ordre de preference des formats graphiques pour creer les vignettes
1360
-	// le premier format disponible, selon la methode demandee, est utilise
1361
-	$image = $valeurs['fichier'];
1362
-	$format = $valeurs['format_source'];
1363
-	$destdir = dirname($valeurs['fichier_dest']);
1364
-	$destfile = basename($valeurs['fichier_dest'], "." . $valeurs["format_dest"]);
1365
-
1366
-	$format_sortie = $valeurs['format_dest'];
1367
-
1368
-	if (($process == 'AUTO') and isset($GLOBALS['meta']['image_process'])) {
1369
-		$process = $GLOBALS['meta']['image_process'];
1370
-	}
1371
-
1372
-	// si le doc n'est pas une image dans un format accetpable, refuser
1373
-	if (!$force and !in_array($format, formats_image_acceptables(in_array($process, ['gd1', 'gd2'])))) {
1374
-		return;
1375
-	}
1376
-	$destination = "$destdir/$destfile";
1377
-
1378
-	// calculer la taille
1379
-	if (($srcWidth = $valeurs['largeur']) && ($srcHeight = $valeurs['hauteur'])) {
1380
-		if (!($destWidth = $valeurs['largeur_dest']) || !($destHeight = $valeurs['hauteur_dest'])) {
1381
-			list($destWidth, $destHeight) = _image_ratio($valeurs['largeur'], $valeurs['hauteur'], $maxWidth, $maxHeight);
1382
-		}
1383
-	} elseif ($process == 'convert' or $process == 'imagick') {
1384
-		$destWidth = $maxWidth;
1385
-		$destHeight = $maxHeight;
1386
-	} else {
1387
-		spip_log("echec $process sur $image");
1388
-
1389
-		return;
1390
-	}
1391
-
1392
-	$vignette = '';
1393
-
1394
-	// Si l'image est de la taille demandee (ou plus petite), simplement la retourner
1395
-	if ($srcWidth and $srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1396
-		$vignette = $destination . '.' . $format;
1397
-		@copy($image, $vignette);
1398
-	}
1399
-
1400
-	elseif ($valeurs["format_source"] === 'svg') {
1401
-		if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)){
1402
-			$format_sortie = 'svg';
1403
-			$vignette = $destination . "." . $format_sortie;
1404
-			$valeurs['fichier_dest'] = $vignette;
1405
-			_image_gd_output($svg, $valeurs);
1406
-		}
1407
-	}
1408
-
1409
-	// imagemagick en ligne de commande
1410
-	elseif ($process == 'convert') {
1411
-		if (!defined('_CONVERT_COMMAND')) {
1412
-			define('_CONVERT_COMMAND', 'convert');
1413
-		} // Securite : mes_options.php peut preciser le chemin absolu
1414
-		if (!defined('_RESIZE_COMMAND')) {
1415
-			define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -resize %xx%y! %src %dest');
1416
-		}
1417
-		$vignette = $destination . "." . $format_sortie;
1418
-		$commande = str_replace(
1419
-			array('%x', '%y', '%src', '%dest'),
1420
-			array(
1421
-				$destWidth,
1422
-				$destHeight,
1423
-				escapeshellcmd($image),
1424
-				escapeshellcmd($vignette)
1425
-			),
1426
-			_RESIZE_COMMAND);
1427
-		spip_log($commande);
1428
-		exec($commande);
1429
-		if (!@file_exists($vignette)) {
1430
-			spip_log("echec convert sur $vignette");
1431
-
1432
-			return;  // echec commande
1433
-		}
1434
-	}
1435
-
1436
-	// php5 imagemagick
1437
-	elseif ($process == 'imagick') {
1438
-		$vignette = "$destination." . $format_sortie;
1439
-
1440
-		if (!class_exists('Imagick')) {
1441
-			spip_log("Classe Imagick absente !", _LOG_ERREUR);
1442
-
1443
-			return;
1444
-		}
1445
-		$imagick = new Imagick();
1446
-		$imagick->readImage($image);
1447
-		$imagick->resizeImage($destWidth, $destHeight, Imagick::FILTER_LANCZOS,
1448
-			1);//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1449
-		$imagick->writeImage($vignette);
1450
-
1451
-		if (!@file_exists($vignette)) {
1452
-			spip_log("echec imagick sur $vignette");
1453
-
1454
-			return;
1455
-		}
1456
-	}
1457
-
1458
-	// netpbm
1459
-	elseif ($process == "netpbm") {
1460
-		if (!defined('_PNMSCALE_COMMAND')) {
1461
-			define('_PNMSCALE_COMMAND', 'pnmscale');
1462
-		} // Securite : mes_options.php peut preciser le chemin absolu
1463
-		if (_PNMSCALE_COMMAND == '') {
1464
-			return;
1465
-		}
1466
-		$vignette = $destination . "." . $format_sortie;
1467
-		$pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND);
1468
-		if ($format == "jpg") {
1469
-
1470
-			$jpegtopnm_command = str_replace("pnmscale", "jpegtopnm", _PNMSCALE_COMMAND);
1471
-			exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1472
-			if (!($s = @filesize($vignette))) {
1473
-				spip_unlink($vignette);
1474
-			}
1475
-			if (!@file_exists($vignette)) {
1476
-				spip_log("echec netpbm-jpg sur $vignette");
1477
-
1478
-				return;
1479
-			}
1480
-		} else {
1481
-			if ($format == "gif") {
1482
-				$giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND);
1483
-				exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1484
-				if (!($s = @filesize($vignette))) {
1485
-					spip_unlink($vignette);
1486
-				}
1487
-				if (!@file_exists($vignette)) {
1488
-					spip_log("echec netpbm-gif sur $vignette");
1489
-
1490
-					return;
1491
-				}
1492
-			} else {
1493
-				if ($format == "png") {
1494
-					$pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND);
1495
-					exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1496
-					if (!($s = @filesize($vignette))) {
1497
-						spip_unlink($vignette);
1498
-					}
1499
-					if (!@file_exists($vignette)) {
1500
-						spip_log("echec netpbm-png sur $vignette");
1501
-
1502
-						return;
1503
-					}
1504
-				}
1505
-			}
1506
-		}
1507
-	}
1508
-
1509
-	// gd ou gd2
1510
-	elseif ($process == 'gd1' or $process == 'gd2') {
1511
-		if (!function_exists('gd_info')) {
1512
-			spip_log("Librairie GD absente !", _LOG_ERREUR);
1513
-
1514
-			return;
1515
-		}
1516
-		if (_IMG_GD_MAX_PIXELS && $srcWidth * $srcHeight > _IMG_GD_MAX_PIXELS) {
1517
-			spip_log("vignette gd1/gd2 impossible : " . $srcWidth * $srcHeight . "pixels");
1518
-
1519
-			return;
1520
-		}
1521
-		$destFormat = $format_sortie;
1522
-		if (!$destFormat) {
1523
-			spip_log("pas de format pour $image");
1524
-
1525
-			return;
1526
-		}
1527
-
1528
-		$fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom'];
1529
-		if (!function_exists($fonction_imagecreatefrom)) {
1530
-			return '';
1531
-		}
1532
-		$srcImage = @$fonction_imagecreatefrom($image);
1533
-		if (!$srcImage) {
1534
-			spip_log("echec gd1/gd2");
1535
-
1536
-			return;
1537
-		}
1538
-
1539
-		// Initialisation de l'image destination
1540
-		$destImage = null;
1541
-		if ($process == 'gd2' and $destFormat != "gif") {
1542
-			$destImage = ImageCreateTrueColor($destWidth, $destHeight);
1543
-		}
1544
-		if (!$destImage) {
1545
-			$destImage = ImageCreate($destWidth, $destHeight);
1546
-		}
1547
-
1548
-		// Recopie de l'image d'origine avec adaptation de la taille 
1549
-		$ok = false;
1550
-		if (($process == 'gd2') and function_exists('ImageCopyResampled')) {
1551
-			if ($format == "gif") {
1552
-				// Si un GIF est transparent, 
1553
-				// fabriquer un PNG transparent  
1554
-				$transp = imagecolortransparent($srcImage);
1555
-				if ($transp > 0) {
1556
-					$destFormat = "png";
1557
-				}
1558
-			}
1559
-			if (in_array($destFormat, _image_extensions_conservent_transparence())) {
1560
-				// Conserver la transparence 
1561
-				if (function_exists("imageAntiAlias")) {
1562
-					imageAntiAlias($destImage, true);
1563
-				}
1564
-				@imagealphablending($destImage, false);
1565
-				@imagesavealpha($destImage, true);
1566
-			}
1567
-			$ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1568
-		}
1569
-		if (!$ok) {
1570
-			$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1571
-		}
1572
-
1573
-		// Sauvegarde de l'image destination
1574
-		$valeurs['fichier_dest'] = $vignette = "$destination.$destFormat";
1575
-		$valeurs['format_dest'] = $format = $destFormat;
1576
-		_image_gd_output($destImage, $valeurs);
1577
-
1578
-		if ($srcImage) {
1579
-			ImageDestroy($srcImage);
1580
-		}
1581
-		ImageDestroy($destImage);
1582
-	}
1583
-
1584
-	if (!$vignette or !$size = @spip_getimagesize($vignette)) {
1585
-		$size = array($destWidth, $destHeight);
1586
-	}
1587
-
1588
-	// Gaffe: en safe mode, pas d'acces a la vignette,
1589
-	// donc risque de balancer "width='0'", ce qui masque l'image sous MSIE
1590
-	if ($size[0] < 1) {
1591
-		$size[0] = $destWidth;
1592
-	}
1593
-	if ($size[1] < 1) {
1594
-		$size[1] = $destHeight;
1595
-	}
1596
-
1597
-	$retour['width'] = $largeur = $size[0];
1598
-	$retour['height'] = $hauteur = $size[1];
1599
-
1600
-	$retour['fichier'] = $vignette;
1601
-	$retour['format'] = $format;
1602
-	$retour['date'] = @filemtime($vignette);
1603
-
1604
-	// renvoyer l'image
1605
-	return $retour;
1359
+    // ordre de preference des formats graphiques pour creer les vignettes
1360
+    // le premier format disponible, selon la methode demandee, est utilise
1361
+    $image = $valeurs['fichier'];
1362
+    $format = $valeurs['format_source'];
1363
+    $destdir = dirname($valeurs['fichier_dest']);
1364
+    $destfile = basename($valeurs['fichier_dest'], "." . $valeurs["format_dest"]);
1365
+
1366
+    $format_sortie = $valeurs['format_dest'];
1367
+
1368
+    if (($process == 'AUTO') and isset($GLOBALS['meta']['image_process'])) {
1369
+        $process = $GLOBALS['meta']['image_process'];
1370
+    }
1371
+
1372
+    // si le doc n'est pas une image dans un format accetpable, refuser
1373
+    if (!$force and !in_array($format, formats_image_acceptables(in_array($process, ['gd1', 'gd2'])))) {
1374
+        return;
1375
+    }
1376
+    $destination = "$destdir/$destfile";
1377
+
1378
+    // calculer la taille
1379
+    if (($srcWidth = $valeurs['largeur']) && ($srcHeight = $valeurs['hauteur'])) {
1380
+        if (!($destWidth = $valeurs['largeur_dest']) || !($destHeight = $valeurs['hauteur_dest'])) {
1381
+            list($destWidth, $destHeight) = _image_ratio($valeurs['largeur'], $valeurs['hauteur'], $maxWidth, $maxHeight);
1382
+        }
1383
+    } elseif ($process == 'convert' or $process == 'imagick') {
1384
+        $destWidth = $maxWidth;
1385
+        $destHeight = $maxHeight;
1386
+    } else {
1387
+        spip_log("echec $process sur $image");
1388
+
1389
+        return;
1390
+    }
1391
+
1392
+    $vignette = '';
1393
+
1394
+    // Si l'image est de la taille demandee (ou plus petite), simplement la retourner
1395
+    if ($srcWidth and $srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1396
+        $vignette = $destination . '.' . $format;
1397
+        @copy($image, $vignette);
1398
+    }
1399
+
1400
+    elseif ($valeurs["format_source"] === 'svg') {
1401
+        if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)){
1402
+            $format_sortie = 'svg';
1403
+            $vignette = $destination . "." . $format_sortie;
1404
+            $valeurs['fichier_dest'] = $vignette;
1405
+            _image_gd_output($svg, $valeurs);
1406
+        }
1407
+    }
1408
+
1409
+    // imagemagick en ligne de commande
1410
+    elseif ($process == 'convert') {
1411
+        if (!defined('_CONVERT_COMMAND')) {
1412
+            define('_CONVERT_COMMAND', 'convert');
1413
+        } // Securite : mes_options.php peut preciser le chemin absolu
1414
+        if (!defined('_RESIZE_COMMAND')) {
1415
+            define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -resize %xx%y! %src %dest');
1416
+        }
1417
+        $vignette = $destination . "." . $format_sortie;
1418
+        $commande = str_replace(
1419
+            array('%x', '%y', '%src', '%dest'),
1420
+            array(
1421
+                $destWidth,
1422
+                $destHeight,
1423
+                escapeshellcmd($image),
1424
+                escapeshellcmd($vignette)
1425
+            ),
1426
+            _RESIZE_COMMAND);
1427
+        spip_log($commande);
1428
+        exec($commande);
1429
+        if (!@file_exists($vignette)) {
1430
+            spip_log("echec convert sur $vignette");
1431
+
1432
+            return;  // echec commande
1433
+        }
1434
+    }
1435
+
1436
+    // php5 imagemagick
1437
+    elseif ($process == 'imagick') {
1438
+        $vignette = "$destination." . $format_sortie;
1439
+
1440
+        if (!class_exists('Imagick')) {
1441
+            spip_log("Classe Imagick absente !", _LOG_ERREUR);
1442
+
1443
+            return;
1444
+        }
1445
+        $imagick = new Imagick();
1446
+        $imagick->readImage($image);
1447
+        $imagick->resizeImage($destWidth, $destHeight, Imagick::FILTER_LANCZOS,
1448
+            1);//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
1449
+        $imagick->writeImage($vignette);
1450
+
1451
+        if (!@file_exists($vignette)) {
1452
+            spip_log("echec imagick sur $vignette");
1453
+
1454
+            return;
1455
+        }
1456
+    }
1457
+
1458
+    // netpbm
1459
+    elseif ($process == "netpbm") {
1460
+        if (!defined('_PNMSCALE_COMMAND')) {
1461
+            define('_PNMSCALE_COMMAND', 'pnmscale');
1462
+        } // Securite : mes_options.php peut preciser le chemin absolu
1463
+        if (_PNMSCALE_COMMAND == '') {
1464
+            return;
1465
+        }
1466
+        $vignette = $destination . "." . $format_sortie;
1467
+        $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND);
1468
+        if ($format == "jpg") {
1469
+
1470
+            $jpegtopnm_command = str_replace("pnmscale", "jpegtopnm", _PNMSCALE_COMMAND);
1471
+            exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1472
+            if (!($s = @filesize($vignette))) {
1473
+                spip_unlink($vignette);
1474
+            }
1475
+            if (!@file_exists($vignette)) {
1476
+                spip_log("echec netpbm-jpg sur $vignette");
1477
+
1478
+                return;
1479
+            }
1480
+        } else {
1481
+            if ($format == "gif") {
1482
+                $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND);
1483
+                exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1484
+                if (!($s = @filesize($vignette))) {
1485
+                    spip_unlink($vignette);
1486
+                }
1487
+                if (!@file_exists($vignette)) {
1488
+                    spip_log("echec netpbm-gif sur $vignette");
1489
+
1490
+                    return;
1491
+                }
1492
+            } else {
1493
+                if ($format == "png") {
1494
+                    $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND);
1495
+                    exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette");
1496
+                    if (!($s = @filesize($vignette))) {
1497
+                        spip_unlink($vignette);
1498
+                    }
1499
+                    if (!@file_exists($vignette)) {
1500
+                        spip_log("echec netpbm-png sur $vignette");
1501
+
1502
+                        return;
1503
+                    }
1504
+                }
1505
+            }
1506
+        }
1507
+    }
1508
+
1509
+    // gd ou gd2
1510
+    elseif ($process == 'gd1' or $process == 'gd2') {
1511
+        if (!function_exists('gd_info')) {
1512
+            spip_log("Librairie GD absente !", _LOG_ERREUR);
1513
+
1514
+            return;
1515
+        }
1516
+        if (_IMG_GD_MAX_PIXELS && $srcWidth * $srcHeight > _IMG_GD_MAX_PIXELS) {
1517
+            spip_log("vignette gd1/gd2 impossible : " . $srcWidth * $srcHeight . "pixels");
1518
+
1519
+            return;
1520
+        }
1521
+        $destFormat = $format_sortie;
1522
+        if (!$destFormat) {
1523
+            spip_log("pas de format pour $image");
1524
+
1525
+            return;
1526
+        }
1527
+
1528
+        $fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom'];
1529
+        if (!function_exists($fonction_imagecreatefrom)) {
1530
+            return '';
1531
+        }
1532
+        $srcImage = @$fonction_imagecreatefrom($image);
1533
+        if (!$srcImage) {
1534
+            spip_log("echec gd1/gd2");
1535
+
1536
+            return;
1537
+        }
1538
+
1539
+        // Initialisation de l'image destination
1540
+        $destImage = null;
1541
+        if ($process == 'gd2' and $destFormat != "gif") {
1542
+            $destImage = ImageCreateTrueColor($destWidth, $destHeight);
1543
+        }
1544
+        if (!$destImage) {
1545
+            $destImage = ImageCreate($destWidth, $destHeight);
1546
+        }
1547
+
1548
+        // Recopie de l'image d'origine avec adaptation de la taille 
1549
+        $ok = false;
1550
+        if (($process == 'gd2') and function_exists('ImageCopyResampled')) {
1551
+            if ($format == "gif") {
1552
+                // Si un GIF est transparent, 
1553
+                // fabriquer un PNG transparent  
1554
+                $transp = imagecolortransparent($srcImage);
1555
+                if ($transp > 0) {
1556
+                    $destFormat = "png";
1557
+                }
1558
+            }
1559
+            if (in_array($destFormat, _image_extensions_conservent_transparence())) {
1560
+                // Conserver la transparence 
1561
+                if (function_exists("imageAntiAlias")) {
1562
+                    imageAntiAlias($destImage, true);
1563
+                }
1564
+                @imagealphablending($destImage, false);
1565
+                @imagesavealpha($destImage, true);
1566
+            }
1567
+            $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1568
+        }
1569
+        if (!$ok) {
1570
+            $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
1571
+        }
1572
+
1573
+        // Sauvegarde de l'image destination
1574
+        $valeurs['fichier_dest'] = $vignette = "$destination.$destFormat";
1575
+        $valeurs['format_dest'] = $format = $destFormat;
1576
+        _image_gd_output($destImage, $valeurs);
1577
+
1578
+        if ($srcImage) {
1579
+            ImageDestroy($srcImage);
1580
+        }
1581
+        ImageDestroy($destImage);
1582
+    }
1583
+
1584
+    if (!$vignette or !$size = @spip_getimagesize($vignette)) {
1585
+        $size = array($destWidth, $destHeight);
1586
+    }
1587
+
1588
+    // Gaffe: en safe mode, pas d'acces a la vignette,
1589
+    // donc risque de balancer "width='0'", ce qui masque l'image sous MSIE
1590
+    if ($size[0] < 1) {
1591
+        $size[0] = $destWidth;
1592
+    }
1593
+    if ($size[1] < 1) {
1594
+        $size[1] = $destHeight;
1595
+    }
1596
+
1597
+    $retour['width'] = $largeur = $size[0];
1598
+    $retour['height'] = $hauteur = $size[1];
1599
+
1600
+    $retour['fichier'] = $vignette;
1601
+    $retour['format'] = $format;
1602
+    $retour['date'] = @filemtime($vignette);
1603
+
1604
+    // renvoyer l'image
1605
+    return $retour;
1606 1606
 }
1607 1607
 
1608 1608
 /**
@@ -1622,25 +1622,25 @@  discard block
 block discarded – undo
1622 1622
  * @return array Liste [ largeur, hauteur, ratio de réduction ]
1623 1623
  **/
1624 1624
 function _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight) {
1625
-	$ratioWidth = $srcWidth / $maxWidth;
1626
-	$ratioHeight = $srcHeight / $maxHeight;
1627
-
1628
-	if ($srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1629
-		$destWidth = $srcWidth;
1630
-		$destHeight = $srcHeight;
1631
-	} elseif ($ratioWidth < $ratioHeight) {
1632
-		$destWidth = $srcWidth / $ratioHeight;
1633
-		$destHeight = $maxHeight;
1634
-	} else {
1635
-		$destWidth = $maxWidth;
1636
-		$destHeight = $srcHeight / $ratioWidth;
1637
-	}
1638
-
1639
-	return array(
1640
-		intval(round($destWidth)),
1641
-		intval(round($destHeight)),
1642
-		max($ratioWidth, $ratioHeight)
1643
-	);
1625
+    $ratioWidth = $srcWidth / $maxWidth;
1626
+    $ratioHeight = $srcHeight / $maxHeight;
1627
+
1628
+    if ($srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1629
+        $destWidth = $srcWidth;
1630
+        $destHeight = $srcHeight;
1631
+    } elseif ($ratioWidth < $ratioHeight) {
1632
+        $destWidth = $srcWidth / $ratioHeight;
1633
+        $destHeight = $maxHeight;
1634
+    } else {
1635
+        $destWidth = $maxWidth;
1636
+        $destHeight = $srcHeight / $ratioWidth;
1637
+    }
1638
+
1639
+    return array(
1640
+        intval(round($destWidth)),
1641
+        intval(round($destHeight)),
1642
+        max($ratioWidth, $ratioHeight)
1643
+    );
1644 1644
 }
1645 1645
 
1646 1646
 /**
@@ -1660,25 +1660,25 @@  discard block
 block discarded – undo
1660 1660
  * @return array Liste [ largeur, hauteur, ratio de réduction ]
1661 1661
  **/
1662 1662
 function ratio_passe_partout($srcWidth, $srcHeight, $maxWidth, $maxHeight) {
1663
-	$ratioWidth = $srcWidth / $maxWidth;
1664
-	$ratioHeight = $srcHeight / $maxHeight;
1665
-
1666
-	if ($srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1667
-		$destWidth = $srcWidth;
1668
-		$destHeight = $srcHeight;
1669
-	} elseif ($ratioWidth > $ratioHeight) {
1670
-		$destWidth = $srcWidth / $ratioHeight;
1671
-		$destHeight = $maxHeight;
1672
-	} else {
1673
-		$destWidth = $maxWidth;
1674
-		$destHeight = $srcHeight / $ratioWidth;
1675
-	}
1676
-
1677
-	return array(
1678
-		intval(round($destWidth)),
1679
-		intval(round($destHeight)),
1680
-		min($ratioWidth, $ratioHeight)
1681
-	);
1663
+    $ratioWidth = $srcWidth / $maxWidth;
1664
+    $ratioHeight = $srcHeight / $maxHeight;
1665
+
1666
+    if ($srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1667
+        $destWidth = $srcWidth;
1668
+        $destHeight = $srcHeight;
1669
+    } elseif ($ratioWidth > $ratioHeight) {
1670
+        $destWidth = $srcWidth / $ratioHeight;
1671
+        $destHeight = $maxHeight;
1672
+    } else {
1673
+        $destWidth = $maxWidth;
1674
+        $destHeight = $srcHeight / $ratioWidth;
1675
+    }
1676
+
1677
+    return array(
1678
+        intval(round($destWidth)),
1679
+        intval(round($destHeight)),
1680
+        min($ratioWidth, $ratioHeight)
1681
+    );
1682 1682
 }
1683 1683
 
1684 1684
 
@@ -1691,12 +1691,12 @@  discard block
 block discarded – undo
1691 1691
  * @return string
1692 1692
  */
1693 1693
 function process_image_svg_identite($image) {
1694
-	if ($image['creer']) {
1695
-		$source = $image['fichier'];
1696
-		_image_gd_output($source, $image);
1697
-	}
1694
+    if ($image['creer']) {
1695
+        $source = $image['fichier'];
1696
+        _image_gd_output($source, $image);
1697
+    }
1698 1698
 
1699
-	return _image_ecrire_tag($image, array('src' => $image['fichier_dest']));
1699
+    return _image_ecrire_tag($image, array('src' => $image['fichier_dest']));
1700 1700
 }
1701 1701
 
1702 1702
 
@@ -1729,104 +1729,104 @@  discard block
 block discarded – undo
1729 1729
  *     Code HTML de la balise img produite
1730 1730
  **/
1731 1731
 function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $process = 'AUTO') {
1732
-	$image = false;
1733
-	if (($process == 'AUTO') and isset($GLOBALS['meta']['image_process'])) {
1734
-		$process = $GLOBALS['meta']['image_process'];
1735
-	}
1736
-	# determiner le format de sortie
1737
-	$format_sortie = false; // le choix par defaut sera bon
1738
-	if ($process == "netpbm") {
1739
-		$format_sortie = "jpg";
1740
-	} elseif ($process == 'gd1' or $process == 'gd2') {
1741
-		$image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1742
-		// on verifie que l'extension choisie est bonne (en principe oui)
1743
-		$gd_formats = formats_image_acceptables(true);
1744
-		if (is_array($image)
1745
-			and (!in_array($image['format_dest'], $gd_formats)
1746
-				or (!in_array($image['format_dest'], _image_extensions_acceptees_en_sortie()))
1747
-			)
1748
-		) {
1749
-			if ($image['format_source'] == 'jpg') {
1750
-				$formats_sortie = array('jpg', 'png', 'gif');
1751
-			} else // les gif sont passes en png preferentiellement pour etre homogene aux autres filtres images
1752
-			{
1753
-				$formats_sortie = array('png', 'jpg', 'gif');
1754
-			}
1755
-			// Choisir le format destination
1756
-			// - on sauve de preference en JPEG (meilleure compression)
1757
-			// - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
1758
-			# bug : gd_formats contient la liste des fichiers qu'on sait *lire*,
1759
-			# pas *ecrire*
1760
-			$format_sortie = "";
1761
-			foreach ($formats_sortie as $fmt) {
1762
-				if (in_array($fmt, $gd_formats) and in_array($fmt, _image_extensions_acceptees_en_sortie())) {
1763
-					$format_sortie = $fmt;
1764
-					break;
1765
-				}
1766
-			}
1767
-			$image = false;
1768
-		}
1769
-	}
1770
-
1771
-	if (!is_array($image)) {
1772
-		$image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1773
-	}
1774
-
1775
-	if (!is_array($image) or !$image['largeur'] or !$image['hauteur']) {
1776
-		spip_log("image_reduire_src:pas de version locale de $img");
1777
-		// on peut resizer en mode html si on dispose des elements
1778
-		if ($srcw = extraire_attribut($img, 'width')
1779
-			and $srch = extraire_attribut($img, 'height')
1780
-		) {
1781
-			list($w, $h) = _image_ratio($srcw, $srch, $taille, $taille_y);
1782
-
1783
-			return _image_tag_changer_taille($img, $w, $h);
1784
-		}
1785
-		// la on n'a pas d'infos sur l'image source... on refile le truc a css
1786
-		// sous la forme style='max-width: NNpx;'
1787
-		return inserer_attribut($img, 'style',
1788
-			"max-width: ${taille}px; max-height: ${taille_y}px");
1789
-	}
1790
-
1791
-	// si l'image est plus petite que la cible retourner une copie cachee de l'image
1792
-	if (($image['largeur'] <= $taille) && ($image['hauteur'] <= $taille_y)) {
1793
-		if ($image['creer']) {
1794
-			@copy($image['fichier'], $image['fichier_dest']);
1795
-		}
1796
-
1797
-		return _image_ecrire_tag($image, array('src' => $image['fichier_dest']));
1798
-	}
1799
-
1800
-	if ($image['creer'] == false && !$force) {
1801
-		return _image_ecrire_tag($image,
1802
-			array('src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest']));
1803
-	}
1804
-
1805
-	if (in_array($image["format_source"], _image_extensions_acceptees_en_entree())) {
1806
-		$destWidth = $image['largeur_dest'];
1807
-		$destHeight = $image['hauteur_dest'];
1808
-		$logo = $image['fichier'];
1809
-		$date = $image["date_src"];
1810
-		$preview = _image_creer_vignette($image, $taille, $taille_y, $process, $force);
1811
-
1812
-		if ($preview && $preview['fichier']) {
1813
-			$logo = $preview['fichier'];
1814
-			$destWidth = $preview['width'];
1815
-			$destHeight = $preview['height'];
1816
-			$date = $preview['date'];
1817
-		}
1818
-		// dans l'espace prive mettre un timestamp sur l'adresse 
1819
-		// de l'image, de facon a tromper le cache du navigateur
1820
-		// quand on fait supprimer/reuploader un logo
1821
-		// (pas de filemtime si SAFE MODE)
1822
-		$date = test_espace_prive() ? ('?' . $date) : '';
1823
-
1824
-		return _image_ecrire_tag($image, array('src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight));
1825
-	}
1826
-	else {
1827
-		# BMP, tiff ... les redacteurs osent tout!
1828
-		return $img;
1829
-	}
1732
+    $image = false;
1733
+    if (($process == 'AUTO') and isset($GLOBALS['meta']['image_process'])) {
1734
+        $process = $GLOBALS['meta']['image_process'];
1735
+    }
1736
+    # determiner le format de sortie
1737
+    $format_sortie = false; // le choix par defaut sera bon
1738
+    if ($process == "netpbm") {
1739
+        $format_sortie = "jpg";
1740
+    } elseif ($process == 'gd1' or $process == 'gd2') {
1741
+        $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1742
+        // on verifie que l'extension choisie est bonne (en principe oui)
1743
+        $gd_formats = formats_image_acceptables(true);
1744
+        if (is_array($image)
1745
+            and (!in_array($image['format_dest'], $gd_formats)
1746
+                or (!in_array($image['format_dest'], _image_extensions_acceptees_en_sortie()))
1747
+            )
1748
+        ) {
1749
+            if ($image['format_source'] == 'jpg') {
1750
+                $formats_sortie = array('jpg', 'png', 'gif');
1751
+            } else // les gif sont passes en png preferentiellement pour etre homogene aux autres filtres images
1752
+            {
1753
+                $formats_sortie = array('png', 'jpg', 'gif');
1754
+            }
1755
+            // Choisir le format destination
1756
+            // - on sauve de preference en JPEG (meilleure compression)
1757
+            // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
1758
+            # bug : gd_formats contient la liste des fichiers qu'on sait *lire*,
1759
+            # pas *ecrire*
1760
+            $format_sortie = "";
1761
+            foreach ($formats_sortie as $fmt) {
1762
+                if (in_array($fmt, $gd_formats) and in_array($fmt, _image_extensions_acceptees_en_sortie())) {
1763
+                    $format_sortie = $fmt;
1764
+                    break;
1765
+                }
1766
+            }
1767
+            $image = false;
1768
+        }
1769
+    }
1770
+
1771
+    if (!is_array($image)) {
1772
+        $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction, false, _SVG_SUPPORTED);
1773
+    }
1774
+
1775
+    if (!is_array($image) or !$image['largeur'] or !$image['hauteur']) {
1776
+        spip_log("image_reduire_src:pas de version locale de $img");
1777
+        // on peut resizer en mode html si on dispose des elements
1778
+        if ($srcw = extraire_attribut($img, 'width')
1779
+            and $srch = extraire_attribut($img, 'height')
1780
+        ) {
1781
+            list($w, $h) = _image_ratio($srcw, $srch, $taille, $taille_y);
1782
+
1783
+            return _image_tag_changer_taille($img, $w, $h);
1784
+        }
1785
+        // la on n'a pas d'infos sur l'image source... on refile le truc a css
1786
+        // sous la forme style='max-width: NNpx;'
1787
+        return inserer_attribut($img, 'style',
1788
+            "max-width: ${taille}px; max-height: ${taille_y}px");
1789
+    }
1790
+
1791
+    // si l'image est plus petite que la cible retourner une copie cachee de l'image
1792
+    if (($image['largeur'] <= $taille) && ($image['hauteur'] <= $taille_y)) {
1793
+        if ($image['creer']) {
1794
+            @copy($image['fichier'], $image['fichier_dest']);
1795
+        }
1796
+
1797
+        return _image_ecrire_tag($image, array('src' => $image['fichier_dest']));
1798
+    }
1799
+
1800
+    if ($image['creer'] == false && !$force) {
1801
+        return _image_ecrire_tag($image,
1802
+            array('src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest']));
1803
+    }
1804
+
1805
+    if (in_array($image["format_source"], _image_extensions_acceptees_en_entree())) {
1806
+        $destWidth = $image['largeur_dest'];
1807
+        $destHeight = $image['hauteur_dest'];
1808
+        $logo = $image['fichier'];
1809
+        $date = $image["date_src"];
1810
+        $preview = _image_creer_vignette($image, $taille, $taille_y, $process, $force);
1811
+
1812
+        if ($preview && $preview['fichier']) {
1813
+            $logo = $preview['fichier'];
1814
+            $destWidth = $preview['width'];
1815
+            $destHeight = $preview['height'];
1816
+            $date = $preview['date'];
1817
+        }
1818
+        // dans l'espace prive mettre un timestamp sur l'adresse 
1819
+        // de l'image, de facon a tromper le cache du navigateur
1820
+        // quand on fait supprimer/reuploader un logo
1821
+        // (pas de filemtime si SAFE MODE)
1822
+        $date = test_espace_prive() ? ('?' . $date) : '';
1823
+
1824
+        return _image_ecrire_tag($image, array('src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight));
1825
+    }
1826
+    else {
1827
+        # BMP, tiff ... les redacteurs osent tout!
1828
+        return $img;
1829
+    }
1830 1830
 }
1831 1831
 
1832 1832
 /**
@@ -1841,144 +1841,144 @@  discard block
 block discarded – undo
1841 1841
  */
1842 1842
 class phpthumb_functions {
1843 1843
 
1844
-	/**
1845
-	 * Retourne la couleur d'un pixel dans une image
1846
-	 *
1847
-	 * @param ressource $img
1848
-	 * @param int $x
1849
-	 * @param int $y
1850
-	 * @return array|bool
1851
-	 */
1852
-	public static function GetPixelColor(&$img, $x, $y) {
1853
-		if (is_resource($img) || (is_object($img) && $img instanceof \GdImage)) {
1854
-			return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
1855
-		}
1856
-		return false;
1857
-	}
1858
-
1859
-	/**
1860
-	 * Retourne un nombre dans une représentation en Little Endian
1861
-	 *
1862
-	 * @param int $number
1863
-	 * @param int $minbytes
1864
-	 * @return string
1865
-	 */
1866
-	public static function LittleEndian2String($number, $minbytes = 1) {
1867
-		$intstring = '';
1868
-		while ($number > 0) {
1869
-			$intstring = $intstring . chr($number & 255);
1870
-			$number >>= 8;
1871
-		}
1872
-
1873
-		return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
1874
-	}
1875
-
1876
-	/**
1877
-	 * Transforme une ressource GD en image au format ICO
1878
-	 *
1879
-	 * @param array $gd_image_array
1880
-	 *     Tableau de ressources d'images GD
1881
-	 * @return string
1882
-	 *     Image au format ICO
1883
-	 */
1884
-	public static function GD2ICOstring(&$gd_image_array) {
1885
-		foreach ($gd_image_array as $key => $gd_image) {
1886
-
1887
-			$ImageWidths[$key] = ImageSX($gd_image);
1888
-			$ImageHeights[$key] = ImageSY($gd_image);
1889
-			$bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24;
1890
-			$totalcolors[$key] = ImageColorsTotal($gd_image);
1891
-
1892
-			$icXOR[$key] = '';
1893
-			for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
1894
-				for ($x = 0; $x < $ImageWidths[$key]; $x++) {
1895
-					$argb = phpthumb_functions::GetPixelColor($gd_image, $x, $y);
1896
-					$a = round(255 * ((127 - $argb['alpha']) / 127));
1897
-					$r = $argb['red'];
1898
-					$g = $argb['green'];
1899
-					$b = $argb['blue'];
1900
-
1901
-					if ($bpp[$key] == 32) {
1902
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
1903
-					} elseif ($bpp[$key] == 24) {
1904
-						$icXOR[$key] .= chr($b) . chr($g) . chr($r);
1905
-					}
1906
-
1907
-					if ($a < 128) {
1908
-						@$icANDmask[$key][$y] .= '1';
1909
-					} else {
1910
-						@$icANDmask[$key][$y] .= '0';
1911
-					}
1912
-				}
1913
-				// mask bits are 32-bit aligned per scanline
1914
-				while (strlen($icANDmask[$key][$y]) % 32) {
1915
-					$icANDmask[$key][$y] .= '0';
1916
-				}
1917
-			}
1918
-			$icAND[$key] = '';
1919
-			foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
1920
-				for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
1921
-					$icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, '0', STR_PAD_LEFT)));
1922
-				}
1923
-			}
1924
-
1925
-		}
1926
-
1927
-		foreach ($gd_image_array as $key => $gd_image) {
1928
-			$biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
1929
-
1930
-			// BITMAPINFOHEADER - 40 bytes
1931
-			$BitmapInfoHeader[$key] = '';
1932
-			$BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";                // DWORD  biSize;
1933
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4);    // LONG   biWidth;
1934
-			// The biHeight member specifies the combined
1935
-			// height of the XOR and AND masks.
1936
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
1937
-			$BitmapInfoHeader[$key] .= "\x01\x00";                    // WORD   biPlanes;
1938
-			$BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00";              // wBitCount;
1939
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biCompression;
1940
-			$BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4);      // DWORD  biSizeImage;
1941
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biXPelsPerMeter;
1942
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biYPelsPerMeter;
1943
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrUsed;
1944
-			$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrImportant;
1945
-		}
1946
-
1947
-
1948
-		$icondata = "\x00\x00";                    // idReserved;   // Reserved (must be 0)
1949
-		$icondata .= "\x01\x00";                    // idType;	   // Resource Type (1 for icons)
1950
-		$icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2);  // idCount;	  // How many images?
1951
-
1952
-		$dwImageOffset = 6 + (count($gd_image_array) * 16);
1953
-		foreach ($gd_image_array as $key => $gd_image) {
1954
-			// ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
1955
-
1956
-			$icondata .= chr($ImageWidths[$key]);           // bWidth;		  // Width, in pixels, of the image
1957
-			$icondata .= chr($ImageHeights[$key]);          // bHeight;		 // Height, in pixels, of the image
1958
-			$icondata .= chr($totalcolors[$key]);           // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1959
-			$icondata .= "\x00";                    // bReserved;	   // Reserved ( must be 0)
1960
-
1961
-			$icondata .= "\x01\x00";                  // wPlanes;		 // Color Planes
1962
-			$icondata .= chr($bpp[$key]) . "\x00";            // wBitCount;	   // Bits per pixel
1963
-
1964
-			$dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
1965
-			$icondata .= phpthumb_functions::LittleEndian2String($dwBytesInRes,
1966
-				4);     // dwBytesInRes;	// How many bytes in this resource?
1967
-
1968
-			$icondata .= phpthumb_functions::LittleEndian2String($dwImageOffset,
1969
-				4);    // dwImageOffset;   // Where in the file is this image?
1970
-			$dwImageOffset += strlen($BitmapInfoHeader[$key]);
1971
-			$dwImageOffset += strlen($icXOR[$key]);
1972
-			$dwImageOffset += strlen($icAND[$key]);
1973
-		}
1974
-
1975
-		foreach ($gd_image_array as $key => $gd_image) {
1976
-			$icondata .= $BitmapInfoHeader[$key];
1977
-			$icondata .= $icXOR[$key];
1978
-			$icondata .= $icAND[$key];
1979
-		}
1980
-
1981
-		return $icondata;
1982
-	}
1844
+    /**
1845
+     * Retourne la couleur d'un pixel dans une image
1846
+     *
1847
+     * @param ressource $img
1848
+     * @param int $x
1849
+     * @param int $y
1850
+     * @return array|bool
1851
+     */
1852
+    public static function GetPixelColor(&$img, $x, $y) {
1853
+        if (is_resource($img) || (is_object($img) && $img instanceof \GdImage)) {
1854
+            return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));
1855
+        }
1856
+        return false;
1857
+    }
1858
+
1859
+    /**
1860
+     * Retourne un nombre dans une représentation en Little Endian
1861
+     *
1862
+     * @param int $number
1863
+     * @param int $minbytes
1864
+     * @return string
1865
+     */
1866
+    public static function LittleEndian2String($number, $minbytes = 1) {
1867
+        $intstring = '';
1868
+        while ($number > 0) {
1869
+            $intstring = $intstring . chr($number & 255);
1870
+            $number >>= 8;
1871
+        }
1872
+
1873
+        return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
1874
+    }
1875
+
1876
+    /**
1877
+     * Transforme une ressource GD en image au format ICO
1878
+     *
1879
+     * @param array $gd_image_array
1880
+     *     Tableau de ressources d'images GD
1881
+     * @return string
1882
+     *     Image au format ICO
1883
+     */
1884
+    public static function GD2ICOstring(&$gd_image_array) {
1885
+        foreach ($gd_image_array as $key => $gd_image) {
1886
+
1887
+            $ImageWidths[$key] = ImageSX($gd_image);
1888
+            $ImageHeights[$key] = ImageSY($gd_image);
1889
+            $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24;
1890
+            $totalcolors[$key] = ImageColorsTotal($gd_image);
1891
+
1892
+            $icXOR[$key] = '';
1893
+            for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) {
1894
+                for ($x = 0; $x < $ImageWidths[$key]; $x++) {
1895
+                    $argb = phpthumb_functions::GetPixelColor($gd_image, $x, $y);
1896
+                    $a = round(255 * ((127 - $argb['alpha']) / 127));
1897
+                    $r = $argb['red'];
1898
+                    $g = $argb['green'];
1899
+                    $b = $argb['blue'];
1900
+
1901
+                    if ($bpp[$key] == 32) {
1902
+                        $icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a);
1903
+                    } elseif ($bpp[$key] == 24) {
1904
+                        $icXOR[$key] .= chr($b) . chr($g) . chr($r);
1905
+                    }
1906
+
1907
+                    if ($a < 128) {
1908
+                        @$icANDmask[$key][$y] .= '1';
1909
+                    } else {
1910
+                        @$icANDmask[$key][$y] .= '0';
1911
+                    }
1912
+                }
1913
+                // mask bits are 32-bit aligned per scanline
1914
+                while (strlen($icANDmask[$key][$y]) % 32) {
1915
+                    $icANDmask[$key][$y] .= '0';
1916
+                }
1917
+            }
1918
+            $icAND[$key] = '';
1919
+            foreach ($icANDmask[$key] as $y => $scanlinemaskbits) {
1920
+                for ($i = 0; $i < strlen($scanlinemaskbits); $i += 8) {
1921
+                    $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, '0', STR_PAD_LEFT)));
1922
+                }
1923
+            }
1924
+
1925
+        }
1926
+
1927
+        foreach ($gd_image_array as $key => $gd_image) {
1928
+            $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8);
1929
+
1930
+            // BITMAPINFOHEADER - 40 bytes
1931
+            $BitmapInfoHeader[$key] = '';
1932
+            $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";                // DWORD  biSize;
1933
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4);    // LONG   biWidth;
1934
+            // The biHeight member specifies the combined
1935
+            // height of the XOR and AND masks.
1936
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG   biHeight;
1937
+            $BitmapInfoHeader[$key] .= "\x01\x00";                    // WORD   biPlanes;
1938
+            $BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00";              // wBitCount;
1939
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biCompression;
1940
+            $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4);      // DWORD  biSizeImage;
1941
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biXPelsPerMeter;
1942
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // LONG   biYPelsPerMeter;
1943
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrUsed;
1944
+            $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";                // DWORD  biClrImportant;
1945
+        }
1946
+
1947
+
1948
+        $icondata = "\x00\x00";                    // idReserved;   // Reserved (must be 0)
1949
+        $icondata .= "\x01\x00";                    // idType;	   // Resource Type (1 for icons)
1950
+        $icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2);  // idCount;	  // How many images?
1951
+
1952
+        $dwImageOffset = 6 + (count($gd_image_array) * 16);
1953
+        foreach ($gd_image_array as $key => $gd_image) {
1954
+            // ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
1955
+
1956
+            $icondata .= chr($ImageWidths[$key]);           // bWidth;		  // Width, in pixels, of the image
1957
+            $icondata .= chr($ImageHeights[$key]);          // bHeight;		 // Height, in pixels, of the image
1958
+            $icondata .= chr($totalcolors[$key]);           // bColorCount;	 // Number of colors in image (0 if >=8bpp)
1959
+            $icondata .= "\x00";                    // bReserved;	   // Reserved ( must be 0)
1960
+
1961
+            $icondata .= "\x01\x00";                  // wPlanes;		 // Color Planes
1962
+            $icondata .= chr($bpp[$key]) . "\x00";            // wBitCount;	   // Bits per pixel
1963
+
1964
+            $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
1965
+            $icondata .= phpthumb_functions::LittleEndian2String($dwBytesInRes,
1966
+                4);     // dwBytesInRes;	// How many bytes in this resource?
1967
+
1968
+            $icondata .= phpthumb_functions::LittleEndian2String($dwImageOffset,
1969
+                4);    // dwImageOffset;   // Where in the file is this image?
1970
+            $dwImageOffset += strlen($BitmapInfoHeader[$key]);
1971
+            $dwImageOffset += strlen($icXOR[$key]);
1972
+            $dwImageOffset += strlen($icAND[$key]);
1973
+        }
1974
+
1975
+        foreach ($gd_image_array as $key => $gd_image) {
1976
+            $icondata .= $BitmapInfoHeader[$key];
1977
+            $icondata .= $icXOR[$key];
1978
+            $icondata .= $icAND[$key];
1979
+        }
1980
+
1981
+        return $icondata;
1982
+    }
1983 1983
 
1984 1984
 }
Please login to merge, or discard this patch.
Braces   +7 added lines, -10 removed lines patch added patch discarded remove patch
@@ -517,8 +517,7 @@  discard block
 block discarded – undo
517 517
 			process_image_svg_identite($ret);
518 518
 			$ret['creer'] = false;
519 519
 		}
520
-	}
521
-	else {
520
+	} else {
522 521
 		if (!function_exists($ret["fonction_imagecreatefrom"])) {
523 522
 			return false;
524 523
 		}
@@ -542,7 +541,9 @@  discard block
 block discarded – undo
542 541
 			$extensions = array_map('trim', $extensions);
543 542
 			$extensions = array_filter($extensions);
544 543
 			$extensions = array_unique($extensions);
545
-			if (in_array("jpg", $extensions)) $extensions[] = 'jpeg';
544
+			if (in_array("jpg", $extensions)) {
545
+			    $extensions[] = 'jpeg';
546
+			}
546 547
 		}
547 548
 		$extensions[] = 'svg'; // on le supporte toujours avec des fonctions specifiques
548 549
 	}
@@ -620,8 +621,7 @@  discard block
 block discarded – undo
620 621
 
621 622
 	if (isset($info['mime'])) {
622 623
 		$mime = $info['mime'];
623
-	}
624
-	else {
624
+	} else {
625 625
 		$mime = image_type_to_mime_type($info[2]);
626 626
 	}
627 627
 
@@ -1395,9 +1395,7 @@  discard block
 block discarded – undo
1395 1395
 	if ($srcWidth and $srcWidth <= $maxWidth and $srcHeight <= $maxHeight) {
1396 1396
 		$vignette = $destination . '.' . $format;
1397 1397
 		@copy($image, $vignette);
1398
-	}
1399
-
1400
-	elseif ($valeurs["format_source"] === 'svg') {
1398
+	} elseif ($valeurs["format_source"] === 'svg') {
1401 1399
 		if ($svg = svg_redimensionner($valeurs['fichier'], $destWidth, $destHeight)){
1402 1400
 			$format_sortie = 'svg';
1403 1401
 			$vignette = $destination . "." . $format_sortie;
@@ -1822,8 +1820,7 @@  discard block
 block discarded – undo
1822 1820
 		$date = test_espace_prive() ? ('?' . $date) : '';
1823 1821
 
1824 1822
 		return _image_ecrire_tag($image, array('src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight));
1825
-	}
1826
-	else {
1823
+	} else {
1827 1824
 		# BMP, tiff ... les redacteurs osent tout!
1828 1825
 		return $img;
1829 1826
 	}
Please login to merge, or discard this patch.