wrote a quick fix
The code is below, some of the functions have been added by me, some have been edited by me (originally written by senocular). Its mostly a fix, I didn't bother writing and get/set functions for portability since I thought I was just writing it for myself. Hope this helps (or at least gets you started)...
DECLARE AT TOP OF .AS FILE:
private var _minRectangle:Rectangle = new Rectangle(0, 0, 100, 75); //set constraints here
private var _horizConstraint:Number;
private var _vertConstraint:Number;
INSERTED/EDITED AROUND LINE 1020:
private function setConstraints():void {
// set new targetbounds
var cWidth:Number = Point.distance(_boundsBottomRight, _boundsBottomLeft);
var cHeight:Number = Point.distance(_boundsTopLeft, _boundsBottomLeft);
// maintain aspect ratio
var whRatio:Number = cWidth / cHeight;
_minRectangle.height = (_minRectangle.width * cHeight) / cWidth;
// boundaries determined by ration between _minRectange and current rectangle
_horizConstraint = (1 - (_minRectangle.width / cWidth)) * (-1);
_vertConstraint = (1 - (_minRectangle.height / cHeight)) * (-1);
}
private function constrainSmallScale(scaleType:String):Point {
// Code Edit by Kyle Brekke - Nov 4, 2007
// Based on the constrain code in scaleBothInteraction function
// mouse reference, may change from innerMouseLoc if constraining
var innerMouseRef:Point = innerMouseLoc.clone();
// how much the mouse has moved from starting the interaction
var moved:Point = innerMouseLoc.subtract(innerInteractionStart);
// the relationship of the start location to the registration point
var regOffset:Point = innerInteractionStart.subtract(innerRegistration);
// find the ratios between movement and the registration offset
var ratioH = regOffset.x ? moved.x/regOffset.x : 0;
var ratioV = regOffset.y ? moved.y/regOffset.y : 0;
if (ratioV < _vertConstraint) { //flipped vert
innerMouseRef.y = innerInteractionStart.y + regOffset.y * _vertConstraint;
}
if (ratioH < _horizConstraint) { //flipped horiz
innerMouseRef.x = innerInteractionStart.x + regOffset.x * _horizConstraint;
}
var distortV:Point = distortOffset(new Point(innerInteractionStart.x, innerMouseRef.y), innerInteractionStart.y - innerRegistration.y);
var distortH:Point = distortOffset(new Point(innerMouseRef.x, innerInteractionStart.y), innerInteractionStart.x - innerRegistration.x);
if (scaleType == "horizontal") {
return distortH;
} else {
return distortV;
}
}
// THIS IS THE SAME CODE FOR scaleYInteraction, just change "horizontal" to "vertical"
public function scaleXInteraction():void {
// Code Edit by Kyle Brekke Nov 9, 2007
// get distortion offset horizontal movement
//var distortH:Point = distortOffset(new Point(innerMouseLoc.x, innerInteractionStart.y), innerInteractionStart.x - innerRegistration.x);
var distortH:Point = constrainSmallScale("horizontal"); // edited Kyle Brekke - Nov 4, 2007
// update the matrix for vertical scale
_toolMatrix.a += distortH.x;
_toolMatrix.b += distortH.y;
completeInteraction(true);
}
INSIDE scaleBothInteraction FUNCTION:
// have the larger of the movement distances brought down
// based on the lowest ratio to fit the registration offset
if (ratioH > ratioV && (ratioV > _vertConstraint) && (ratioH > _horizConstraint)) { // "&&..." added by Kyle Brekke Nov 5, 2007
innerMouseRef.x = innerInteractionStart.x + regOffset.x * ratioV;
}else if (ratioV > ratioH && (ratioV > _vertConstraint) && (ratioH > _horizConstraint)){ // "&&..." added by Kyle Brekke Nov 5, 2007
innerMouseRef.y = innerInteractionStart.y + regOffset.y * ratioH;
}
// constrain the scale so pictures don't flip - editted Kyle Brekke Nov 4
if (ratioV < _vertConstraint || ratioH < _horizConstraint) { //flipped vert
innerMouseRef.y = innerInteractionStart.y + regOffset.y * _vertConstraint;
innerMouseRef.x = innerInteractionStart.x + regOffset.x * _horizConstraint;
}
|