UNPKG

@awayfl/avm1

Version:

Virtual machine for executing AS1 and AS2 code

139 lines (138 loc) 6.13 kB
import { __extends } from "tslib"; import { BitmapImage2D } from '@awayjs/stage'; import { Timeline, MovieClip, Sprite, DisplayObjectContainer, Billboard, TextField, DefaultSceneGraphFactory, MorphSprite, FrameScriptManager } from '@awayjs/scene'; import { MethodMaterial } from '@awayjs/materials'; import { getAVM1Object } from './lib/AVM1Utils'; import { Graphics } from '@awayjs/graphics'; var AVM1SceneGraphFactory = /** @class */ (function (_super) { __extends(AVM1SceneGraphFactory, _super); function AVM1SceneGraphFactory(avm1Context) { var _this = _super.call(this) || this; _this.imageStore = {}; _this.avm1Context = avm1Context; AVM1SceneGraphFactory._instance = _this; return _this; } Object.defineProperty(AVM1SceneGraphFactory, "instance", { get: function () { if (!AVM1SceneGraphFactory._instance) { console.log('Error. A instance of AVM1SceneGraphFactory must be created manually \ before accessing the singleton AVM1SceneGraphFactory._instance'); //AVM1SceneGraphFactory._instance=new AVM1SceneGraphFactory(); } return AVM1SceneGraphFactory._instance; }, enumerable: false, configurable: true }); AVM1SceneGraphFactory.prototype.createSprite = function (prefab) { if (prefab === void 0) { prefab = null; } return new Sprite(); }; AVM1SceneGraphFactory.prototype.createDisplayObjectContainer = function () { return new DisplayObjectContainer(); }; AVM1SceneGraphFactory.prototype.createMovieClip = function (timeline, symbol) { if (timeline === void 0) { timeline = null; } if (symbol === void 0) { symbol = null; } var awayMovieClip = new MovieClip(timeline || new Timeline(this)); getAVM1Object(awayMovieClip, this.avm1Context); awayMovieClip._symbol = symbol; return awayMovieClip; }; AVM1SceneGraphFactory.prototype.createTextField = function () { var awayTextfield = new TextField(); awayTextfield.multiline = true; awayTextfield.wordWrap = true; getAVM1Object(awayTextfield, this.avm1Context); return awayTextfield; }; AVM1SceneGraphFactory.prototype.createBillboard = function (material) { return null; //new Billboard(); }; AVM1SceneGraphFactory.prototype.createImage2D = function (width, height, transparent, fillColor, powerOfTwo) { if (transparent === void 0) { transparent = true; } if (fillColor === void 0) { fillColor = null; } if (powerOfTwo === void 0) { powerOfTwo = true; } return new BitmapImage2D(width, height, transparent, fillColor, powerOfTwo); }; AVM1SceneGraphFactory.prototype.createFrameScripts = function (scripts, frameIdx, objName, objID) { objName = objName.replace(/[^\w]/g, ''); var outputFrameScripts = []; for (var i = 0; i < scripts.length; i++) { var script = scripts[i]; script.data = this.avm1Context.actionsDataFactory.createActionsData(script, 'script_' + name + '_' + objID + '_frame_' + frameIdx + '_idx_' + i); outputFrameScripts[outputFrameScripts.length] = script; } if (outputFrameScripts.length) { outputFrameScripts.sort(this.compareAVM1FrameScripts); } return outputFrameScripts; }; /** * Get a instance for a given SymbolID and assign a sessionID to it. * This is used by timeline to create children * * @param symbolID * @param sessionID */ AVM1SceneGraphFactory.prototype.createChildInstanceForTimeline = function (timeline, symbolID, sessionID) { // if this was called we might have new constructors from timeline to process FrameScriptManager.invalidAS3Constructors = true; var asset = this.awaySymbols[symbolID]; var clone; if (asset.isAsset(Graphics)) { clone = Sprite.getNewSprite(asset.clone()); //TODO: remove this clone() without the mem leak clone.mouseEnabled = false; } else if (asset.isAsset(Sprite)) { clone = Sprite.getNewSprite(asset.graphics); clone.mouseEnabled = false; } else if (asset.isAsset(MorphSprite)) { clone = MorphSprite.getNewMorphSprite(asset.graphics.clone()); clone.mouseEnabled = false; } else if (asset.isAsset(BitmapImage2D)) { // enable blending for symbols, because if you place image directly on stage // it not enable blend mode var m = new MethodMaterial(asset); m.alphaBlending = asset.transparent; clone = Billboard.getNewBillboard(m); clone.mouseEnabled = false; } else { clone = asset.adapter.clone(false).adaptee; } var placeObjectTag = timeline.placeObjectTagsForSessionIDs[sessionID]; if (placeObjectTag && (placeObjectTag.variableName || (placeObjectTag.events && placeObjectTag.events.length > 0))) { clone.adapter.placeObjectTag = placeObjectTag; clone.adapter.initEvents = placeObjectTag; } clone._sessionID = sessionID; return clone; }; // this is used for ordering AVM1 Framescripts into correct order AVM1SceneGraphFactory.prototype.compareAVM1FrameScripts = function (a, b) { if (!a.precedence) { return !b.precedence ? 0 : -1; } else if (!b.precedence) { return 1; } var i = 0; while (i < a.precedence.length && i < b.precedence.length && a.precedence[i] === b.precedence[i]) { i++; } if (i >= a.precedence.length) { return a.precedence.length === b.precedence.length ? 0 : -1; } else { return i >= b.precedence.length ? 1 : a.precedence[i] - b.precedence[i]; } }; return AVM1SceneGraphFactory; }(DefaultSceneGraphFactory)); export { AVM1SceneGraphFactory };