1<?php 2/** 3 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 4 * @author Andreas Gohr <gohr@cosmocode.de> 5 */ 6 7if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../../').'/'); 8define('DOKU_DISABLE_GZIP_OUTPUT', 1); 9require_once(DOKU_INC.'inc/init.php'); 10require_once(DOKU_INC.'inc/common.php'); 11require_once(DOKU_INC.'inc/pageutils.php'); 12require_once(DOKU_INC.'inc/httputils.php'); 13require_once(DOKU_INC.'inc/auth.php'); 14session_write_close(); 15 16 $data = array(); 17 // get parameters 18 list($data['zoom'],$data['col'],$data['row']) = explode('-',$_GET['tile']); 19 $data['id'] = cleanID($_GET['image']); 20 $data['file'] = mediaFN($data['id']); 21 $data['mtime'] = @filemtime($data['file']); 22 23 // check auth and existance 24 if(auth_quickaclcheck(getNS($data['id']).':X') < AUTH_READ) gfx_error('noauth'); 25 if(!$data['mtime']) gfx_error('notfound'); 26 27 // calculate zoom level scaling 28 $data['ts'] = 256; 29 list($data['width'],$data['height']) = getimagesize($data['file']); 30 $data['scale'] = (int)pow(2,$data['zoom']); 31 $data['max'] = max($data['width'],$data['height']); 32 $data['inv'] = $data['max'] / ($data['ts'] * $data['scale']); 33 if($data['inv'] < 1.0) gfx_error('maxzoom'); 34 35 // calculate tile boundaries 36 $data['tlx'] = (int) ($data['col'] * $data['ts'] * $data['inv']); 37 $data['tly'] = (int) ($data['row'] * $data['ts'] * $data['inv']); 38 $data['brx'] = (int) ($data['tlx'] + ($data['ts'] * $data['inv'])); 39 $data['bry'] = (int) ($data['tly'] + ($data['ts'] * $data['inv'])); 40 if($data['tlx'] > $data['width'] || $data['tly'] > $data['height']) gfx_error('blank'); 41 42 // cache times 43 $data['cache'] = getCacheName($data['file'],'.pv.'.$data['zoom'].'-'.$data['col'].'-'.$data['row'].'.jpg'); 44 $data['cachet'] = @filemtime($data['cache']); 45 46 // (re)generate 47 if($data['cachet'] < $data['mtime']){ 48 if($conf['im_convert']){ 49 tile_im($data); 50 }else{ 51 tile_gd($data); 52 } 53 } 54 55 // send 56 header('Content-type: image/jpeg'); 57 http_conditionalRequest(max($data['mtime'],$data['selft'])); 58 http_sendfile($data['cache']); 59 readfile($data['cache']); 60 61 62 63 64/* --------------- functions -------------------- */ 65 66 67function tile_gd($d){ 68 global $conf; 69 70 $img = null; 71 if(preg_match('/\.jpe?g$/',$d['file'])){ 72 $img = @imagecreatefromjpeg($d['file']); 73 }elseif(preg_match('/\.png$/',$d['file'])){ 74 $img = @imagecreatefrompng($d['file']); 75 }elseif(preg_match('/\.gif$/',$d['file'])){ 76 $img = @imagecreatefromgif($d['file']); 77 } 78 if(!$img) gfx_error('generic'); 79 80 $crop = image_crop($img,$d['width'],$d['height'],$d['tlx'],$d['tly'],$d['brx'],$d['bry']); 81 imagedestroy($img); 82 83 $scale = image_scale($crop,abs($d['brx'] - $d['tlx']),abs($d['bry'] - $d['tly']),$d['ts'],$d['ts']); 84 imagedestroy($crop); 85 86 imagejpeg($scale,$d['cache'],$conf['jpg_quality']); 87 imagedestroy($scale); 88 89 if($conf['fperm']) chmod($d['cache'], $conf['fperm']); 90} 91 92function tile_im($d){ 93 global $conf; 94 95 $cmd = $conf['im_convert']; 96 $cmd .= ' '.escapeshellarg($d['file']); 97 $cmd .= ' -crop \''.abs($d['brx'] - $d['tlx']).'x'.abs($d['bry'] - $d['tly']).'!+'.$d['tlx'].'+'.$d['tly'].'\''; 98 $cmd .= ' -background black'; 99 $cmd .= ' -extent \''.abs($d['brx'] - $d['tlx']).'x'.abs($d['bry'] - $d['tly']).'!\''; 100 $cmd .= ' -resize \''.$d['ts'].'x'.$d['ts'].'!\''; 101 102 $cmd .= ' -quality '.$conf['jpg_quality']; 103 $cmd .= ' '.escapeshellarg($d['cache']); 104 105# dbg($cmd); exit; 106 107 @exec($cmd,$out,$retval); 108 if ($retval == 0) return true; 109 gfx_error('generic'); 110} 111 112 113 114function image_scale($image,$x,$y,$w,$h){ 115 $scale=imagecreatetruecolor($w,$h); 116 imagecopyresampled($scale,$image,0,0,0,0,$w,$h,$x,$y); 117 return $scale; 118} 119 120function image_crop($image,$x,$y,$left,$upper,$right,$lower) { 121 $w=abs($right-$left); 122 $h=abs($lower-$upper); 123 $crop = imagecreatetruecolor($w,$h); 124 imagecopy($crop,$image,0,0,$left,$upper,$w,$h); 125 return $crop; 126} 127 128function gfx_error($type){ 129 $file = dirname(__FILE__).'/gfx/'.$type.'.gif'; 130 $time = filemtime($file); 131 header('Content-type: image/gif'); 132 133 http_conditionalRequest($time); 134 http_sendfile($file); 135 readfile($file); 136 exit; 137} 138 139//Setup VIM: ex: et ts=4 enc=utf-8 : 140