Added support for centering the media panel on a region of interest when

it is displaying in a space smaller than its desired view size.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1345 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2002-05-07 00:53:56 +00:00
parent 581a2cce44
commit ac31caa28b
+46 -3
View File
@@ -1,5 +1,5 @@
//
// $Id: MediaPanel.java,v 1.5 2002/04/27 22:40:09 mdb Exp $
// $Id: MediaPanel.java,v 1.6 2002/05/07 00:53:56 mdb Exp $
package com.threerings.media;
@@ -151,6 +151,20 @@ public class MediaPanel extends JComponent
}
}
/**
* Configures a region of interest which will be displayed in the
* center of the viewport in situations where the media panel's actual
* size is smaller than its view size.
*
* @param region the region of interest or null if there is to be no
* region of interest (in which case the view will simply be
* centered).
*/
public void setRegionOfInterest (Rectangle region)
{
_interest = region;
}
/**
* Returns a reference to the region manager that is used to
* accumulate dirty regions each frame.
@@ -199,13 +213,39 @@ public class MediaPanel extends JComponent
// figure out our viewport offsets
Dimension size = getSize(), vsize = getViewSize();
_tx = (vsize.width - size.width)/2;
_ty = (vsize.height - size.height)/2;
// we need to compute one dimension at a time to make things work;
// if we have a region of interest (and our actual size is smaller
// than our view size), use that to compute our offset
if (_interest != null && size.width < vsize.width) {
_tx = centerWithInterest(size.width, vsize.width,
_interest.x, _interest.width);
} else {
// otherwise just center the display
_tx = (vsize.width - size.width)/2;
}
if (_interest != null && size.height < vsize.height) {
_ty = centerWithInterest(size.height, vsize.height,
_interest.y, _interest.height);
} else {
_ty = (vsize.height - size.height)/2;
}
// Log.info("Size: " + size + ", vsize: " + vsize +
// ", tx: " + _tx + ", ty: " + _ty + ".");
}
/**
* Used to compute our viewport offsets.
*/
protected int centerWithInterest (int len, int vlen, int ix, int ilen)
{
// start out by centering on the region of interest
int tx = (ix - (len - ilen)/2);
// make sure that didn't push us off of the screen
return Math.min(Math.max(tx, 0), vlen-len);
}
// documentation inherited
public void invalidate ()
{
@@ -492,6 +532,9 @@ public class MediaPanel extends JComponent
/** Used to accumulate and merge dirty regions on each tick. */
protected RegionManager _remgr;
/** A region of interest which we'll try to keep visible. */
protected Rectangle _interest;
/** Our viewport offsets. */
protected int _tx, _ty;