annotate nodejs/coord.cc @ 1450:6644ef3d75eb

Add get_child method for coord in JS
author Thinker K.F. Li <thinker@codemud.net>
date Wed, 13 Apr 2011 14:36:32 +0800
parents ef3908d9a3d2
children 5d89aa30310c
rev   line source
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*-
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
2 // vim: sw=4:ts=8:sts=4
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3 #include <stdio.h>
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
4 #include <v8.h>
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
5
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
6 extern "C" {
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7 #include "mb.h"
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
8 #include "mb_X_supp.h"
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
9 #include "mb_tools.h"
1056
88bd0eee2b00 Rename X_supp_njs.[ch] to njs_mb_supp.[ch].
Thinker K.F. Li <thinker@codemud.net>
parents: 843
diff changeset
10 #include "njs_mb_supp.h"
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
11 }
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
12
560
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
13 #include "mbfly_njs.h"
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
14
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
15 #ifndef ASSERT
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
16 #define ASSERT(x)
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
17 #endif
1449
ef3908d9a3d2 Revert 4be04f29fa70
Thinker K.F. Li <thinker@codemud.net>
parents: 1434
diff changeset
18
743
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
19 #define OK 0
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
20
739
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
21 /*! \page jsgc How to Manage Life-cycle of Objects for Javascript.
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
22 *
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
23 * The life-cycle of MadButterfly ojects are simple. A object is live
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
24 * when it is created and dead when it is free. When a coord or shape
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
25 * is free, it is also removed from the tree. There is not way to
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
26 * remove a coord or a shape without freeing it. So, if you want to
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
27 * remove a coord or a shape object from the tree, you can only free
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
28 * it.
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
29 *
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
30 * Javascript, in conventional, does not free an object. It has GC,
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
31 * the engine, being used, will free an object if it is no more
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
32 * referenced. So, we had better provide a removing function, but
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
33 * actually free an object. In idea situation, a new MB object would
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
34 * be created for and attached on the JS object, when an object added
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
35 * back to the tree. But, it means we need to keep states of an
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
36 * object and create a new one with the same states later. It is
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
37 * complicated. So, once an object is removed, it is invalidated.
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
38 *
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
39 * I hope someone would implement a higher abstract layer, in JS, to
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
40 * implement the idea model that recreate a new object when an
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
41 * invalidated JS object being added back.
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
42 *
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
43 * An invalid object is the one with NULL internal field and obj.valid
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
44 * == false. The binding of MadButterfly hold a reference to every
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
45 * object added to the tree of a mbrt (runtime object), and remove the
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
46 * reference and invalidate it when it being removed.
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
47 *
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
48 * For coords, they are always attached to the tree when it is valid.
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
49 * So, binding hold a persistent reference to it. The reference is
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
50 * purged when a coord being removed from the tree and being
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
51 * invalidated.
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
52 *
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
53 * For any shape, it is not attached to the tree at begining, but is
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
54 * attached to a tree laterly, or is collected by GC. The binding
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
55 * hold a weak reference for a new shape, and upgrade to a strong
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
56 * reference when the shape being added to the tree.
739
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
57 */
4916c3a3fe3c Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents: 695
diff changeset
58
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
59 using namespace v8;
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
60
684
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
61 /*! \defgroup xnjsmb_coord JS binding for coord objects.
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
62 * \ingroup xnjsmb
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
63 *
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
64 * @{
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
65 */
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
66 /*! \brief Invalidate JS objects for coords and shapes in a subtree.
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
67 *
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
68 * \param self is the object of the root of subtree.
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
69 *
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
70 * \sa \ref jsgc
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
71 */
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
72 static void
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
73 xnjsmb_coord_invalidate_subtree(coord_t *coord) {
742
24038e7a365b Reorder instructions to invalidate coords correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 741
diff changeset
74 Persistent<Object> *child_hdl;
24038e7a365b Reorder instructions to invalidate coords correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 741
diff changeset
75 Persistent<Object> *mem_hdl;
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
76 coord_t *child;
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
77 shape_t *mem;
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
78 Handle<Value> _false = Boolean::New(0);
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
79
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
80 /* Invalidate all coords in the subtree */
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
81 FOR_COORDS_PREORDER(coord, child) {
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
82 child_hdl = (Persistent<Object> *)mb_prop_get(&child->obj.props,
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
83 PROP_JSOBJ);
1416
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
84 /* There is no associated JS object. Perhaps, it is created
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
85 * by xnjsmb_coord_clone_from_subtree().
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
86 */
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
87 if(child_hdl == NULL) {
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
88 preorder_coord_skip_subtree(child);
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
89 continue;
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
90 }
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
91
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
92 SET(*child_hdl, "valid", _false);
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
93 WRAP(*child_hdl, NULL);
766
be0e02948c1d Improve resource management for coords, shapes and paints.
Thinker K.F. Li <thinker@codemud.net>
parents: 749
diff changeset
94 child_hdl->Dispose();
746
1dbc74a14199 Delete internal reference ob binding when invalidating coords and/or shapes
Thinker K.F. Li <thinker@codemud.net>
parents: 745
diff changeset
95 delete child_hdl;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
96
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
97 /* Invalidate members of a coord */
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
98 FOR_COORD_SHAPES(child, mem) {
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
99 mem_hdl = (Persistent<Object> *)mb_prop_get(&mem->obj.props,
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
100 PROP_JSOBJ);
1416
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
101 /* There is no associated JS object. Perhaps, it is
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
102 * created by xnjsmb_coord_clone_from_subtree().
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
103 */
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
104 if(mem_hdl == NULL)
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
105 continue;
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
106
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
107 SET(*mem_hdl, "valid", _false);
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
108 WRAP(*mem_hdl, NULL);
766
be0e02948c1d Improve resource management for coords, shapes and paints.
Thinker K.F. Li <thinker@codemud.net>
parents: 749
diff changeset
109 mem_hdl->Dispose();
746
1dbc74a14199 Delete internal reference ob binding when invalidating coords and/or shapes
Thinker K.F. Li <thinker@codemud.net>
parents: 745
diff changeset
110 delete mem_hdl;
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
111 }
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
112 }
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
113 }
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
114
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
115 /*! \brief Free C objects for coords and shapes in a subtree.
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
116 *
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
117 * \param self is the object of the root of subtree.
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
118 *
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
119 * \sa \ref jsgc
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
120 */
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
121 static void
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
122 xnjsmb_coord_free_subtree(redraw_man_t *rdman, coord_t *coord) {
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
123 coord_t *child, *last_child;
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
124 shape_t *mem, *last_mem;
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
125 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
126
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
127 rdman_coord_changed(rdman, coord);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
128
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
129 last_child = NULL;
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
130 FOR_COORDS_POSTORDER(coord, child) {
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
131 if(last_child != NULL) {
768
13669b28826d Fix issue of memory leaking for coord objects.
Thinker K.F. Li <thinker@codemud.net>
parents: 766
diff changeset
132 r = rdman_coord_free(rdman, last_child);
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
133 if(r != OK)
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
134 THROW_noret("Unknown error");
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
135 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
136
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
137 /* Free members of a coord */
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
138 last_mem = NULL;
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
139 FOR_COORD_SHAPES(child, mem) {
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
140 if(last_mem != NULL) {
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
141 r = rdman_shape_free(rdman, last_mem);
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
142 if(r != OK)
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
143 THROW_noret("Unknown error");
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
144 }
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
145
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
146 last_mem = mem;
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
147 }
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
148 if(last_mem != NULL) {
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
149 r = rdman_shape_free(rdman, last_mem);
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
150 if(r != OK)
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
151 THROW_noret("Unknown error");
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
152 }
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
153
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
154 last_child = child;
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
155 }
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
156 if(last_child != NULL) {
768
13669b28826d Fix issue of memory leaking for coord objects.
Thinker K.F. Li <thinker@codemud.net>
parents: 766
diff changeset
157 r = rdman_coord_free(rdman, last_child);
744
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
158 if(r != OK)
6a988e23ad2a A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 743
diff changeset
159 THROW_noret("Unknown error");
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
160 }
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
161 }
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
162
680
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
163 static void
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
164 xnjsmb_coord_mod(Handle<Object> self, coord_t *coord) {
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
165 Persistent<Object> *self_hdl;
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
166 subject_t *subject;
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
167 Handle<Value> subject_o;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
168
680
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
169 /* Keep associated js object in property store for retrieving,
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
170 * later, without create new js object.
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
171 */
743
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
172 self_hdl = new Persistent<Object>();
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
173 *self_hdl = Persistent<Object>::New(self);
680
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
174 mb_prop_set(&coord->obj.props, PROP_JSOBJ, self_hdl);
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
175
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
176 subject = coord->mouse_event;
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
177 subject_o = export_xnjsmb_auto_subject_new(subject);
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
178 SET(self, "mouse_event", subject_o);
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
179 SET(self, "valid", Boolean::New(1));
680
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
180 }
a588eefd3f04 Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents: 667
diff changeset
181
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
182 static float
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
183 coord_get_index(coord_t *coord, Handle<Object> self, int idx,
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
184 const char **err) {
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
185 if(idx < 0 || idx >= 6) {
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
186 *err = "Invalid index: out of range";
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
187 return 0;
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
188 }
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
189
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
190 return coord_get_matrix(coord)[idx];
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
191 }
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
192
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
193 static float
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
194 coord_set_index(coord_t *coord, Handle<Object> self,
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
195 int idx, float v, const char **err) {
560
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
196 Handle<Object> js_rt;
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
197 redraw_man_t *rdman;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
198
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
199 if(idx < 0 || idx >= 6) {
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
200 *err = "Invalid index: out of range";
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
201 return 0;
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
202 }
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
203
1423
d82a828e8e26 Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents: 1416
diff changeset
204 if (coord_get_matrix(coord)[idx] == v) return v;
d82a828e8e26 Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents: 1416
diff changeset
205
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
206 coord_get_matrix(coord)[idx] = v;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
207
560
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
208 js_rt = GET(self, "mbrt")->ToObject();
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
209 rdman = xnjsmb_rt_rdman(js_rt);
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
210 rdman_coord_changed(rdman, coord);
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
211
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
212 return v;
557
0ca8437a91fa Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
213 }
560
ce7a35abcb0d Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents: 557
diff changeset
214
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
215 static void
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
216 xnjsmb_coord_add_shape(coord_t *coord, Handle<Object> self,
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
217 shape_t *shape, const char **err) {
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
218 Handle<Object> js_rt;
748
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
219 Persistent<Object> *shape_hdl;
566
6639d386db78 Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents: 563
diff changeset
220 redraw_man_t *rdman;
6639d386db78 Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents: 563
diff changeset
221 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
222
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
223 js_rt = GET(self, "mbrt")->ToObject();
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
224 rdman = xnjsmb_rt_rdman(js_rt);
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
225 r = rdman_add_shape(rdman, shape, coord);
566
6639d386db78 Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents: 563
diff changeset
226 if(r != 0)
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
227 *err = "Unknown error";
748
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
228
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
229 /* see \ref jsgc */
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
230 shape_hdl = (Persistent<Object> *)mb_prop_get(&shape->obj.props,
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
231 PROP_JSOBJ);
56a5e08cd8af Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents: 746
diff changeset
232 shape_hdl->ClearWeak();
778
61c217f8cec8 Fix bug of transformation from user space to image space.
Thinker K.F. Li <thinker@codemud.net>
parents: 768
diff changeset
233 rdman_shape_changed(rdman, shape);
566
6639d386db78 Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents: 563
diff changeset
234 }
6639d386db78 Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents: 563
diff changeset
235
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
236 static void
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
237 xnjsmb_coord_remove(coord_t *coord, Handle<Object> self) {
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
238 Handle<Object> js_rt;
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
239 redraw_man_t *rdman;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
240
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
241 if(!GET(self, "valid")->ToBoolean()->Value()) /* Invalidated object */
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
242 THROW_noret("Invalid object");
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
243
745
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
244 js_rt = GET(self, "mbrt")->ToObject();
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
245 rdman = xnjsmb_rt_rdman(js_rt);
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
246
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
247 xnjsmb_coord_invalidate_subtree(coord);
4ccb0553e804 Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 744
diff changeset
248 xnjsmb_coord_free_subtree(rdman, coord);
741
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
249 }
d8764f10e141 Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents: 739
diff changeset
250
1377
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
251 static void
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
252 _xnjsmb_coord_clone_from_subtree_mod(Handle<Object> src, Handle<Value> ret) {
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
253 Handle<Object> js_rt;
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
254 Handle<Object> ret_obj = ret->ToObject();
1416
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
255 coord_t *ret_coord, *child;
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
256 Handle<Object> child_obj;
1377
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
257
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
258 js_rt = GET(src, "mbrt")->ToObject();
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
259 SET(ret_obj, "mbrt", js_rt);
1416
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
260
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
261 /* Only root of the subtree is warpped. Descendants of subtree
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
262 * are not wrapped by JS object. We have no any method to access
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
263 * children and members of a coord, now. So, it is fine. But,
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
264 * sometime later, we will provide APIs for traveling a tree. At
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
265 * that time, we need to create wrappers for all descendants.
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
266 */
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
267 ret_coord = (coord_t *)UNWRAP(ret_obj);
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
268 xnjsmb_coord_mod(ret_obj, ret_coord);
1377
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
269 }
8ecee58c85c6 Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents: 1372
diff changeset
270
1372
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
271 static coord_t *
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
272 xnjsmb_coord_clone_from_subtree(coord_t *coord, Handle<Object> self,
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
273 coord_t *src, const char **err) {
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
274 Handle<Object> js_rt;
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
275 redraw_man_t *rdman;
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
276 coord_t *cloning;
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
277
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
278 js_rt = GET(self, "mbrt")->ToObject();
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
279 ASSERT(js_rt != NULL);
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
280 rdman = xnjsmb_rt_rdman(js_rt);
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
281
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
282 cloning = rdman_coord_clone_from_subtree(rdman, coord, src);
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
283 if(cloning == NULL) {
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
284 *err = "can not clone a subtree (allocate memory)";
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
285 return NULL;
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
286 }
1416
c60a978f98b1 Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents: 1415
diff changeset
287 rdman_coord_changed(rdman, cloning);
1372
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
288
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
289 return cloning;
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
290 }
0afd598a0b30 Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents: 1056
diff changeset
291
749
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
292 static void
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
293 xnjsmb_coord_show(coord_t *coord, Handle<Object> self) {
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
294 Handle<Object> js_rt;
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
295 redraw_man_t *rdman;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
296
749
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
297 js_rt = GET(self, "mbrt")->ToObject();
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
298 ASSERT(js_rt != NULL);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
299 rdman = xnjsmb_rt_rdman(js_rt);
1423
d82a828e8e26 Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents: 1416
diff changeset
300 if ((coord->flags & COF_HIDDEN) == 0) return;
749
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
301 coord_show(coord);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
302 rdman_coord_changed(rdman, coord);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
303 }
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
304
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
305 static void
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
306 xnjsmb_coord_hide(coord_t *coord, Handle<Object> self) {
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
307 Handle<Object> js_rt;
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
308 redraw_man_t *rdman;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
309
749
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
310 js_rt = GET(self, "mbrt")->ToObject();
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
311 ASSERT(js_rt != NULL);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
312 rdman = xnjsmb_rt_rdman(js_rt);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
313
1423
d82a828e8e26 Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents: 1416
diff changeset
314 if ((coord->flags & COF_HIDDEN) != 0) return;
749
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
315 coord_hide(coord);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
316 rdman_coord_changed(rdman, coord);
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
317 }
ed59e659a202 Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents: 748
diff changeset
318
810
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
319 static void
829
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
320 xnjsmb_coord_set_opacity(Handle<Object> self, coord_t *coord, Handle<Value> value, const char **str)
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
321 {
810
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
322 Handle<Object> js_rt;
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
323 redraw_man_t *rdman;
829
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
324
810
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
325 js_rt = GET(self, "mbrt")->ToObject();
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
326 ASSERT(js_rt != NULL);
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
327 rdman = xnjsmb_rt_rdman(js_rt);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
328
1423
d82a828e8e26 Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents: 1416
diff changeset
329 if (coord_get_opacity(coord) == value->NumberValue()) return;
829
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
330
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
331 coord_set_opacity(coord, value->NumberValue());
810
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
332 rdman_coord_changed(rdman, coord);
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
333 }
84853c8559cf Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents: 778
diff changeset
334
829
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
335 static Handle<Value>
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
336 xnjsmb_coord_get_opacity(Handle<Object> self, coord_t *coord,
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
337 const char **err) {
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
338 float opacity;
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
339
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
340 opacity = coord_get_opacity(coord);
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
341 return Number::New(opacity);
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
342 }
379fd510ba38 Define accessor for the opacity attribute of the coord
wycc
parents: 822
diff changeset
343
843
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
344 #define cc(i) (coord_get_matrix(coord)[i])
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
345 static void
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
346 xnjsmb_coord_set_y(Handle<Object> self, coord_t *coord, Handle<Value> value, const char **str)
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
347 {
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
348 Handle<Object> js_rt;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
349 redraw_man_t *rdman;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
350 co_aix y,ty;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
351 co_aix xx,yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
352
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
353 js_rt = GET(self, "mbrt")->ToObject();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
354 ASSERT(js_rt != NULL);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
355 rdman = xnjsmb_rt_rdman(js_rt);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
356
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
357
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
358 ty = value->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
359 xx = GET(self,"_x")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
360 yy = GET(self,"_y")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
361 y = ty-cc(3)*xx-cc(4)*yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
362 coord_get_matrix(coord)[5] = y;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
363 rdman_coord_changed(rdman, coord);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
364 }
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
365
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
366 static Handle<Value>
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
367 xnjsmb_coord_get_y(Handle<Object> self, coord_t *coord,
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
368 const char **err) {
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
369 co_aix y;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
370 co_aix xx,yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
371
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
372 xx = GET(self,"_x")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
373 yy = GET(self,"_y")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
374
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
375 y = cc(3)*xx+cc(4)*yy+cc(5);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
376 return Number::New(y);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
377 }
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
378 static void
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
379 xnjsmb_coord_set_x(Handle<Object> self, coord_t *coord, Handle<Value> value, const char **str)
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
380 {
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
381 Handle<Object> js_rt;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
382 redraw_man_t *rdman;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
383 co_aix x,tx;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
384 co_aix xx,yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
385
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
386 xx = GET(self,"_x")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
387 yy = GET(self,"_y")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
388 js_rt = GET(self, "mbrt")->ToObject();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
389 ASSERT(js_rt != NULL);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
390 rdman = xnjsmb_rt_rdman(js_rt);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
391
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
392 tx = value->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
393 x = tx-cc(0)*xx-cc(1)*yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
394 coord_get_matrix(coord)[2] = x;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
395 rdman_coord_changed(rdman, coord);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
396 }
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
397
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
398 static Handle<Value>
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
399 xnjsmb_coord_get_x(Handle<Object> self, coord_t *coord,
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
400 const char **err) {
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
401 co_aix x;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
402 co_aix xx,yy;
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
403
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
404 xx = GET(self,"_x")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
405 yy = GET(self,"_y")->ToNumber()->NumberValue();
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
406
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
407 x = cc(0)*xx+cc(1)*yy+cc(2);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
408 return Number::New(x);
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
409 }
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
410 #undef m
2bcacd29d95f Define accessor for x and y to implement absolute location
wycc
parents: 829
diff changeset
411
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
412 #include "coord-inc.h"
562
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
413
684
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
414 /*! \brief This function used by \ref xnjsmb_mb_rt to wrap coord object.
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
415 */
666
b6fb543d69ee Use binding generator to implement mb_rt
Thinker K.F. Li <thinker@branda.to>
parents: 661
diff changeset
416 Handle<Value> export_xnjsmb_auto_coord_new(coord_t *coord) {
695
763a4e2bbd85 Return the value of ojbject to fix the crash issue
wycc
parents: 684
diff changeset
417 return xnjsmb_auto_coord_new(coord);
666
b6fb543d69ee Use binding generator to implement mb_rt
Thinker K.F. Li <thinker@branda.to>
parents: 661
diff changeset
418 }
b6fb543d69ee Use binding generator to implement mb_rt
Thinker K.F. Li <thinker@branda.to>
parents: 661
diff changeset
419
562
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
420 /*! \brief Initialize Javascript object for root coord of a runtime.
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
421 *
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
422 * \param js_rt is the runtime object to create the root object for.
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
423 *
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
424 * After the function, js_rt.root is the object for root coord in
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
425 * Javascript.
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
426 */
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
427 void
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
428 xnjsmb_coord_mkroot(Handle<Object> js_rt) {
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
429 redraw_man_t *rdman;
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
430 coord_t *root;
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
431 Handle<Object> obj;
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
432 static int init_flag = 0;
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
433
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
434 if(!init_flag) {
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
435 xnjsmb_auto_coord_init();
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
436 init_flag = 1;
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
437 }
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 810
diff changeset
438
562
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
439 rdman = xnjsmb_rt_rdman(js_rt);
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
440 root = rdman_get_root(rdman);
661
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
441 obj = xnjsmb_auto_coord_new(root).As<Object>();
90c7726bc953 Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents: 566
diff changeset
442 SET(obj, "mbrt", js_rt);
562
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
443
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
444 SET(js_rt, "root", obj);
1b6402f07cd4 Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents: 560
diff changeset
445 }
684
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
446
b346e4699e55 Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents: 680
diff changeset
447 /* @} */