version 2.8
list.c
1 #include "zgl.h"
2 
3 static char *op_table_str[]=
4 {
5 #define ADD_OP(a,b,c) "gl" #a " " #c,
6 
7 #include "opinfo.h"
8 };
9 
10 static void (*op_table_func[])(GLContext *,GLParam *)=
11 {
12 #define ADD_OP(a,b,c) glop ## a ,
13 
14 #include "opinfo.h"
15 };
16 
17 static int op_table_size[]=
18 {
19 #define ADD_OP(a,b,c) b + 1 ,
20 
21 #include "opinfo.h"
22 };
23 
24 
25 GLContext *gl_get_context(void)
26 {
27  return gl_ctx;
28 }
29 
30 static GLList *find_list(GLContext *c,unsigned int list)
31 {
32  return c->shared_state.lists[list];
33 }
34 
35 static void delete_list(GLContext *c,int list)
36 {
37  GLParamBuffer *pb,*pb1;
38  GLList *l;
39 
40  l=find_list(c,list);
41  gl_assert(l != NULL);
42 
43  /* free param buffer */
44  pb=l->first_op_buffer;
45  while (pb!=NULL) {
46  pb1=pb->next;
47  gl_free(pb);
48  pb=pb1;
49  }
50 
51  gl_free(l);
52  c->shared_state.lists[list]=NULL;
53 }
54 
55 static GLList *alloc_list(GLContext *c,int list)
56 {
57  GLList *l;
58  GLParamBuffer *ob;
59 
60  l=gl_zalloc(sizeof(GLList));
61  ob=gl_zalloc(sizeof(GLParamBuffer));
62 
63  ob->next=NULL;
64  l->first_op_buffer=ob;
65 
66  ob->ops[0].op=OP_EndList;
67 
68  c->shared_state.lists[list]=l;
69  return l;
70 }
71 
72 
73 #ifndef NO_STDIO
74 void gl_print_op(FILE *f,GLParam *p)
75 {
76  int op;
77  char *s;
78 
79  op=p[0].op;
80  p++;
81  s=op_table_str[op];
82  while (*s != 0) {
83  if (*s == '%') {
84  s++;
85  switch (*s++) {
86  case 'f':
87  fprintf(f,"%g",p[0].f);
88  break;
89  default:
90  fprintf(f,"%d",p[0].i);
91  break;
92  }
93  p++;
94  } else {
95  fputc(*s,f);
96  s++;
97  }
98  }
99  fprintf(f,"\n");
100 }
101 #endif
102 
103 
104 void gl_compile_op(GLContext *c,GLParam *p)
105 {
106  int op,op_size;
107  GLParamBuffer *ob,*ob1;
108  int index,i;
109 
110  op=p[0].op;
111  op_size=op_table_size[op];
112  index=c->current_op_buffer_index;
113  ob=c->current_op_buffer;
114 
115  /* we should be able to add a NextBuffer opcode */
116  if ((index + op_size) > (OP_BUFFER_MAX_SIZE-2)) {
117 
118  ob1=gl_zalloc(sizeof(GLParamBuffer));
119  ob1->next=NULL;
120 
121  ob->next=ob1;
122  ob->ops[index].op=OP_NextBuffer;
123  ob->ops[index+1].p=(void *)ob1;
124 
125  c->current_op_buffer=ob1;
126  ob=ob1;
127  index=0;
128  }
129 
130  for(i=0;i<op_size;i++) {
131  ob->ops[index]=p[i];
132  index++;
133  }
134  c->current_op_buffer_index=index;
135 }
136 
137 void gl_add_op(GLParam *p)
138 {
139  GLContext *c=gl_get_context();
140  int op;
141 
142  op=p[0].op;
143  if (c->exec_flag) {
144  op_table_func[op](c,p);
145  }
146  if (c->compile_flag) {
147  gl_compile_op(c,p);
148  }
149 #ifndef NO_CLIBRARY
150  if (c->print_flag) {
151  gl_print_op(stderr,p);
152  }
153 #endif
154 }
155 
156 /* this opcode is never called directly */
157 void glopEndList(GLContext *c,GLParam *p)
158 {
159  (void) c;
160  (void) p;
161  gl_assert(0);
162 }
163 
164 /* this opcode is never called directly */
165 void glopNextBuffer(GLContext *c,GLParam *p)
166 {
167  (void) c;
168  (void) p;
169  gl_assert(0);
170 }
171 
172 
173 void glopCallList(GLContext *c,GLParam *p)
174 {
175  GLList *l;
176  int list,op;
177 
178  list=p[1].ui;
179  l=find_list(c,list);
180  if (l == NULL) gl_fatal_error("list %d not defined",list);
181  p=l->first_op_buffer->ops;
182 
183  while (1) {
184  op=p[0].op;
185  if (op == OP_EndList) break;
186  if (op == OP_NextBuffer) {
187  p=(GLParam *)p[1].p;
188  } else {
189  op_table_func[op](c,p);
190  p+=op_table_size[op];
191  }
192  }
193 }
194 
195 
196 
197 void glNewList(unsigned int list,int mode)
198 {
199  GLList *l;
200  GLContext *c=gl_get_context();
201 
202  gl_assert(mode == GL_COMPILE || mode == GL_COMPILE_AND_EXECUTE);
203  gl_assert(c->compile_flag == 0);
204 
205  l=find_list(c,list);
206  if (l!=NULL) delete_list(c,list);
207  l=alloc_list(c,list);
208 
209  c->current_op_buffer=l->first_op_buffer;
210  c->current_op_buffer_index=0;
211 
212  c->compile_flag=1;
213  c->exec_flag=(mode == GL_COMPILE_AND_EXECUTE);
214 }
215 
216 void glEndList(void)
217 {
218  GLContext *c=gl_get_context();
219  GLParam p[1];
220 
221  gl_assert(c->compile_flag == 1);
222 
223  /* end of list */
224  p[0].op=OP_EndList;
225  gl_compile_op(c,p);
226 
227  c->compile_flag=0;
228  c->exec_flag=1;
229 }
230 
231 int glIsList(unsigned int list)
232 {
233  GLContext *c=gl_get_context();
234  GLList *l;
235  l=find_list(c,list);
236  return (l != NULL);
237 }
238 
239 unsigned int glGenLists(int range)
240 {
241  GLContext *c=gl_get_context();
242  int count,i,list;
243  GLList **lists;
244 
245  lists=c->shared_state.lists;
246  count=0;
247  for(i=0;i<MAX_DISPLAY_LISTS;i++) {
248  if (lists[i]==NULL) {
249  count++;
250  if (count == range) {
251  list=i-range+1;
252  for(i=0;i<range;i++) {
253  alloc_list(c,list+i);
254  }
255  return list;
256  }
257  } else {
258  count=0;
259  }
260  }
261  return 0;
262 }
263