static void DestroyViewStack(GF_Node *node) { ViewStack *st = (ViewStack *) gf_node_get_private(node); PreDestroyBindable(node, st->reg_stacks); gf_list_del(st->reg_stacks); VPCHANGED(gf_sc_get_compositor(node)); gf_free(st); }
static void viewport_set_bind(GF_Node *node, GF_Route *route) { GF_Compositor *rend = gf_sc_get_compositor(node); ViewStack *st = (ViewStack *) gf_node_get_private(node); Bindable_OnSetBind(node, st->reg_stacks, NULL); gf_sc_invalidate(rend, NULL); /*notify change of vp stack*/ VPCHANGED(rend); /*and dirty ourselves to force frustrum update*/ gf_node_dirty_set(node, 0, 0); }
void group_2d_destroy_svg(GF_Node *node, GroupingNode2D *group) { #ifdef GF_SR_USE_VIDEO_CACHE GF_Compositor *compositor = gf_sc_get_compositor(node); if (gf_cache_remove_entry(compositor, node, group)) { /*simulate a zoom changed for cache recompute*/ compositor->zoom_changed = 1; compositor->draw_next_frame = 1; } if (group->cache) group_cache_del(group->cache); #endif }
void Bindable_OnSetBind(GF_Node *bindable, GF_List *stack_list, GF_List *for_stack) { u32 i; Bool on_top, is_bound, set_bind; GF_Node *node; GF_List *stack; set_bind = Bindable_GetSetBind(bindable); is_bound = Bindable_GetIsBound(bindable); if (!set_bind && !is_bound) return; if (set_bind && is_bound) return; i=0; while ((stack = (GF_List*)gf_list_enum(stack_list, &i))) { if (for_stack && (for_stack!=stack)) continue; on_top = (gf_list_get(stack, 0)==bindable) ? GF_TRUE : GF_FALSE; if (!set_bind) { if (is_bound) Bindable_SetIsBound(bindable, GF_FALSE); if (on_top && (gf_list_count(stack)>1)) { gf_list_rem(stack, 0); gf_list_add(stack, bindable); node = (GF_Node*)gf_list_get(stack, 0); Bindable_SetIsBound(node, GF_TRUE); } } else { if (!is_bound) Bindable_SetIsBound(bindable, GF_TRUE); if (!on_top) { /*push old top one down and unbind*/ node = (GF_Node*)gf_list_get(stack, 0); Bindable_SetIsBound(node, GF_FALSE); /*insert new top*/ gf_list_del_item(stack, bindable); gf_list_insert(stack, bindable, 0); } } } /*force invalidate of the bindable stack's owner*/ gf_node_dirty_set(bindable, 0, GF_TRUE); /*and redraw scene*/ gf_sc_invalidate(gf_sc_get_compositor(bindable), NULL); }
static void mpeg4_sensor_deleted(GF_Node *node, GF_SensorHandler *hdl) { GF_Compositor *compositor = gf_sc_get_compositor(node); if (compositor) { GF_VisualManager *visual; u32 i=0; gf_list_del_item(compositor->sensors, hdl); gf_list_del_item(compositor->previous_sensors, hdl); if (compositor->interaction_sensors) compositor->interaction_sensors--; while ( (visual=gf_list_enum(compositor->visuals, &i)) ) { if (visual->offscreen) compositor_compositetexture_sensor_delete(visual->offscreen, hdl); } #ifndef GPAC_DISABLE_SVG gf_sg_unregister_event_type(gf_node_get_graph(node), GF_DOM_EVENT_MOUSE|GF_DOM_EVENT_KEY); #endif } }
static void fog_set_bind(GF_Node *node, GF_Route *route) { ViewStack *st = (ViewStack *) gf_node_get_private(node); Bindable_OnSetBind(node, st->reg_stacks, NULL); gf_sc_invalidate(gf_sc_get_compositor(node), NULL); }
static void Text_Traverse(GF_Node *n, void *rs, Bool is_destroy) { DrawableContext *ctx; M_Text *txt = (M_Text *) n; TextStack *st = (TextStack *) gf_node_get_private(n); GF_TraverseState *tr_state = (GF_TraverseState *)rs; if (is_destroy) { text_clean_paths(gf_sc_get_compositor(n), st); drawable_del(st->graph); gf_list_del(st->spans); gf_free(st); return; } if (!txt->string.count) return; if (tr_state->text_split_mode) { gf_node_dirty_clear(n, 0); text_clean_paths(tr_state->visual->compositor, st); build_text_split(st, txt, tr_state); return; } text_check_changes(n, st, tr_state); switch (tr_state->traversing_mode) { case TRAVERSE_DRAW_2D: text_draw_2d(n, tr_state); return; #ifndef GPAC_DISABLE_3D case TRAVERSE_DRAW_3D: text_draw_3d(tr_state, n, st); return; #endif case TRAVERSE_PICK: tr_state->text_parent = n; gf_font_spans_pick(n, st->spans, tr_state, &st->bounds, 0, NULL); tr_state->text_parent = NULL; return; case TRAVERSE_GET_BOUNDS: tr_state->bounds = st->bounds; return; case TRAVERSE_GET_TEXT: tr_state->text_parent = n; gf_font_spans_get_selection(n, st->spans, tr_state); tr_state->text_parent = NULL; return; case TRAVERSE_SORT: break; default: return; } #ifndef GPAC_DISABLE_3D if (tr_state->visual->type_3d) return; #endif ctx = drawable_init_context_mpeg4(st->graph, tr_state); if (!ctx) return; ctx->sub_path_index = tr_state->text_split_idx; ctx->flags |= CTX_IS_TEXT; if (!GF_COL_A(ctx->aspect.fill_color)) { /*override line join*/ ctx->aspect.pen_props.join = GF_LINE_JOIN_MITER; ctx->aspect.pen_props.cap = GF_LINE_CAP_FLAT; } /*if text selection mode, we must force redraw of the entire text span because we don't if glyphs have been (un)selected*/ if (!tr_state->immediate_draw && /*text selection on*/ (tr_state->visual->compositor->text_selection /*text sel release*/ || (tr_state->visual->compositor->store_text_state==GF_SC_TSEL_RELEASED)) ) { GF_TextSpan *span; u32 i = 0; Bool unselect = (tr_state->visual->compositor->store_text_state==GF_SC_TSEL_RELEASED) ? 1 : 0; while ((span = gf_list_enum(st->spans, &i))) { if (span->flags & GF_TEXT_SPAN_SELECTED) { if (unselect) span->flags &= ~GF_TEXT_SPAN_SELECTED; ctx->flags |= CTX_APP_DIRTY; } } } if (ctx->sub_path_index) { GF_TextSpan *span = (GF_TextSpan *)gf_list_get(st->spans, ctx->sub_path_index-1); if (span) drawable_finalize_sort(ctx, tr_state, &span->bounds); } else { drawable_finalize_sort(ctx, tr_state, &st->bounds); } }