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

📄 fad.actions.c

📁 libFAD is a Flash Animation Decode library
💻 C
字号:
/** * libFAD is the legal property of its developers, whose names are too numerous * to list here.  Please refer to the COPYRIGHT file distributed with this * source distribution. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *  * $Id: fad.actions.c,v 1.6 2006/02/25 02:47:23 wrxzzj Exp $ */#include"fad.actions.h"typedef struct {  s32_t (* actioncode_exec)(fad_actions_context_t *fac, bits_t *bits);  const char *name; /**action code readable name*/} actioncode_item_t;static actioncode_item_t g_ac_array[] = {  { NULL , "UNUSED ACTIONCODE" }, /**0x00 UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x01 UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x02 UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x03 UNUSED ACTIONCODE*/  { actions_v3_exec , "FAD_ACTION3_NEXT_FRAME" }, /**0x04 FAD_ACTION3_NEXT_FRAME*/  { actions_v3_exec , "FAD_ACTION3_PREV_FRAME" }, /**0x05 FAD_ACTION3_PREV_FRAME*/  { actions_v3_exec , "FAD_ACTION3_PLAY" }, /**0x06 FAD_ACTION3_PLAY*/  { actions_v3_exec , "FAD_ACTION3_STOP" }, /**0x07 FAD_ACTION3_STOP*/  { actions_v3_exec , "FAD_ACTION3_TOGGLE_QUALITY" }, /**0x08 FAD_ACTION3_TOGGLE_QUALITY*/  { actions_v3_exec , "FAD_ACTION3_STOP_SOUNDS" }, /**0x09 FAD_ACTION3_STOP_SOUNDS*/  { actions_v4_arithmetic_exec , "FAD_ACTION4_ADD" }, /**0x0a FAD_ACTION4_ADD*/  { actions_v4_arithmetic_exec , "FAD_ACTION4_SUBTRACT" }, /**0x0b FAD_ACTION4_SUBTRACT*/  { actions_v4_arithmetic_exec , "FAD_ACTION4_MULTIPLY" }, /**0x0c FAD_ACTION4_MULTIPLY*/  { actions_v4_arithmetic_exec , "FAD_ACTION4_DIVIDE" }, /**0x0d FAD_ACTION4_DIVIDE*/  { actions_v4_numerical_exec , "FAD_ACTION4_EQUALS" }, /**0x0e FAD_ACTION4_EQUALS*/  { actions_v4_numerical_exec , "FAD_ACTION4_LESS" }, /**0x0f FAD_ACTION4_LESS*/  { actions_v4_logical_exec , "FAD_ACTION4_AND" }, /**0x10 FAD_ACTION4_AND*/  { actions_v4_logical_exec , "FAD_ACTION4_OR" }, /**0x11 FAD_ACTION4_OR*/  { actions_v4_logical_exec , "FAD_ACTION4_NOT" }, /**0x12 FAD_ACTION4_NOT*/  { actions_v4_string_exec , "FAD_ACTION4_STRING_EQUALS" }, /**0x13 FAD_ACTION4_STRING_EQUALS*/  { actions_v4_string_exec , "FAD_ACTION4_STRING_LENGTH" }, /**0x14 FAD_ACTION4_STRING_LENGTH*/  { actions_v4_string_exec , "FAD_ACTION4_STRING_EXTRACT" }, /**0x15 FAD_ACTION4_STRING_EXTRACT*/  { NULL , "UNUSED ACTIONCODE" }, /**0x16 UNUSED ACTIONCODE*/  { actions_v4_stack_exec , "FAD_ACTION4_POP" }, /**0x17 FAD_ACTION4_POP*/  { actions_v4_type_exec , "FAD_ACTION4_TO_INTEGER" }, /**0x18 FAD_ACTION4_TO_INTEGER*/  { NULL , "UNUSED ACTIONCODE" }, /**0x19 UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x1a UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x1b UNUSED ACTIONCODE*/  { actions_v4_variable_exec , "FAD_ACTION4_GET_VARIABLE" }, /**0x1c, FAD_ACTION4_GET_VARIABLE*/  { actions_v4_variable_exec , "FAD_ACTION4_SET_VARIABLE" }, /**0x1d, FAD_ACTION4_SET_VARIABLE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x1e UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x1f UNUSED ACTIONCODE*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_SET_TARGET2" }, /**0x20, FAD_ACTION4_SET_TARGET2*/  { actions_v4_string_exec , "FAD_ACTION4_STRING_ADD" }, /**0x21 FAD_ACTION4_STRING_ADD*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_GET_PROPERTY" }, /**0x22, FAD_ACTION4_GET_PROPERTY*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_SET_PROPERTY" }, /**0x23, FAD_ACTION4_SET_PROPERTY*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_CLONE_SPRITE" }, /**0x24, FAD_ACTION4_CLONE_SPRITE*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_REMOVE_SPRITE" }, /**0x25, FAD_ACTION4_REMOVE_SPRITE*/  { actions_v4_utils_exec, "FAD_ACTION4_TRACE" }, /**0x26, FAD_ACTION4_TRACE*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_START_DRAG" }, /**0x27, FAD_ACTION4_START_DRAG*/  { actions_v4_movie_ctrl_exec, "FAD_ACTION4_END_DRAG" }, /**0x28, FAD_ACTION4_END_DRAG*/  { actions_v4_string_exec , "FAD_ACTION4_STRING_LESS" }, /**0x29 FAD_ACTION4_STRING_LESS*/  { actions_v7_exec , "FAD_ACTION7_THROW" }, /**0x2a FAD_ACTION7_THROW*/  { actions_v7_exec , "FAD_ACTION7_CASTOP" }, /**0x2b FAD_ACTION7_CASTOP*/  { actions_v7_exec , "FAD_ACTION7_IMPLEMENTSOP" }, /**0x2c FAD_ACTION7_IMPLEMENTSOP*/  { NULL , "UNUSED ACTIONCODE" }, /**0x2d UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x2e UNUSED ACTIONCODE*/  { NULL , "UNUSED ACTIONCODE" }, /**0x2f UNUSED ACTIONCODE*/  { actions_v4_utils_exec, "FAD_ACTION4_RANDOM_NUMBER" }, /**0x30, FAD_ACTION4_RANDOM_NUMBER*/  { actions_v4_string_exec , "FAD_ACTION4_MBSTRING_LENGTH" }, /**0x31 FAD_ACTION4_MBSTRING_LENGTH*/  { actions_v4_type_exec , "FAD_ACTION4_CHAR_TO_ASCII" }, /**0x32 FAD_ACTION4_CHAR_TO_ASCII*/  { actions_v4_type_exec , "FAD_ACTION4_ASCII_TO_CHAR" }, /**0x33 FAD_ACTION4_ASCII_TO_CHAR*/  { actions_v4_utils_exec, "FAD_ACTION4_GET_TIME" }, /**0x34, FAD_ACTION4_GET_TIME*/  { actions_v4_string_exec , "FAD_ACTION4_MBSTRING_EXTRACT" }, /**0x35 FAD_ACTION4_MBSTRING_EXTRACT*/  { actions_v4_string_exec , "FAD_ACTION4_MBCHAR_TO_ASCII" }, /**0x36 FAD_ACTION4_MBCHAR_TO_ASCII*/  { actions_v4_string_exec , "FAD_ACTION4_MBASCII_TO_CHAR" }, /**0x37 FAD_ACTION4_MBASCII_TO_CHAR*/  { actions_v5_script_object_exec, "FAD_ACTION5_DELETE" }, /**0x3a*/  { actions_v5_script_object_exec, "FAD_ACTION5_DELETE2" }, /**0x3b*/  { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_LOCALE" }, /**0x3c*/  { actions_v5_script_object_exec, "FAD_ACTION5_CALL_FUNCTION" }, /**0x3d*/  { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_LOCALE2" }, /**0x3c*/  { actions_v5_script_object_exec, "FAD_ACTION5_NEW_OBJECT" }, /**0x40*/  { actions_v5_script_object_exec, "FAD_ACTION5_INIT_ARRAY" }, /**0x42*/  { actions_v5_script_object_exec, "FAD_ACTION5_INIT_OBJECT" }, /**0x43*/  { actions_v5_script_object_exec, "FAD_ACTION5_TARGET_PATH" }, /**0x45*/  { actions_v5_script_object_exec, "FAD_ACTION5_ENUMERATE" }, /**0x46*/  { actions_v5_script_object_exec, "FAD_ACTION5_EQUEAL2" }, /**0x49*/  { actions_v5_script_object_exec, "FAD_ACTION5_GET_MEMBER" }, /**0x4e*/  { actions_v5_script_object_exec, "FAD_ACTION5_SET_MEMBER" }, /**0x4f*/  { actions_v5_script_object_exec, "FAD_ACTION5_CALL_METHOD" }, /**0x52*/  { actions_v5_script_object_exec, "FAD_ACTION5_NEW_METHOD" }, /**0x53*/  { actions_v5_script_object_exec, "FAD_ACTION5_CONSTANT_POOL" }, /**0x88*/  { actions_v5_script_object_exec, "FAD_ACTION5_WITH" }, /**0x94*/  { actions_v5_script_object_exec, "FAD_ACTION5_DEFINE_FUNCTION" }, /**0x98*/};void fad_actions_stack_init(fad_actions_stack_t *fas) {  fas->hdr = fas->curr = calloc(1, sizeof(fad_stack_chunk_t));  fas->top = -1;}#define TOP2IDX(top) (top&0x4ff)as_object_t* fad_actions_stack_pop(fad_actions_stack_t *fas) {  as_object_t *obj = NULL;  fas->top--;  if(fas->top >= 0) {    obj = fas->curr->objs[TOP2IDX(fas->top)];    if(TOP2IDX(fas->top) == 0) {      fas->curr = fas->curr->next;    }  }  return obj;}static s32_t _fad_actions_get_object(bits_t *bits, as_object_t *obj) {  s32_t ret = 0;  obj->type = bits_get_u8(bits);  switch(obj->type) {    case 0:      obj->val.str = strdup(bits_tell(bits));      break;    case 1:      obj->val.f = bits_get_u32(bits);      break;    case 4:      obj->val.reg = bits_get_u8(bits);      break;    case 5:      obj->val.b   = bits_get_u8(bits);      break;    case 6:      obj->val.d   = bits_get_u32(bits);      break;    case 7:      obj->val.i   = bits_get_u32(bits);      break;    case 8:      obj->val.c8  = bits_get_u8(bits);      break;    case 9:      obj->val.c9 = bits_get_u16(bits);      break;    default:      DEBUG("unknow AS value type = %x\n", obj->type);      ret = -1;      break;  }  return ret;}void fad_actions_stack_push(fad_actions_stack_t *fas, bits_t *bits) {  as_object_t *obj = NULL;  fas->top++;  if(TOP2IDX(fas->top) == 0x4ff) {    fad_stack_chunk_t *fsc = NULL;    if(fas->curr->prev) {      fas->curr = fas->curr->prev;    } else {      fsc = calloc(1, sizeof(fad_stack_chunk_t));      fas->hdr->prev = fsc;      fsc->next = fas->hdr;      fsc->prev = NULL;      fas->hdr = fsc;      fas->curr = fsc;    }  }  obj = &(fas->curr->objs[TOP2IDX(fas->top)]);  _fad_actions_get_object(bits, obj);}void fad_actions_stack_finish(fad_actions_stack_t *fas) {  as_object_t *obj = NULL, *ptr = NULL;  if(fas != NULL) {    for(obj = fas->hdr; obj != NULL; ) {      ptr = obj;      obj = obj->next;      free(ptr);    }  }}static s32_t actions_v3_exec(fad_actions_context_t *fac, bits_t *bits) {  s32_t ret = 0;  switch(code) {    case FAD_ACTION3_GOTO_FRAME:      {        s16_t idx;        bits_seek_nbytes(bits, 2);        idx = bits_get_u16(bits);        fad_frame_seek(fac->frame, fac->stream, idx);      }      break;    case FAD_ACTION3_NEXT_FRAME:      fad_frame_seek(fac->frame, fac->stream, fac->frame->output_frame+1);      break;    case FAD_ACTION3_PREV_FRAME:      fad_frame_seek(fac->frame, fac->stream, fac->frame->output_frame-1);      break;    case FAD_ACTION3_PLAY:      fac->frame->sta = FAD_STA_DOTAG;      break;    case FAD_ACTION3_STOP:      fac->frame->sta = FAD_STA_STOP;      break;    case FAD_ACTION3_STOP_SOUNDS:      break;    case FAD_ACTION3_TOGGLE_QUALITY:      break;    default:      ret = -1;      break;  }  return ret;}static float as_object_to_float(as_object_t *obj) {  switch(obj->type) {    case 1: return obj->val.f;    case 5: return (float)(obj->val.b);    case 6: return (float)(obj->val.d);    case 7: return (float)(obj->val.i);    default: return 0;  }}static s32_t fad_actions_v4_do_exec(fad_actions_context_t *fac, u8_t code) {  float a = 0.0, b = 0.0;  as_object_t *obj = NULL;  switch(code) {    case FAD_ACTION4_MBASCII_TO_CHAR:    case FAD_ACTION4_MBCHAR_TO_ASCII:    case FAD_ACTION4_ASCII_TO_CHAR:    case FAD_ACTION4_CHAR_TO_ASCII:    case FAD_ACTION4_NOT:    case FAD_ACTION4_TO_INTEGER:    case FAD_ACTION4_STRING_LENGTH:    case FAD_ACTION4_IF:    case FAD_ACTION4_GET_VARIABLE:    case FAD_ACTION4_REMOVE_SPRITE:    case FAD_ACTION4_TRACE:    case FAD_ACTION4_RANDOM_NUMBER:      obj = fad_actions_stack_pop(&fac->fas);      a = as_object_to_float(obj);      break;    default:      obj = fad_actions_stack_pop(&fac->fas);      a = as_object_to_float(obj);      obj = fad_actions_stack_pop(&fac->fas);      b = as_object_to_float(obj);      break;  }  return ret;}void fad_actions_context_init(fad_actions_context_t *fac, fad_frame_t *frame, fad_stream_t *stream) {  fad_actions_stack_init(&fac->fas, stream);  fac->pc = 0;  fac->bc = frame->asr;}void fad_actions_context_finish(fad_actions_context_t *fac) {  fad_actions_stack_finish(&fac->fas);}s32_t action_script_decode(fad_frame_t* frame, fad_stream_t* s) {  /**just save AS record address*/  frame->asr = bits_tell(&s->bits);  return -1;}void action_script_exec(fad_actions_context_t *fac, u8_t *asr) {  bits_t bits;  u8_t code;  s32_t ret = 0;  s32_t (* as2_exec_func)(fad_actions_context_t *fac, bits_t *bits);  bits_init(&bits);  while(code=bits_get_u8(&bits)) {    len = bits_get_u16(&bits);    if(as2_exec_func = g_ac_array[code]) {      ret = (* as2_exec_func)(fac, &bits);    } else {      ret = (code>=0x80 ? -1 : 0);    }    if(ret < 0)      bits_seek_nbytes(&bits, len);  }  bits_finish(&bits);}

⌨️ 快捷键说明

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