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 41 // cache times 42 $data['cache'] = getCacheName($data['file'],'.pv.'.$data['zoom'].'-'.$data['col'].'-'.$data['row'].'.jpg'); 43 $data['cachet'] = @filemtime($data['cache']); 44 $data['selft'] = filemtime(__FILE__); 45 46 // (re)generate 47 if( ($data['cachet'] < $data['mtime']) || ($data['cachet'] < $data['selft']) ){ 48 tile_gd($data); 49 } 50 51 // send 52 header('Content-type: image/jpeg'); 53 http_conditionalRequest(max($data['mtime'],$data['selft'])); 54 http_sendfile($data['cache']); 55 readfile($data['cache']); 56 57 58 59 60/* --------------- functions -------------------- */ 61 62 63function tile_gd($d){ 64 $img = null; 65 if(preg_match('/\.jpe?g$/',$d['file'])){ 66 $img = @imagecreatefromjpeg($d['file']); 67 }elseif(preg_match('/\.png$/',$d['file'])){ 68 $img = @imagecreatefrompng($d['file']); 69 }elseif(preg_match('/\.gif$/',$d['file'])){ 70 $img = @imagecreatefromgif($d['file']); 71 } 72 if(!$img) gfx_error('generic'); 73 74 $crop = image_crop($img,$d['width'],$d['height'],$d['tlx'],$d['tly'],$d['brx'],$d['bry']); 75 imagedestroy($img); 76 77 $scale = image_scale($crop,abs($d['brx'] - $d['tlx']),abs($d['bry'] - $d['tly']),$d['ts'],$d['ts']); 78 imagedestroy($crop); 79 80 imagejpeg($scale,$d['cache']); 81 imagedestroy($scale); 82} 83 84function image_scale($image,$x,$y,$w,$h){ 85 $scale=imagecreatetruecolor($w,$h); 86 imagecopyresampled($scale,$image,0,0,0,0,$w,$h,$x,$y); 87 return $scale; 88} 89 90function image_crop($image,$x,$y,$left,$upper,$right,$lower) { 91 $w=abs($right-$left); 92 $h=abs($lower-$upper); 93 $crop = imagecreatetruecolor($w,$h); 94 imagecopy($crop,$image,0,0,$left,$upper,$w,$h); 95 return $crop; 96} 97 98function gfx_error($type){ 99 $file = dirname(__FILE__).'/gfx/'.$type.'.gif'; 100 $time = filemtime($file); 101 header('Content-type: image/gif'); 102 103 http_conditionalRequest($time); 104 http_sendfile($file); 105 readfile($file); 106 exit; 107} 108 109//Setup VIM: ex: et ts=4 enc=utf-8 : 110