зеркало из https://github.com/mozilla/shumway.git
Add flash.display.Stage, flash.ui.Keyboard, .Mouse stubs
This commit is contained in:
Родитель
ed0a555c4b
Коммит
a8c9026c86
|
@ -44,6 +44,18 @@
|
|||
<script src="../../src/avm1/stream.js"></script>
|
||||
<script src="../../src/avm1/interpreter.js"></script>
|
||||
|
||||
<script src="../../src/flash/util.js"></script>
|
||||
<script src="../../src/flash/events/EventDispatcher.js"></script>
|
||||
<script src="../../src/flash/display/DisplayObject.js"></script>
|
||||
<script src="../../src/flash/display/InteractiveObject.js"></script>
|
||||
<script src="../../src/flash/display/DisplayObjectContainer.js"></script>
|
||||
<script src="../../src/flash/display/Graphics.js"></script>
|
||||
<script src="../../src/flash/display/Sprite.js"></script>
|
||||
<script src="../../src/flash/display/MovieClip.js"></script>
|
||||
<script src="../../src/flash/display/Stage.js"></script>
|
||||
<script src="../../src/flash/ui/Keyboard.js"></script>
|
||||
<script src="../../src/flash/ui/Mouse.js"></script>
|
||||
|
||||
<script>
|
||||
SWF.embed("../../examples/racing/race.swf", document.getElementById("stage"));
|
||||
</script>
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
});
|
||||
</script>
|
||||
|
||||
<script src="../src/flash/util.js"></script>
|
||||
<script src="../src/flash/events/EventDispatcher.js"></script>
|
||||
<script src="../src/flash/display/DisplayObject.js"></script>
|
||||
<script src="../src/flash/display/InteractiveObject.js"></script>
|
||||
|
@ -99,6 +100,9 @@
|
|||
<script src="../src/flash/display/Graphics.js"></script>
|
||||
<script src="../src/flash/display/Sprite.js"></script>
|
||||
<script src="../src/flash/display/MovieClip.js"></script>
|
||||
<script src="../src/flash/display/Stage.js"></script>
|
||||
<script src="../src/flash/ui/Keyboard.js"></script>
|
||||
<script src="../src/flash/ui/Mouse.js"></script>
|
||||
|
||||
<div id="inputBar">
|
||||
<span><a href="https://www.github.com/mozilla/shumway">shumway</a> inspector | </span>
|
||||
|
|
|
@ -1010,15 +1010,13 @@ defineObjectProperties(AS2Mouse, {
|
|||
},
|
||||
hide: {
|
||||
value: function hide() {
|
||||
// flash.ui.Mouse.hide()
|
||||
throw 'Not implemented: hide';
|
||||
Mouse.hide();
|
||||
},
|
||||
enumerable: false
|
||||
},
|
||||
show: {
|
||||
value: function show() {
|
||||
// flash.ui.Mouse.show()
|
||||
throw 'Not implemented: show';
|
||||
Mouse.show();
|
||||
},
|
||||
enumerable: false
|
||||
}
|
||||
|
@ -1054,60 +1052,65 @@ AS2Broadcaster.initialize(AS2Mouse);
|
|||
function AS2Stage() {
|
||||
}
|
||||
defineObjectProperties(AS2Stage, {
|
||||
$stage: {
|
||||
get: function get$stage() {
|
||||
return AS2Context.instance.stage;
|
||||
}
|
||||
},
|
||||
align: {
|
||||
get: function get$align() {
|
||||
throw 'Not implemented: get$align';
|
||||
return this.$stage.align;
|
||||
},
|
||||
set: function set$align(value) {
|
||||
throw 'Not implemented: set$align';
|
||||
this.$stage.align = value;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
displayState: {
|
||||
get: function get$displayState() {
|
||||
throw 'Not implemented: get$displayState';
|
||||
return this.$stage.displayState;
|
||||
},
|
||||
set: function set$displayState(value) {
|
||||
throw 'Not implemented: set$displayState';
|
||||
this.$stage.displayState = value;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
fullScreenSourceRect: {
|
||||
get: function get$fullScreenSourceRect() {
|
||||
throw 'Not implemented: get$fullScreenSourceRect';
|
||||
return this.$stage.fullScreenSourceRect;
|
||||
},
|
||||
set: function set$fullScreenSourceRect(value) {
|
||||
throw 'Not implemented: set$fullScreenSourceRect';
|
||||
this.$stage.fullScreenSourceRect = value;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
height: {
|
||||
get: function get$height() {
|
||||
return AS2Context.instance.stage.height;
|
||||
return this.$stage.stageHeight;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
scaleMode: {
|
||||
get: function get$scaleMode() {
|
||||
throw 'Not implemented: get$scaleMode';
|
||||
return this.$stage.scaleMode;
|
||||
},
|
||||
set: function set$scaleMode(value) {
|
||||
throw 'Not implemented: set$scaleMode';
|
||||
this.$stage.scaleMode = value;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
showMenu: {
|
||||
get: function get$showMenu() {
|
||||
throw 'Not implemented: get$showMenu';
|
||||
return this.$stage.showDefaultContextMenu;
|
||||
},
|
||||
set: function set$showMenu(value) {
|
||||
throw 'Not implemented: set$showMenu';
|
||||
this.$stage.showDefaultContextMenu = value;
|
||||
},
|
||||
enumerable: true
|
||||
},
|
||||
width: {
|
||||
get: function get$width() {
|
||||
return AS2Context.instance.stage.width;
|
||||
return this.$stage.stageWidth;
|
||||
},
|
||||
enumerable: true
|
||||
}
|
||||
|
|
|
@ -0,0 +1,299 @@
|
|||
function Stage() {
|
||||
this._loaderInfo = null; // TODO
|
||||
this._transform = [];
|
||||
this._color = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
Stage.prototype = Object.create(new DisplayObjectContainer, {
|
||||
accessibilityProperties: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
align: descAccessor(
|
||||
function () {
|
||||
return ''; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
allowsFullScreen: descAccessor(function () {
|
||||
return false; // TODO
|
||||
}),
|
||||
alpha: descAccessor(function () {
|
||||
return 1; // read-only/default
|
||||
}),
|
||||
blendMode: descAccessor(function () {
|
||||
// TODO BlendMode.NORMAL
|
||||
return 'normal'; // read-only/default
|
||||
}),
|
||||
cacheAsBitmap: descAccessor(function () {
|
||||
return false; // read-only/default
|
||||
}),
|
||||
color: descAccessor(
|
||||
function () {
|
||||
return this._color;
|
||||
},
|
||||
function (val) {
|
||||
this._color = val;
|
||||
}
|
||||
),
|
||||
colorCorrection: descAccessor(
|
||||
function () {
|
||||
return 'default'; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
colorCorrectionSupport: descAccessor(function () {
|
||||
return 'unsupported'; // TODO
|
||||
}),
|
||||
contextMenu: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
displayState: descAccessor(
|
||||
function () {
|
||||
return null; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
filters: descAccessor(function () {
|
||||
return []; // read-only/default
|
||||
}),
|
||||
focus: descAccessor(
|
||||
function () {
|
||||
return null; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
focusRect: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
frameRate: descAccessor(
|
||||
function () {
|
||||
return this._frameRate;
|
||||
},
|
||||
function (val) {
|
||||
if (val < 0.01 || val > 1000)
|
||||
throw 'Invalid frame rate';
|
||||
this._frameRate = val;
|
||||
}
|
||||
),
|
||||
fullScreenHeight: descAccessor(function () {
|
||||
notImplemented();
|
||||
}),
|
||||
fullScreenSourceRect: descAccessor(
|
||||
function () {
|
||||
return null; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
fullScreenWidth: descAccessor(function () {
|
||||
notImplemented();
|
||||
}),
|
||||
invalidate: descMethod(function() {
|
||||
notImplemented();
|
||||
}),
|
||||
isFocusInaccessible: descMethod(function() {
|
||||
notImplemented();
|
||||
}),
|
||||
loaderInfo: descAccessor(function () {
|
||||
return this._loaderInfo; // read-only/default
|
||||
}),
|
||||
mask: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
mouseEnabled: descAccessor(function () {
|
||||
return true; // read-only/default
|
||||
}),
|
||||
name: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
nativeWindow: descAccessor(function () {
|
||||
return null; // TODO
|
||||
}),
|
||||
opaqueBackground: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
quality: descAccessor(
|
||||
function () {
|
||||
return 'HIGH'; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
rotation: descAccessor(function () {
|
||||
return 0; // read-only/default
|
||||
}),
|
||||
scale9Grid: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
scaleMode: descAccessor(
|
||||
function () {
|
||||
return 'noScale'; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
scaleX: descAccessor(function () {
|
||||
return 1; // read-only/default
|
||||
}),
|
||||
scaleY: descAccessor(function () {
|
||||
return 1; // read-only/default
|
||||
}),
|
||||
scrollRect: descAccessor(function () {
|
||||
return null; // read-only/default
|
||||
}),
|
||||
showDefaultContextMenu: descAccessor(
|
||||
function () {
|
||||
return true; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
softKeyboardRect: descAccessor(function () {
|
||||
notImplemented();
|
||||
}),
|
||||
stageFocusRect: descAccessor(
|
||||
function () {
|
||||
return false; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
stageHeight: descAccessor(
|
||||
function () {
|
||||
return this._stageHeight;
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
stageWidth: descAccessor(
|
||||
function () {
|
||||
return this._stageWidth;
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
tabEnabled: descAccessor(function () {
|
||||
return false; // read-only/default
|
||||
}),
|
||||
tabIndex: descAccessor(function () {
|
||||
return 1; // read-only/default
|
||||
}),
|
||||
transform: descAccessor(function () {
|
||||
return this._transform; // read-only/default
|
||||
}),
|
||||
visible: descAccessor(function () {
|
||||
return true; // read-only/default
|
||||
}),
|
||||
x: descAccessor(function () {
|
||||
return 0; // read-only/default
|
||||
}),
|
||||
y: descAccessor(function () {
|
||||
return 0; // read-only/default
|
||||
}),
|
||||
wmodeGPU: descAccessor(function () {
|
||||
return false; // TODO
|
||||
}),
|
||||
_attachToCanvas: descMethod(function(parameters) {
|
||||
var result;
|
||||
var root;
|
||||
var pframes = [];
|
||||
var dictionary = parameters.dictionary;
|
||||
var canvas = parameters.canvas;
|
||||
var ctx = canvas.getContext('2d');
|
||||
var frameRate, bounds;
|
||||
var plays;
|
||||
var as2Context = null;
|
||||
|
||||
var stage = this;
|
||||
startWorking(parameters.file, function(obj) {
|
||||
if (!root) {
|
||||
bounds = obj.bounds;
|
||||
|
||||
stage._stageWidth = (bounds.xMax - bounds.xMin) / 20;
|
||||
stage._stageHeight = (bounds.yMax - bounds.yMin) / 20
|
||||
stage._frameRate = obj.frameRate;
|
||||
|
||||
// TODO disable AVM1 if AVM2 is enabled
|
||||
as2Context = new AS2Context(obj.version, stage);
|
||||
AS2Context.instance = as2Context;
|
||||
var globals = as2Context.globals;
|
||||
|
||||
AS2Mouse.$bind(canvas);
|
||||
AS2Key.$bind(canvas);
|
||||
|
||||
var proto = create(new MovieClipPrototype({
|
||||
frameCount: obj.frameCount,
|
||||
pframes: pframes
|
||||
}, dictionary));
|
||||
root = proto.constructor();
|
||||
root.name = '_root';
|
||||
|
||||
globals._root = globals._level0 = root.$as2Object;
|
||||
|
||||
parameters.onstart(root, stage);
|
||||
return;
|
||||
}
|
||||
|
||||
AS2Context.instance = as2Context;
|
||||
if (obj) {
|
||||
if (obj.id) {
|
||||
definePrototype(dictionary, obj);
|
||||
} else if (obj.type === 'pframe') {
|
||||
if (obj.bgcolor) {
|
||||
stage._color = obj.bgcolor; // TODO convert to numeric
|
||||
canvas.style.background = obj.bgcolor;
|
||||
}
|
||||
|
||||
if (obj.abcBlocks) {
|
||||
var blocks = obj.abcBlocks;
|
||||
var i = 0;
|
||||
var block;
|
||||
while (block = blocks[i++]) {
|
||||
var abc = new AbcFile(block);
|
||||
executeAbc(abc, ALWAYS_INTERPRET);
|
||||
}
|
||||
}
|
||||
|
||||
if (obj.symbols) {
|
||||
var symbols = obj.symbols;
|
||||
var i = 0;
|
||||
var sym;
|
||||
while (sym = symbols[i++]) {
|
||||
if (!sym.id) {
|
||||
var mainTimeline = new (toplevel.getTypeByName(
|
||||
Multiname.fromSimpleName(sym.name),
|
||||
true
|
||||
)).instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pframes.push(obj);
|
||||
if (!plays) {
|
||||
renderMovieClip(root, stage, ctx);
|
||||
plays = true;
|
||||
}
|
||||
} else {
|
||||
result = obj;
|
||||
}
|
||||
} else {
|
||||
parameters.oncomplete(root, result);
|
||||
}
|
||||
});
|
||||
})
|
||||
});
|
|
@ -0,0 +1,372 @@
|
|||
function Keyboard() {
|
||||
}
|
||||
|
||||
Object.defineProperties(Keyboard, {
|
||||
capsLock: descAccessor(function () {
|
||||
return Stage.instance.$keyboard.capsLock;
|
||||
}),
|
||||
hasVirtualKeyboard: descAccessor(function () {
|
||||
return false; // TODO Stage.instance.$keyboard.hasVirtualKeyboard;
|
||||
}),
|
||||
numLock: descAccessor(function () {
|
||||
return Stage.instance.$keyboard.numLock;
|
||||
}),
|
||||
physicalKeyboardType: descAccessor(function () {
|
||||
return 'alphanumeric'; // TODO Stage.instance.$keyboard.physicalKeyboardType;
|
||||
}),
|
||||
isAccessible: descMethod(function () {
|
||||
return true; // TODO
|
||||
}),
|
||||
A: descConst(65),
|
||||
ALTERNATE: descConst(18),
|
||||
AUDIO: descConst(0x01000017),
|
||||
B: descConst(66),
|
||||
BACK: descConst(0x01000016),
|
||||
BACKQUOTE: descConst(192),
|
||||
BACKSLASH: descConst(220),
|
||||
BACKSPACE: descConst(8),
|
||||
BLUE: descConst(0x01000003),
|
||||
C: descConst(67),
|
||||
CAPS_LOCK: descConst(20),
|
||||
CHANNEL_DOWN: descConst(0x01000005),
|
||||
CHANNEL_UP: descConst(0x01000004),
|
||||
COMMA: descConst(188),
|
||||
COMMAND: descConst(15),
|
||||
CONTROL: descConst(17),
|
||||
D: descConst(68),
|
||||
DELETE: descConst(46),
|
||||
DOWN: descConst(40),
|
||||
DVR: descConst(0x01000019),
|
||||
E: descConst(69),
|
||||
END: descConst(35),
|
||||
ENTER: descConst(13),
|
||||
EQUAL: descConst(187),
|
||||
ESCAPE: descConst(27),
|
||||
EXIT: descConst(0x01000015),
|
||||
F: descConst(70),
|
||||
F1: descConst(112),
|
||||
F10: descConst(121),
|
||||
F11: descConst(122),
|
||||
F12: descConst(123),
|
||||
F13: descConst(124),
|
||||
F14: descConst(125),
|
||||
F15: descConst(126),
|
||||
F2: descConst(113),
|
||||
F3: descConst(114),
|
||||
F4: descConst(115),
|
||||
F5: descConst(116),
|
||||
F6: descConst(117),
|
||||
F7: descConst(118),
|
||||
F8: descConst(119),
|
||||
F9: descConst(120),
|
||||
FAST_FORWARD: descConst(0x0100000A),
|
||||
G: descConst(71),
|
||||
GREEN: descConst(0x01000001),
|
||||
GUIDE: descConst(0x01000014),
|
||||
H: descConst(72),
|
||||
HELP: descConst(0x0100001D),
|
||||
HOME: descConst(36),
|
||||
I: descConst(73),
|
||||
INFO: descConst(0x01000013),
|
||||
INPUT: descConst(0x0100001B),
|
||||
INSERT: descConst(45),
|
||||
J: descConst(74),
|
||||
K: descConst(75),
|
||||
KEYNAME_BEGIN: descConst('Begin'),
|
||||
KEYNAME_BREAK: descConst('Break'),
|
||||
KEYNAME_CLEARDISPLAY: descConst('ClrDsp'),
|
||||
KEYNAME_CLEARLINE: descConst('ClrLn'),
|
||||
KEYNAME_DELETE: descConst('Delete'),
|
||||
KEYNAME_DELETECHAR: descConst('DelChr'),
|
||||
KEYNAME_DELETELINE: descConst('DelLn'),
|
||||
KEYNAME_DOWNARROW: descConst('Down'),
|
||||
KEYNAME_END: descConst('End'),
|
||||
KEYNAME_EXECUTE: descConst('Exec'),
|
||||
KEYNAME_F1: descConst('F1'),
|
||||
KEYNAME_F10: descConst('F10'),
|
||||
KEYNAME_F11: descConst('F11'),
|
||||
KEYNAME_F12: descConst('F12'),
|
||||
KEYNAME_F13: descConst('F13'),
|
||||
KEYNAME_F14: descConst('F14'),
|
||||
KEYNAME_F15: descConst('F15'),
|
||||
KEYNAME_F16: descConst('F16'),
|
||||
KEYNAME_F17: descConst('F17'),
|
||||
KEYNAME_F18: descConst('F18'),
|
||||
KEYNAME_F19: descConst('F19'),
|
||||
KEYNAME_F2: descConst('F2'),
|
||||
KEYNAME_F20: descConst('F20'),
|
||||
KEYNAME_F21: descConst('F21'),
|
||||
KEYNAME_F22: descConst('F22'),
|
||||
KEYNAME_F23: descConst('F23'),
|
||||
KEYNAME_F24: descConst('F24'),
|
||||
KEYNAME_F25: descConst('F25'),
|
||||
KEYNAME_F26: descConst('F26'),
|
||||
KEYNAME_F27: descConst('F27'),
|
||||
KEYNAME_F28: descConst('F28'),
|
||||
KEYNAME_F29: descConst('F29'),
|
||||
KEYNAME_F3: descConst('F3'),
|
||||
KEYNAME_F30: descConst('F30'),
|
||||
KEYNAME_F31: descConst('F31'),
|
||||
KEYNAME_F32: descConst('F32'),
|
||||
KEYNAME_F33: descConst('F33'),
|
||||
KEYNAME_F34: descConst('F34'),
|
||||
KEYNAME_F35: descConst('F35'),
|
||||
KEYNAME_F4: descConst('F4'),
|
||||
KEYNAME_F5: descConst('F5'),
|
||||
KEYNAME_F6: descConst('F6'),
|
||||
KEYNAME_F7: descConst('F7'),
|
||||
KEYNAME_F8: descConst('F8'),
|
||||
KEYNAME_F9: descConst('F9'),
|
||||
KEYNAME_FIND: descConst('Find'),
|
||||
KEYNAME_HELP: descConst('Help'),
|
||||
KEYNAME_HOME: descConst('Home'),
|
||||
KEYNAME_INSERT: descConst('Insert'),
|
||||
KEYNAME_INSERTCHAR: descConst('InsChr'),
|
||||
KEYNAME_INSERTLINE: descConst('InsLn'),
|
||||
KEYNAME_LEFTARROW: descConst('Left'),
|
||||
KEYNAME_MENU: descConst('Menu'),
|
||||
KEYNAME_MODESWITCH: descConst('ModeSw'),
|
||||
KEYNAME_NEXT: descConst('Next'),
|
||||
KEYNAME_PAGEDOWN: descConst('PgDn'),
|
||||
KEYNAME_PAGEUP: descConst('PgUp'),
|
||||
KEYNAME_PAUSE: descConst('Pause'),
|
||||
KEYNAME_PREV: descConst('Prev'),
|
||||
KEYNAME_PRINT: descConst('Print'),
|
||||
KEYNAME_PRINTSCREEN: descConst('PrntScrn'),
|
||||
KEYNAME_REDO: descConst('Redo'),
|
||||
KEYNAME_RESET: descConst('Reset'),
|
||||
KEYNAME_RIGHTARROW: descConst('Right'),
|
||||
KEYNAME_SCROLLLOCK: descConst('ScrlLck'),
|
||||
KEYNAME_SELECT: descConst('Select'),
|
||||
KEYNAME_STOP: descConst('Stop'),
|
||||
KEYNAME_SYSREQ: descConst('SysReq'),
|
||||
KEYNAME_SYSTEM: descConst('Sys'),
|
||||
KEYNAME_UNDO: descConst('Undo'),
|
||||
KEYNAME_UPARROW: descConst('Up'),
|
||||
KEYNAME_USER: descConst('User'),
|
||||
L: descConst(76),
|
||||
LAST: descConst(0x01000011),
|
||||
LEFT: descConst(37),
|
||||
LEFTBRACKET: descConst(219),
|
||||
LIVE: descConst(0x01000010),
|
||||
M: descConst(77),
|
||||
MASTER_SHELL: descConst(0x0100001E),
|
||||
MENU: descConst(0x01000012),
|
||||
MINUS: descConst(189),
|
||||
N: descConst(78),
|
||||
NEXT: descConst(0x0100000E),
|
||||
NUMBER_0: descConst(48),
|
||||
NUMBER_1: descConst(49),
|
||||
NUMBER_2: descConst(50),
|
||||
NUMBER_3: descConst(51),
|
||||
NUMBER_4: descConst(52),
|
||||
NUMBER_5: descConst(53),
|
||||
NUMBER_6: descConst(54),
|
||||
NUMBER_7: descConst(55),
|
||||
NUMBER_8: descConst(56),
|
||||
NUMBER_9: descConst(57),
|
||||
NUMPAD: descConst(21),
|
||||
NUMPAD_0: descConst(96),
|
||||
NUMPAD_1: descConst(97),
|
||||
NUMPAD_2: descConst(98),
|
||||
NUMPAD_3: descConst(99),
|
||||
NUMPAD_4: descConst(100),
|
||||
NUMPAD_5: descConst(101),
|
||||
NUMPAD_6: descConst(102),
|
||||
NUMPAD_7: descConst(103),
|
||||
NUMPAD_8: descConst(104),
|
||||
NUMPAD_9: descConst(105),
|
||||
NUMPAD_ADD: descConst(107),
|
||||
NUMPAD_DECIMAL: descConst(110),
|
||||
NUMPAD_DIVIDE: descConst(111),
|
||||
NUMPAD_ENTER: descConst(108),
|
||||
NUMPAD_MULTIPLY: descConst(106),
|
||||
NUMPAD_SUBTRACT: descConst(109),
|
||||
O: descConst(79),
|
||||
P: descConst(80),
|
||||
PAGE_DOWN: descConst(34),
|
||||
PAGE_UP: descConst(33),
|
||||
PAUSE: descConst(0x01000008),
|
||||
PERIOD: descConst(190),
|
||||
PLAY: descConst(0x01000007),
|
||||
PREVIOUS: descConst(0x0100000F),
|
||||
Q: descConst(81),
|
||||
QUOTE: descConst(222),
|
||||
R: descConst(82),
|
||||
RECORD: descConst(0x01000006),
|
||||
RED: descConst(0x01000000),
|
||||
REWIND: descConst(0x0100000B),
|
||||
RIGHT: descConst(39),
|
||||
RIGHTBRACKET: descConst(221),
|
||||
S: descConst(83),
|
||||
SEARCH: descConst(0x0100001F),
|
||||
SEMICOLON: descConst(186),
|
||||
SETUP: descConst(0x0100001C),
|
||||
SHIFT: descConst(16),
|
||||
SKIP_BACKWARD: descConst(0x0100000D),
|
||||
SKIP_FORWARD: descConst(0x0100000C),
|
||||
SLASH: descConst(191),
|
||||
SPACE: descConst(32),
|
||||
STOP: descConst(0x01000009),
|
||||
STRING_BEGIN: descConst('\uF72A'),
|
||||
STRING_BREAK: descConst('\uF732'),
|
||||
STRING_CLEARDISPLAY: descConst('\uF73A'),
|
||||
STRING_CLEARLINE: descConst('\uF739'),
|
||||
STRING_DELETE: descConst('\uF728'),
|
||||
STRING_DELETECHAR: descConst('\uF73E'),
|
||||
STRING_DELETELINE: descConst('\uF73C'),
|
||||
STRING_DOWNARROW: descConst('\uF701'),
|
||||
STRING_END: descConst('\uF72B'),
|
||||
STRING_EXECUTE: descConst('\uF742'),
|
||||
STRING_F1: descConst('\uF704'),
|
||||
STRING_F10: descConst('\uF70D'),
|
||||
STRING_F11: descConst('\uF70E'),
|
||||
STRING_F12: descConst('\uF70F'),
|
||||
STRING_F13: descConst('\uF710'),
|
||||
STRING_F14: descConst('\uF711'),
|
||||
STRING_F15: descConst('\uF712'),
|
||||
STRING_F16: descConst('\uF713'),
|
||||
STRING_F17: descConst('\uF714'),
|
||||
STRING_F18: descConst('\uF715'),
|
||||
STRING_F19: descConst('\uF716'),
|
||||
STRING_F2: descConst('\uF705'),
|
||||
STRING_F20: descConst('\uF717'),
|
||||
STRING_F21: descConst('\uF718'),
|
||||
STRING_F22: descConst('\uF719'),
|
||||
STRING_F23: descConst('\uF71A'),
|
||||
STRING_F24: descConst('\uF71B'),
|
||||
STRING_F25: descConst('\uF71C'),
|
||||
STRING_F26: descConst('\uF71D'),
|
||||
STRING_F27: descConst('\uF71E'),
|
||||
STRING_F28: descConst('\uF71F'),
|
||||
STRING_F29: descConst('\uF720'),
|
||||
STRING_F3: descConst('\uF706'),
|
||||
STRING_F30: descConst('\uF721'),
|
||||
STRING_F31: descConst('\uF722'),
|
||||
STRING_F32: descConst('\uF723'),
|
||||
STRING_F33: descConst('\uF724'),
|
||||
STRING_F34: descConst('\uF725'),
|
||||
STRING_F35: descConst('\uF726'),
|
||||
STRING_F4: descConst('\uF707'),
|
||||
STRING_F5: descConst('\uF708'),
|
||||
STRING_F6: descConst('\uF709'),
|
||||
STRING_F7: descConst('\uF70A'),
|
||||
STRING_F8: descConst('\uF70B'),
|
||||
STRING_F9: descConst('\uF70C'),
|
||||
STRING_FIND: descConst('\uF745'),
|
||||
STRING_HELP: descConst('\uF746'),
|
||||
STRING_HOME: descConst('\uF729'),
|
||||
STRING_INSERT: descConst('\uF727'),
|
||||
STRING_INSERTCHAR: descConst('\uF73D'),
|
||||
STRING_INSERTLINE: descConst('\uF73B'),
|
||||
STRING_LEFTARROW: descConst('\uF702'),
|
||||
STRING_MENU: descConst('\uF735'),
|
||||
STRING_MODESWITCH: descConst('\uF747'),
|
||||
STRING_NEXT: descConst('\uF740'),
|
||||
STRING_PAGEDOWN: descConst('\uF72D'),
|
||||
STRING_PAGEUP: descConst('\uF72C'),
|
||||
STRING_PAUSE: descConst('\uF730'),
|
||||
STRING_PREV: descConst('\uF73F'),
|
||||
STRING_PRINT: descConst('\uF738'),
|
||||
STRING_PRINTSCREEN: descConst('\uF72E'),
|
||||
STRING_REDO: descConst('\uF744'),
|
||||
STRING_RESET: descConst('\uF733'),
|
||||
STRING_RIGHTARROW: descConst('\uF703'),
|
||||
STRING_SCROLLLOCK: descConst('\uF72F'),
|
||||
STRING_SELECT: descConst('\uF741'),
|
||||
STRING_STOP: descConst('\uF734'),
|
||||
STRING_SYSREQ: descConst('\uF731'),
|
||||
STRING_SYSTEM: descConst('\uF737'),
|
||||
STRING_UNDO: descConst('\uF743'),
|
||||
STRING_UPARROW: descConst('\uF700'),
|
||||
STRING_USER: descConst('\uF736'),
|
||||
SUBTITLE: descConst(0x01000018),
|
||||
T: descConst(84),
|
||||
TAB: descConst(9),
|
||||
U: descConst(85),
|
||||
UP: descConst(38),
|
||||
V: descConst(86),
|
||||
VOD: descConst(0x0100001A),
|
||||
W: descConst(87),
|
||||
X: descConst(88),
|
||||
Y: descConst(89),
|
||||
YELLOW: descConst(0x01000002),
|
||||
Z: descConst(90),
|
||||
});
|
||||
|
||||
Object.defineProperties(Keyboard, {
|
||||
CharCodeStrings: descConst([
|
||||
Keyboard.KEYNAME_BEGIN,
|
||||
Keyboard.KEYNAME_BREAK,
|
||||
Keyboard.KEYNAME_CLEARDISPLAY,
|
||||
Keyboard.KEYNAME_CLEARLINE,
|
||||
Keyboard.KEYNAME_DELETE,
|
||||
Keyboard.KEYNAME_DELETECHAR,
|
||||
Keyboard.KEYNAME_DELETELINE,
|
||||
Keyboard.KEYNAME_DOWNARROW,
|
||||
Keyboard.KEYNAME_END,
|
||||
Keyboard.KEYNAME_EXECUTE,
|
||||
Keyboard.KEYNAME_F1,
|
||||
Keyboard.KEYNAME_F10,
|
||||
Keyboard.KEYNAME_F11,
|
||||
Keyboard.KEYNAME_F12,
|
||||
Keyboard.KEYNAME_F13,
|
||||
Keyboard.KEYNAME_F14,
|
||||
Keyboard.KEYNAME_F15,
|
||||
Keyboard.KEYNAME_F16,
|
||||
Keyboard.KEYNAME_F17,
|
||||
Keyboard.KEYNAME_F18,
|
||||
Keyboard.KEYNAME_F19,
|
||||
Keyboard.KEYNAME_F2,
|
||||
Keyboard.KEYNAME_F20,
|
||||
Keyboard.KEYNAME_F21,
|
||||
Keyboard.KEYNAME_F22,
|
||||
Keyboard.KEYNAME_F23,
|
||||
Keyboard.KEYNAME_F24,
|
||||
Keyboard.KEYNAME_F25,
|
||||
Keyboard.KEYNAME_F26,
|
||||
Keyboard.KEYNAME_F27,
|
||||
Keyboard.KEYNAME_F28,
|
||||
Keyboard.KEYNAME_F29,
|
||||
Keyboard.KEYNAME_F3,
|
||||
Keyboard.KEYNAME_F30,
|
||||
Keyboard.KEYNAME_F31,
|
||||
Keyboard.KEYNAME_F32,
|
||||
Keyboard.KEYNAME_F33,
|
||||
Keyboard.KEYNAME_F34,
|
||||
Keyboard.KEYNAME_F35,
|
||||
Keyboard.KEYNAME_F4,
|
||||
Keyboard.KEYNAME_F5,
|
||||
Keyboard.KEYNAME_F6,
|
||||
Keyboard.KEYNAME_F7,
|
||||
Keyboard.KEYNAME_F8,
|
||||
Keyboard.KEYNAME_F9,
|
||||
Keyboard.KEYNAME_FIND,
|
||||
Keyboard.KEYNAME_HELP,
|
||||
Keyboard.KEYNAME_HOME,
|
||||
Keyboard.KEYNAME_INSERT,
|
||||
Keyboard.KEYNAME_INSERTCHAR,
|
||||
Keyboard.KEYNAME_INSERTLINE,
|
||||
Keyboard.KEYNAME_LEFTARROW,
|
||||
Keyboard.KEYNAME_MENU,
|
||||
Keyboard.KEYNAME_MODESWITCH,
|
||||
Keyboard.KEYNAME_NEXT,
|
||||
Keyboard.KEYNAME_PAGEDOWN,
|
||||
Keyboard.KEYNAME_PAGEUP,
|
||||
Keyboard.KEYNAME_PAUSE,
|
||||
Keyboard.KEYNAME_PREV,
|
||||
Keyboard.KEYNAME_PRINT,
|
||||
Keyboard.KEYNAME_PRINTSCREEN,
|
||||
Keyboard.KEYNAME_REDO,
|
||||
Keyboard.KEYNAME_RESET,
|
||||
Keyboard.KEYNAME_RIGHTARROW,
|
||||
Keyboard.KEYNAME_SCROLLLOCK,
|
||||
Keyboard.KEYNAME_SELECT,
|
||||
Keyboard.KEYNAME_STOP,
|
||||
Keyboard.KEYNAME_SYSREQ,
|
||||
Keyboard.KEYNAME_SYSTEM,
|
||||
Keyboard.KEYNAME_UNDO,
|
||||
Keyboard.KEYNAME_UPARROW,
|
||||
Keyboard.KEYNAME_USER
|
||||
])
|
||||
});
|
|
@ -0,0 +1,31 @@
|
|||
function Mouse() {
|
||||
}
|
||||
|
||||
Object.defineProperties(Mouse, {
|
||||
cursor: descAccessor(
|
||||
function () {
|
||||
return 'auto'; // TODO
|
||||
},
|
||||
function (val) {
|
||||
notImplemented();
|
||||
}
|
||||
),
|
||||
hide: descMethod(function () {
|
||||
notImplemented();
|
||||
}),
|
||||
registerCursor: descMethod(function (name, cursor) {
|
||||
notImplemented();
|
||||
}),
|
||||
show: descMethod(function () {
|
||||
notImplemented();
|
||||
}),
|
||||
supportsCursor: descAccessor(function () {
|
||||
return true; // TODO
|
||||
}),
|
||||
supportsNativeCursor: descAccessor(function () {
|
||||
return true; // TODO
|
||||
}),
|
||||
unregisterCursor: descMethod(function (name) {
|
||||
notImplemented();
|
||||
})
|
||||
});
|
|
@ -95,102 +95,34 @@ SWF.embed = function(file, container, options) {
|
|||
if (!options)
|
||||
options = { };
|
||||
|
||||
var result;
|
||||
var root;
|
||||
var dictionary = new ObjDictionary();
|
||||
var pframes = [];
|
||||
var canvas = document.createElement('canvas');
|
||||
var ctx = canvas.getContext('2d');
|
||||
var frameRate, bounds;
|
||||
var plays;
|
||||
var as2Context = null;
|
||||
var dictionary = new ObjDictionary();
|
||||
|
||||
function resizeCanvas(container, canvas) {
|
||||
canvas.width = container.clientWidth;
|
||||
canvas.height = container.clientHeight;
|
||||
}
|
||||
|
||||
startWorking(file, function(obj) {
|
||||
if (!root) {
|
||||
bounds = obj.bounds;
|
||||
var stage = new Stage();
|
||||
stage._attachToCanvas({
|
||||
file: file,
|
||||
canvas: canvas,
|
||||
dictionary: dictionary,
|
||||
onstart: function(root, stage) {
|
||||
if (container.clientHeight) {
|
||||
resizeCanvas(container, canvas);
|
||||
window.addEventListener('resize',
|
||||
resizeCanvas.bind(null, container, canvas), false);
|
||||
} else {
|
||||
canvas.width = (bounds.xMax - bounds.xMin) / 20;
|
||||
canvas.height = (bounds.yMax - bounds.yMin) / 20;
|
||||
canvas.width = stage.stageWidth;
|
||||
canvas.height = stage.stageHeight;
|
||||
}
|
||||
container.appendChild(canvas);
|
||||
|
||||
frameRate = obj.frameRate;
|
||||
|
||||
// TODO disable AVM1 if AVM2 is enabled
|
||||
as2Context = new AS2Context(obj.version, {
|
||||
width: (bounds.xMax - bounds.xMin) / 20,
|
||||
height: (bounds.yMax - bounds.yMin) / 20
|
||||
});
|
||||
AS2Context.instance = as2Context;
|
||||
var globals = as2Context.globals;
|
||||
|
||||
AS2Mouse.$bind(canvas);
|
||||
AS2Key.$bind(canvas);
|
||||
|
||||
var proto = create(new MovieClipPrototype({
|
||||
frameCount: obj.frameCount,
|
||||
pframes: pframes
|
||||
}, dictionary));
|
||||
root = proto.constructor();
|
||||
root.name = '_root';
|
||||
|
||||
globals._root = globals._level0 = root.$as2Object;
|
||||
|
||||
if (options.onstart)
|
||||
options.onstart(root);
|
||||
return;
|
||||
}
|
||||
|
||||
AS2Context.instance = as2Context;
|
||||
if (obj) {
|
||||
if (obj.id) {
|
||||
definePrototype(dictionary, obj);
|
||||
} else if (obj.type === 'pframe') {
|
||||
if (obj.bgcolor)
|
||||
canvas.style.background = obj.bgcolor;
|
||||
|
||||
if (obj.abcBlocks) {
|
||||
var blocks = obj.abcBlocks;
|
||||
var i = 0;
|
||||
var block;
|
||||
while (block = blocks[i++]) {
|
||||
var abc = new AbcFile(block);
|
||||
executeAbc(abc, ALWAYS_INTERPRET);
|
||||
}
|
||||
}
|
||||
|
||||
if (obj.symbols) {
|
||||
var symbols = obj.symbols;
|
||||
var i = 0;
|
||||
var sym;
|
||||
while (sym = symbols[i++]) {
|
||||
if (!sym.id) {
|
||||
var mainTimeline = new (toplevel.getTypeByName(
|
||||
Multiname.fromSimpleName(sym.name),
|
||||
true
|
||||
)).instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pframes.push(obj);
|
||||
if (!plays) {
|
||||
renderMovieClip(root, frameRate, bounds, ctx);
|
||||
plays = true;
|
||||
}
|
||||
} else {
|
||||
result = obj;
|
||||
}
|
||||
} else if (options.oncomplete) {
|
||||
},
|
||||
oncomplete: function(root, result) {
|
||||
if (options.oncomplete)
|
||||
options.oncomplete(root, result);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -94,9 +94,9 @@ function renderShadowCanvas(character) {
|
|||
ctx.restore();
|
||||
}
|
||||
|
||||
function renderMovieClip(mc, rate, bounds, ctx) {
|
||||
function renderMovieClip(mc, stage, ctx) {
|
||||
var frameTime = 0;
|
||||
var maxDelay = 1000 / rate;
|
||||
var maxDelay = 1000 / stage.frameRate;
|
||||
var frameWidth = ctx.canvas.width;
|
||||
var frameHeight = ctx.canvas.height;
|
||||
|
||||
|
@ -109,22 +109,21 @@ function renderMovieClip(mc, rate, bounds, ctx) {
|
|||
var frameWidth = ctx.canvas.width;
|
||||
var frameHeight = ctx.canvas.height;
|
||||
|
||||
var scaleX = frameWidth / (bounds.xMax - bounds.xMin);
|
||||
var scaleY = frameHeight / (bounds.yMax - bounds.yMin);
|
||||
var scaleX = frameWidth / stage.stageWidth;
|
||||
var scaleY = frameHeight / stage.stageHeight;
|
||||
var scale = Math.min(scaleX, scaleY);
|
||||
var offsetX = (frameWidth - scale * (bounds.xMax - bounds.xMin)) / 2;
|
||||
var offsetY = (frameHeight - scale * (bounds.yMax - bounds.yMin)) / 2;
|
||||
var offsetX = (frameWidth - scale * stage.stageWidth) / 2;
|
||||
var offsetY = (frameHeight - scale * stage.stageHeight) / 2;
|
||||
|
||||
ctx.clearRect(0, 0, frameWidth, frameHeight);
|
||||
ctx.save();
|
||||
ctx.translate(offsetX, offsetY);
|
||||
ctx.scale(scale, scale);
|
||||
ctx.scale(scale / 20, scale / 20);
|
||||
|
||||
ctx.canvas.currentTransform = {
|
||||
scale: scale * 20,
|
||||
scale: scale,
|
||||
offsetX: offsetX,
|
||||
offsetY: offsetY,
|
||||
bounds: bounds
|
||||
offsetY: offsetY
|
||||
};
|
||||
}
|
||||
this.depth++;
|
||||
|
|
Загрузка…
Ссылка в новой задаче