mirror of
https://github.com/YunoHost-Apps/spip_ynh.git
synced 2024-09-03 20:25:59 +02:00
159 lines
4.4 KiB
PHP
159 lines
4.4 KiB
PHP
|
<?php
|
||
|
|
||
|
/***************************************************************************\
|
||
|
* SPIP, Systeme de publication pour l'internet *
|
||
|
* *
|
||
|
* Copyright (c) 2001-2014 *
|
||
|
* 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;
|
||
|
|
||
|
/**
|
||
|
* Tourner un document
|
||
|
*
|
||
|
* http://doc.spip.org/@action_tourner_dist
|
||
|
*
|
||
|
* lorsque les arguments sont passes dans arg en GET :
|
||
|
* id_document-angle
|
||
|
*
|
||
|
* @param int $id_document
|
||
|
* @param int $angle
|
||
|
* angle de rotation en degre>0
|
||
|
* @return void
|
||
|
*/
|
||
|
function action_tourner_dist($id_document=null, $angle=null) {
|
||
|
if (is_null($id_document) OR is_null($angle)){
|
||
|
$securiser_action = charger_fonction('securiser_action', 'inc');
|
||
|
$arg = $securiser_action();
|
||
|
|
||
|
if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) {
|
||
|
spip_log("action_tourner_dist $arg pas compris");
|
||
|
}
|
||
|
else{
|
||
|
array_shift($r);
|
||
|
list($id_document,$angle) = $r;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if ($id_document AND autoriser('modifier','document',$id_document))
|
||
|
action_tourner_post($id_document,$angle);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Tourner un document
|
||
|
*
|
||
|
* http://doc.spip.org/@action_tourner_post
|
||
|
*
|
||
|
* @param int $id_document
|
||
|
* @param int $angle
|
||
|
* angle de rotation en degre>0
|
||
|
* @return
|
||
|
*/
|
||
|
function action_tourner_post($id_document,$angle)
|
||
|
{
|
||
|
$row = sql_fetsel("fichier,extension", "spip_documents", "id_document=".intval($id_document));
|
||
|
|
||
|
if (!$row) return;
|
||
|
|
||
|
include_spip('inc/charsets'); # pour le nom de fichier
|
||
|
include_spip('inc/documents');
|
||
|
// Fichier destination : on essaie toujours de repartir de l'original
|
||
|
$var_rot = $angle;
|
||
|
|
||
|
include_spip('inc/distant'); # pour copie_locale
|
||
|
$src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier']));
|
||
|
if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
|
||
|
$effacer = $src;
|
||
|
$src = $match[1].'.'.$match[3];
|
||
|
$var_rot += intval($match[2]);
|
||
|
}
|
||
|
$var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270
|
||
|
|
||
|
if ($var_rot > 0) {
|
||
|
$dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src);
|
||
|
spip_log("rotation $var_rot $src : $dest");
|
||
|
|
||
|
include_spip('inc/filtres');
|
||
|
include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0
|
||
|
$res = filtrer('image_rotation',$src,$var_rot);
|
||
|
$res = filtrer('image_format',$res,$row['extension']);
|
||
|
|
||
|
list($hauteur,$largeur) = taille_image($res);
|
||
|
$res = extraire_attribut($res,'src');
|
||
|
|
||
|
include_spip('inc/getdocument');
|
||
|
deplacer_fichier_upload($res,$dest);
|
||
|
}
|
||
|
else {
|
||
|
$dest = $src;
|
||
|
$size_image = @getimagesize($dest);
|
||
|
$largeur = $size_image[0];
|
||
|
$hauteur = $size_image[1];
|
||
|
}
|
||
|
|
||
|
// succes !
|
||
|
if ($largeur>0 AND $hauteur>0) {
|
||
|
$set = array(
|
||
|
'fichier' => set_spip_doc($dest),
|
||
|
'largeur'=>$largeur, 'hauteur'=>$hauteur,
|
||
|
'distant'=>'non' // le document n'est plus distant apres une transformation
|
||
|
);
|
||
|
if ($taille = @filesize($dest))
|
||
|
$set['taille'] = $taille;
|
||
|
sql_updateq('spip_documents', $set, "id_document=".intval($id_document));
|
||
|
if ($effacer) {
|
||
|
spip_log("rotation : j'efface $effacer");
|
||
|
spip_unlink($effacer);
|
||
|
}
|
||
|
// pipeline pour les plugins
|
||
|
pipeline('post_edition',
|
||
|
array(
|
||
|
'args' => array(
|
||
|
'table' => 'spip_documents',
|
||
|
'table_objet' => 'documents',
|
||
|
'spip_table_objet' => 'spip_documents',
|
||
|
'type' =>'document',
|
||
|
'id_objet' => $id_document,
|
||
|
'champs' => array('rotation'=>$angle,'orientation'=>$var_rot,'fichier'=>$row['fichier']),
|
||
|
'serveur' => $serveur,
|
||
|
'action'=>'tourner',
|
||
|
),
|
||
|
'data' => $set
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Appliquer l'EXIF orientation
|
||
|
// cf. http://trac.rezo.net/trac/spip/ticket/1494
|
||
|
// http://doc.spip.org/@tourner_selon_exif_orientation
|
||
|
function tourner_selon_exif_orientation($id_document, $fichier) {
|
||
|
|
||
|
if (function_exists('exif_read_data')
|
||
|
AND $exif = exif_read_data($fichier)
|
||
|
AND (
|
||
|
$ort = $exif['IFD0']['Orientation']
|
||
|
OR $ort = $exif['Orientation'])
|
||
|
) {
|
||
|
spip_log("rotation: $ort");
|
||
|
$rot = null;
|
||
|
switch ($ort) {
|
||
|
case 3:
|
||
|
$rot = 180;
|
||
|
case 6:
|
||
|
$rot = 90;
|
||
|
case 8:
|
||
|
$rot = -90;
|
||
|
}
|
||
|
if ($rot)
|
||
|
action_tourner_post(array(null,$id_document, $rot));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|