xref: /plugin/panoview/tiles.php (revision 8f5b2c443926244abdd521573e7c1fe60fb9e68c)
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