/*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; }
/*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; } }