annotate src/sprite.c @ 1434:4be04f29fa70

Add functions to search for the text recursively inside coord_t tree. Once we find the first instance, we change the text of it. We need to think about how to manage the multiple segment texts, which is composed of several tspan.
author wycc
date Mon, 11 Apr 2011 12:52:09 +0800
parents 8679b03f72e8
children
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>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
6 #include <dlfcn.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
7 #include <sys/stat.h>
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
8 #include "mb_types.h"
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
9 #include "mb_redraw_man.h"
1051
8679b03f72e8 Move declaration about sprite to a separated header file.
Thinker K.F. Li <thinker@codemud.net>
parents: 992
diff changeset
10 #include "mb_sprite.h"
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
11
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
12 #define ASSERT(x)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
13 #define OK 0
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
14 #define ERR 1
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
15
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
16 static char *sprite_search_path = NULL;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
17
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
18 static char *sprite_search_so(const char *name) {
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
19 struct stat st;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
20 int fsz;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
21 char *fullname;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
22 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
23
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
24 if(sprite_search_path == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
25 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
26
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
27 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
28 fullname = (char *)malloc(fsz);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
29
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
30 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
31 r = stat(fullname, &st);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
32 if(r != 0) {
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
33 free(fullname);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
34 return NULL;
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
35 }
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
36
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
37 return fullname;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
38 }
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
39
992
2cbe3721dc9a Change signature of sprite_set_search_path()
Thinker K.F. Li <thinker@codemud.net>
parents: 822
diff changeset
40 void sprite_set_search_path(const char *path) {
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
41 int sz;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
42
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
43 if (sprite_search_path)
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
44 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
45
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
46 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
47
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
48 sz = strlen(sprite_search_path);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
49 if(sprite_search_path[sz - 1] == '/')
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
50 sprite_search_path[sz - 1] = 0;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
51 }
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
52
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
53 mb_sprite_t *
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
54 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
55 char cnstr_name[256];
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
56 char *so_path;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
57 const char *bname;
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
58 void *handle;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
59 mb_sprite_t *(*cnstr)(redraw_man_t *, coord_t *);
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
60 mb_sprite_t *obj;
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
61 int r;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
62
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
63 so_path = sprite_search_so(name);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
64 if(so_path == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
65 return NULL;
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 handle = dlopen(so_path, RTLD_LAZY);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
68 free(so_path);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
69 if (handle == NULL)
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
70 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
71
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
72 bname = strrchr(name, '/');
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
73 if(bname != NULL && strlen(bname) > 250)
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 if(bname == NULL)
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
77 bname = name;
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
78 else
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
79 bname++;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
80
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
81 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
82 cnstr = dlsym(handle, cnstr_name);
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
83 if (cnstr == NULL)
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
84 return NULL;
822
586e50f82c1f Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents: 453
diff changeset
85
453
84ce2d4a8c3f Change interface of sprite loader.
Thinker K.F. Li <thinker@branda.to>
parents: 452
diff changeset
86 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
87
452
cb10f3424f3a re-indent
Thinker K.F. Li <thinker@branda.to>
parents: 448
diff changeset
88 return obj;
228
25bc0e753b88 Add dynamic loading function
wycc
parents:
diff changeset
89 }