DrawableContext *LASeR_drawable_init_context(Drawable *node, RenderEffect2D *eff) { DrawableContext *ctx; u32 i; Bool skipFill = 0; assert(eff->surface); if (!Node_GetActive(node->owner)) return NULL; /*switched-off geometry nodes are not rendered*/ if (eff->trav_flags & TF_SWITCHED_OFF) return NULL; //Get a empty context from the current surface ctx = VS2D_GetDrawableContext(eff->surface); mx2d_copy(ctx->transform, eff->transform); if (Node_GetTag(node->owner) == TAG_LASeRText) { ctx->transform.m[0] = 1; ctx->transform.m[4] = 1; ctx->transform.m[1] = 0; ctx->transform.m[3] = 0; } ctx->node = node; if (eff->invalidate_all || node->node_changed) ctx->redraw_flags |= CTX_NODE_DIRTY; ctx->h_texture = NULL; /* if (eff->appear) { ctx->appear = eff->appear; if (Node_GetDirty(eff->appear)) ctx->redraw_flags |= CTX_APP_DIRTY; } */ #ifndef FIXME /*todo cliper*/ #else else {
static void RenderLayer2D(GF_Node *node, void *rs, Bool is_destroy) { u32 i; GF_List *prevback, *prevviews; GF_Rect clip; M_Viewport *vp; ChildGroup2D *cg; GF_Matrix2D gf_mx2d_bck; GroupingNode2D *parent_bck; DrawableContext *back_ctx; Bool bool_bck; DrawableContext *ctx; M_Background2D *back; M_Layer2D *l = (M_Layer2D *)node; Layer2DStack *l2D = (Layer2DStack *) gf_node_get_private(node); RenderEffect2D *eff; if (is_destroy) { DeleteGroupingNode2D((GroupingNode2D *)l2D); gf_list_del(l2D->backs); gf_list_del(l2D->views); free(l2D); return; } eff = (RenderEffect2D *) rs; gf_mx2d_copy(gf_mx2d_bck, eff->transform); parent_bck = eff->parent; eff->parent = (GroupingNode2D *) l2D; gf_mx2d_init(eff->transform); bool_bck = eff->draw_background; prevback = eff->back_stack; prevviews = eff->view_stack; eff->back_stack = l2D->backs; eff->view_stack = l2D->views; if (l2D->first) { /*render on back first to register with stack*/ if (l->background) { eff->draw_background = 0; gf_node_render((GF_Node*) l->background, eff); group2d_reset_children((GroupingNode2D*) l2D); eff->draw_background = 1; } vp = (M_Viewport*)l->viewport; if (vp) { gf_list_add(l2D->views, vp); if (!vp->isBound) { vp->isBound = 1; gf_node_event_out_str((GF_Node*)vp, "isBound"); } } } back = NULL; if (gf_list_count(l2D->backs) ) { back = (M_Background2D*)gf_list_get(l2D->backs, 0); if (!back->isBound) back = NULL; } vp = NULL; if (gf_list_count(l2D->views)) { vp = (M_Viewport*)gf_list_get(l2D->views, 0); if (!vp->isBound) vp = NULL; } if (!eff->is_pixel_metrics) gf_mx2d_add_scale(&eff->transform, eff->min_hsize, eff->min_hsize); l2D->clip = R2D_ClipperToPixelMetrics(eff, l->size); /*apply viewport*/ if (vp) { clip = l2D->clip; vp_setup((GF_Node *) vp, eff, &clip); } back_ctx = NULL; if (back) { /*setup back size and render*/ group2d_start_child((GroupingNode2D *)l2D); eff->draw_background = 1; ctx = b2D_GetContext(back, l2D->backs); ctx->bi->unclip = l2D->clip; ctx->bi->clip = gf_rect_pixelize(&ctx->bi->unclip); gf_mx2d_init(ctx->transform); gf_node_render((GF_Node *) back, eff); eff->draw_background = 0; /*we need a trick since we're not using a dedicated surface for layer rendering, we emulate the back context: remove previous context and insert fake one*/ if (!(eff->trav_flags & TF_RENDER_DIRECT) && (gf_list_count(l2D->groups)==1)) { ChildGroup2D *cg = (ChildGroup2D *)gf_list_get(l2D->groups, 0); back_ctx = VS2D_GetDrawableContext(eff->surface); gf_list_rem(cg->contexts, 0); gf_list_add(cg->contexts, back_ctx); back_ctx->h_texture = ctx->h_texture; back_ctx->flags = ctx->flags; back_ctx->flags &= ~CTX_IS_TRANSPARENT; back_ctx->flags |= CTX_IS_BACKGROUND; back_ctx->aspect = ctx->aspect; back_ctx->drawable = ctx->drawable; drawable_check_bounds(back_ctx, eff->surface); back_ctx->bi->clip = ctx->bi->clip; back_ctx->bi->unclip = ctx->bi->unclip; } group2d_end_child((GroupingNode2D *)l2D); } group2d_traverse((GroupingNode2D *)l2D, l->children, eff); /*restore effect*/ eff->draw_background = bool_bck; gf_mx2d_copy(eff->transform, gf_mx2d_bck); eff->parent = parent_bck; eff->back_stack = prevback; eff->view_stack = prevviews; /*check bindables*/ if (l2D->first) { Bool redraw = 0; l2D->first = 0; if (!back && gf_list_count(l2D->backs)) redraw = 1; if (!vp && gf_list_count(l2D->views) ) redraw = 1; /*we missed background or viewport (was not declared as bound during traversal, and is bound now)*/ if (redraw) { group2d_reset_children((GroupingNode2D*)l2D); gf_sr_invalidate(l2D->compositor, NULL); return; } } i=0; while ((cg = (ChildGroup2D *)gf_list_enum(l2D->groups, &i))) { child2d_render_done(cg, eff, &l2D->clip); } group2d_reset_children((GroupingNode2D*)l2D); group2d_force_bounds(eff->parent, &l2D->clip); }
DrawableContext *drawable_init_context(Drawable *node, RenderEffect2D *eff) { DrawableContext *ctx; u32 i; Bool skipFill; assert(eff->surface); /*switched-off geometry nodes are not rendered*/ if (eff->trav_flags & TF_SWITCHED_OFF) return NULL; //Get a empty context from the current surface ctx = VS2D_GetDrawableContext(eff->surface); mx2d_copy(ctx->transform, eff->transform); ctx->node = node; if (eff->invalidate_all || node->node_changed) ctx->redraw_flags |= CTX_NODE_DIRTY; ctx->h_texture = NULL; if (eff->appear) { ctx->appear = eff->appear; if (Node_GetDirty(eff->appear)) ctx->redraw_flags |= CTX_APP_DIRTY; } #ifndef FIXME /*todo cliper*/ #else else { VS2D_RemoveLastContext(eff->surface); return NULL; } #endif /*FIXME - only needed for texture*/ cmat_copy(&ctx->cmat, &eff->color_mat); /*IndexedLineSet2D and PointSet2D ignores fill flag and texturing*/ skipFill = 0; ctx->h_texture = NULL; switch (Node_GetTag(ctx->node->owner) ) { case TAG_MPEG4_IndexedLineSet2D: skipFill = 1; break; case TAG_MPEG4_PointSet2D: skipFill = 1; break; default: ctx->h_texture = drawable_get_texture(eff); break; } /*setup sensors*/ for (i=0; i<ChainGetCount(eff->sensors); i++) drawctx_add_sensor(ctx, ChainGetEntry(eff->sensors, i)); setup_drawable_context(ctx, eff); /*Update texture info - draw even if texture not created (this may happen if the media is removed)*/ if (ctx->h_texture && ctx->h_texture->needs_refresh) ctx->redraw_flags |= CTX_TEXTURE_DIRTY; /*not clear in the spec: what happens when a transparent node is in form/layout ?? this may completely break layout of children. We consider the node should be drawn*/ if (!eff->parent && check_transparent_skip(ctx, skipFill)) { VS2D_RemoveLastContext(eff->surface); return NULL; } //setup clipper if needed return ctx; }