127bbde00SAndreas Gohr<?php 2*8f5b2c44SAndreas Gohr 327bbde00SAndreas Gohr/** 427bbde00SAndreas Gohr * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 527bbde00SAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 627bbde00SAndreas Gohr */ 727bbde00SAndreas Gohr 8*8f5b2c44SAndreas Gohrif (!defined('DOKU_INC')) define('DOKU_INC', realpath(__DIR__ . '/../../../') . '/'); 927bbde00SAndreas Gohrdefine('DOKU_DISABLE_GZIP_OUTPUT', 1); 1027bbde00SAndreas Gohrrequire_once(DOKU_INC . 'inc/init.php'); 1127bbde00SAndreas Gohrsession_write_close(); 1227bbde00SAndreas Gohr 137242a9edSAndreas Gohrglobal $conf; 147242a9edSAndreas Gohr 157242a9edSAndreas Gohr 16d6577f0fSAndreas Gohr/** @var syntax_plugin_panoview $pl */ 177242a9edSAndreas Gohr$pl = plugin_load('syntax', 'panoview'); 181faa1ff0SAndreas Gohr 19*8f5b2c44SAndreas Gohr$data = []; 2027bbde00SAndreas Gohr// get parameters 21*8f5b2c44SAndreas Gohr[$data['zoom'], $data['col'], $data['row']] = explode('-', $_GET['tile']); 2227bbde00SAndreas Gohr$data['id'] = cleanID($_GET['image']); 2327bbde00SAndreas Gohr$data['file'] = mediaFN($data['id']); 2427bbde00SAndreas Gohr$data['mtime'] = @filemtime($data['file']); 2527bbde00SAndreas Gohr 2627bbde00SAndreas Gohr// check auth and existance 27*8f5b2c44SAndreas Gohrif (auth_quickaclcheck(getNS($data['id']) . ':X') < AUTH_READ) $pl->gfxError('noauth'); 28*8f5b2c44SAndreas Gohrif (!$data['mtime']) $pl->gfxError('notfound'); 2927bbde00SAndreas Gohr 3027bbde00SAndreas Gohr// calculate zoom level scaling 3127bbde00SAndreas Gohr$data['ts'] = 256; 32*8f5b2c44SAndreas Gohr[$data['width'], $data['height']] = getimagesize($data['file']); 33*8f5b2c44SAndreas Gohr$data['scale'] = (int) 2 ** $data['zoom']; 3427bbde00SAndreas Gohr$data['max'] = max($data['width'], $data['height']); 3527bbde00SAndreas Gohr$data['inv'] = $data['max'] / ($data['ts'] * $data['scale']); 36359cb25cSAndreas Gohr 37*8f5b2c44SAndreas Gohrif ($data['inv'] < 0.5) $pl->gfxError('maxzoom'); 38359cb25cSAndreas Gohrif ($data['inv'] < 1.0) $data['inv'] = 1.0; // original size, no upscaling 3927bbde00SAndreas Gohr 4027bbde00SAndreas Gohr// calculate tile boundaries 4127bbde00SAndreas Gohr$data['tlx'] = (int) ($data['col'] * $data['ts'] * $data['inv']); 4227bbde00SAndreas Gohr$data['tly'] = (int) ($data['row'] * $data['ts'] * $data['inv']); 4327bbde00SAndreas Gohr$data['brx'] = (int) ($data['tlx'] + ($data['ts'] * $data['inv'])); 4427bbde00SAndreas Gohr$data['bry'] = (int) ($data['tly'] + ($data['ts'] * $data['inv'])); 45*8f5b2c44SAndreas Gohrif ($data['tlx'] > $data['width'] || $data['tly'] > $data['height']) $pl->gfxError('blank'); 4627bbde00SAndreas Gohr 4727bbde00SAndreas Gohr// cache times 4827bbde00SAndreas Gohr$data['cache'] = getCacheName($data['file'], '.pv.' . $data['zoom'] . '-' . $data['col'] . '-' . $data['row'] . '.jpg'); 4927bbde00SAndreas Gohr$data['cachet'] = @filemtime($data['cache']); 5027bbde00SAndreas Gohr 5127bbde00SAndreas Gohr// (re)generate 52c131b324SAndreas Gohrif ($data['cachet'] < $data['mtime']) { 53*8f5b2c44SAndreas Gohr $pl->tileLock($data); 54dc838624SAndreas Gohr if ($conf['im_convert']) { 55*8f5b2c44SAndreas Gohr $pl->tileIM($data); 56dc838624SAndreas Gohr } else { 57*8f5b2c44SAndreas Gohr $pl->tileGD($data); 5827bbde00SAndreas Gohr } 59*8f5b2c44SAndreas Gohr $pl->tileUnlock($data); 60dc838624SAndreas Gohr} 6127bbde00SAndreas Gohr 6227bbde00SAndreas Gohr// send 6327bbde00SAndreas Gohrheader('Content-type: image/jpeg'); 647242a9edSAndreas Gohrhttp_conditionalRequest(max($data['mtime'], $data['cachet'])); 65d6577f0fSAndreas Gohr 66d6577f0fSAndreas Gohr//use x-sendfile header to pass the delivery to compatible webservers 677242a9edSAndreas Gohrhttp_sendfile($data['cache']); 68d6577f0fSAndreas Gohr 69d6577f0fSAndreas Gohr// send file contents 70d6577f0fSAndreas Gohr$fp = @fopen($data['cache'], "rb"); 71d6577f0fSAndreas Gohrif ($fp) { 72d6577f0fSAndreas Gohr http_rangeRequest($fp, filesize($data['cache']), 'image/jpeg'); 73d6577f0fSAndreas Gohr} else { 74d6577f0fSAndreas Gohr header("HTTP/1.0 500 Internal Server Error"); 75*8f5b2c44SAndreas Gohr echo "Could not read tile - bad permissions?"; 76d6577f0fSAndreas Gohr} 77