/*ColorTransform*/ static void TraverseColorTransform(GF_Node *node, void *rs, Bool is_destroy) { Bool c_changed; M_ColorTransform *tr = (M_ColorTransform *)node; ColorTransformStack *ptr = (ColorTransformStack *)gf_node_get_private(node); GF_TraverseState *tr_state = (GF_TraverseState *) rs; Bool prev_inv; if (is_destroy) { gf_sc_check_focus_upon_destroy(node); group_2d_destroy(node, (GroupingNode2D*)ptr); gf_free(ptr); return; } if (tr_state->traversing_mode==TRAVERSE_GET_BOUNDS) { group_2d_traverse(node, (GroupingNode2D *) ptr, tr_state); return; } prev_inv = tr_state->invalidate_all; c_changed = 0; if (gf_node_dirty_get(node) & GF_SG_NODE_DIRTY) { gf_cmx_set(&ptr->cmat, tr->mrr , tr->mrg, tr->mrb, tr->mra, tr->tr, tr->mgr , tr->mgg, tr->mgb, tr->mga, tr->tg, tr->mbr, tr->mbg, tr->mbb, tr->mba, tr->tb, tr->mar, tr->mag, tr->mab, tr->maa, tr->ta); c_changed = 1; gf_node_dirty_clear(node, GF_SG_NODE_DIRTY); } if ((tr_state->traversing_mode==TRAVERSE_SORT) && !tr->maa && !tr->mar && !tr->mag && !tr->mab && !tr->ta) return; /*if modified redraw all nodes*/ if (c_changed) tr_state->invalidate_all = 1; /*note we don't clear dirty flag, this is done in traversing*/ if (ptr->cmat.identity) { group_2d_traverse(node, (GroupingNode2D *) ptr, tr_state); } else { GF_ColorMatrix gf_cmx_bck; gf_cmx_copy(&gf_cmx_bck, &tr_state->color_mat); gf_cmx_multiply(&tr_state->color_mat, &ptr->cmat); group_2d_traverse(node, (GroupingNode2D *) ptr, tr_state); /*restore traversing state*/ gf_cmx_copy(&tr_state->color_mat, &gf_cmx_bck); } tr_state->invalidate_all = prev_inv; }
void visual_2d_texture_path_opengl_auto(GF_VisualManager *visual, GF_Path *path, GF_TextureHandler *txh, struct _drawable_context *ctx, GF_Rect *orig_bounds, GF_Matrix2D *ext_mx, GF_TraverseState *tr_state) { GF_Rect clipper; u32 prev_mode = tr_state->traversing_mode; u32 prev_type_3d = tr_state->visual->type_3d; visual_2d_flush_hybgl_canvas(visual, txh, ctx, tr_state); tr_state->visual->type_3d = 4; tr_state->appear = ctx->appear; if (ctx->col_mat) gf_cmx_copy(&tr_state->color_mat, ctx->col_mat);// tr_state->traversing_mode=TRAVERSE_DRAW_3D; gf_mx_from_mx2d(&tr_state->model_matrix, &ctx->transform); clipper.x = INT2FIX(ctx->bi->clip.x); clipper.y = INT2FIX(ctx->bi->clip.y); clipper.width = INT2FIX(ctx->bi->clip.width); clipper.height = INT2FIX(ctx->bi->clip.height); visual_3d_set_clipper_2d(tr_state->visual, clipper, NULL, 1); gf_node_allow_cyclic_traverse(ctx->drawable->node); gf_node_traverse(ctx->drawable->node, tr_state); tr_state->visual->type_3d=prev_type_3d; tr_state->traversing_mode=prev_mode; if (ctx->col_mat) gf_cmx_init(&tr_state->color_mat); ctx->flags |= CTX_PATH_FILLED; visual_3d_reset_clipper_2d(tr_state->visual); }
/*ColorTransform*/ static void RenderColorTransform(GF_Node *node, void *rs, Bool is_destroy) { Bool c_changed; M_ColorTransform *tr = (M_ColorTransform *)node; ColorTransformStack *ptr = (ColorTransformStack *)gf_node_get_private(node); RenderEffect2D *eff; eff = (RenderEffect2D *) rs; if (is_destroy) { DeleteGroupingNode2D((GroupingNode2D *)ptr); free(ptr); return; } c_changed = 0; if (gf_node_dirty_get(node) & GF_SG_NODE_DIRTY) { gf_cmx_set(&ptr->cmat, tr->mrr , tr->mrg, tr->mrb, tr->mra, tr->tr, tr->mgr , tr->mgg, tr->mgb, tr->mga, tr->tg, tr->mbr, tr->mbg, tr->mbb, tr->mba, tr->tb, tr->mar, tr->mag, tr->mab, tr->maa, tr->ta); c_changed = 1; } /*note we don't clear dirty flag, this is done in traversing*/ if (ptr->cmat.identity) { group2d_traverse((GroupingNode2D *) ptr, tr->children, eff); } else { GF_ColorMatrix gf_cmx_bck; Bool prev_inv = eff->invalidate_all; /*if modified redraw all nodes*/ if (c_changed) eff->invalidate_all = 1; gf_cmx_copy(&gf_cmx_bck, &eff->color_mat); gf_cmx_multiply(&eff->color_mat, &ptr->cmat); group2d_traverse((GroupingNode2D *) ptr, tr->children, eff); /*restore effects*/ gf_cmx_copy(&eff->color_mat, &gf_cmx_bck); eff->invalidate_all = prev_inv; } }