From 81370f762516851f3739defc4ba69a7cd6f7cbb7 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Mon, 11 Sep 2017 09:42:16 -0400 Subject: [PATCH] Refactor method exports to fix linting and CWF comment --- src/import/load-costume.js | 100 +++++++++++++++++------------- src/import/load-sound.js | 37 +++++++---- src/serialization/sb2.js | 4 +- src/serialization/sb3.js | 4 +- src/virtual-machine.js | 4 +- test/integration/sb3-roundtrip.js | 4 +- 6 files changed, 88 insertions(+), 65 deletions(-) diff --git a/src/import/load-costume.js b/src/import/load-costume.js index 9e2f165b6..b55f07ed6 100644 --- a/src/import/load-costume.js +++ b/src/import/load-costume.js @@ -1,6 +1,59 @@ const StringUtil = require('../util/string-util'); const log = require('../util/log'); +/** + * Initialize a costume from an asset asynchronously. + * Do not call this unless there is a renderer attached. + * @param {!object} costume - the Scratch costume object. + * @property {int} skinId - the ID of the costume's render skin, once installed. + * @property {number} rotationCenterX - the X component of the costume's origin. + * @property {number} rotationCenterY - the Y component of the costume's origin. + * @property {number} [bitmapResolution] - the resolution scale for a bitmap costume. + * @param {!Asset} costumeAsset - the asset of the costume loaded from storage. + * @param {!Runtime} runtime - Scratch runtime, used to access the storage module. + * @returns {?Promise} - a promise which will resolve after skinId is set, or null on error. + */ +const loadCostumeFromAsset = function (costume, costumeAsset, runtime) { + costume.assetId = costumeAsset.assetId; + if (!runtime.renderer) { + log.error('No rendering module present; cannot load costume: ', costume.name); + return costume; + } + const AssetType = runtime.storage.AssetType; + const rotationCenter = [ + costume.rotationCenterX / costume.bitmapResolution, + costume.rotationCenterY / costume.bitmapResolution + ]; + if (costumeAsset.assetType === AssetType.ImageVector) { + costume.skinId = runtime.renderer.createSVGSkin(costumeAsset.decodeText(), rotationCenter); + return costume; + } + + return new Promise((resolve, reject) => { + const imageElement = new Image(); + const onError = function () { + // eslint-disable-next-line no-use-before-define + removeEventListeners(); + reject(); + }; + const onLoad = function () { + // eslint-disable-next-line no-use-before-define + removeEventListeners(); + resolve(imageElement); + }; + const removeEventListeners = function () { + imageElement.removeEventListener('error', onError); + imageElement.removeEventListener('load', onLoad); + }; + imageElement.addEventListener('error', onError); + imageElement.addEventListener('load', onLoad); + imageElement.src = costumeAsset.encodeDataURI(); + }).then(imageElement => { + costume.skinId = runtime.renderer.createBitmapSkin(imageElement, costume.bitmapResolution, rotationCenter); + return costume; + }); +}; + /** * Load a costume's asset into memory asynchronously. * Do not call this unless there is a renderer attached. @@ -31,48 +84,7 @@ const loadCostume = function (md5ext, costume, runtime) { }); }; -const loadCostumeFromAsset = function (costume, costumeAsset, runtime) { - const rotationCenter = [ - costume.rotationCenterX / costume.bitmapResolution, - costume.rotationCenterY / costume.bitmapResolution - ]; - - if (!runtime.renderer) { - log.error('No rendering module present; cannot load costume asset: ', md5ext); - return costume; - } - const AssetType = runtime.storage.AssetType; - costume.assetId = costumeAsset.assetId; - if (costumeAsset.assetType === AssetType.ImageVector) { - costume.skinId = runtime.renderer.createSVGSkin(costumeAsset.decodeText(), rotationCenter); - return costume; - } - - return new Promise((resolve, reject) => { - const imageElement = new Image(); - const onError = function () { - // eslint-disable-next-line no-use-before-define - removeEventListeners(); - reject(); - }; - const onLoad = function () { - // eslint-disable-next-line no-use-before-define - removeEventListeners(); - resolve(imageElement); - }; - const removeEventListeners = function () { - imageElement.removeEventListener('error', onError); - imageElement.removeEventListener('load', onLoad); - }; - imageElement.addEventListener('error', onError); - imageElement.addEventListener('load', onLoad); - imageElement.src = costumeAsset.encodeDataURI(); - }).then(imageElement => { - costume.skinId = runtime.renderer.createBitmapSkin(imageElement, costume.bitmapResolution, rotationCenter); - return costume; - }); +module.exports = { + loadCostume, + loadCostumeFromAsset }; - -loadCostume.loadCostumeFromAsset = loadCostumeFromAsset; - -module.exports = loadCostume; diff --git a/src/import/load-sound.js b/src/import/load-sound.js index 84425c189..e4c7009b9 100644 --- a/src/import/load-sound.js +++ b/src/import/load-sound.js @@ -1,6 +1,27 @@ const StringUtil = require('../util/string-util'); const log = require('../util/log'); +/** + * Initialize a sound from an asset asynchronously. + * @param {!object} sound - the Scratch sound object. + * @property {string} md5 - the MD5 and extension of the sound to be loaded. + * @property {Buffer} data - sound data will be written here once loaded. + * @param {!Asset} soundAsset - the asset loaded from storage. + * @param {!Runtime} runtime - Scratch runtime, used to access the storage module. + * @returns {!Promise} - a promise which will resolve to the sound when ready. + */ +const loadSoundFromAsset = function (sound, soundAsset, runtime) { + sound.assetId = soundAsset.assetId; + return runtime.audioEngine.decodeSound(Object.assign( + {}, + sound, + {data: soundAsset.data} + )).then(soundId => { + sound.soundId = soundId; + return sound; + }); +}; + /** * Load a sound's asset into memory asynchronously. * @param {!object} sound - the Scratch sound object. @@ -28,17 +49,7 @@ const loadSound = function (sound, runtime) { }); }; -const loadSoundFromAsset = function (sound, soundAsset, runtime) { - sound.assetId = soundAsset.assetId; - return runtime.audioEngine.decodeSound(Object.assign( - {}, - sound, - {data: soundAsset.data} - )).then(soundId => { - sound.soundId = soundId; - return sound; - }); +module.exports = { + loadSound, + loadSoundFromAsset }; - -loadSound.loadSoundFromAsset = loadSoundFromAsset; -module.exports = loadSound; diff --git a/src/serialization/sb2.js b/src/serialization/sb2.js index 48e89f448..84560881a 100644 --- a/src/serialization/sb2.js +++ b/src/serialization/sb2.js @@ -15,8 +15,8 @@ const specMap = require('./sb2_specmap'); const Variable = require('../engine/variable'); const List = require('../engine/list'); -const loadCostume = require('../import/load-costume.js'); -const loadSound = require('../import/load-sound.js'); +const {loadCostume} = require('../import/load-costume.js'); +const {loadSound} = require('../import/load-sound.js'); /** * Convert a Scratch 2.0 procedure string (e.g., "my_procedure %s %b %n") diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js index 35267a5e2..ad91cce78 100644 --- a/src/serialization/sb3.js +++ b/src/serialization/sb3.js @@ -10,8 +10,8 @@ const Sprite = require('../sprites/sprite'); const Variable = require('../engine/variable'); const List = require('../engine/list'); -const loadCostume = require('../import/load-costume.js'); -const loadSound = require('../import/load-sound.js'); +const {loadCostume} = require('../import/load-costume.js'); +const {loadSound} = require('../import/load-sound.js'); /** * Serializes the specified VM runtime. diff --git a/src/virtual-machine.js b/src/virtual-machine.js index 0109f9c26..17df958be 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -6,8 +6,8 @@ const sb2 = require('./serialization/sb2'); const sb3 = require('./serialization/sb3'); const StringUtil = require('./util/string-util'); -const loadCostume = require('./import/load-costume.js'); -const loadSound = require('./import/load-sound.js'); +const {loadCostume} = require('./import/load-costume.js'); +const {loadSound} = require('./import/load-sound.js'); const RESERVED_NAMES = ['_mouse_', '_stage_', '_edge_', '_myself_', '_random_']; diff --git a/test/integration/sb3-roundtrip.js b/test/integration/sb3-roundtrip.js index c401248bd..058169a8d 100644 --- a/test/integration/sb3-roundtrip.js +++ b/test/integration/sb3-roundtrip.js @@ -2,8 +2,8 @@ const test = require('tap').test; const Blocks = require('../../src/engine/blocks'); const Clone = require('../../src/util/clone'); -const loadCostume = require('../../src/import/load-costume'); -const loadSound = require('../../src/import/load-sound'); +const {loadCostume} = require('../../src/import/load-costume'); +const {loadSound} = require('../../src/import/load-sound'); const makeTestStorage = require('../fixtures/make-test-storage'); const Runtime = require('../../src/engine/runtime'); const sb3 = require('../../src/serialization/sb3');