DrawableContext *visual_2d_get_drawable_context(GF_VisualManager *visual) { #ifdef SKIP_CONTEXT return NULL; #endif if (!visual->context) { visual->context = NewDrawableContext(); visual->cur_context = visual->context; drawctx_reset(visual->context); visual->num_nodes_current_frame ++; return visual->context; } // assert(visual->cur_context); /*current context is OK*/ if (!visual->cur_context->drawable) { /*reset next context in display list for next call*/ if (visual->cur_context->next) visual->cur_context->next->drawable = NULL; drawctx_reset(visual->cur_context); return visual->cur_context; } /*need a new context and next one is OK*/ if (visual->cur_context->next) { visual->cur_context = visual->cur_context->next; // assert(visual->cur_context->drawable == NULL); /*reset next context in display list for next call*/ if (visual->cur_context->next) visual->cur_context->next->drawable = NULL; drawctx_reset(visual->cur_context); visual->num_nodes_current_frame ++; return visual->cur_context; } /*need to create a new context*/ visual->cur_context->next = NewDrawableContext(); visual->cur_context = visual->cur_context->next; drawctx_reset(visual->cur_context); visual->num_nodes_current_frame ++; //pre-allocate some contexts #if 0 { u32 i; DrawableContext *last = visual->cur_context; for (i=0; i<50; i++) { last->next = gf_malloc(sizeof(DrawableContext)); last = last->next; last->drawable = NULL; last->col_mat = NULL; } last->next = NULL; } #endif return visual->cur_context; }
DrawableContext *VS2D_GetDrawableContext(VisualSurface2D *surf) { u32 i; if (surf->alloc_contexts==surf->num_contexts) { surf->alloc_contexts += CONTEXT_ALLOC_STEP; surf->contexts = (DrawableContext **) realloc(surf->contexts, surf->alloc_contexts * sizeof(DrawableContext *) ); for (i=surf->num_contexts; i<surf->alloc_contexts; i++) surf->contexts[i] = NewDrawableContext(); surf->nodes_to_draw = realloc(surf->nodes_to_draw, surf->alloc_contexts * sizeof(u32)); } i = surf->num_contexts; surf->num_contexts++; drawctx_reset(surf->contexts[i]); surf->contexts[i]->surface = surf; return surf->contexts[i]; }
void DeleteDrawableContext(DrawableContext *ctx) { drawctx_reset(ctx); if (ctx->sensors) DeleteChain(ctx->sensors); free(ctx); }