Mercurial > MadButterfly
diff nodejs/mbapp.js @ 1067:7b4e80ab671a openvg
merge from default branch
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 01 Dec 2010 12:25:56 +0800 |
parents | 78312b44f48c |
children | 593a418ed8bf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nodejs/mbapp.js Wed Dec 01 12:25:56 2010 +0800 @@ -0,0 +1,224 @@ +// -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- +// vim: sw=4:ts=8:sts=4 +var mbfly = require("mbfly"); +var svg = require("./svg"); +var sys = require("sys"); +var ldr = mbfly.img_ldr_new("."); + +function _reverse(m1) { + var rev = new Array(1, 0, 0, 0, 1, 0); + var m = new Array(m1[0], m1[1], m1[2], m1[3], m1[4], m1[5]); + + rev[3] = -m[3] / m[0]; + m[3] = 0; + m[4] += rev[3] * m[1]; + m[5] += rev[3] * m[2]; + + rev[1] = -m[1] / m[4]; + rev[0] += rev[1] * rev[3]; + m[1] = 0; + m[2] += rev[1] * m[5]; + + rev[2] = -m[2]; + rev[5] = -m[5]; + + rev[0] = rev[0] / m[0]; + rev[1] = rev[1] / m[0]; + rev[2] = rev[2] / m[0]; + + rev[3] = rev[3] / m[4]; + rev[4] = rev[4] / m[4]; + rev[5] = rev[5] / m[4]; + + return rev; +} + +function _decorate_mb_rt(mb_rt) { + var coord; + + mb_rt._mbapp_saved_coord_new = mb_rt.coord_new; + mb_rt.coord_new = function(parent) { + var coord; + + coord = this._mbapp_saved_coord_new(parent); + coord.type = "coord"; + coord.children = []; + coord._mbapp_saved_mtx = [coord[0], coord[1], coord[2], + coord[3], coord[4], coord[5]]; + coord._mbapp_saved_rev_mtx = _reverse(coord._mbapp_saved_mtx); + coord.parent = parent; + coord._mbapp_saved_add_shape = coord.add_shape; + coord.add_shape = function(shape) { + var coord; + + this._mbapp_saved_add_shape(shape); + shape.parent = this; + this.children.push(shape); + } + + parent.children.push(coord); + + return coord; + }; + + /* + * Decorate root coord + */ + coord = mb_rt.root; + coord.type = "coord"; + coord.children = []; + coord._mbapp_saved_mtx = [coord[0], coord[1], coord[2], + coord[3], coord[4], coord[5]]; + coord._mbapp_saved_rev_mtx = _reverse(coord._mbapp_saved_mtx); + coord._mbapp_saved_add_shape = coord.add_shape; + coord.add_shape = function(shape) { + var coord; + + this._mbapp_saved_add_shape(shape); + shape.parent = this; + } +} + +app=function(display, w, h) { + var self = this; + var mb_rt; + + if(typeof display == "undefined") + display = ":0.0"; + if(typeof w == "undefined") + w = 720; + if(typeof h == "undefined") + h = 480; + + mb_rt = this.mb_rt = new mbfly.mb_rt(display, w, h); + _decorate_mb_rt(mb_rt); + var background = mb_rt.rect_new(0, 0, 720, 480, 0, 0); + var paint = mb_rt.paint_color_new(1, 1, 1, 1); + paint.fill(background); + mb_rt.root.add_shape(background); + + this.mb_rt.kbevents.add_event_observer(exports.EVT_KB_PRESS, function(evt) { self.KeyPress(evt);}); + this.keymap={}; + this.onKeyPress = null; + this.svg = new svg.loadSVG(this.mb_rt,this.mb_rt.root,null); +} +app.prototype.loadSVG=function(fname) { + this.svg.load(this.mb_rt,this.mb_rt.root,fname) +} + +app.prototype.KeyPress = function(evt) { + if (this.onKeyPress) this.onKeyPress(evt.sym); + if (evt.sym in this.keymap) { + this.keymap[evt.sym](); + } +} + +app.prototype.loop=function() { + this.mb_rt.redraw_all(); + this.mb_rt.flush(); +} +app.prototype.update=function() { + this.mb_rt.redraw_all(); + this.mb_rt.flush(); +} +app.prototype.get=function(name) { + return this.mb_rt.mbnames[name]; +} +app.prototype.addKeyboardListener=function(type,f) { + return this.mb_rt.kbevents.add_event_observer(type,f); +} +app.prototype.refresh=function() { + this.mb_rt.redraw_changed(); + this.mb_rt.flush(); +} +app.prototype.dump=function() { + sys.puts(this.onKeyPress); +} + +app.prototype.addKeyListener=function(key,f) { + if (typeof(key) == 'number') + this.keymap[key] = f; + else { + for(k in key) { + this.keymap[k] = f; + } + } +} + + +app.prototype.changeScene=function(s) { + var nth; + if (typeof(s)=='number') { + var i; + nth = s; + } else { + nth = this.svg.getFrameNumber(s); + if (nth == -1) return; + } + var scenes = this.svg.scenes; + for(i=0;i<scenes.length;i++) { + try { + if (nth >=scenes[i].start && nth <=scenes[i].end) { + this.get(scenes[i].ref).show(); + } else { + this.get(scenes[i].ref).hide(); + } + } catch(e) { + sys.puts(e); + sys.puts(scenes[i].ref); + } + } +} +app.prototype.addSceneListener=function(n, cb) { + sys.puts("This is not implemented yet") +} + +var app_with_win = function(display, win) { + var self = this; + var mb_rt; + var background; + var paint; + + if(typeof display == "undefined" || typeof win == "undefined") + throw "Invalid argument"; + + mb_rt = this.mb_rt = new mbfly.mb_rt_with_win(display, win); + _decorate_mb_rt(mb_rt); + background = mb_rt.rect_new(0, 0, 720, 480, 0, 0); + paint = mb_rt.paint_color_new(1, 1, 1, 1); + paint.fill(background); + mb_rt.root.add_shape(background); + + this.mb_rt.kbevents. + add_event_observer(exports.EVT_KB_PRESS, + function(evt) { self.KeyPress(evt); }); + this.keymap = {}; + this.onKeyPress = null; +} + +app_with_win.prototype = app.prototype; + +exports.app=app; +exports.app_with_win = app_with_win; + +// Put all key definition here +exports.KEY_LEFT = 0xff51; +exports.KEY_UP = 0xff52; +exports.KEY_RIGHT = 0xff53; +exports.KEY_DOWN = 0xff54; +exports.KEY_ENTER = 0xff0d; +exports.EVT_ANY=0; +exports.EVT_MOUSE_OVER=1; +exports.EVT_MOUSE_OUT=2; +exports.EVT_MOUSE_MOVE=3; +exports.EVT_MOUSE_BUT_PRESS4; +exports.EVT_MOUSE_BUT_RELEASE=5 +exports.EVT_KB_PRESS=6; +exports.EVT_KB_RELEASE=7; +exports.EVT_PROGM_COMPLETE=8; +exports.EVT_RDMAN_REDRAW=9; +exports.EVT_MONITOR_ADD=10; +exports.EVT_MONITOR_REMOVE=11; +exports.EVT_MONITOR_FREE=12; +exports.EVT_MOUSE_MOVE_RAW=13; +exports.ldr = ldr;