/**
*
*
* @namespace GOWN.utils.resizeScaling
*/
module.exports = {
/**
* This should be called from inside the constructor
*
* @function GOWN.utils.resizeScaling.initResizeScaling
*/
initResizeScaling: function() {
this.resizeScaling = true; // resize instead of scale
this.minWidth = 1;
this.minHeight = 1;
// update dimension flag
this._lastWidth = NaN;
this._lastHeight = NaN;
},
/**
* Update before draw call.
* Redraw control for current state from theme
*
* @function GOWN.utils.resizeScaling.redraw
*/
redraw: function() {
// remove last skin after new one has been added
// (just before rendering, otherwise we would see nothing for a frame)
if (this._lastSkin) {
//this.removeChild(this._lastSkin);
this._lastSkin.alpha = 0;
this._lastSkin = null;
}
if (this.invalidState) {
this.fromSkin(this._currentState, this.changeSkin);
}
var width = this.worldWidth;
var height = this.worldHeight;
if (this._currentSkin &&
(this._lastWidth !== width || this._lastHeight !== height) &&
width > 0 && height > 0) {
this._currentSkin.width = this._lastWidth = width;
this._currentSkin.height = this._lastHeight = height;
this.updateDimensions();
}
},
/**
* @function GOWN.utils.resizeScaling.updateDimensions
*/
updateDimensions: function() {
},
/**
* @function GOWN.utils.resizeScaling.updateTransform
*/
updateTransform: function() {
var wt = this.worldTransform;
var scaleX = 1;
var scaleY = 1;
if(this.redraw) {
if(this.resizeScaling) {
var pt = this.parent.worldTransform;
scaleX = Math.sqrt(Math.pow(pt.a, 2) + Math.pow(pt.b, 2));
scaleY = Math.sqrt(Math.pow(pt.c, 2) + Math.pow(pt.d, 2));
}
this.worldWidth = Math.round(Math.max(this._width * scaleX, this.minWidth));
this.worldHeight = Math.round(Math.max(this._height * scaleY, this.minHeight));
this.redraw();
}
// obmit Control.updateTransform as it calls redraw as well
if(!this.resizeScaling) {
PIXI.Container.prototype.updateTransform.call(this);
} else {
PIXI.DisplayObject.prototype.updateTransform.call(this);
// revert scaling
var tx = wt.tx;
var ty = wt.ty;
scaleX = scaleX !== 0 ? 1/scaleX : 0;
scaleY = scaleY !== 0 ? 1/scaleY : 0;
wt.scale(scaleX, scaleY);
wt.tx = tx;
wt.ty = ty;
for (var i = 0, j = this.children.length; i < j; ++i) {
this.children[i].updateTransform();
}
}
},
/**
* @member GOWN.utils.resizeScaling.defineProperty
*/
defineProperty: {
'height': {
get: function () {
return this._height
},
set: function (value) {
this._height = value
this.minHeight = Math.min(value, this.minHeight)
}
},
'width': {
get: function () {
return this._width
},
set: function (value) {
this._width = value
this.minWidth = Math.min(value, this.minWidth)
}
}
}
};