annotate src/sprite.c @ 872:bcc63b20d5c6

mbapp.js support to create an application with existed window
author Thinker K.F. Li <thinker@codemud.net>
date Fri, 24 Sep 2010 16:00:04 +0800
parents 586e50f82c1f
children 2cbe3721dc9a
rev   line source
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
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: 453
diff changeset
2 // vim: sw=4:ts=8:sts=4
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
3 #include <stdio.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
4 #include <stdlib.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
5 #include <string.h>
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 399
diff changeset
6 #include "mb_graph_engine.h"
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
7 #include <dlfcn.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
8 #include <sys/stat.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
9 #include "mb_types.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
10 #include "mb_shapes.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
11 #include "mb_tools.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
12 #include "mb_redraw_man.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
13 #include "mb_observer.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
14 #include "mb_prop.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
15
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
16 #define ASSERT(x)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
17 #define OK 0
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
18 #define ERR 1
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
19
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
20 static char *sprite_search_path = NULL;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
21
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
22 static char *sprite_search_so(const char *name) {
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
23 struct stat st;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
24 int fsz;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
25 char *fullname;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
26 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
27
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
28 if(sprite_search_path == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
29 sprite_search_path = strdup("/usr/share/madbutterffly");
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
30
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
31 fsz = strlen(sprite_search_path) + strlen(name) + 5;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
32 fullname = (char *)malloc(fsz);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
33
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
34 snprintf(fullname, fsz, "%s/%s.so", sprite_search_path, name);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
35 r = stat(fullname, &st);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
36 if(r != 0) {
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
37 free(fullname);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
38 return NULL;
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
39 }
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
40
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
41 return fullname;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
42 }
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
43
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
44 void sprite_set_search_path(char *path) {
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
45 int sz;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
46
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
47 if (sprite_search_path)
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
48 free(sprite_search_path);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
49
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
50 sprite_search_path = strdup(path);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
51
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
52 sz = strlen(sprite_search_path);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
53 if(sprite_search_path[sz - 1] == '/')
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
54 sprite_search_path[sz - 1] = 0;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
55 }
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
56
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
57 mb_sprite_t *
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
58 sprite_load(const char *name, redraw_man_t *rdman, coord_t *root) {
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
59 char cnstr_name[256];
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
60 char *so_path;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
61 const char *bname;
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
62 void *handle;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
63 mb_sprite_t *(*cnstr)(redraw_man_t *, coord_t *);
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
64 mb_sprite_t *obj;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
65 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
66
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
67 so_path = sprite_search_so(name);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
68 if(so_path == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
69 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
70
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
71 handle = dlopen(so_path, RTLD_LAZY);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
72 free(so_path);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
73 if (handle == NULL)
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
74 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
75
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
76 bname = strrchr(name, '/');
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
77 if(bname != NULL && strlen(bname) > 250)
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
78 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
79
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
80 if(bname == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
81 bname = name;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
82 else
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
83 bname++;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
84
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
85 snprintf(cnstr_name, sizeof(cnstr_name), "%s_new", bname);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
86 cnstr = dlsym(handle, cnstr_name);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
87 if (cnstr == NULL)
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
88 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
89
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
90 obj = cnstr(rdman, root);
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
91
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
92 return obj;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
93 }