Mercurial > MadButterfly
annotate nodejs/coord.cc @ 1498:fc4169113259
Show popup menu for right click on a transition
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 03 May 2011 13:00:20 +0800 |
parents | e22df2f3bffe |
children |
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 | 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 |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
21 #define xnjsmb_auto_path_new export_xnjsmb_auto_path_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
22 #define xnjsmb_auto_stext_new export_xnjsmb_auto_stext_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
23 #define xnjsmb_auto_image_new export_xnjsmb_auto_image_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
24 #define xnjsmb_auto_rect_new export_xnjsmb_auto_rect_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
25 #define xnjsmb_auto_paint_color_new export_xnjsmb_auto_paint_color_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
26 #define xnjsmb_auto_paint_image_new export_xnjsmb_auto_paint_image_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
27 #define xnjsmb_auto_paint_linear_new export_xnjsmb_auto_paint_linear_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
28 #define xnjsmb_auto_paint_radial_new export_xnjsmb_auto_paint_radial_new |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
29 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
30 |
739
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
31 /*! \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
|
32 * |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
33 * 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
|
34 * 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
|
35 * 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
|
36 * 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
|
37 * 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
|
38 * it. |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
39 * |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
40 * 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
|
41 * 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
|
42 * 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
|
43 * 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
|
44 * 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
|
45 * 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
|
46 * 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
|
47 * 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
|
48 * |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
49 * 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
|
50 * 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
|
51 * 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
|
52 * |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
53 * 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
|
54 * == 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
|
55 * 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
|
56 * 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
|
57 * |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
58 * 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
|
59 * 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
|
60 * 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
|
61 * invalidated. |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
62 * |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
63 * 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
|
64 * 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
|
65 * 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
|
66 * 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
|
67 */ |
4916c3a3fe3c
Design doc for life-cycle of MB objects for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
695
diff
changeset
|
68 |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
69 using namespace v8; |
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
70 |
684
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
71 /*! \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
|
72 * \ingroup xnjsmb |
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
73 * |
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
74 * @{ |
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
75 */ |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
76 /*! \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
|
77 * |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
78 * \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
|
79 * |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
80 * \sa \ref jsgc |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
81 */ |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
82 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
|
83 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
|
84 Persistent<Object> *child_hdl; |
24038e7a365b
Reorder instructions to invalidate coords correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
741
diff
changeset
|
85 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
|
86 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
|
87 shape_t *mem; |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
88 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
|
89 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
90 /* 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
|
91 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
|
92 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
|
93 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
|
94 /* 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
|
95 * 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
|
96 */ |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
97 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
|
98 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
|
99 continue; |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
100 } |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
101 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
102 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
|
103 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
|
104 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
|
105 delete child_hdl; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
810
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 /* 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
|
108 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
|
109 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
|
110 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
|
111 /* 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
|
112 * 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
|
113 */ |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
114 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
|
115 continue; |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
116 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
117 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
|
118 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
|
119 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
|
120 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
|
121 } |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
122 } |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
123 } |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
124 |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
125 /*! \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
|
126 * |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
127 * \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
|
128 * |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
129 * \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
|
130 */ |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 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
|
135 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
810
diff
changeset
|
136 |
744
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
137 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
|
138 |
744
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
139 last_child = NULL; |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
140 FOR_COORDS_POSTORDER(coord, child) { |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
141 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
|
142 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
|
143 if(r != OK) |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
144 THROW_noret("Unknown error"); |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
145 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
810
diff
changeset
|
146 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
147 /* Free members of a coord */ |
744
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
148 last_mem = NULL; |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
149 FOR_COORD_SHAPES(child, mem) { |
744
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
150 if(last_mem != NULL) { |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
151 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
|
152 if(r != OK) |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
153 THROW_noret("Unknown error"); |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
154 } |
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 last_mem = mem; |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
157 } |
744
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
158 if(last_mem != NULL) { |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
159 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
|
160 if(r != OK) |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
161 THROW_noret("Unknown error"); |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
162 } |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
163 |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
164 last_child = child; |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
165 } |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
166 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
|
167 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
|
168 if(r != OK) |
6a988e23ad2a
A dirty implementation of removing subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
743
diff
changeset
|
169 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
|
170 } |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
171 } |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
172 |
680
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
173 static void |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
174 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
|
175 Persistent<Object> *self_hdl; |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
176 subject_t *subject; |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
177 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
|
178 |
680
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
179 /* 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
|
180 * later, without create new js object. |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
181 */ |
743
dd1f3382d6a4
Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents:
742
diff
changeset
|
182 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
|
183 *self_hdl = Persistent<Object>::New(self); |
680
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
184 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
|
185 |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
186 subject = coord->mouse_event; |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
187 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
|
188 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
|
189 SET(self, "valid", Boolean::New(1)); |
680
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
190 } |
a588eefd3f04
Refactor to xnjsmb_coord_mod().
Thinker K.F. Li <thinker@branda.to>
parents:
667
diff
changeset
|
191 |
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
|
192 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
|
193 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
|
194 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
|
195 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
|
196 *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
|
197 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
|
198 } |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
199 |
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
|
200 return coord_get_matrix(coord)[idx]; |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
201 } |
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
202 |
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
|
203 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
|
204 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
|
205 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
|
206 Handle<Object> js_rt; |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
207 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
|
208 |
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
|
209 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
|
210 *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
|
211 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
|
212 } |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
213 |
1423
d82a828e8e26
Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents:
1416
diff
changeset
|
214 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
|
215 |
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
|
216 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
|
217 |
560
ce7a35abcb0d
Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents:
557
diff
changeset
|
218 js_rt = GET(self, "mbrt")->ToObject(); |
ce7a35abcb0d
Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents:
557
diff
changeset
|
219 rdman = xnjsmb_rt_rdman(js_rt); |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
220 rdman_coord_changed(rdman, coord); |
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
221 |
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
|
222 return v; |
557
0ca8437a91fa
Implement Indexed Property interceptors
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
223 } |
560
ce7a35abcb0d
Function to instantiate coord for Javascript
Thinker K.F. Li <thinker@branda.to>
parents:
557
diff
changeset
|
224 |
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
|
225 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
|
226 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
|
227 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
|
228 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
|
229 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
|
230 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
|
231 int r; |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
810
diff
changeset
|
232 |
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
|
233 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
|
234 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
|
235 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
|
236 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
|
237 *err = "Unknown error"; |
748
56a5e08cd8af
Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents:
746
diff
changeset
|
238 |
56a5e08cd8af
Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents:
746
diff
changeset
|
239 /* see \ref jsgc */ |
56a5e08cd8af
Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents:
746
diff
changeset
|
240 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
|
241 PROP_JSOBJ); |
56a5e08cd8af
Make shapes can be removed from the tree
Thinker K.F. Li <thinker@codemud.net>
parents:
746
diff
changeset
|
242 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
|
243 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
|
244 } |
6639d386db78
Function of add a shape to a coord in Javascript.
Thinker K.F. Li <thinker@branda.to>
parents:
563
diff
changeset
|
245 |
741
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
246 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
|
247 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
|
248 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
|
249 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
|
250 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
251 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
|
252 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
|
253 |
745
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
254 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
|
255 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
|
256 |
4ccb0553e804
Refactor code of free C objects into xnjsmb_coord_free_subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
744
diff
changeset
|
257 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
|
258 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
|
259 } |
d8764f10e141
Remove a coord from the tree in JS
Thinker K.F. Li <thinker@codemud.net>
parents:
739
diff
changeset
|
260 |
1377
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
261 static void |
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
262 _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
|
263 Handle<Object> js_rt; |
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
264 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
|
265 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
|
266 Handle<Object> child_obj; |
1377
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
267 |
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
268 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
|
269 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
|
270 |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
271 /* 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
|
272 * 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
|
273 * 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
|
274 * 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
|
275 * 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
|
276 */ |
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
277 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
|
278 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
|
279 } |
8ecee58c85c6
Fix issue of crashing for cloned subtree
Thinker K.F. Li <thinker@codemud.net>
parents:
1372
diff
changeset
|
280 |
1372
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
281 static coord_t * |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
282 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
|
283 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
|
284 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
|
285 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
|
286 coord_t *cloning; |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
287 |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
288 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
|
289 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
|
290 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
|
291 |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
292 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
|
293 if(cloning == NULL) { |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
294 *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
|
295 return NULL; |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
296 } |
1416
c60a978f98b1
Fix issue of seg. fault at xnjsmb_coord_invalidate_subtree().
Thinker K.F. Li <thinker@codemud.net>
parents:
1415
diff
changeset
|
297 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
|
298 |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
299 return cloning; |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
300 } |
0afd598a0b30
Add clone_from_subtree() for coord object of nodejs
Thinker K.F. Li <thinker@codemud.net>
parents:
1056
diff
changeset
|
301 |
749
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
302 static void |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 |
749
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 coord_show(coord); |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
312 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
|
313 } |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
314 |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
315 static void |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
316 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
|
317 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
|
318 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
|
319 |
749
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
320 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
|
321 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
|
322 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
|
323 |
1423
d82a828e8e26
Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents:
1416
diff
changeset
|
324 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
|
325 coord_hide(coord); |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
326 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
|
327 } |
ed59e659a202
Implement binding for hide/show for shapes and coords
Thinker K.F. Li <thinker@codemud.net>
parents:
748
diff
changeset
|
328 |
810
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
329 static void |
829
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
330 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
|
331 { |
810
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
332 Handle<Object> js_rt; |
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
333 redraw_man_t *rdman; |
829
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
334 |
810
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
335 js_rt = GET(self, "mbrt")->ToObject(); |
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
336 ASSERT(js_rt != NULL); |
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
337 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
|
338 |
1423
d82a828e8e26
Optimize the performance. If properties is not changed, we don't call rdman_coord_changed.
wycc
parents:
1416
diff
changeset
|
339 if (coord_get_opacity(coord) == value->NumberValue()) return; |
829
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
340 |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
341 coord_set_opacity(coord, value->NumberValue()); |
810
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
342 rdman_coord_changed(rdman, coord); |
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
343 } |
84853c8559cf
Support opacity on coords
Thinker K.F. Li <thinker@codemud.net>
parents:
778
diff
changeset
|
344 |
829
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
345 static Handle<Value> |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
346 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
|
347 const char **err) { |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
348 float opacity; |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
349 |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
350 opacity = coord_get_opacity(coord); |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
351 return Number::New(opacity); |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
352 } |
379fd510ba38
Define accessor for the opacity attribute of the coord
wycc
parents:
822
diff
changeset
|
353 |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
354 #define COORD_NEXT_SIBLING(child) STAILQ_NEXT(coord_t, sibling, (child)) |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
355 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
356 static mb_obj_t * |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
357 _coord_get_nth_child_member(coord_t *coord, int idx) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
358 geo_t *geo; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
359 coord_t *child; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
360 int member_idx = 0; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
361 int cnt = 0; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
362 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
363 child = STAILQ_HEAD(coord->children); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
364 FOR_COORD_MEMBERS(coord, geo) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
365 while(child != NULL && child->before_pmem == member_idx) { |
1454
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
366 if(cnt == idx) |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
367 return (mb_obj_t *)child; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
368 cnt++; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
369 child = COORD_NEXT_SIBLING(child); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
370 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
371 |
1454
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
372 if(cnt == idx) |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
373 return (mb_obj_t *)geo->shape; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
374 cnt++; |
1454
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
375 member_idx++; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
376 } |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
377 |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
378 while(child != NULL) { |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
379 if(cnt == idx) |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
380 return (mb_obj_t *)child; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
381 cnt++; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
382 child = COORD_NEXT_SIBLING(child); |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
383 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
384 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
385 return NULL; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
386 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
387 |
1454
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
388 static int |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
389 xnjsmb_coord_num_children(coord_t *coord, Handle<Object> self) { |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
390 int children_n_member_total; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
391 int children_cnt; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
392 coord_t *child; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
393 |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
394 children_cnt = 0; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
395 FOR_COORD_CHILDREN(coord, child) { |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
396 children_cnt++; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
397 } |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
398 children_n_member_total = coord->num_members + children_cnt; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
399 |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
400 return children_n_member_total; |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
401 } |
e22df2f3bffe
Provide number of children for coords
Thinker K.F. Li <thinker@codemud.net>
parents:
1453
diff
changeset
|
402 |
1453
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
403 static Handle<Value> xnjsmb_auto_coord_new(coord_t *data); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
404 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
405 static Handle<Value> |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
406 _mb_obj_to_value(Handle<Object> parent, mb_obj_t *mbobj) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
407 Handle<Value> val; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
408 Handle<Object> obj; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
409 Handle<Value> mbrt; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
410 Handle<Object> mbrt_o; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
411 Persistent<Object> *hdl; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
412 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
413 hdl = (Persistent<Object> *)mb_prop_get(&mbobj->props, |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
414 PROP_JSOBJ); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
415 if(hdl) |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
416 return *hdl; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
417 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
418 switch(mbobj->obj_type) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
419 case MBO_COORD: |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
420 val = xnjsmb_auto_coord_new((coord_t *)mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
421 break; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
422 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
423 case MBO_PATH: |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
424 val = xnjsmb_auto_path_new((shape_t *)mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
425 break; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
426 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
427 case MBO_RECT: |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
428 val = xnjsmb_auto_rect_new((shape_t *)mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
429 break; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
430 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
431 case MBO_IMAGE: |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
432 val = xnjsmb_auto_image_new((shape_t *)mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
433 break; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
434 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
435 case MBO_STEXT: |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
436 val = xnjsmb_auto_stext_new((shape_t *)mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
437 break; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
438 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
439 ASSERT(val != NULL); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
440 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
441 mbrt = GET(parent, "mbrt"); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
442 obj = val->ToObject(); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
443 mbrt_o = mbrt->ToObject(); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
444 SET(obj, "mbrt", mbrt_o); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
445 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
446 return val; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
447 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
448 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
449 static Handle<Value> |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
450 xnjsmb_coord_get_child(coord_t *coord, Handle<Object> self, |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
451 int idx, const char **err) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
452 Handle<Value> child; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
453 mb_obj_t *child_mbobj; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
454 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
455 child_mbobj = _coord_get_nth_child_member(coord, idx); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
456 if(child_mbobj == NULL) { |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
457 *err = "invalid index value for children"; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
458 return Handle<Value>(NULL); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
459 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
460 child = _mb_obj_to_value(self, child_mbobj); |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
461 |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
462 return child; |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
463 } |
0cb89e204824
Implement tree-traveling for JS
Thinker K.F. Li <thinker@codemud.net>
parents:
1451
diff
changeset
|
464 |
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
|
465 #include "coord-inc.h" |
562
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
466 |
684
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
467 /*! \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
|
468 */ |
666
b6fb543d69ee
Use binding generator to implement mb_rt
Thinker K.F. Li <thinker@branda.to>
parents:
661
diff
changeset
|
469 Handle<Value> export_xnjsmb_auto_coord_new(coord_t *coord) { |
695 | 470 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
|
471 } |
b6fb543d69ee
Use binding generator to implement mb_rt
Thinker K.F. Li <thinker@branda.to>
parents:
661
diff
changeset
|
472 |
562
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
473 /*! \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
|
474 * |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
475 * \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
|
476 * |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
477 * 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
|
478 * Javascript. |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
479 */ |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
480 void |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
481 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
|
482 redraw_man_t *rdman; |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
483 coord_t *root; |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
484 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
|
485 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
|
486 |
90c7726bc953
Replace part code of coord.cc by the code generated by generator
Thinker K.F. Li <thinker@branda.to>
parents:
566
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 } |
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
810
diff
changeset
|
491 |
562
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
492 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
|
493 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
|
494 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
|
495 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
|
496 |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
497 SET(js_rt, "root", obj); |
1b6402f07cd4
Make root coord availabe for Javascript code
Thinker K.F. Li <thinker@branda.to>
parents:
560
diff
changeset
|
498 } |
684
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
499 |
b346e4699e55
Add more comment for JS binding
Thinker K.F. Li <thinker@branda.to>
parents:
680
diff
changeset
|
500 /* @} */ |