[swfmill] a proposal : cmd=swf2xml to report TagID and Length info as XML comment

matsuhashi@quick.co.jp matsuhashi at quick.co.jp
Sun Mar 25 21:32:20 EST 2007



Hi, List

I wanted a tool which informs me of the metrics of a given SWF. I wanted to
know which types of SWF tags are contained there and the byte length of
each SWF tags occupies. I thought it is nice if the swfmill can do it. I
made a small patch to swfmill 0.2.12.


(See attached file: swfmill-diff.txt)

Once applied, swfmill cmd=swf2xml produces a <swf> that contains a series
of XML comment which show you TagID and Length, for example:


<?xml version="1.0"?>
<swf version="8" compressed="1">
  <Header framerate="12" frames="1">
    <size>
      <Rectangle left="0" right="16000" top="0" bottom="12000"/>
    </size>
    <tags>
<!-- TagID 69 , Length 4 -->
      <FileAttributes hasMetaData="0" useNetwork="0"/>
<!-- TagID 9 , Length 3 -->
      <SetBackgroundColor>
        <color>
          <Color red="255" green="170" blue="170"/>
        </color>
      </SetBackgroundColor>
<!-- TagID 69 , Length 4 -->
      <FileAttributes hasMetaData="0" useNetwork="0"/>
<!-- TagID 83 , Length 47 -->
      <DefineShape5 objectID="2" nonScalingStrokes="0" scalingStrokes="1">
      ....continue

Each XML comment precedes the corresponding elements for example <!-- TagID
69 , Length 4 --> is showing that the following <FileAttributes> element
has TagID=69 in decimal, and the length of the tag is 4 bytes.

I could easily write a small XSLT stylesheet to filter the swf2xml output
to report a summary of tag metrics of a SWF: the output was something like:

<?xml version="1.0" encoding="UTF-8"?>
<swfmetrics version="8" compressed="1">
  <Header framerate="12" frames="1">
    <size>
      <Rectangle left="0" right="16000" top="0" bottom="12000"></Rectangle>
    </size>
    <tags>
      <tag id="69" name="FileAttributes" length="4"></tag>
      <tag id="9" name="SetBackGroundColor" length="3"></tag>
      <tag id="69" name="FileAttributes" length="4"></tag>
      <tag id="83" name="DefineShape4" length="47"></tag>
      <tag id="2" name="DefineShape" length="35"></tag>
      <tag id="75" name="DefineFont3" length="184"></tag>
      <tag id="73" name="DefineFontAlignZones" length="13"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="2" name="DefineShape" length="36"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="37" name="DefineEditText" length="52"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="39" name="DefineSprite" length="2211"></tag>
      <tag id="56" name="Export" length="15"></tag>
      <tag id="32" name="DefineShape3" length="133"></tag>
      <tag id="39" name="DefineSprite" length="16"></tag>
      <tag id="56" name="Export" length="13"></tag>
      <tag id="75" name="DefineFont3" length="183"></tag>
      <tag id="73" name="DefineFontAlignZones" length="13"></tag>
      <tag id="37" name="DefineEditText" length="171"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="39" name="DefineSprite" length="409"></tag>
      <tag id="56" name="Export" length="21"></tag>
      <tag id="75" name="DefineFont3" length="4313"></tag>
      <tag id="73" name="DefineFontAlignZones" length="313"></tag>
      <tag id="37" name="DefineEditText" length="43"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="11" name="DefineText" length="48"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="11" name="DefineText" length="39"></tag>
      <tag id="37" name="DefineEditText" length="50"></tag>
      <tag id="74" name="CMSTextSettings" length="12"></tag>
      <tag id="83" name="DefineShape4" length="395"></tag>
      <tag id="39" name="DefineSprite" length="590"></tag>
      <tag id="56" name="Export" length="21"></tag>
      <tag id="39" name="DefineSprite" length="1522"></tag>
      <tag id="56" name="Export" length="22"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="43"></tag>
      <tag id="59" name="DoInitAction" length="1243"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="50"></tag>
      <tag id="59" name="DoInitAction" length="4642"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="49"></tag>
      <tag id="59" name="DoInitAction" length="33136"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="45"></tag>
      <tag id="59" name="DoInitAction" length="1126"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="44"></tag>
      <tag id="59" name="DoInitAction" length="1290"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="46"></tag>
      <tag id="59" name="DoInitAction" length="787"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="51"></tag>
      <tag id="59" name="DoInitAction" length="1629"></tag>
      <tag id="39" name="DefineSprite" length="6"></tag>
      <tag id="56" name="Export" length="46"></tag>
      <tag id="59" name="DoInitAction" length="516"></tag>
      <tag id="39" name="DefineSprite" length="26"></tag>
      <tag id="48" name="DefineFont2" length="355028"></tag>
      <tag id="56" name="Export" length="34"></tag>
      <tag id="26" name="PlaceObject2" length="17"></tag>
      <tag id="1" name="ShowFrame" length="0"></tag>
      <tag id="0" name="End" length="0"></tag>
    </tags>
  </Header>
</swfmetrics>

I find this metrics report quite useful for me. I can find the reason why a
SWF file is unexpectedly large sometimes. In the above case, 355 mega bytes
of a DefineFont2 tag is determinant to the SWF file size.

I hope this feature or similar one be considered for the next swfmill
version-up.



      MATSUHASHI,kazuaki
-------------- next part --------------
A non-text attachment was scrubbed...
Name: swfmill-diff.txt
Type: application/octet-stream
Size: 2058 bytes
Desc: not available
Url : http://osflash.org/pipermail/swfmill_osflash.org/attachments/20070326/62a16eb2/swfmill-diff.obj


More information about the swfmill mailing list