⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grouping_stacks.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
	i=0;	while (i<an->url.count) {		event.navigate.to_url = an->url.vals[i].url;		if (!event.navigate.to_url) break;		/*current scene navigation*/		if (event.navigate.to_url[0] == '#') {			GF_Node *n;			event.navigate.to_url++;			n = gf_sg_find_node_by_name(gf_node_get_graph(sh->owner), (char *) event.navigate.to_url);			if (n) {				switch (gf_node_get_tag(n)) {				case TAG_MPEG4_Viewport:					((M_Viewport *)n)->set_bind = 1;					((M_Viewport *)n)->on_set_bind(n);					break;				}				break;			}		} else if (st->compositor->term) {			if (gf_is_process_anchor(sh->owner, &event))				break;		} else if (st->compositor->user->EventProc) {			if (st->compositor->user->EventProc(st->compositor->user->opaque, &event))				break;		}		i++;	}	return 0;}static void on_activate_anchor(GF_Node *node){	GF_Event ev;	AnchorStack *st = (AnchorStack *) gf_node_get_private(node);	if (!((M_Anchor *)node)->activate) return;	ev.type = GF_EVENT_MOUSEUP;	ev.mouse.button = GF_MOUSE_LEFT;	OnAnchor(&st->hdl, &ev, NULL, NULL);	return;}SensorHandler *r2d_anchor_get_handler(GF_Node *n){	AnchorStack *st = (AnchorStack *) gf_node_get_private(n);	return &st->hdl;}void R2D_InitAnchor(Render2D *sr, GF_Node *node){	AnchorStack *stack;	M_Anchor *an = (M_Anchor *)node;	GF_SAFEALLOC(stack, AnchorStack);	SetupGroupingNode2D((GroupingNode2D*)stack, sr, node);	sr->compositor->interaction_sensors++;	an->on_activate = on_activate_anchor;	stack->hdl.IsEnabled = anchor_is_enabled;	stack->hdl.OnUserEvent = OnAnchor;	stack->hdl.owner = node;	gf_node_set_private(node, stack);	gf_node_set_callback_function(node, RenderAnchor);}struct og_pos{	Fixed priority;	u32 position;};typedef struct{	GF_Node *owner;	GF_Renderer *compositor;	GROUPINGNODESTACK2D	struct og_pos *priorities;	u32 count;} OrderedGroupStack;static s32 compare_priority(const void* elem1, const void* elem2){	struct og_pos *p1, *p2;	p1 = (struct og_pos *)elem1;	p2 = (struct og_pos *)elem2;	if (p1->priority < p2->priority) return -1;	if (p1->priority > p2->priority) return 1;	return 0;}static void RenderOrderedGroup(GF_Node *node, void *rs, Bool is_destroy){	u32 i, count;	GF_Node *child;	Bool split_text_backup, invalidate_backup;	M_OrderedGroup *og;	u32 count2;	GF_List *sensor_backup;	SensorHandler *hsens;	OrderedGroupStack *ogs = (OrderedGroupStack *) gf_node_get_private(node);	RenderEffect2D *eff = (RenderEffect2D *)rs;	if (is_destroy) {		DeleteGroupingNode2D((GroupingNode2D *)ogs);		if (ogs->priorities) free(ogs->priorities);		free(ogs);		return;	}	og = (M_OrderedGroup *) ogs->owner;	if (!og->order.count) {		group2d_traverse((GroupingNode2D*)ogs, og->children, eff);		return;	}	count = gf_node_list_get_count(og->children);	invalidate_backup = eff->invalidate_all;	/*check whether the OrderedGroup node has changed*/	if (gf_node_dirty_get(node) & GF_SG_NODE_DIRTY) {		if (ogs->priorities) free(ogs->priorities);		ogs->priorities = (struct og_pos*)malloc(sizeof(struct og_pos)*count);		for (i=0; i<count; i++) {			ogs->priorities[i].position = i;			ogs->priorities[i].priority = (i<og->order.count) ? og->order.vals[i] : 0;		}		qsort(ogs->priorities, count, sizeof(struct og_pos), compare_priority);		eff->invalidate_all = 1;	}	sensor_backup = NULL;	if (gf_node_dirty_get(node) & GF_SG_CHILD_DIRTY) {		/*rebuild sensor list*/		if (gf_list_count(ogs->sensors)) {			gf_list_del(ogs->sensors);			ogs->sensors = gf_list_new();		}		for (i=0; i<count; i++) {			child = (GF_Node*)gf_node_list_get_child(og->children, ogs->priorities[i].position);			if (!child || !is_sensor_node(child) ) continue;			hsens = get_sensor_handler(child);			if (hsens) gf_list_add(ogs->sensors, hsens);		}	}	/*if we have an active sensor at this level discard all sensors in current render context (cf VRML)*/	count2 = gf_list_count(ogs->sensors);	if (count2) {		sensor_backup = eff->sensors;		eff->sensors = gf_list_new();		/*add sensor to effects*/			for (i=0; i <count2; i++) {			SensorHandler *hsens = (SensorHandler *)gf_list_get(ogs->sensors, i);			effect_add_sensor(eff, hsens, &eff->transform);		}	}	gf_node_dirty_clear(node, 0);	if (eff->parent == (GroupingNode2D *) ogs) {		for (i=0; i<count; i++) {			group2d_start_child((GroupingNode2D *) ogs);			child = (GF_Node*)gf_node_list_get_child(og->children, ogs->priorities[i].position);			gf_node_render(child, eff);			group2d_end_child((GroupingNode2D *) ogs);		}	} else {		split_text_backup = eff->text_split_mode;		if (count>1) eff->text_split_mode = 0;		for (i=0; i<count; i++) {			child = (GF_Node*)gf_node_list_get_child(og->children, ogs->priorities[i].position);			gf_node_render(child, eff);		}		eff->text_split_mode = split_text_backup;	}	/*restore effect*/	invalidate_backup = eff->invalidate_all;	if (count2) {		/*destroy current effect list and restore previous*/		effect_reset_sensors(eff);		gf_list_del(eff->sensors);		eff->sensors = sensor_backup;	}}void R2D_InitOrderedGroup(Render2D *sr, GF_Node *node){	OrderedGroupStack *ptr;	GF_SAFEALLOC(ptr, OrderedGroupStack);	SetupGroupingNode2D((GroupingNode2D*)ptr, sr, node);		gf_node_set_private(node, ptr);	gf_node_set_callback_function(node, RenderOrderedGroup);}typedef struct{	GF_Node *owner;	GF_Renderer *compositor;	GROUPINGNODESTACK2D	GF_List *backs;	GF_List *views;	Bool first;	GF_Rect clip;} Layer2DStack;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);}void R2D_InitLayer2D(Render2D *sr, GF_Node *node){	Layer2DStack *stack = (Layer2DStack *)malloc(sizeof(Layer2DStack));	SetupGroupingNode2D((GroupingNode2D*)stack, sr, node);	stack->backs = gf_list_new();	stack->views = gf_list_new();	stack->first = 1;	gf_node_set_private(node, stack);	gf_node_set_callback_function(node, RenderLayer2D);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -