594a704af0eef0468eadacc65030671a9ce8b518
[lhc/web/www.git] / www / ecrire / action / tester_taille.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion de l'action testant, pour la librairie graphique GD2, la taille
15 * maximale des images qu'il est capable de traiter
16 *
17 * @package SPIP\Core\Configurer
18 */
19
20 if (!defined('_ECRIRE_INC_VERSION')) {
21 return;
22 }
23 include_spip('inc/headers');
24
25 /**
26 * Interception très probable d'une impossibilité de créer l'image demandée
27 * dans le buffer de ob_start()
28 *
29 * Si c'est le cas, on redirige sur la page prévue, testant un autre cas
30 * de traitement
31 *
32 * @param string $output
33 * Sortie du buffer
34 * @return string
35 * Sortie du buffer
36 **/
37 function action_tester_taille_error_handler($output) {
38 // on est ici, donc echec lors de la creation de l'image
39 if (!empty($GLOBALS['redirect'])) {
40 return redirige_formulaire($GLOBALS['redirect']);
41 }
42
43 return $output;
44 }
45
46
47 /**
48 * Tester nos capacités à redimensionner des images avec GD2 (taille mémoire)
49 *
50 * Ce test par dichotomie permet de calculer la taille (en pixels) de la
51 * plus grande image traitable. Ce test se relance jusqu'à trouver cette
52 * taille.
53 *
54 * La clé `arg` attendue est une chaîne indiquant les valeurs minimum et
55 * maximum de taille à tester tel que '3000' (maximum) ou '3000-5000'
56 * (minimum-maximum)
57 *
58 **/
59 function action_tester_taille_dist() {
60
61 if (!autoriser('configurer')) {
62 return;
63 }
64
65 $taille = _request('arg');
66 $taille = explode('-', $taille);
67
68 $GLOBALS['taille_max'] = end($taille);
69 $GLOBALS['taille_min'] = 0;
70 if (count($taille) > 1) {
71 $GLOBALS['taille_min'] = reset($taille);
72 }
73
74 // si l'intervalle est assez petit, on garde la valeur min
75 if ($GLOBALS['taille_max'] * $GLOBALS['taille_max'] - $GLOBALS['taille_min'] * $GLOBALS['taille_min'] < 50000) {
76 $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']);
77 if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) {
78 $t = $t * 0.9; // marge de securite
79 echo round($t / 1000000, 3) . ' Mpx';
80 } else {
81 // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue"
82 $t = 0;
83 echo "&infin;";
84 }
85 ecrire_meta('max_taille_vignettes', $t, 'non');
86 die();
87 }
88
89 $taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max'] + $GLOBALS['taille_min']) / 2);
90
91 include_spip('inc/filtres');
92 // des inclusions representatives d'un hit prive et/ou public pour la conso memoire
93 include_spip('public/assembler');
94 include_spip('public/balises');
95 include_spip('public/boucles');
96 include_spip('public/cacher');
97 include_spip('public/compiler');
98 include_spip('public/composer');
99 include_spip('public/criteres');
100 include_spip('public/interfaces');
101 include_spip('public/parametrer');
102 include_spip('public/phraser_html');
103 include_spip('public/references');
104
105 include_spip('inc/presentation');
106 include_spip('inc/charsets');
107 include_spip('inc/documents');
108 include_spip('inc/header');
109 propre("<doc1>"); // charger propre avec le trairement d'un modele
110
111 $i = _request('i') + 1;
112 $image_source = chemin_image("test.png");
113 $GLOBALS['redirect'] = generer_url_action("tester_taille",
114 "i=$i&arg=" . $GLOBALS['taille_min'] . "-" . $GLOBALS['taille_test']);
115
116 ob_start('action_tester_taille_error_handler');
117 filtrer('image_recadre', $image_source, $taille, $taille);
118 $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']);
119
120 // si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee
121 // si $GLOBALS['taille_min']==0 (car on est au premier coup)
122 if ($GLOBALS['taille_min'] == 0) {
123 $taille = $GLOBALS['taille_max'];
124 filtrer('image_recadre', $image_source, $taille, $taille);
125 $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']);
126 }
127 ob_end_clean();
128
129
130 // on est ici, donc pas de plantage
131 echo redirige_formulaire($GLOBALS['redirect']);
132 }