annotate nodejs/coord.cc @ 1491:06c101bba830

Hint user to select transition target
author Thinker K.F. Li <thinker@codemud.net>
date Sun, 01 May 2011 00:09:56 +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
ef3908d9a3d2 Revert 4be04f29fa70
Thinker K.F. Li <thinker@codemud.net>
parents: 1434
diff changeset
18
743
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
19 #define OK 0
dd1f3382d6a4 Create a persistent handle for coords and shapes correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 742
diff changeset
20
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
763a4e2bbd85 Return the value of ojbject to fix the crash issue
wycc
parents: 684
diff changeset
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 /* @} */