Source: sprite.js

goog.provide('lime.Renderer.CANVAS.SPRITE');
goog.provide('lime.Renderer.DOM.SPRITE');
goog.provide('lime.Sprite');

goog.require('goog.events');
goog.require('goog.events.EventTarget');
goog.require('goog.math.Size');
goog.require('lime');
goog.require('lime.Node');
goog.require('lime.fill.Color');
goog.require('lime.fill.Stroke');
goog.require('lime.fill.Fill');
goog.require('lime.fill.Image');

/**
 * Rectangural textured object
 * @constructor
 * @extends lime.Node
 */
lime.Sprite = function() {

    lime.Node.call(this);

    /**
     * Fill object used while drawing
     * @type {lime.fill.Fill}
     * @private
     */
    this.fill_ = null;


    this.stroke_ = null;


};
goog.inherits(lime.Sprite, lime.Node);

/**
 * Common name for sprite objects
 * @type {string}
 */
lime.Sprite.prototype.id = 'sprite';


/** @inheritDoc */
lime.Sprite.prototype.supportedRenderers = [
    lime.Renderer.DOM.makeSubRenderer(lime.Renderer.DOM.SPRITE),
    lime.Renderer.CANVAS.makeSubRenderer(lime.Renderer.CANVAS.SPRITE)
];

/**
 * Gets fill parameters
 * @return {lime.fill.Fill} Fill object.
 */
lime.Sprite.prototype.getFill = function() {
    return this.fill_;
};

/**
 * Sets fill parameters
 * @param {*} fill Fill.
 * @param {number=} opt_g Optionaly use r,g,b,a as parameter.
 * @param {number=} opt_b Optionaly use r,g,b,a as parameter.
 * @param {number=} opt_a Optionaly use r,g,b,a as parameter.
 * @return {lime.Sprite} object itself.
 */
lime.Sprite.prototype.setFill = function(fill, opt_g, opt_b, opt_a) {
    this.fill_ = lime.fill.parse(goog.array.toArray(arguments));
    this.fill_.initForSprite(this);
    this.setDirty(lime.Dirty.CONTENT);
    return this;
};

/**
 * Return Stroke object if one is set
 * @return {lime.fill.Stroke} Stroke object.
 */
lime.Sprite.prototype.getStroke = function() {
    return this.stroke_;
};

/**
 * Sets stroke parameters.
 * @param {*} stroke Stroke object or width and (mixed type) Color.
 * @return {lime.Sprite} object itself.
 */
lime.Sprite.prototype.setStroke = function(stroke) {
    if (stroke && !(stroke instanceof lime.fill.Stroke)) {
        stroke = new lime.fill.Stroke(goog.array.toArray(arguments));
    }
    this.stroke_ = stroke;
    this.setDirty(lime.Dirty.CONTENT);
    return this;
};

/**
 * @private
 */
// todo: move this function to canvas background rendermode
lime.Sprite.prototype.getCanvasContextName_ = (function() {
    var contextID_ = 0;
    return function() {

        if (!goog.isDef(this.canvasContextName_)) {
            this.canvasContextName_ = 'limedc' + (contextID_++);
        }
        return this.canvasContextName_;
    };
})();


/**
 * @inheritDoc
 * @this {lime.Sprite}
 */
lime.Renderer.DOM.SPRITE.draw = function(el) {
    if (!goog.isNull(this.fill_)) {
        this.fill_.setDOMStyle(el, this);
    }
    if (!goog.isNull(this.stroke_)) {
        this.stroke_.setDOMStyle(el, this);
    } else {
        goog.style.setStyle(el, 'border-width', 0);
    }
};

/**
 * @inheritDoc
 * @this {lime.Sprite}
 */
lime.Renderer.CANVAS.SPRITE.draw = function(context) {
    var size = this.getSize(),
        fill = this.fill_,
        stroke = this.stroke_;

    if (!fill && !stroke) return;

    var frame = this.getFrame();


    if (fill) {
        fill.setCanvasStyle(context, this);

        if (fill.id != 'image' && fill.id != 'frame') {
            context.fillRect(frame.left, frame.top,
                size.width, size.height);
        }
    }


    if (stroke) {
        stroke.setCanvasStyle(context, this);

        if (this.id == 'sprite' || this.id == 'label') {
            var lw = stroke.width_ / 2;
            context.strokeRect(frame.left + lw, frame.top + lw,
                size.width - 2 * lw, size.height - 2 * lw);
        }
    }

};