/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Gestion de l'action testant, pour la librairie graphique GD2, la taille
+ * maximale des images qu'il est capable de traiter
+ *
+ * @package SPIP\Core\Configurer
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
include_spip('inc/headers');
-function action_tester_taille_error_handler($output)
-{
+/**
+ * Interception très probable d'une impossibilité de créer l'image demandée
+ * dans le buffer de ob_start()
+ *
+ * Si c'est le cas, on redirige sur la page prévue, testant un autre cas
+ * de traitement
+ *
+ * @param string $output
+ * Sortie du buffer
+ * @return string
+ * Sortie du buffer
+ **/
+function action_tester_taille_error_handler($output) {
// on est ici, donc echec lors de la creation de l'image
- if ($GLOBALS['redirect']){
+ if (!empty($GLOBALS['redirect'])) {
return redirige_formulaire($GLOBALS['redirect']);
}
+
return $output;
}
-// Tester nos capacites a creer des images avec GD2 (taille memoire)
-// http://doc.spip.org/@action_tester_taille_dist
+/**
+ * Tester nos capacités à redimensionner des images avec GD2 (taille mémoire)
+ *
+ * Ce test par dichotomie permet de calculer la taille (en pixels) de la
+ * plus grande image traitable. Ce test se relance jusqu'à trouver cette
+ * taille.
+ *
+ * La clé `arg` attendue est une chaîne indiquant les valeurs minimum et
+ * maximum de taille à tester tel que '3000' (maximum) ou '3000-5000'
+ * (minimum-maximum)
+ *
+ **/
function action_tester_taille_dist() {
-
- if (!autoriser('configurer'))
+
+ if (!autoriser('configurer')) {
return;
-
+ }
+
$taille = _request('arg');
- $taille = explode('-',$taille);
+ $taille = explode('-', $taille);
$GLOBALS['taille_max'] = end($taille);
$GLOBALS['taille_min'] = 0;
- if (count($taille)>1)
+ if (count($taille) > 1) {
$GLOBALS['taille_min'] = reset($taille);
+ }
// si l'intervalle est assez petit, on garde la valeur min
- if ($GLOBALS['taille_max']*$GLOBALS['taille_max']-$GLOBALS['taille_min']*$GLOBALS['taille_min']<50000){
- ecrire_meta('max_taille_vignettes',$t=($GLOBALS['taille_min']*$GLOBALS['taille_min'])*0.9,'non');
- echo round($t/1000000,3).' Mpx';
+ if ($GLOBALS['taille_max'] * $GLOBALS['taille_max'] - $GLOBALS['taille_min'] * $GLOBALS['taille_min'] < 50000) {
+ $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']);
+ if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) {
+ $t = $t * 0.9; // marge de securite
+ echo round($t / 1000000, 3) . ' Mpx';
+ } else {
+ // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue"
+ $t = 0;
+ echo "∞";
+ }
+ ecrire_meta('max_taille_vignettes', $t, 'non');
die();
}
- $taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max']+$GLOBALS['taille_min'])/2);
+ $taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max'] + $GLOBALS['taille_min']) / 2);
include_spip('inc/filtres');
// des inclusions representatives d'un hit prive et/ou public pour la conso memoire
include_spip('inc/header');
propre("<doc1>"); // charger propre avec le trairement d'un modele
- $i = _request('i')+1;
+ $i = _request('i') + 1;
$image_source = chemin_image("test.png");
- $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=".$GLOBALS['taille_min']."-".$GLOBALS['taille_test']);
+ $GLOBALS['redirect'] = generer_url_action("tester_taille",
+ "i=$i&arg=" . $GLOBALS['taille_min'] . "-" . $GLOBALS['taille_test']);
ob_start('action_tester_taille_error_handler');
- filtrer('image_recadre',$image_source,$taille,$taille);
- $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']);
+ filtrer('image_recadre', $image_source, $taille, $taille);
+ $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']);
+
// si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee
- $taille = $GLOBALS['taille_max'];
- filtrer('image_recadre',$image_source,$taille,$taille);
- $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']);
+ // si $GLOBALS['taille_min']==0 (car on est au premier coup)
+ if ($GLOBALS['taille_min'] == 0) {
+ $taille = $GLOBALS['taille_max'];
+ filtrer('image_recadre', $image_source, $taille, $taille);
+ $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']);
+ }
ob_end_clean();
+
// on est ici, donc pas de plantage
echo redirige_formulaire($GLOBALS['redirect']);
}
-
-?>