minor fixes: swf_SetBits(), cleanup shape struct, fixed dumpfont
[swftools.git] / lib / rfxswf.h
index 95d497c..a860b77 100644 (file)
@@ -16,6 +16,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include "../config.h"
 
 #define DEBUG_RFXSWF
@@ -70,18 +72,20 @@ typedef struct _CXFORM
 
 typedef struct _TAG             // NEVER access a Tag-Struct directly !
 { U16           id;
-  U32           len;
   U8 *          data;
+  U32           memsize;        // to minimize realloc() calls
+
+  U32         len;            // for Set-Access
+  U32         pos;            // for Get-Access
 
-  int           frame;
+  int           frame;          // not really up-to-date
 
   struct _TAG * next;
   struct _TAG * prev;
 
-  U32           memsize;        // to minimize realloc() calls
-  U32           pos;            // for Get/Set-Access
-  U8            bitmask;        // for Bit-Manipulating Functions [read]
-  U8            bitcount;       // [write]
+  U8            readBit;        // for Bit-Manipulating Functions [read]
+  U8            writeBit;       // [write]
+  
 } TAG, * LPTAG;
 
 typedef struct _ActionTAG 
@@ -93,6 +97,7 @@ typedef struct _ActionTAG
   struct _ActionTAG * prev;
 
   TAG* parent; // may be null
+  U8 tmp[4]; // store small operands here.
 } ActionTAG;
 
 
@@ -217,18 +222,14 @@ int   swf_SetRGBA(TAG * t,RGBA * col);
 #define ST_TEMPLATECOMMAND      49
 #define ST_GENERATOR3           51
 #define ST_EXTERNALFONT         52
+#define ST_EXPORTASSETS                56
+#define ST_IMPORTASSETS                57
+#define ST_ENABLEDEBUGGER      58
 
 #define ST_REFLEX              777 /* to identify generator software */
 
 // Advanced Funtions
 
-// swfdump.c
-
-void swf_DumpHeader(FILE * f,SWF * swf);
-void swf_DumpMatrix(FILE * f,MATRIX * m);
-void swf_DumpTag(FILE * f,TAG * t); 
-char* swf_TagGetName(TAG*tag);
-
 // swfshape.c
 
 typedef struct _LINESTYLE
@@ -249,20 +250,17 @@ typedef struct _SHAPE           // NEVER access a Shape-Struct directly !
   { LINESTYLE * data;
     U16         n;
   } linestyle;
-                  // note: changes of shape structure
-  struct                  // lead to incompatible .efont formats
+                  
+  struct                    
   { FILLSTYLE * data;
     U16         n;
   } fillstyle;
-
-  S32           px;
-  S32           py;
-  
   struct
   { U16         fill;
     U16         line;
   } bits;
-  
+                               // used by Get/SetSimpleShape and glyph handling
   U8 *          data;
   U32           bitlen;         // length of data in bits
 } SHAPE, * LPSHAPE;
@@ -298,33 +296,40 @@ int   swf_ShapeSetEnd(TAG * t);
 
 // does not support wide characters !
 
-#define MAX_CHAR_PER_FONT 256
+#define MAX_CHAR_PER_FONT 512
+
+typedef struct _KERNING
+{
+  U16        char1;
+  U16        char2;
+  U16        adjustment;
+} SWFKERNING;
 
 typedef struct _SWFLAYOUT
-{ S16         ascent;
-  S16         descent;
-  S16         leading;
-  SRECT       bounds[MAX_CHAR_PER_FONT];
-  struct
-  { U16       count;
-    U8 *      data;  // size = count*4 bytes
-  } kerning;
+{ S16          ascent;
+  S16          descent;
+  S16          leading;
+  SRECT      * bounds;
+  U16         kerningcount;
+  SWFKERNING * kerning;
 } SWFLAYOUT, * LPSWFLAYOUT;
 
+typedef struct
+{ S16         advance;
+  SHAPE *     shape;
+} SWFGLYPH;
+
 typedef struct _SWFFONT
-{ U16           id;
+{ int          id; // -1 = not set
+  U8           version; // 0 = not set, 1 = definefont, 2 = definefont2
   U8 *          name;
   SWFLAYOUT *   layout;
-
+  U16          numchars;
+  U16          maxascii; // highest mapped ascii value
   U8            flags; // bold/italic/unicode/ansi ...
-
-  U16           codes[MAX_CHAR_PER_FONT];
-  
-  struct
-  { U16         advance;
-    U16         gid;            // Glyph-ID after DefineFont
-    SHAPE *     shape;
-  }             glyph[MAX_CHAR_PER_FONT];
+  U16  *       glyph2ascii;
+  int  *       ascii2glyph;
+  SWFGLYPH *   glyph;
 } SWFFONT, * LPSWFFONT;
 
 typedef struct _FONTUSAGE
@@ -350,9 +355,13 @@ int swf_FontUse(FONTUSAGE * use,U8 * s);
 int swf_FontSetDefine(TAG * t,SWFFONT * f);
 int swf_FontSetInfo(TAG * t,SWFFONT * f);
 
+// the following two functions are obsolete and will be removed soon
 int swf_FontExport(int handle,SWFFONT * f);
 int swf_FontImport(int handle,SWFFONT * * f);
 
+void swf_WriteFont(SWFFONT* font, char* filename);
+SWFFONT* swf_ReadFont(char* filename);
+
 void swf_FontFree(SWFFONT * f);
 
 U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale);
@@ -364,6 +373,13 @@ int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 ab
 int swf_TextPrintDefineText(TAG * t,SWFFONT * f);
 // Prints text defined in tag t with font f to stdout
 
+// swfdump.c
+
+void swf_DumpHeader(FILE * f,SWF * swf);
+void swf_DumpMatrix(FILE * f,MATRIX * m);
+void swf_DumpTag(FILE * f,TAG * t); 
+char* swf_TagGetName(TAG*tag);
+void swf_DumpFont(SWFFONT * font);
 
 // swfobject.c
 
@@ -456,7 +472,7 @@ U8 swf_isAllowedSpriteTag(TAG * t);
 U16 swf_GetDefineID(TAG * t);
 U16 swf_GetPlaceID(TAG * t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT
 U16 swf_GetDepth(TAG * t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2
-char* swf_GetTagName(TAG * t); //PLACEOBJECT2, FRAMELABEL
+char* swf_GetName(TAG * t); //PLACEOBJECT2, FRAMELABEL
 MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2);
 MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy,
                     int x0,int y0,int x1,int y1,int x2,int y2);
@@ -468,11 +484,111 @@ void swf_uncgi();  // same behaviour as Steven Grimm's uncgi-library
 
 // swfaction.c
 
-ActionTAG* swf_GetActions(TAG*tag);
-void swf_SetActions(TAG*tag, ActionTAG*actions);
+ActionTAG* swf_ActionGet(TAG*tag);
+void swf_ActionFree(ActionTAG*tag);
+void swf_ActionSet(TAG*tag, ActionTAG*actions);
 void swf_DumpActions(ActionTAG*atag, char*prefix);
 void swf_ActionEnumerateURLs(ActionTAG*atag, char*(*callback)(char*));
 void swf_ActionEnumerateTargets(ActionTAG*atag, char*(*callback)(char*));
 void swf_ActionEnumerateStrings(ActionTAG*atag, char*(*callback)(char*));
 
+ActionTAG* swf_ActionStart();
+void action_End();
+void action_NextFrame();
+void action_PreviousFrame();
+void action_Play();
+void action_Stop();
+void action_ToggleQuality();
+void action_StopSounds();
+void action_Add();
+void action_Subtract();
+void action_Multiply();
+void action_Divide();
+void action_Equals();
+void action_Less();
+void action_And();
+void action_Or();
+void action_Not();
+void action_StringEquals();
+void action_StringLength();
+void action_StringExtract();
+void action_Pop();
+void action_ToInteger();
+void action_GetVariable();
+void action_SetVariable();
+void action_SetTarget2();
+void action_StringAdd();
+void action_GetProperty();
+void action_SetProperty();
+void action_CloneSprite();
+void action_RemoveSprite();
+void action_Trace();
+void action_StartDrag();
+void action_EndDrag();
+void action_StringLess();
+void action_RandomNumber();
+void action_MBStringLength();
+void action_CharToAscii();
+void action_AsciiToChar();
+void action_GetTime();
+void action_MBStringExtract();
+void action_MBCharToAscii();
+void action_MBAsciiToChar();
+void action_Delete();
+void action_Delete2();
+void action_DefineLocal();
+void action_CallFunction();
+void action_Return();
+void action_Modulo();
+void action_NewObject();
+void action_DefineLocal2();
+void action_InitArray();
+void action_Makehash();
+void action_TypeOf();
+void action_TargetPath();
+void action_Enumerate();
+void action_Add2();
+void action_Less2();
+void action_Equals2();
+void action_ToNumber();
+void action_ToString();
+void action_PushDuplicate();
+void action_StackSwap();
+void action_GetMember();
+void action_SetMember();
+void action_Increment();
+void action_Decrement();
+void action_CallMethod();
+void action_NewMethod();
+void action_BitAnd();
+void action_BitOr();
+void action_BitXor();
+void action_BitLShift();
+void action_BitRShift();
+void action_BitURShift();
+void action_GotoFrame(U16 frame);
+void action_GetUrl(char* url, char* label);
+void action_StoreRegister(U8 reg);
+void action_Constantpool(char* constantpool);
+void action_WaitForFrame(U16 frame, U8 skip);
+void action_SetTarget(char* target);
+void action_GotoLabel(char* label);
+void action_WaitForFrame2(U8 skip);
+void action_With(char*object);
+void action_PushString(char*str);
+void action_PushFloat(float f);
+void action_PushNULL();
+void action_PushRegister(U8 reg);
+void action_PushBoolean(char c);
+void action_PushDouble(double d);
+void action_PushInt(int i);
+void action_PushLookup(U8 index);
+void action_Jump(U16 branch);
+void action_GetUrl2(U8 method);
+void action_DefineFunction(U8*data, int len);
+void action_If(U16 branch);
+void action_Call();
+void action_GotoFrame2(U8 method);
+void swf_ActionEnd();
+
 #endif