<?php

/***************************************************************************\
 *  SPIP, Système de publication pour l'internet                           *
 *                                                                         *
 *  Copyright © avec tendresse depuis 2001                                 *
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
\***************************************************************************/

/**
 * Gestion de l'action testant une librairie graphique
 *
 * @package SPIP\Core\Configurer
 */

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

/**
 * Tester les capacités du serveur à utiliser une librairie graphique
 *
 * L'argument transmis dans la clé `arg` est le type de librairie parmi
 * gd2, gd1, netpbm, imagick ou convert
 *
 * L'action crée une vignette en utilisant la librairie indiquée puis
 * redirige sur l'image ainsi créée (sinon sur une image d'echec).
 **/
function action_tester_dist() {
	$arg = _request('arg');

	$gd_formats = [];
	$gd_formats_read_gif = '';
	// verifier les formats acceptes par GD
	if ($arg == 'gd1') {
		// Si GD est installe et php >= 4.0.2
		if (function_exists('imagetypes')) {
			if (imagetypes() & IMG_GIF) {
				$gd_formats[] = 'gif';
			} else {
				# Attention GD sait lire le gif mais pas forcement l'ecrire
				if (function_exists('ImageCreateFromGIF')) {
					$srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . 'test.gif');
					if ($srcImage) {
						$gd_formats_read_gif = ',gif';
						if (\PHP_VERSION_ID < 80000) {
							imagedestroy($srcImage);
						}
						unset($srcImage);
					}
				}
			}

			if (imagetypes() & IMG_JPG) {
				$gd_formats[] = 'jpg';
			}
			if (imagetypes() & IMG_PNG) {
				$gd_formats[] = 'png';
			}
			if (imagetypes() & IMG_WEBP) {
				$gd_formats[] = 'webp';
			}
		} else {
			# ancienne methode de detection des formats, qui en plus
			# est bugguee car elle teste les formats en lecture
			# alors que la valeur deduite sert a identifier
			# les formats disponibles en ecriture... (cf. inc_logos)

			if (function_exists('ImageCreateFromJPEG')) {
				$srcImage = @ImageCreateFromJPEG(_ROOT_IMG_PACK . 'test.jpg');
				if ($srcImage) {
					$gd_formats[] = 'jpg';
					if (\PHP_VERSION_ID < 80000) {
						imagedestroy($srcImage);
					}
					unset($srcImage);
				}
			}
			if (function_exists('ImageCreateFromGIF')) {
				$srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . 'test.gif');
				if ($srcImage) {
					$gd_formats[] = 'gif';
					if (\PHP_VERSION_ID < 80000) {
						imagedestroy($srcImage);
					}
					unset($srcImage);
				}
			}
			if (function_exists('ImageCreateFromPNG')) {
				$srcImage = @ImageCreateFromPNG(_ROOT_IMG_PACK . 'test.png');
				if ($srcImage) {
					$gd_formats[] = 'png';
					if (\PHP_VERSION_ID < 80000) {
						imagedestroy($srcImage);
					}
					unset($srcImage);
				}
			}
			if (function_exists('ImageCreateFromWEBP')) {
				$srcImage = @ImageCreateFromWEBP(_ROOT_IMG_PACK . 'test.webp');
				if ($srcImage) {
					$gd_formats[] = 'webp';
					if (\PHP_VERSION_ID < 80000) {
						imagedestroy($srcImage);
					}
					unset($srcImage);
				}
			}
		}

		if (! empty($gd_formats)) {
			$gd_formats = join(',', $gd_formats);
		}
		ecrire_meta('gd_formats_read', $gd_formats . $gd_formats_read_gif);
		ecrire_meta('gd_formats', $gd_formats);
	} // verifier les formats netpbm
	else {
		if ($arg == 'netpbm') {
			if (!defined('_PNMSCALE_COMMAND')) {
				define('_PNMSCALE_COMMAND', 'pnmscale');
			} // Securite : mes_options.php peut preciser le chemin absolu
			if (_PNMSCALE_COMMAND == '') {
				return;
			}
			$netpbm_formats = [];

			$jpegtopnm_command = str_replace(
				'pnmscale',
				'jpegtopnm',
				_PNMSCALE_COMMAND
			);
			$pnmtojpeg_command = str_replace(
				'pnmscale',
				'pnmtojpeg',
				_PNMSCALE_COMMAND
			);

			$vignette = _ROOT_IMG_PACK . 'test.jpg';
			$dest = _DIR_VAR . 'test-jpg.jpg';
			$commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
			spip_log($commande);
			exec($commande);
			if ($taille = @getimagesize($dest)) {
				if ($taille[1] == 10) {
					$netpbm_formats[] = 'jpg';
				}
			}
			$giftopnm_command = str_replace('pnmscale', 'giftopnm', _PNMSCALE_COMMAND);
			$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', _PNMSCALE_COMMAND);
			$vignette = _ROOT_IMG_PACK . 'test.gif';
			$dest = _DIR_VAR . 'test-gif.jpg';
			$commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
			spip_log($commande);
			exec($commande);
			if ($taille = @getimagesize($dest)) {
				if ($taille[1] == 10) {
					$netpbm_formats[] = 'gif';
				}
			}

			$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', _PNMSCALE_COMMAND);
			$vignette = _ROOT_IMG_PACK . 'test.png';
			$dest = _DIR_VAR . 'test-gif.jpg';
			$commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
			spip_log($commande);
			exec($commande);
			if ($taille = @getimagesize($dest)) {
				if ($taille[1] == 10) {
					$netpbm_formats[] = 'png';
				}
			}

			ecrire_meta('netpbm_formats', join(',', $netpbm_formats ?: []));
		}
	}

	// et maintenant envoyer la vignette de tests
	if (in_array($arg, ['gd1', 'gd2', 'imagick', 'convert', 'netpbm'])) {
		include_spip('inc/filtres');
		include_spip('inc/filtres_images_mini');
		$taille_preview = 150;
		$image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');

		$image['fichier_dest'] = _DIR_VAR . "test_$arg";

		if (
			$preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true)
			and ($preview['width'] * $preview['height'] > 0)
		) {
			redirige_par_entete($preview['fichier']);
		}
	}

	# image echec
	redirige_par_entete(chemin_image('echec-reducteur-xx.svg'));
}
