AnnieJS API Docs for: 1.1.3
show:

File: libs/CanvasRender.js

var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
/**
 * @module annie
 */
var annie;
(function (annie) {
    /**
     * Canvas 渲染器
     * @class annie.CanvasRender
     * @extends annie.AObject
     * @implements IRender
     * @public
     * @since 1.0.0
     */
    var CanvasRender = (function (_super) {
        __extends(CanvasRender, _super);
        /**
         * @CanvasRender
         * @param {annie.Stage} stage
         * @public
         * @since 1.0.0
         */
        function CanvasRender(stage) {
            var _this = _super.call(this) || this;
            /**
             * 渲染器所在最上层的对象
             * @property rootContainer
             * @public
             * @since 1.0.0
             * @type {any}
             * @default null
             */
            _this.rootContainer = null;
            _this._instanceType = "annie.CanvasRender";
            _this._stage = stage;
            return _this;
        }
        /**
         * 开始渲染时执行
         * @method begin
         * @since 1.0.0
         * @public
         */
        CanvasRender.prototype.begin = function () {
            var s = this;
            var c = s.rootContainer;
            s._ctx.setTransform(1, 0, 0, 1, 0, 0);
            if (s._stage.bgColor != "") {
                s._ctx.fillStyle = s._stage.bgColor;
                s._ctx.fillRect(0, 0, c.width, c.height);
            }
            else {
                s._ctx.clearRect(0, 0, c.width, c.height);
            }
        };
        /**
         * 开始有遮罩时调用
         * @method beginMask
         * @param {annie.DisplayObject} target
         * @public
         * @since 1.0.0
         */
        CanvasRender.prototype.beginMask = function (target) {
            var s = this;
            var isHadPath = false;
            if (target.children && target.children.length > 0) {
                target = target.children[0];
            }
            if (target._command && target._command.length > 0) {
                s._ctx.save();
                s._ctx.globalAlpha = 0;
                var tm = target.cMatrix;
                s._ctx.setTransform(tm.a, tm.b, tm.c, tm.d, tm.tx, tm.ty);
                target._drawShape(s._ctx, true);
                s._ctx.restore();
                isHadPath = true;
            }
            //和后面endMask的restore对应
            s._ctx.save();
            if (isHadPath) {
                s._ctx.clip();
            }
        };
        /**
         * 结束遮罩时调用
         * @method endMask
         * @public
         * @since 1.0.0
         */
        CanvasRender.prototype.endMask = function () {
            this._ctx.restore();
        };
        /**
         * 调用渲染
         * @public
         * @since 1.0.0
         * @method draw
         * @param {annie.DisplayObject} target 显示对象
         */
        CanvasRender.prototype.draw = function (target) {
            var s = this;
            //由于某些原因导致有些元件没来的及更新就开始渲染了,就不渲染,过滤它
            if (target._cp)
                return;
            var texture = target._texture;
            if (texture && texture.width > 0 && texture.height > 0) {
                var ctx = s._ctx;
                ctx.globalAlpha = target.cAlpha;
                var tm = target.cMatrix;
                ctx.setTransform(tm.a, tm.b, tm.c, tm.d, tm.tx, tm.ty);
                if (target.rect && !target._isCache) {
                    var tr = target.rect;
                    ctx.drawImage(texture, tr.x, tr.y, tr.width, tr.height, 0, 0, tr.width, tr.height);
                }
                else {
                    ctx.translate(target._offsetX, target._offsetY);
                    ctx.drawImage(texture, 0, 0);
                }
            }
        };
        /**
         * 初始化渲染器
         * @public
         * @since 1.0.0
         * @method init
         */
        CanvasRender.prototype.init = function () {
            var s = this;
            if (!s.rootContainer) {
                s.rootContainer = document.createElement("canvas");
                s._stage.rootDiv.appendChild(s.rootContainer);
                s.rootContainer.id = "_a2x_canvas";
            }
            var c = s.rootContainer;
            s._ctx = c["getContext"]('2d');
        };
        /**
         * 当舞台尺寸改变时会调用
         * @public
         * @since 1.0.0
         * @method reSize
         */
        CanvasRender.prototype.reSize = function () {
            var s = this;
            var c = s.rootContainer;
            c.width = s._stage.divWidth * annie.devicePixelRatio;
            c.height = s._stage.divHeight * annie.devicePixelRatio;
            c.style.width = s._stage.divWidth + "px";
            c.style.height = s._stage.divHeight + "px";
        };
        return CanvasRender;
    }(annie.AObject));
    annie.CanvasRender = CanvasRender;
})(annie || (annie = {}));