# src/pixi/Sprite.js - Pixi.JS

#

API Docs for: 1.0.0
Show: Inherited Protected Private Deprecated

# File: src/pixi/Sprite.js

    /**
     * @author Mat Groves http://matgroves.com/ @Doormat23
     */

    PIXI.blendModes = {};
    PIXI.blendModes.NORMAL = 0;
    PIXI.blendModes.SCREEN = 1;

    /**
    @class Sprite
    @extends DisplayObjectContainer
    @constructor
    @param texture {Texture}
    @type String
    */
    PIXI.Sprite = function(texture)
    {
    	PIXI.DisplayObjectContainer.call( this );

    	 /**
    	 * The anchor sets the origin point of the texture.
    	 * The default is 0,0 this means the textures origin is the top left
    	 * Setting than anchor to 0.5,0.5 means the textures origin is centered
    	 * Setting the anchor to 1,1 would mean the textures origin points will be the bottom right
         * @property anchor
         * @type Point
         */
    	this.anchor = new PIXI.Point();

    	/**
    	 * The texture that the sprite is using
    	 * @property texture
    	 * @type Texture
    	 */
    	this.texture = texture;

    	/**
    	 * The blend mode of sprite.
    	 * currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
    	 * @property blendMode
    	 * @type uint
    	 */
    	this.blendMode = PIXI.blendModes.NORMAL;

    	/**
    	 * The width of the sprite (this is initially set by the texture)
    	 * @property width
    	 * @type #Number
    	 */
    	this._width = 0;

    	/**
    	 * The height of the sprite (this is initially set by the texture)
    	 * @property height
    	 * @type #Number
    	 */
    	this._height = 0;

    	if(texture.baseTexture.hasLoaded)
    	{
    		this.updateFrame = true;
    	}
    	else
    	{
    		this.onTextureUpdateBind = this.onTextureUpdate.bind(this);
    		this.texture.addEventListener( 'update', this.onTextureUpdateBind );
    	}

    	this.renderable = true;

    	// thi next bit is here for the docs...

    }

    // constructor
    PIXI.Sprite.constructor = PIXI.Sprite;
    PIXI.Sprite.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );

    // OOH! shiney new getters and setters for width and height
    // The width and height now modify the scale (this is what flash does, nice and tidy!)
    Object.defineProperty(PIXI.Sprite.prototype, 'width', {
        get: function() {
            return this.scale.x * this.texture.frame.width;
        },
        set: function(value) {
        	this.scale.x = value / this.texture.frame.width
            this._width = value;
        }
    });

    Object.defineProperty(PIXI.Sprite.prototype, 'height', {
        get: function() {
            return  this.scale.y * this.texture.frame.height;
        },
        set: function(value) {
        	this.scale.y = value / this.texture.frame.height
            this._height = value;
        }
    });

    /**
    @method setTexture
    @param texture {Texture} The PIXI texture that is displayed by the sprite
    */
    PIXI.Sprite.prototype.setTexture = function(texture)
    {
    	// stop current texture;
    	if(this.texture.baseTexture != texture.baseTexture)
    	{
    		this.textureChange = true;
    	}

    	this.texture = texture;
    	this.updateFrame = true;
    }

    /**
     * @private
     */
    PIXI.Sprite.prototype.onTextureUpdate = function(event)
    {
    	//this.texture.removeEventListener( 'update', this.onTextureUpdateBind );

    	// so if _width is 0 then width was not set..
    	if(this._width)this.scale.x = this._width / this.texture.frame.width;
    	if(this._height)this.scale.y = this._height / this.texture.frame.height;

    	this.updateFrame = true;
    }

    // some helper functions..

    /**
     *
     * Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId
     * The frame ids are created when a Texture packer file has been loaded
     * @method fromFrame
     * @static
     * @param frameId {String} The frame Id of the texture in the cache
     * @return {Sprite} A new Sprite using a texture from the texture cache matching the frameId
     */
    PIXI.Sprite.fromFrame = function(frameId)
    {
    	var texture = PIXI.TextureCache[frameId];
    	if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache" + this);
    	return new PIXI.Sprite(texture);
    }

    /**
     *
     * Helper function that creates a sprite that will contain a texture based on an image url
     * If the image is not in the texture cache it will be loaded
     * @method fromImage
     * @static
     * @param The image url of the texture
     * @return {Sprite} A new Sprite using a texture from the texture cache matching the image id
     */
    PIXI.Sprite.fromImage = function(imageId)
    {
    	var texture = PIXI.Texture.fromImage(imageId);
    	return new PIXI.Sprite(texture);
    }