annotate dox/define_backend.h @ 1160:1a699dc00fa3

Fix the issue of not removing node in old scene when switching scenes. - When a timeline is playing and crossing two scenes (tween block), nodes, for the old scene, in duplicate group must be removed. But, it is not. - It is fixed by checking if nodes, in the duplicate group, are also in the key frame next to the new scene. All nodes that is not in next key frame are remove.
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 28 Dec 2010 13:35:34 +0800
parents 5dedeedf0408
children
rev   line source
443
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1 /*! \page backend How to Define a Backend
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2 *
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
3 * A backend is factory to initialize environment to make
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
4 * MadBufferfly available. A backend should provide resources
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
5 * needed by MadButterfly, for example, to provide a surface
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
6 * that will show everything drawing on it. It also translate and
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7 * relay input events, mouse or keyboard, to MadButterfly.
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
8 * The tasks that a backend should do are listed following,
934
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
9 * - tranlsate and relay mouse events to MadButterfly.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
10 * - to provide
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
11 * - *_MB_new()/*_MB_free function to create and free a runtime.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
12 * - prepare a backend surface,
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
13 * - prepare a front surface,
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
14 * - *_MB_kbevents() to return a subject, for keyboard
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
15 * events, associated with a runtime.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
16 * - translate and relay keyboard events to MadButterfly,
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
17 * - *_MB_tman() to return a timer manager associated with
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
18 * a runtime.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
19 * - to handle a timer, and relay timeout events to MadButterfly.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
20 * - *_MB_ob_factory() to return an observer factory.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
21 * - *_MB_img_ldr() to return an image loader.
443
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
22 *
934
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
23 * \section backend_mb_new_n_free *_MB_new()/*_MB_free()
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
24 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
25 * MadButterfly supposes that application programmers may create more
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
26 * than one instance of MadButterfly to draw mutliple windows for an
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
27 * application. So, we need you, backend developer, to provide a
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
28 * *_MB_new()/*_MB_free() to create/free an instance respective.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
29 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
30 * *_MB_new() should return an *_MB_runtime_t object to keep states of
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
31 * an instance. The definition of *_MB_runtime_t is up to backend
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
32 * developers.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
33 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
34 * For each *_MB_runtime_t, backend should create a redraw manager,
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
35 * a.k.a rdman, by calling malloc() and redraw_man_init(). For each
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
36 * rdman, you should give it one or two surfaces. Rdman draws shapes
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
37 * on first one, called 'cr' (should be changed), as an off-screen
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
38 * buffer and copy it to 2nd one, called 'backend' surface, as an
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
39 * on-screen buffer. For X, the 'backend' should be a window surface.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
40 * The reason of two surfaces are to prevent user from seeing
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
41 * intermediate result of drawing procedure. You can also pass a NULL
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
42 * pointer for 2nd surface if you dont care intermediate result, HW
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
43 * accelerator is fast enough, or with HW dobule buffering.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
44 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
45 * \section backend_kbevents Keyboard Events
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
46 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
47 * *_MB_kbevents() returns a subject (\see
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
48 * http://en.wikipedia.org/wiki/Observer_pattern). Applications want
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
49 * to receive keyboard events would register an observer on this
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
50 * subject. A backend should translate keyboard events for
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
51 * MadButterfly, and notify observers of this subject.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
52 * Subject-observer had implemented by MadBuffery.
443
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
53 *
934
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
54 * \section backend_timer Timer
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
55 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
56 * *_MB_tman() should return a timer manager, with type of mb_tman_t.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
57 * When an application want to get notified at some time later, it
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
58 * would register a callback with the mb_tman_t. A backend should
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
59 * call mb_tman_handle_timeout() at proper time. You can call
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
60 * mb_tman_next_timeout() to get the time to call
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
61 * mb_tman_handle_timeout() for next timeout. For nodejs or other
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
62 * binding that has their-owned timer, you can skip *_MB_tman(). But,
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
63 * C code need this one.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
64 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
65 * \section backend_obfactory Observer Factory
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
66 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
67 * *_MB_ob_factory() returns an observer factory, ob_factory_t. It is
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
68 * reponsible for creation of observers. Applications call observer
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
69 * to allocate and free observers and subjects. ob_factory_t is
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
70 * defined in mb_observer.h, there are 5 function pointers in it. You
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
71 * can use functions of default implementation instead of new ones.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
72 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
73 * \section backend_img_ldr Image Loader
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
74 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
75 * *_MB_img_ldr() returns an image loader, mb_img_ldr_t. A backend
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
76 * developer can use the default implementation. He can also
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
77 * implement a new one, but it should implement the interface defined
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
78 * by mb_img_ldr_t and mb_img_data_t.
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
79 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
80 * \section backend_mouse_events Mouse Events
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
81 *
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
82 * A backend should also translate and relay mouse events to
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
83 * MadButterfly. The mouse events should be dispatched by notifing
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
84 * observers of the subject of a coord or shape of an rdman. The
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
85 * backend developers can check handle_single_x_event() in X_supp.c
5dedeedf0408 Change page of "How to Defaine a Backend"
Thinker K.F. Li <thinker@codemud.net>
parents: 443
diff changeset
86 * for how to dispatch mouse events.
443
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
87 *
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
88 * \see X_supp.c
1f900a67bd38 Doc How to Define a Backend
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
89 */