Skip to content

Commit

Permalink
multisize - added the coi (still to affine the admin ui + language)
Browse files Browse the repository at this point in the history
multisize - derivatives can be revuild from a larger derviative instead of the original

git-svn-id: http://piwigo.org/svn/trunk@13038 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information
rvelices committed Feb 6, 2012
1 parent 8d86e7b commit 0d27721
Show file tree
Hide file tree
Showing 15 changed files with 2,204 additions and 28 deletions.
97 changes: 97 additions & 0 deletions admin/picture_coi.php
@@ -0,0 +1,97 @@
<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+

if(!defined("PHPWG_ROOT_PATH"))
{
die('Hacking attempt!');
}

// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);

check_input_parameter('image_id', $_GET, false, PATTERN_ID);

if (isset($_POST['submit']))
{
$query = 'UPDATE '.IMAGES_TABLE;
if (strlen($_POST['l'])==0)
{
$query .= ' SET coi=NULL';
}
else
{
$coi = fraction_to_char($_POST['l'])
.fraction_to_char($_POST['t'])
.fraction_to_char($_POST['r'])
.fraction_to_char($_POST['b']);
$query .= ' SET coi=\''.$coi.'\'';
}
$query .= ' WHERE id='.$_GET['image_id'];
pwg_query($query);
}

$query = 'SELECT * FROM '.IMAGES_TABLE.' WHERE id='.$_GET['image_id'];
$row = pwg_db_fetch_assoc( pwg_query($query) );

if (isset($_POST['submit']))
{
delete_element_derivatives($row);
}

$tpl_var = array(
'ALT' => $row['file'],
'U_IMG' => DerivativeImage::url(IMG_LARGE, $row),
'U_EDIT' => get_root_url().'admin.php?page=picture_modify&amp;image_id='.$_GET['image_id'],
);

if (!empty($row['coi']))
{
$tpl_var['coi'] = array(
'l'=> char_to_fraction($row['coi'][0]),
't'=> char_to_fraction($row['coi'][1]),
'r'=> char_to_fraction($row['coi'][2]),
'b'=> char_to_fraction($row['coi'][3]),
);
}

if (isset($_POST['submit']))
{
$uid = '&b='.time();
$conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
$conf['derivative_url_style']=2; //script
$tpl_var['U_SQUARE'] = DerivativeImage::url(IMG_SQUARE, $row).$uid;
$tpl_var['U_THUMB'] = DerivativeImage::url(IMG_THUMB, $row).$uid;
}
else
{
$tpl_var['U_SQUARE'] = DerivativeImage::url(IMG_SQUARE, $row);
$tpl_var['U_THUMB'] = DerivativeImage::url(IMG_THUMB, $row);
}

$template->assign($tpl_var);
$template->set_filename('picture_coi', 'picture_coi.tpl');

$template->assign_var_from_handle('ADMIN_CONTENT', 'picture_coi');
?>
5 changes: 5 additions & 0 deletions admin/picture_modify.php
Expand Up @@ -303,6 +303,11 @@
)
);

if (in_array(get_extension($row['path']),$conf['picture_ext']))
{
$template->assign('U_COI', get_root_url().'admin.php?page=picture_coi&amp;image_id='.$_GET['image_id']);
}

// image level options
$selected_level = isset($_POST['level']) ? $_POST['level'] : $row['level'];
$template->assign(
Expand Down
66 changes: 66 additions & 0 deletions admin/themes/default/template/picture_coi.tpl
@@ -0,0 +1,66 @@
{html_head}
<link rel="stylesheet" type="text/css" href="themes/default/js/plugins/jquery.Jcrop.css" />
{/html_head}
{combine_script id='jquery.jcrop' load='footer' require='jquery' path='themes/default/js/plugins/jquery.Jcrop.min.js'}

<h2>{'Center of interest'|@translate}</h2>
<div>
<a href="{$U_EDIT}">{'Edit photo information'|@translate}</a>
</div>

<div>
<img src="{$U_SQUARE}" alt="{$ALT}">
<img src="{$U_THUMB}" alt="{$ALT}">
</div>

<div>
<form method="post">
<input type="hidden" id="l" name="l" value="{if isset($coi)}{$coi.l}{/if}">
<input type="hidden" id="t" name="t" value="{if isset($coi)}{$coi.t}{/if}">
<input type="hidden" id="r" name="r" value="{if isset($coi)}{$coi.r}{/if}">
<input type="hidden" id="b" name="b" value="{if isset($coi)}{$coi.b}{/if}">

<img id="jcrop" src="{$U_IMG}" alt="{$ALT}">

<p>
<input type="submit" name="submit" value="{'Submit'|@translate}">
</p>
</form>
</div>

{footer_script}
{literal}
function from_coi(f, total) {
return f*total;
}

function to_coi(v, total) {
return v/total;
}

function jOnChange(sel) {
var $img = jQuery("#jcrop");
jQuery("#l").val( to_coi(sel.x, $img.width()) );
jQuery("#t").val( to_coi(sel.y, $img.height()) );
jQuery("#r").val( to_coi(sel.x2, $img.width()) );
jQuery("#b").val( to_coi(sel.y2, $img.height()) );
}
function jOnRelease() {
jQuery("#l,#t,#r,#b").val("");
}

{/literal}
jQuery("#jcrop").Jcrop( {ldelim}
boxWidth: 400, boxHeight: 400,
onChange: jOnChange,
onRelease: jOnRelease
}
{if isset($coi)}
,function() {ldelim}
var $img = jQuery("#jcrop");
this.animateTo( [from_coi({$coi.l}, $img.width()), from_coi({$coi.t}, $img.height()), from_coi({$coi.r}, $img.width()), from_coi({$coi.b}, $img.height()) ] );
}
{/if}
);
{/footer_script}

7 changes: 6 additions & 1 deletion admin/themes/default/template/picture_modify.tpl
Expand Up @@ -83,7 +83,12 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da
</td>
</tr>
{/if}

{if isset($U_COI)}
<tr>
<td></td>
<td><a href="{$U_COI}">{'Not cropped correctly?'|@translate}</a></td>
</tr>
{/if}
</table>

</fieldset>
Expand Down
96 changes: 87 additions & 9 deletions i.php
Expand Up @@ -232,12 +232,6 @@ function parse_request()
}
}
array_shift($deriv);
$page['coi'] = '';
if (count($deriv) && $deriv[0][0]=='c' && $deriv[0][1]=='i')
{
$page['coi'] = substr(array_shift($deriv), 2);
preg_match('#^[a-zA-Z]{4}$#', $page['coi']) or ierror('Invalid center of interest', 400);
}

if ($page['derivative_type'] == IMG_CUSTOM)
{
Expand All @@ -256,7 +250,7 @@ function parse_request()
{
ierror('Too big', 403);
}

$key = array();
$params->add_url_tokens($key);
$key = implode('_', $key);
Expand All @@ -266,15 +260,65 @@ function parse_request()
}
}

if (!is_file(PHPWG_ROOT_PATH.$req.$ext) and
is_file(PHPWG_ROOT_PATH.'../'.$req.$ext) )
if (is_file(PHPWG_ROOT_PATH.$req.$ext))
{
$req = './'.$req; // will be used to match #iamges.path
}
elseif (is_file(PHPWG_ROOT_PATH.'../'.$req.$ext))
{
$req = '../'.$req;
}

$page['src_location'] = $req.$ext;
$page['src_path'] = PHPWG_ROOT_PATH.$page['src_location'];
$page['src_url'] = $page['root_path'].$page['src_location'];
}

function try_switch_source(DerivativeParams $params, $original_mtime)
{
global $page;
$candidates = array();
foreach(ImageStdParams::get_defined_type_map() as $candidate)
{
if ($candidate->type == $params->type)
continue;
if ($candidate->use_watermark != $params->use_watermark)
continue;
if ($candidate->max_width() < $params->max_width() || $candidate->max_height() < $params->max_height())
continue;
if ($params->sizing->max_crop==0)
{
if ($candidate->sizing->max_crop!=0)
continue;
}
else
{
if ($candidate->sizing->max_crop!=0)
continue; // this could be optimized
if (!isset($page['original_size']))
continue;
$candidate_size = $candidate->compute_final_size($page['original_size']);
if ($candidate_size[0] < $params->sizing->min_size[0] || $candidate_size[1] < $params->sizing->min_size[1] )
continue;
}
$candidates[] = $candidate;
}

foreach( array_reverse($candidates) as $candidate)
{
$candidate_path = $page['derivative_path'];
$candidate_path = str_replace( '-'.derivative_to_url($params->type), '-'.derivative_to_url($candidate->type), $candidate_path);
$candidate_mtime = @filemtime($candidate_path);
if ($candidate_mtime === false
|| $candidate_mtime < $original_mtime
|| $candidate_mtime < $candidate->last_mod_time)
continue;
$params->use_watermark = false;
$params->sharpen = min(1, $params->sharpen);
$page['src_path'] = $candidate_path;
$page['src_url'] = $page['root_path'] . substr($candidate_path, strlen(PHPWG_ROOT_PATH));
}
}

function send_derivative($expires)
{
Expand Down Expand Up @@ -362,6 +406,40 @@ function send_derivative($expires)
send_derivative($expires);
}

$page['coi'] = null;
if (strpos($page['src_location'], '/pwg_representative/')===false
&& strpos($page['src_location'], 'themes/')===false
&& strpos($page['src_location'], 'plugins/')===false)
{
@include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php');
include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
try
{
$pwg_db_link = pwg_db_connect($conf['db_host'], $conf['db_user'],
$conf['db_password'], $conf['db_base']);
$query = 'SELECT coi, width, height FROM '.$prefixeTable.'images WHERE path=\''.$page['src_location'].'\'';
if ( ($row=pwg_db_fetch_assoc(pwg_query($query))) )
{
if (isset($row['width']))
{
$page['original_size'] = array($row['width'],$row['height']);
}
$page['coi'] = $row['coi'];
}
mysql_close($pwg_db_link);
if (!$row)
{
ierror('Db file path not found', 404);
}
}
catch (Exception $e)
{
ilog("db error", $e->getMessage());
}
}

try_switch_source($params, $src_mtime);

if (!mkgetdir(dirname($page['derivative_path'])))
{
ierror("dir create error", 500);
Expand Down
6 changes: 3 additions & 3 deletions include/dblayer/functions_mysql.inc.php
Expand Up @@ -84,10 +84,10 @@ function pwg_query($query)
{
global $conf,$page,$debug,$t2;

$start = get_moment();
$start = microtime(true);
($result = mysql_query($query)) or my_error($query, $conf['die_on_sql_error']);

$time = get_moment() - $start;
$time = microtime(true) - $start;

if (!isset($page['count_queries']))
{
Expand Down Expand Up @@ -199,7 +199,7 @@ function array_from_query($query, $fieldname)
$result = pwg_query($query);
while ($row = mysql_fetch_assoc($result))
{
array_push($array, $row[$fieldname]);
$array[] = $row[$fieldname];
}

return $array;
Expand Down
11 changes: 2 additions & 9 deletions include/derivative.inc.php
Expand Up @@ -27,14 +27,13 @@ final class SrcImage
public $id;
public $rel_path;

public $coi=null;
private $size=null;
private $flags=0;

function __construct($infos)
{
global $conf;

$this->id = $infos['id'];
$ext = get_extension($infos['path']);
if (in_array($ext, $conf['picture_ext']))
Expand All @@ -54,7 +53,6 @@ function __construct($infos)
$this->size = @getimagesize(PHPWG_ROOT_PATH.$this->rel_path);
}

$this->coi = @$infos['coi'];
if (!$this->size && isset($infos['width']) && isset($infos['height']))
{
$this->size = array($infos['width'], $infos['height']);
Expand Down Expand Up @@ -168,11 +166,6 @@ private static function build($src, &$params, &$rel_path, &$rel_url)
$tokens=array();
$tokens[] = substr($params->type,0,2);

if ($params->sizing->max_crop != 0 and !empty($src->coi))
{
$tokens[] = 'ci'.$src->coi;
}

if ($params->type==IMG_CUSTOM)
{
$params->add_url_tokens($tokens);
Expand Down Expand Up @@ -257,7 +250,7 @@ function get_size()
{
return $this->src_image->get_size();
}
return $this->params->compute_final_size($this->src_image->get_size(), $this->src_image->coi);
return $this->params->compute_final_size($this->src_image->get_size());
}

function get_size_htm()
Expand Down

0 comments on commit 0d27721

Please sign in to comment.