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

📄 swf_file_tree.c.svn-base

📁 A Flash Player with ActionScript support. Write in C and C++. It have two part, one is Player and an
💻 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 + -