Engine.UniformScaleGraphic = class extends Engine.Drawable
{
constructor(width /*int*/, height /*int*/, allowUpScale /*float*/, graphicName)
{
super();
if (width === undefined) width = 128;
if (height === undefined) height = 128;
if (allowUpScale === undefined) allowUpScale = 1;
this.contents = new Engine.Drawable();
this.origWidth = 128;
this.origHeight = 128;
this.rect = new PIXI.Rectangle();
this.allowUpScale = 1;
this._maxWidth = width;
this._maxHeight = height;
this.hasContents = false;
this.frame = 0;
this.debug = null;
this.isUniformScaleGraphic = true;
this.allowUpScale = allowUpScale;
this.setSize(width, height, allowUpScale);
this.contents.onGraphicLoaded.addListener(this, this.graphicLoaded);
if (graphicName !== undefined)
{
this.setGraphicByName(graphicName);
}
}
get maxWidth() { return this._maxWidth; }
set maxWidth(value)
{
this.setSize(value, this._maxHeight);
}
get maxHeight() { return this._maxHeight; }
set maxHeight(value)
{
this.setSize(this._maxWidth, value);
}
clear()
{
this.contents.clear();
this.removeChild(this.contents);
this.hasContents = false;
}
setGraphicByID(graphic_id /*int*/, frame /*int*/)
{
if (frame === undefined) frame = 1;
this.frame = frame;
var def = Engine.GraphicFactoryInstance.getGraphicDefByID(graphic_id);
if (def)
{
this.setGraphicByName(def.name);
}
}
setGraphicByName(graphicName /*string*/, frame /*int*/)
{
if (frame === undefined) frame = 1;
this.clear();
if (graphicName == null || graphicName == "") return;
this.frame = frame;
this.addChild(this.contents);
this.contents.loadFromGraphicName(graphicName, this.maxWidth, this.maxHeight);
}
graphicLoaded(obj /*Drawable*/)
{
this.contents.gotoAndStop(this.frame);
this.contentsUpdated();
this.contents.graphicData.setTextureMode(PIXI.SCALE_MODES.LINEAR);
}
contentsUpdated()
{
this.contents.x = 0;
this.contents.y = 0;
this.contents.scale.x = this.contents.scale.y = 1;
this.rect = this.contents.getLocalBounds();
this.origWidth = Math.max(1, this.rect.width);
this.origHeight = Math.max(1, this.rect.height);
this.setSize(this.maxWidth, this.maxHeight, this.allowUpScale);
}
setSize(maxWidth /*int*/, maxHeight /*int*/, allowUpScale /*float*/, setUnrounded /*bool*/)
{
if (allowUpScale === undefined) allowUpScale = 1;
if (setUnrounded === undefined) setUnrounded = false;
this.allowUpScale = allowUpScale;
this._maxWidth = maxWidth;
this._maxHeight = maxHeight;
this.contents.scale.x = 1;
this.contents.scale.y = 1;
var maxScale = 1;
if (this.origWidth > maxWidth || this.origHeight > maxHeight)
{
maxScale = Math.min(maxWidth / this.origWidth, maxHeight / this.origHeight);
}
else if (allowUpScale > 1)
{
maxScale = Math.min(maxWidth / this.origWidth, maxHeight / this.origHeight);
maxScale = Math.min(this.allowUpScale, maxScale);
}
this.contents.scale.x = maxScale;
this.contents.scale.y = maxScale;
//center graphic?
this.contents.x = 0;
this.contents.y = 0;
var newWidth = this.origWidth * maxScale;
var newHeight = this.origHeight * maxScale;
var r = new PIXI.Rectangle(this.rect.x, this.rect.y, this.rect.width, this.rect.height);
r.x *= maxScale;
r.y *= maxScale;
r.width *= maxScale;
r.height *= maxScale;
if(this.setUnrounded)
{
this.contents.setXYUnrounded(((maxWidth - r.width) / 2) - r.x, ((maxHeight - r.height) / 2) - r.y);
}
else
{
this.contents.x = ((maxWidth - r.width) / 2) - r.x;
this.contents.y = ((maxHeight - r.height) / 2) - r.y;
}
this.hitArea = new PIXI.Rectangle(0, 0, maxWidth, maxHeight);
}
setWidth(width /*int*/, allowUpScale /*float*/, setXYUnrounded /*bool*/)
{
if (allowUpScale === undefined) allowUpScale = 1;
if (setXYUnrounded === undefined) setXYUnrounded = false;
this.contents.scale.x = contents.scale.y = 1;
this.origWidth = Math.max(1, this.contents.width);
this.origHeight = Math.max(1, this.contents.height);
var ratio = this.contents.height / this.contents.width;
var height = Math.floor(width * ratio);
this.setSize(width, height, allowUpScale, setXYUnrounded);
}
setHeight(height /*int*/, allowUpScale /*float*/, setXYUnrounded /*bool*/)
{
if (allowUpScale === undefined) allowUpScale = 1;
if (setXYUnrounded === undefined) setXYUnrounded = false;
this.contents.scale.x = this.contents.scale.y = 1;
this.origWidth = Math.max(1, this.contents.width);
this.origHeight = Math.max(1, this.contents.height);
var ratio = this.contents.width / this.contents.height;
var width = Math.floor(height * ratio);
this.setSize(width, height, allowUpScale, setXYUnrounded);
}
}