Valider 9fe35bd7 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Mecanisme de destruction des images intermediaires (generalisation de [8664],...

Mecanisme de destruction des images intermediaires (generalisation de [8664], mais automatisé et creation sur disque des images intermédiaires pour permettre aux gros calculs de toujours pouvoir passer).
Ce mécanisme fonctionne sur toutes les utilisations de filtres image, y compris sur ces champs texte. Il est appliqué automatiquement par le SPIP, sans modification des squelettes.

Le principe :
- lorsqu'une image toto.png est cree par un filtre, un fichier de controle toto.png.src lui est associé. Ce fichier contient les infos necessaires a la recreation de l'image si necessaire (image source, fonction et arguments appelés)
Une image qui possede un fichier de controle est considérée comme temporaire et peut etre supprimée du process
Une image qui ne possede pas de fichier de controle est une image gravée, permnanente.
- lorsqu'une serie de filtre contient au moins un filtre image, le compilateur la termine par le filtre image_graver
- dans un enchainement de filtres, si une image intermediaire est absente mais son fichier de controle present, on ne fait rien tant qu'on a pas besoin de creer explicitement l'image cible. 
 Dans la plupart des cas, la serie de filtre se finit sur l'image cible qui a ete gravee par le filtre image_graver, et qui est la
 Si par contre on a besoin de creer une nouvelle image sur la base d'une image intermediaire absente, on remonte la chaine des fichiers de controle pour recreer chaque image intermediaire a partir de l'image source originale.

Le filtre image_graver supprime le fichier de controle de l'image cible, et remonte la chaine des fichiers de controle pour supprimer les images temporaires (mais laisse les fichiers de controle permettant de les reconstruire).

Dans un double traitement du style
[(#TEXTE|image_reduire{520,0}|image_reduire{150}|image_rotation{90}|image_recadre{200,200,'center','red'}|image_aplatir{jpg})]
[(#TEXTE|image_reduire{520,0}|image_reduire{150}|image_rotation{-90}|image_recadre{200,200,'center','red'}|image_aplatir{jpg})]

La premiere serie de filtre conduit a la creation d'une image jpg et toutes les images intermediaires sont supprimees
Dans la deuxieme serie de filtre, les 2 premiers filtres image_reduire ne font rien car les fichiers de controle sont la. Au moment de calculer le image_rotation, on s'apercoit qu'il nous les faut. On reconstruit donc les 2 imags intermédiaires, et celle qui a manqué (la deuxieme) est gravée car on sait qu'elle est commune a plusieurs séries.
Le gravage automatique de l'image intermediaire evite un recalcul systématique pour cause de dates a chaque hit.
Une écriture optimisée serait bien entendu d'appliquer les filtres communs une seule fois et de stocker le resultat avec #SET
parent 11bda76b
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -40,6 +40,7 @@ $GLOBALS['spip_matrice']['image_couleur_extraire'] = '';
$GLOBALS['spip_matrice']['image_select'] = '';
$GLOBALS['spip_matrice']['image_renforcement'] = '';
$GLOBALS['spip_matrice']['image_imagick'] = '';
$GLOBALS['spip_matrice']['image_ramasse_miettes'] = '';

$inc_filtres_images = _DIR_RESTREINT."inc/filtres_images.php"; # find_in_path('inc/filtres_images');
$GLOBALS['spip_matrice']['couleur_dec_to_hex'] = $inc_filtres_images;
+179 −86

Fichier modifié.

La taille limite d'aperçu a été dépassée, l'affichage des modifications a donc été réduit.

+7 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -441,6 +441,10 @@ function applique_filtres($p) {
	if ($p->param)
		$code = compose_filtres($p, $code);

	// ramasser les images intermediaires inutiles et graver l'image finale
	if ($p->ramasser_miettes)
		$code = "filtrer('image_graver',$code)";

	// Securite
	if ($p->interdire_scripts
	AND $p->etoile != '**')
@@ -451,7 +455,7 @@ function applique_filtres($p) {

// Cf. function pipeline dans ecrire/inc_utils.php
// http://doc.spip.org/@compose_filtres
function compose_filtres($p, $code) {
function compose_filtres(&$p, $code) {
	foreach($p->param as $filtre) {
		$fonc = array_shift($filtre);
		if ($fonc) {
@@ -469,6 +473,8 @@ function compose_filtres($p, $code) {
			// de maniere indirecte, pour charger au prealable sa definition
			if (isset($GLOBALS['spip_matrice'][$fonc])) {
				$code = "filtrer('$fonc',$code$arglist)";
				if (substr($fonc,0,6)=='image_')
					$p->ramasser_miettes = true;
			}
			// le filtre est defini sous forme de fonction ou de methode
			// par ex. dans inc_texte, inc_filtres ou mes_fonctions