X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=c4f6e0581f2ad64991223d7b5e59bdda62336a33;hb=4acb3c6593a57f4feb0e8b496025ef8497f8e9a2;hp=e3d20eeb6ea89a3d949cf9d485d0770fd7ffd6ce;hpb=8526dcf3a698c688e2cc4430ae106b5ecf70677f;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index e3d20ee..c4f6e05 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -136,6 +136,7 @@ SRECT swf_GetDefineBBox(TAG * t) U32 oldTagPos; U16 id = 0; SRECT b1,b2; + memset(&b1, 0, sizeof(b1)); oldTagPos = swf_GetTagPos(t); swf_SetTagPos(t,0); @@ -844,17 +845,19 @@ void swf_Relocate (SWF*swf, char*bitmap) } num = swf_GetNumUsedIDs(tag); - ptr = rfx_alloc(sizeof(int)*num); - swf_GetUsedIDs(tag, ptr); - - for(t=0;tdata[ptr[t]]); - if(slaveids[id]<0) { - fprintf(stderr, "swf_Relocate: Mapping id never encountered before: %d\n", id); - return ; + if(num) { + ptr = rfx_alloc(sizeof(int)*num); + swf_GetUsedIDs(tag, ptr); + + for(t=0;tdata[ptr[t]]); + if(slaveids[id]<0) { + fprintf(stderr, "swf_Relocate: Mapping id never encountered before: %d\n", id); + return ; + } + id = slaveids[id]; + PUT16(&tag->data[ptr[t]], id); } - id = slaveids[id]; - PUT16(&tag->data[ptr[t]], id); } tag=tag->next; } @@ -964,7 +967,7 @@ static int tagHash(TAG*tag) a >>= 8; a += tag->data[t]*0xefbc35a5*b*(t+1); } - return a&0x7fffffff; //always return unsigned + return a&0x7fffffff; //always return positive number } void swf_Optimize(SWF*swf) @@ -989,8 +992,9 @@ void swf_Optimize(SWF*swf) FIXME: a better way would be to compare the helper tags, too. */ - if(swf_isPseudoDefiningTag(tag)) { - //dontremap[swf_GetDefineID(tag)] = 1; //FIXME + if(swf_isPseudoDefiningTag(tag) && + tag->id != ST_NAMECHARACTER) { + dontremap[swf_GetDefineID(tag)] = 1; } tag=tag->next; } @@ -999,7 +1003,22 @@ void swf_Optimize(SWF*swf) int doremap=1; TAG*next = tag->next; - + + /* remap the tag */ + int num = swf_GetNumUsedIDs(tag); + int*positions = rfx_alloc(sizeof(int)*num); + int t; + swf_GetUsedIDs(tag, positions); + for(t=0;tdata[positions[t]]); + id = remap[id]; + PUT16(&tag->data[positions[t]], id); + } + rfx_free(positions); + tag = tag->next; + + /* now look for previous tags with the same + content */ if(swf_isDefiningTag(tag)) { TAG*tag2; int id = swf_GetDefineID(tag); @@ -1048,21 +1067,6 @@ void swf_Optimize(SWF*swf) } } - if(doremap) - { - int num = swf_GetNumUsedIDs(tag); - int*positions = rfx_alloc(sizeof(int)*num); - int t; - swf_GetUsedIDs(tag, positions); - for(t=0;tdata[positions[t]]); - id = remap[id]; - PUT16(&tag->data[positions[t]], id); - } - rfx_free(positions); - tag = tag->next; - } - tag = next; } rfx_free(dontremap); @@ -1070,3 +1074,41 @@ void swf_Optimize(SWF*swf) rfx_free(id2tag); rfx_free(hashmap); } + +void swf_SetDefineBBox(TAG * tag, SRECT newbbox) +{ + U16 id = 0; + SRECT b1; + swf_SetTagPos(tag,0); + + switch (swf_GetTagID(tag)) + { + case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINEEDITTEXT: + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + case ST_DEFINEVIDEOSTREAM: { + U32 after_bbox_offset = 0, len; + U8*data; + id = swf_GetU16(tag); + swf_GetRect(tag, &b1); + swf_ResetReadBits(tag); + after_bbox_offset = tag->pos; + len = tag->len - after_bbox_offset; + data = malloc(len); + memcpy(data, &tag->data[after_bbox_offset], len); + tag->writeBit = 0; + tag->len = 2; + swf_SetRect(tag, &newbbox); + swf_SetBlock(tag, data, len); + free(data); + tag->pos = tag->readBit = 0; + + } break; + default: + fprintf(stderr, "rfxswf: Tag %d (%s) has no bbox\n", tag->id, swf_TagGetName(tag)); + } +} +