📄 swf_file_tree.c.svn-base
字号:
#include <stdio.h>#include <glib.h>#include <assert.h>#include "player_pub.h"#include "base_types.h"#include "instance.h"#include "swf_file_pub.h"#include "spliter_pub.h"#include "render_pub.h"#include "movie_clips_ins.h"#include "movie_clips_def.h"#include "sound_decomp.h"#include "button_ins.h"#include "button_def.h"#include "xwin_pub.h"#include "action.h"extern player_t *player_p;// 先根遍历所有节点, MC 和 BTN 型的重新计算其子节点.// 如果 MC 或 BTN dirty 则其子均标为 dirty.// 如果 叶节点 为 dirty 则重新计算其外框,并登记其// 面积到脏区.// MC 或 BTN 的外框设为空,以便在第二遍时重新计算(其所有子节点的合成).void swf_first_pass(GNode* node_p) { instance_t *data_p = (instance_t*)(node_p->data); swf_file_t *swf_p = data_p->swf_p; changed_t *chg_p = swf_p->changed_p; GNode *child; switch (data_p->ins_type) { case INS_MC: mc_ins_evolve(node_p); mc_ins_update_children(node_p); rect_new(&data_p->boundary); break; case INS_BTN: btn_ins_update_children(node_p); rect_new(&data_p->boundary); break; }; if (data_p->dirty) { ins_fresh_boundary(node_p); switch (data_p->ins_type) { case INS_MC: break; /* if (data_p->dirty) { // 如果其 dirty 则其子均 dirty GNode *p; for (p = g_node_first_child(node_p);p!= NULL;p = p -> next) { ((instance_t*)(p->data))->dirty = TRUE; ((instance_t*)(p->data))->visible = data_p->visible; }; } break; */ case INS_BTN: if (data_p->dirty) { // 如果其 dirty 则其子均 dirty GNode *p; for (p = g_node_first_child(node_p);p!= NULL;p = p -> next) { ((instance_t*)(p->data))->dirty = TRUE; ((instance_t*)(p->data))->visible = data_p->visible; }; } btn_ins_fresh_hit_area(node_p); break; case INS_STX: case INS_DTX: case INS_MRH: case INS_SHP: // 所有 dirty 的叶节点均需登记 box_bounding(更改后,新添后)// printf("p3\n"); chg_add_boundary(chg_p,node_p); break; }; }; child = node_p->children; while (child) { register GNode *current; current = child; child = current->next; swf_first_pass(current); };};static gboolean swf_second_pass_do(GNode* node_p,gpointer in_chg_p) { instance_t *data_p = (instance_t*)(node_p->data); changed_t *chg_p = in_chg_p; struct MovieClip *mc_def_p = (struct MovieClip*)(data_p->define_p); mc_ins_t *mc_data_p = (mc_ins_t*)(node_p->data); btn_ins_t *btn_data_p = (btn_ins_t*)(node_p->data); if (node_p->parent) { ((instance_t*)(node_p->parent->data))->boundary = rect_add(&((instance_t*)(node_p->parent->data))->boundary, &data_p->boundary); }; if ((data_p->dirty == FALSE) && (rect_is_rect_cross(&chg_p->dirty_area,&data_p->boundary))) { data_p->dirty = TRUE; }; // 声音部分#if WITH_SOUND { int frame=0; if (mc_data_p->last_frame > 0) { frame = mc_data_p->last_frame-1; } else { frame = 0; }; switch (data_p->ins_type) { case INS_MC: if (mc_def_p->Frames[frame].SoundStreamHeadP) { snd_stream_create(node_p,mc_def_p->Frames[frame].SoundStreamHeadP); } if (mc_def_p->Frames[frame].SoundStreamBlockP) { snd_stream_add(node_p,mc_def_p->Frames[frame].SoundStreamBlockP); }; if (mc_def_p->Frames[frame].EventSoundP) { snd_define_create(node_p,mc_def_p->Frames[frame].EventSoundP); } break; case INS_BTN: if (btn_data_p->sound_p) { snd_define_create(node_p,btn_data_p->sound_p); }; break; }; };#endif return FALSE;};// 后根遍历所有节点,// 重新合成每个中间节点的边框.// 和脏区相交的节点标为脏.void swf_second_pass(GNode *node_p) { instance_t *data_p = (instance_t*)(node_p->data); swf_file_t *swf_p = data_p->swf_p; changed_t *chg_p = swf_p->changed_p; g_node_traverse(node_p,G_POST_ORDER,G_TRAVERSE_ALL,-1,swf_second_pass_do,chg_p);};// 此部分在算桢和画桢后执行.// 收集 Frame 事件. EnterFrame 事件.// MC_STOP: 脚本不执行.// MC_TO_STOP: next_frame 所指定的桢,脚本部分完成后进入 STOP 状态.// MC_PLAY:static gboolean swf_three_pass_do(GNode* node_p,gpointer p) { instance_t *data_p = (instance_t*)(node_p->data); struct MovieClip *mc_def_p = (struct MovieClip*)(data_p->define_p); mc_ins_t *mc_data_p = (mc_ins_t*)data_p; to_exec_t *to_exec_p = NULL; switch (data_p->ins_type) { case INS_MC: switch (mc_data_p->state) { case MC_STOP: return FALSE; break; case MC_TO_STOP: printf(" %s, to stop -> stop\n", data_p->name_p); mc_data_p->state = MC_STOP; break; case MC_PLAY: break; default: assert(0); } if ((mc_data_p->last_frame > 0) && (mc_def_p->Frames[mc_data_p->last_frame-1].FrameEventP)) { to_exec_p = g_new0(to_exec_t,1); to_exec_p->as_p = mc_def_p->Frames[mc_data_p->last_frame-1].FrameEventP; to_exec_p->name_p = ins_node_to_name(node_p); printf("add in frame \n"); player_p->actionq_p = g_slist_append(player_p->actionq_p,to_exec_p); }; if ((mc_data_p->actions_p) && (mc_data_p->actions_p->ClipEventEnterFrameP)) { to_exec_p = g_new0(to_exec_t,1); to_exec_p->as_p = mc_data_p->actions_p->ClipEventEnterFrameP; to_exec_p->name_p = ins_node_to_name(node_p); printf("add in enter frame \n"); player_p->actionq_p = g_slist_append(player_p->actionq_p,to_exec_p); }; } return FALSE;};void swf_three_pass(GNode *node_p) { g_node_traverse(node_p,G_POST_ORDER,G_TRAVERSE_ALL,-1,swf_three_pass_do,NULL);}void swf_init_root(swf_file_t *swf_p) { mc_ins_t *data_p; data_p = g_new0(mc_ins_t,1); swf_p->_root_p = g_node_new(data_p); data_p->boundary = swf_p->frame_size; data_p->define_p = swf_p->dict_p->dict[0]; data_p->ins_type = INS_MC; data_p->last_frame = 0; data_p->next_frame = 0; data_p->state = MC_PLAY; data_p->name_p = g_strdup("_level0"); data_p->depth = 0; data_p->swf_p = swf_p; data_p->dirty = TRUE; data_p->visible = TRUE; mat_new(&data_p->matrix); mat_new(&data_p->ab_matrix); cxform_new(&data_p->cxform);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -