?? cropper.uncompressed.js
字號:
dir.y = 1;
break;
}
if( dir.x != 0 || dir.y != 0 ) {
// if shift is pressed then move by 10 pixels
if( e.shiftKey ) {
dir.x *= 10;
dir.y *= 10;
}
this.moveArea( [ this.areaCoords.x1 + dir.x, this.areaCoords.y1 + dir.y ] );
Event.stop( e );
}
}
},
/**
* Calculates the width from the areaCoords
*
* @access private
* @return int
*/
calcW: function() {
return (this.areaCoords.x2 - this.areaCoords.x1)
},
/**
* Calculates the height from the areaCoords
*
* @access private
* @return int
*/
calcH: function() {
return (this.areaCoords.y2 - this.areaCoords.y1)
},
/**
* Moves the select area to the supplied point (assumes the point is x1 & y1 of the select area)
*
* @access public
* @param array Point for x1 & y1 to move select area to
* @return void
*/
moveArea: function( point ) {
// dump( 'moveArea : ' + point[0] + ',' + point[1] + ',' + ( point[0] + ( this.areaCoords.x2 - this.areaCoords.x1 ) ) + ',' + ( point[1] + ( this.areaCoords.y2 - this.areaCoords.y1 ) ) + '\n' );
this.setAreaCoords(
{
x1: point[0],
y1: point[1],
x2: point[0] + this.calcW(),
y2: point[1] + this.calcH()
},
true,
false
);
this.drawArea();
},
/**
* Clones a co-ordinates object, stops problems with handling them by reference
*
* @access private
* @param obj Coordinate object x1, y1, x2, y2
* @return obj Coordinate object x1, y1, x2, y2
*/
cloneCoords: function( coords ) {
return { x1: coords.x1, y1: coords.y1, x2: coords.x2, y2: coords.y2 };
},
/**
* Sets the select coords to those provided but ensures they don't go
* outside the bounding box
*
* @access private
* @param obj Coordinates x1, y1, x2, y2
* @param boolean Whether this is a move
* @param boolean Whether to apply squaring
* @param obj Direction of mouse along both axis x, y ( -1 = negative, 1 = positive ) only required when moving etc.
* @param string The current resize handle || null
* @return void
*/
setAreaCoords: function( coords, moving, square, direction, resizeHandle ) {
// dump( 'setAreaCoords (in) : ' + coords.x1 + ',' + coords.y1 + ',' + coords.x2 + ',' + coords.y2 );
if( moving ) {
// if moving
var targW = coords.x2 - coords.x1;
var targH = coords.y2 - coords.y1;
// ensure we're within the bounds
if( coords.x1 < 0 ) {
coords.x1 = 0;
coords.x2 = targW;
}
if( coords.y1 < 0 ) {
coords.y1 = 0;
coords.y2 = targH;
}
if( coords.x2 > this.imgW ) {
coords.x2 = this.imgW;
coords.x1 = this.imgW - targW;
}
if( coords.y2 > this.imgH ) {
coords.y2 = this.imgH;
coords.y1 = this.imgH - targH;
}
} else {
// ensure we're within the bounds
if( coords.x1 < 0 ) coords.x1 = 0;
if( coords.y1 < 0 ) coords.y1 = 0;
if( coords.x2 > this.imgW ) coords.x2 = this.imgW;
if( coords.y2 > this.imgH ) coords.y2 = this.imgH;
// This is passed as null in onload
if( direction != null ) {
// apply the ratio or squaring where appropriate
if( this.ratioX > 0 ) this.applyRatio( coords, { x: this.ratioX, y: this.ratioY }, direction, resizeHandle );
else if( square ) this.applyRatio( coords, { x: 1, y: 1 }, direction, resizeHandle );
var mins = [ this.options.minWidth, this.options.minHeight ]; // minimum dimensions [x,y]
var maxs = [ this.options.maxWidth, this.options.maxHeight ]; // maximum dimensions [x,y]
// apply dimensions where appropriate
if( mins[0] > 0 || mins[1] > 0 || maxs[0] > 0 || maxs[1] > 0) {
var coordsTransX = { a1: coords.x1, a2: coords.x2 };
var coordsTransY = { a1: coords.y1, a2: coords.y2 };
var boundsX = { min: 0, max: this.imgW };
var boundsY = { min: 0, max: this.imgH };
// handle squaring properly on single axis minimum dimensions
if( (mins[0] != 0 || mins[1] != 0) && square ) {
if( mins[0] > 0 ) mins[1] = mins[0];
else if( mins[1] > 0 ) mins[0] = mins[1];
}
if( (maxs[0] != 0 || maxs[0] != 0) && square ) {
// if we have a max x value & it is less than the max y value then we set the y max to the max x (so we don't go over the minimum maximum of one of the axes - if that makes sense)
if( maxs[0] > 0 && maxs[0] <= maxs[1] ) maxs[1] = maxs[0];
else if( maxs[1] > 0 && maxs[1] <= maxs[0] ) maxs[0] = maxs[1];
}
if( mins[0] > 0 ) this.applyDimRestriction( coordsTransX, mins[0], direction.x, boundsX, 'min' );
if( mins[1] > 1 ) this.applyDimRestriction( coordsTransY, mins[1], direction.y, boundsY, 'min' );
if( maxs[0] > 0 ) this.applyDimRestriction( coordsTransX, maxs[0], direction.x, boundsX, 'max' );
if( maxs[1] > 1 ) this.applyDimRestriction( coordsTransY, maxs[1], direction.y, boundsY, 'max' );
coords = { x1: coordsTransX.a1, y1: coordsTransY.a1, x2: coordsTransX.a2, y2: coordsTransY.a2 };
}
}
}
// dump( 'setAreaCoords (out) : ' + coords.x1 + ',' + coords.y1 + ',' + coords.x2 + ',' + coords.y2 + '\n' );
this.areaCoords = coords;
},
/**
* Applies the supplied dimension restriction to the supplied coordinates along a single axis
*
* @access private
* @param obj Single axis coordinates, a1, a2 (e.g. for the x axis a1 = x1 & a2 = x2)
* @param int The restriction value
* @param int The direction ( -1 = negative, 1 = positive )
* @param obj The bounds of the image ( for this axis )
* @param string The dimension restriction type ( 'min' | 'max' )
* @return void
*/
applyDimRestriction: function( coords, val, direction, bounds, type ) {
var check;
if( type == 'min' ) check = ( ( coords.a2 - coords.a1 ) < val );
else check = ( ( coords.a2 - coords.a1 ) > val );
if( check ) {
if( direction == 1 ) coords.a2 = coords.a1 + val;
else coords.a1 = coords.a2 - val;
// make sure we're still in the bounds (not too pretty for the user, but needed)
if( coords.a1 < bounds.min ) {
coords.a1 = bounds.min;
coords.a2 = val;
} else if( coords.a2 > bounds.max ) {
coords.a1 = bounds.max - val;
coords.a2 = bounds.max;
}
}
},
/**
* Applies the supplied ratio to the supplied coordinates
*
* @access private
* @param obj Coordinates, x1, y1, x2, y2
* @param obj Ratio, x, y
* @param obj Direction of mouse, x & y : -1 == negative 1 == positive
* @param string The current resize handle || null
* @return void
*/
applyRatio : function( coords, ratio, direction, resizeHandle ) {
// dump( 'direction.y : ' + direction.y + '\n');
var newCoords;
if( resizeHandle == 'N' || resizeHandle == 'S' ) {
// dump( 'north south \n');
// if moving on either the lone north & south handles apply the ratio on the y axis
newCoords = this.applyRatioToAxis(
{ a1: coords.y1, b1: coords.x1, a2: coords.y2, b2: coords.x2 },
{ a: ratio.y, b: ratio.x },
{ a: direction.y, b: direction.x },
{ min: 0, max: this.imgW }
);
coords.x1 = newCoords.b1;
coords.y1 = newCoords.a1;
coords.x2 = newCoords.b2;
coords.y2 = newCoords.a2;
} else {
// otherwise deal with it as if we're applying the ratio on the x axis
newCoords = this.applyRatioToAxis(
{ a1: coords.x1, b1: coords.y1, a2: coords.x2, b2: coords.y2 },
{ a: ratio.x, b: ratio.y },
{ a: direction.x, b: direction.y },
{ min: 0, max: this.imgH }
);
coords.x1 = newCoords.a1;
coords.y1 = newCoords.b1;
coords.x2 = newCoords.a2;
coords.y2 = newCoords.b2;
}
},
/**
* Applies the provided ratio to the provided coordinates based on provided direction & bounds,
* use to encapsulate functionality to make it easy to apply to either axis. This is probably
* quite hard to visualise so see the x axis example within applyRatio()
*
* Example in parameter details & comments is for requesting applying ratio to x axis.
*
* @access private
* @param obj Coords object (a1, b1, a2, b2) where a = x & b = y in example
* @param obj Ratio object (a, b) where a = x & b = y in example
* @param obj Direction object (a, b) where a = x & b = y in example
* @param obj Bounds (min, max)
* @return obj Coords object (a1, b1, a2, b2) where a = x & b = y in example
*/
applyRatioToAxis: function( coords, ratio, direction, bounds ) {
var newCoords = Object.extend( coords, {} );
var calcDimA = newCoords.a2 - newCoords.a1; // calculate dimension a (e.g. width)
var targDimB = Math.floor( calcDimA * ratio.b / ratio.a ); // the target dimension b (e.g. height)
var targB; // to hold target b (e.g. y value)
var targDimA; // to hold target dimension a (e.g. width)
var calcDimB = null; // to hold calculated dimension b (e.g. height)
// dump( 'newCoords[0]: ' + newCoords.a1 + ',' + newCoords.b1 + ','+ newCoords.a2 + ',' + newCoords.b2 + '\n');
if( direction.b == 1 ) { // if travelling in a positive direction
// make sure we're not going out of bounds
targB = newCoords.b1 + targDimB;
if( targB > bounds.max ) {
targB = bounds.max;
calcDimB = targB - newCoords.b1; // calcuate dimension b (e.g. height)
}
newCoords.b2 = targB;
} else { // if travelling in a negative direction
// make sure we're not going out of bounds
targB = newCoords.b2 - targDimB;
if( targB < bounds.min ) {
targB = bounds.min;
calcDimB = targB + newCoords.b2; // calcuate dimension b (e.g. height)
}
newCoords.b1 = targB;
}
// dump( 'newCoords[1]: ' + newCoords.a1 + ',' + newCoords.b1 + ','+ newCoords.a2 + ',' + newCoords.b2 + '\n');
// apply the calculated dimensions
if( calcDimB != null ) {
targDimA = Math.floor( calcDimB * ratio.a / ratio.b );
if( direction.a == 1 ) newCoords.a2 = newCoords.a1 + targDimA;
else newCoords.a1 = newCoords.a1 = newCoords.a2 - targDimA;
}
// dump( 'newCoords[2]: ' + newCoords.a1 + ',' + newCoords.b1 + ','+ newCoords.a2 + ',' + newCoords.b2 + '\n');
return newCoords;
},
/**
* Draws the select area
*
* @access private
* @return void
*/
drawArea: function( ) {
/*
* NOTE: I'm not using the Element.setStyle() shortcut as they make it
* quite sluggish on Mac based browsers
*/
// dump( 'drawArea : ' + this.areaCoords.x1 + ',' + this.areaCoords.y1 + ',' + this.areaCoords.x2 + ',' + this.areaCoords.y2 + '\n' );
var areaWidth = this.calcW();
var areaHeight = this.calcH();
/*
* Calculate all the style strings before we use them, allows reuse & produces quicker
* rendering (especially noticable in Mac based browsers)
*/
var px = 'px';
var params = [
this.areaCoords.x1 + px, // the left of the selArea
this.areaCoords.y1 + px, // the top of the selArea
areaWidth + px, // width of the selArea
areaHeight + px, // height of the selArea
this.areaCoords.x2 + px, // bottom of the selArea
this.areaCoords.y2 + px, // right of the selArea
(this.img.width - this.areaCoords.x2) + px, // right edge of selArea
(this.img.height - this.areaCoords.y2) + px // bottom edge of selArea
];
// do the select area
var areaStyle = this.selArea.style;
areaStyle.left = params[0];
areaStyle.top = params[1];
areaStyle.width = params[2];
areaStyle.height = params[3];
// position the north, east, south & west handles
var horizHandlePos = Math.ceil( (areaWidth - 6) / 2 ) + px;
var vertHandlePos = Math.ceil( (areaHeight - 6) / 2 ) + px;
this.handleN.style.left = horizHandlePos;
this.handleE.style.top = vertHandlePos;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -