swfdec_button.c
来自「Flush解码源程序」· C语言 代码 · 共 195 行
C
195 行
#include "swfdec_internal.h"void swfdec_button_free(SwfdecObject *object){ SwfdecButton *button = object->priv; int i; for(i=0;i<3;i++){ if(button->state[i]){ swfdec_spriteseg_free(button->state[i]); } } g_free(button);}SwfdecLayer *swfdec_button_prerender(SwfdecDecoder *s,SwfdecSpriteSeg *seg, SwfdecObject *object, SwfdecLayer *oldlayer){ SwfdecButton *button = object->priv; SwfdecObject *obj; SwfdecLayer *layer; SwfdecSpriteSeg *tmpseg; if(oldlayer && oldlayer->seg == seg)return oldlayer; layer = swfdec_layer_new(); layer->seg = seg; layer->rect.x0 = 0; layer->rect.x1 = 0; layer->rect.y0 = 0; layer->rect.y1 = 0; art_affine_multiply(layer->transform, seg->transform, s->transform); if(button->state[0]){ SwfdecLayer *child_layer = NULL; obj = swfdec_object_get(s,button->state[0]->id); if(!obj)return NULL; tmpseg = swfdec_spriteseg_dup(button->state[0]); art_affine_multiply(tmpseg->transform, button->state[0]->transform, seg->transform); child_layer = swfdec_spriteseg_prerender(s,tmpseg,NULL); if(child_layer){ layer->sublayers = g_list_append(layer->sublayers, child_layer); art_irect_union_to_masked(&layer->rect, &child_layer->rect, &s->irect); } swfdec_spriteseg_free(tmpseg); } return layer;}void swfdec_button_render(SwfdecDecoder *s,SwfdecLayer *layer, SwfdecObject *object){ int i; SwfdecLayerVec *layervec; for(i=0;i<layer->fills->len;i++){ layervec = &g_array_index(layer->fills, SwfdecLayerVec, i); swfdec_layervec_render(s, layervec); } for(i=0;i<layer->lines->len;i++){ layervec = &g_array_index(layer->lines, SwfdecLayerVec, i); swfdec_layervec_render(s, layervec); }}int tag_func_define_button_2(SwfdecDecoder *s){ bits_t *bits = &s->b; int id; int flags; int offset; int condition; SwfdecObject *object; double trans[6]; double color_add[4], color_mult[4]; SwfdecButton *button; unsigned char *endptr; endptr = bits->ptr + s->tag_len; id = get_u16(bits); object = swfdec_object_new(s,id); button = g_new0(SwfdecButton,1); object->type = SWF_OBJECT_BUTTON; object->priv = button; SWF_DEBUG(0," ID: %d\n", object->id); flags = get_u8(bits); offset = get_u16(bits); SWF_DEBUG(0," flags = %d\n",flags); SWF_DEBUG(0," offset = %d\n",offset); while(peek_u8(bits)){ int reserved; int hit_test; int down; int over; int up; int character; int layer; syncbits(bits); reserved = getbits(bits,4); hit_test = getbit(bits); down = getbit(bits); over = getbit(bits); up = getbit(bits); character = get_u16(bits); layer = get_u16(bits); SWF_DEBUG(0," reserved = %d\n",reserved); if(reserved){ SWF_DEBUG(4,"reserved is supposed to be 0\n"); } SWF_DEBUG(0," hit_test = %d\n",hit_test); SWF_DEBUG(0," down = %d\n",down); SWF_DEBUG(0," over = %d\n",over); SWF_DEBUG(0," up = %d\n",up); SWF_DEBUG(0," character = %d\n",character); SWF_DEBUG(0," layer = %d\n",layer); SWF_DEBUG(0,"bits->ptr %p\n",bits->ptr); //get_art_matrix(bits, trans); get_art_matrix(bits, trans); syncbits(bits); SWF_DEBUG(0,"bits->ptr %p\n",bits->ptr); get_art_color_transform(bits, color_mult, color_add); syncbits(bits); SWF_DEBUG(0,"bits->ptr %p\n",bits->ptr); if(up){ if(button->state[0]){ SWF_DEBUG(4,"button->state already set\n"); swfdec_spriteseg_free(button->state[0]); } button->state[0] = swfdec_spriteseg_new(); button->state[0]->id = character; art_affine_copy(button->state[0]->transform,trans); memcpy(button->state[0]->color_mult,color_mult,4*sizeof(double)); memcpy(button->state[0]->color_add,color_add,4*sizeof(double)); } if(over){ if(button->state[1]){ SWF_DEBUG(4,"button->state already set\n"); swfdec_spriteseg_free(button->state[1]); } button->state[1] = swfdec_spriteseg_new(); button->state[1]->id = character; art_affine_copy(button->state[1]->transform,trans); memcpy(button->state[1]->color_mult,color_mult,4*sizeof(double)); memcpy(button->state[1]->color_add,color_add,4*sizeof(double)); } if(down){ if(button->state[2]){ SWF_DEBUG(4,"button->state already set\n"); swfdec_spriteseg_free(button->state[2]); } button->state[2] = swfdec_spriteseg_new(); button->state[2]->id = character; art_affine_copy(button->state[2]->transform,trans); memcpy(button->state[2]->color_mult,color_mult,4*sizeof(double)); memcpy(button->state[2]->color_add,color_add,4*sizeof(double)); } } get_u8(bits); while(offset!=0){ offset = get_u16(bits); condition = get_u16(bits); SWF_DEBUG(0," offset = %d\n",offset); SWF_DEBUG(0," condition = 0x%04x\n",condition); get_actions(s,bits); } return SWF_OK;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?