[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / action / tester_taille.php
index 6fe03fc..594a704 100644 (file)
@@ -3,49 +3,90 @@
 /***************************************************************************\
  *  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 "&infin;";
+               }
+               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
@@ -67,21 +108,25 @@ function action_tester_taille_dist() {
        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']);
 }
-
-?>