static/ext/src/draw/Sprite.js
function(attrs, redraw) {
        var me = this,
            fontProps = me.fontProperties,
            fontPropsLength = fontProps.length,
            pathProps = me.pathProperties,
            pathPropsLength = pathProps.length,
            hasSurface = !!me.surface,
            custom = hasSurface && me.surface.customAttributes || {},
            spriteAttrs = me.attr,
            dirtyBBox = false,
            attr, i, newTranslation, translation, newRotate, rotation, newScaling, scaling;

        attrs = Ext.apply({}, attrs);
        for (attr in custom) {
            if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
                Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
            }
        }

        // Flag a change in hidden
        if (!!attrs.hidden !== !!spriteAttrs.hidden) {
            me.dirtyHidden = true;
        }

        // Flag path change
        for (i = 0; i < pathPropsLength; i++) {
            attr = pathProps[i];
            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                me.dirtyPath = true;
                dirtyBBox = true;
                break;
            }
        }

        // Flag zIndex change
        if ('zIndex' in attrs) {
            me.zIndexDirty = true;
        }

        // Flag font/text change
        if ('text' in attrs) {
            me.dirtyFont = true;
            dirtyBBox = true;
        }

        for (i = 0; i < fontPropsLength; i++) {
            attr = fontProps[i];
            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                me.dirtyFont = true;
                dirtyBBox = true;
                break;
            }
        }

        newTranslation = attrs.translation || attrs.translate;
        delete attrs.translate;
        delete attrs.translation;
        translation = spriteAttrs.translation;
        if (newTranslation) {
            if (('x' in newTranslation && newTranslation.x !== translation.x) ||
                ('y' in newTranslation && newTranslation.y !== translation.y)) {
                me.dirtyTransform = true;
                translation.x = newTranslation.x;
                translation.y = newTranslation.y;
            }
        }

        newRotate = attrs.rotation || attrs.rotate;
        rotation = spriteAttrs.rotation;
        delete attrs.rotate;
        delete attrs.rotation;
        if (newRotate) {
            if (('x' in newRotate && newRotate.x !== rotation.x) ||
                ('y' in newRotate && newRotate.y !== rotation.y) ||
                ('degrees' in newRotate && newRotate.degrees !== rotation.degrees)) {
                me.dirtyTransform = true;
                rotation.x = newRotate.x;
                rotation.y = newRotate.y;
                rotation.degrees = newRotate.degrees;
            }
        }

        newScaling = attrs.scaling || attrs.scale;
        scaling = spriteAttrs.scaling;
        delete attrs.scale;
        delete attrs.scaling;
        if (newScaling) {
            if (('x' in newScaling && newScaling.x !== scaling.x) ||
                ('y' in newScaling && newScaling.y !== scaling.y) ||
                ('cx' in newScaling && newScaling.cx !== scaling.cx) ||
                ('cy' in newScaling && newScaling.cy !== scaling.cy)) {
                me.dirtyTransform = true;
                scaling.x = newScaling.x;
                scaling.y = newScaling.y;
                scaling.cx = newScaling.cx;
                scaling.cy = newScaling.cy;
            }
        }

        // If the bbox is changed, then the bbox based transforms should be invalidated.
        if (!me.dirtyTransform && dirtyBBox) {
            if (spriteAttrs.scaling.x === null ||
                spriteAttrs.scaling.y === null ||
                spriteAttrs.rotation.y === null ||
                spriteAttrs.rotation.y === null) {
                me.dirtyTransform = true;
            }
        }

        Ext.apply(spriteAttrs, attrs);
        me.dirty = true;

        if (redraw === true && hasSurface) {
            me.redraw();
        }
        return this;
    }
function(attrs, redraw) {
        var me = this,
            fontProps = me.fontProperties,
            fontPropsLength = fontProps.length,
            pathProps = me.pathProperties,
            pathPropsLength = pathProps.length,
            hasSurface = !!me.surface,
            custom = hasSurface && me.surface.customAttributes || {},
            spriteAttrs = me.attr,
            dirtyBBox = false,
            attr, i, newTranslation, translation, newRotate, rotation, newScaling, scaling;

        attrs = Ext.apply({}, attrs);
        for (attr in custom) {
            if (attrs.hasOwnProperty(attr) && typeof custom[attr] == "function") {
                Ext.apply(attrs, custom[attr].apply(me, [].concat(attrs[attr])));
            }
        }

        // Flag a change in hidden
        if (!!attrs.hidden !== !!spriteAttrs.hidden) {
            me.dirtyHidden = true;
        }

        // Flag path change
        for (i = 0; i < pathPropsLength; i++) {
            attr = pathProps[i];
            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                me.dirtyPath = true;
                dirtyBBox = true;
                break;
            }
        }

        // Flag zIndex change
        if ('zIndex' in attrs) {
            me.zIndexDirty = true;
        }

        // Flag font/text change
        if ('text' in attrs) {
            me.dirtyFont = true;
            dirtyBBox = true;
        }

        for (i = 0; i < fontPropsLength; i++) {
            attr = fontProps[i];
            if (attr in attrs && attrs[attr] !== spriteAttrs[attr]) {
                me.dirtyFont = true;
                dirtyBBox = true;
                break;
            }
        }

        newTranslation = attrs.translation || attrs.translate;
        delete attrs.translate;
        delete attrs.translation;
        translation = spriteAttrs.translation;
        if (newTranslation) {
            if (('x' in newTranslation && newTranslation.x !== translation.x) ||
                ('y' in newTranslation && newTranslation.y !== translation.y)) {
                me.dirtyTransform = true;
                translation.x = newTranslation.x;
                translation.y = newTranslation.y;
            }
        }

        newRotate = attrs.rotation || attrs.rotate;
        rotation = spriteAttrs.rotation;
        delete attrs.rotate;
        delete attrs.rotation;
        if (newRotate) {
            if (('x' in newRotate && newRotate.x !== rotation.x) ||
                ('y' in newRotate && newRotate.y !== rotation.y) ||
                ('degrees' in newRotate && newRotate.degrees !== rotation.degrees)) {
                me.dirtyTransform = true;
                rotation.x = newRotate.x;
                rotation.y = newRotate.y;
                rotation.degrees = newRotate.degrees;
            }
        }

        newScaling = attrs.scaling || attrs.scale;
        scaling = spriteAttrs.scaling;
        delete attrs.scale;
        delete attrs.scaling;
        if (newScaling) {
            if (('x' in newScaling && newScaling.x !== scaling.x) ||
                ('y' in newScaling && newScaling.y !== scaling.y) ||
                ('cx' in newScaling && newScaling.cx !== scaling.cx) ||
                ('cy' in newScaling && newScaling.cy !== scaling.cy)) {
                me.dirtyTransform = true;
                scaling.x = newScaling.x;
                scaling.y = newScaling.y;
                scaling.cx = newScaling.cx;
                scaling.cy = newScaling.cy;
            }
        }

        // If the bbox is changed, then the bbox based transforms should be invalidated.
        if (!me.dirtyTransform && dirtyBBox) {
            if (spriteAttrs.scaling.x === null ||
                spriteAttrs.scaling.y === null ||
                spriteAttrs.rotation.y === null ||
                spriteAttrs.rotation.y === null) {
                me.dirtyTransform = true;
            }
        }

        Ext.apply(spriteAttrs, attrs);
        me.dirty = true;

        if (redraw === true && hasSurface) {
            me.redraw();
        }
        return this;
    }
function ( attrs , redraw ) { var me = this , fontProps = me . fontProperties , fontPropsLength = fontProps . length , pathProps = me . pathProperties , pathPropsLength = pathProps . length , hasSurface = ! ! me . surface , custom = hasSurface && me . surface . customAttributes || { } , spriteAttrs = me . attr , dirtyBBox = false , attr , i , newTranslation , translation , newRotate , rotation , newScaling , scaling ; attrs = Ext . apply ( { } , attrs ) ; for ( attr in custom ) { if ( attrs . hasOwnProperty ( attr ) && typeof custom [ attr ] == "function" ) { Ext . apply ( attrs , custom [ attr ] . apply ( me , [ ] . concat ( attrs [ attr ] ) ) ) ; } } // Flag a change in hidden if ( ! ! attrs . hidden !== ! ! spriteAttrs . hidden ) { me . dirtyHidden = true ; } // Flag path change for ( i = 0 ; i < pathPropsLength ; i ++ ) { attr = pathProps [ i ] ; if ( attr in attrs && attrs [ attr ] !== spriteAttrs [ attr ] ) { me . dirtyPath = true ; dirtyBBox = true ; break ; } } // Flag zIndex change if ( 'zIndex' in attrs ) { me . zIndexDirty = true ; } // Flag font/text change if ( 'text' in attrs ) { me . dirtyFont = true ; dirtyBBox = true ; } for ( i = 0 ; i < fontPropsLength ; i ++ ) { attr = fontProps [ i ] ; if ( attr in attrs && attrs [ attr ] !== spriteAttrs [ attr ] ) { me . dirtyFont = true ; dirtyBBox = true ; break ; } } newTranslation = attrs . translation || attrs . translate ; delete attrs . translate ; delete attrs . translation ; translation = spriteAttrs . translation ; if ( newTranslation ) { if ( ( 'x' in newTranslation && newTranslation . x !== translation . x ) || ( 'y' in newTranslation && newTranslation . y !== translation . y ) ) { me . dirtyTransform = true ; translation . x = newTranslation . x ; translation . y = newTranslation . y ; } } newRotate = attrs . rotation || attrs . rotate ; rotation = spriteAttrs . rotation ; delete attrs . rotate ; delete attrs . rotation ; if ( newRotate ) { if ( ( 'x' in newRotate && newRotate . x !== rotation . x ) || ( 'y' in newRotate && newRotate . y !== rotation . y ) || ( 'degrees' in newRotate && newRotate . degrees !== rotation . degrees ) ) { me . dirtyTransform = true ; rotation . x = newRotate . x ; rotation . y = newRotate . y ; rotation . degrees = newRotate . degrees ; } } newScaling = attrs . scaling || attrs . scale ; scaling = spriteAttrs . scaling ; delete attrs . scale ; delete attrs . scaling ; if ( newScaling ) { if ( ( 'x' in newScaling && newScaling . x !== scaling . x ) || ( 'y' in newScaling && newScaling . y !== scaling . y ) || ( 'cx' in newScaling && newScaling . cx !== scaling . cx ) || ( 'cy' in newScaling && newScaling . cy !== scaling . cy ) ) { me . dirtyTransform = true ; scaling . x = newScaling . x ; scaling . y = newScaling . y ; scaling . cx = newScaling . cx ; scaling . cy = newScaling . cy ; } } // If the bbox is changed, then the bbox based transforms should be invalidated. if ( ! me . dirtyTransform && dirtyBBox ) { if ( spriteAttrs . scaling . x === null || spriteAttrs . scaling . y === null || spriteAttrs . rotation . y === null || spriteAttrs . rotation . y === null ) { me . dirtyTransform = true ; } } Ext . apply ( spriteAttrs , attrs ) ; me . dirty = true ; if ( redraw === true && hasSurface ) { me . redraw ( ) ; } return this ; }
Change the attributes of the sprite.

## Translation

For translate, the configuration object contains x and y attributes that indicate where to
translate the object. For example:

sprite.setAttributes({
translate: {
x: 10,
y: 10
}
}, true);


## Rotation

For rotation, the configuration object contains x and y attributes for the center of the rotation (which are optional),
and a `degrees` attribute that specifies the rotation in degrees. For example:

sprite.setAttributes({
rotate: {
degrees: 90
}
}, true);

That example will create a 90 degrees rotation using the centroid of the Sprite as center of rotation, whereas:

sprite.setAttributes({
rotate: {
x: 0,
y: 0,
degrees: 90
}
}, true);

will create a rotation around the `(0, 0)` axis.


## Scaling

For scaling, the configuration object contains x and y attributes for the x-axis and y-axis scaling. For example:

sprite.setAttributes({
scale: {
x: 10,
y: 3
}
}, true);

You can also specify the center of scaling by adding `cx` and `cy` as properties:

sprite.setAttributes({
scale: {
cx: 0,
cy: 0,
x: 10,
y: 3
}
}, true);

That last example will scale a sprite taking as centers of scaling the `(0, 0)` coordinate.

@param {Object} attrs attributes to be changed on the sprite.
@param {Boolean} redraw Flag to immediately draw the change.
@return {Ext.draw.Sprite} this
Change the attributes of the sprite .