 			}
 			else
 			{
-				var usedCenterCoords:Boolean = false;
+				var useFixedAspectRatio:Boolean = false;
 				if (state.hasOwnProperty("xCenter"))
 				{
+					useFixedAspectRatio = true;
 					if (MathLib.roundSignificant(_dataBounds.getXCenter()) != state.xCenter)
 					{
 						_dataBounds.setXCenter(state.xCenter);
 						cc.triggerCallbacks();
 					}
-					usedCenterCoords = true;
 				}
 				if (state.hasOwnProperty("yCenter"))
 				{
+					useFixedAspectRatio = true;
 					if (MathLib.roundSignificant(_dataBounds.getYCenter()) != state.yCenter)
 					{
 						_dataBounds.setYCenter(state.yCenter);
 						cc.triggerCallbacks();
 					}
-					usedCenterCoords = true;
-				}
-				if (state.hasOwnProperty("areaPerPixel"))
-				{
-					if (MathLib.roundSignificant(_dataBounds.getArea() / _screenBounds.getArea()) != state.areaPerPixel)
-					{
-						var scale:Number = Math.sqrt(state.areaPerPixel);
-						_dataBounds.centeredResize(_screenBounds.getXCoverage() * scale, _screenBounds.getYCoverage() * scale);
+				}
+				if (state.hasOwnProperty("area"))
+				{
+					useFixedAspectRatio = true;
+					if (MathLib.roundSignificant(_dataBounds.getArea()) != state.area)
+					{
+						// We can't change the screen area.  Adjust the dataBounds to match the specified area.
+						/*
+							Ad = Wd * Hd
+							Wd/Hd = Ws/Hs
+							Wd = Hd * Ws/Hs
+							Ad = Hd^2 * Ws/Hs
+							Hd^2 = Ad * Hs/Ws
+							Hd = sqrt(Ad * Hs/Ws)
+						*/
+						
+						var Ad:Number = state.area;
+						var HsWsRatio:Number = _screenBounds.getYCoverage() / _screenBounds.getXCoverage();
+						if (!isFinite(HsWsRatio)) // handle case if screenBounds is undefined
+							HsWsRatio = 1;
+						var Hd:Number = Math.sqrt(Ad * HsWsRatio);
+						var Wd:Number = Ad / Hd;
+						_dataBounds.centeredResize(Wd, Hd);
 						cc.triggerCallbacks();
 					}
-					usedCenterCoords = true;
 				}
 				
-				if (!usedCenterCoords)
+				if (!useFixedAspectRatio)
 				{
 					var names:Array = ["xMin", "yMin", "xMax", "yMax"];
 					for each (var name:String in names)


package weave.primitives
{
	import weave.api.WeaveAPI;
	import weave.api.core.ICallbackCollection;
	import weave.api.core.ILinkableObject;

				return {
					xCenter: MathLib.roundSignificant(_dataBounds.getXCenter()),
					yCenter: MathLib.roundSignificant(_dataBounds.getYCenter()),
					area: MathLib.roundSignificant(_dataBounds.getArea())
				};
			}
			else
