From ac31caa28b8db3e9dd9e054bb5e094c2b08ef72a Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Tue, 7 May 2002 00:53:56 +0000 Subject: [PATCH] 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 --- src/java/com/threerings/media/MediaPanel.java | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/java/com/threerings/media/MediaPanel.java b/src/java/com/threerings/media/MediaPanel.java index f84c4d02b..97a4513b6 100644 --- a/src/java/com/threerings/media/MediaPanel.java +++ b/src/java/com/threerings/media/MediaPanel.java @@ -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;