Mercurial > MadButterfly
annotate nodejs/coord.cc @ 1532:4a92b639a1cd
Clear selection set when switching current scene.
To clear selection set after switching away from current to another scene.
It avoids Inkscape select on nodes they are not saw after switching.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Fri, 30 Sep 2011 12:31:33 +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 /* @} */ |