some indenting/style fixes.
[swftools.git] / lib / modules / swfobject.c
index a9507ab..d1a7632 100644 (file)
@@ -7,9 +7,19 @@
 
    Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>
  
-   This file is distributed under the GPL, see file COPYING for details 
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU 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 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 */
 
 #define PF_MOVE         0x01
 #define PF_CHAR         0x02
 #define PF_CLIPACTION   0x40
 #define PF_ACTIONEVENT  0x80
 
+int isUnitMatrix(MATRIX* m)
+{
+    /* a matrix with all zeros is also considered
+       "unit matrix", as a zeroed out MATRIX structure
+       usually means that the caller doesn't want to
+       set the matrix */
+    if((   (m->sx == 0x10000 && m->sy == 0x10000) 
+       || (m->sx == 0 && m->sy == 0))
+               && ((m->r0|m->r1|m->tx|m->ty) == 0)
+      )
+       return 1;
+    return 0;
+}
+
+int isUnitCXForm(CXFORM* cx)
+{
+    if((cx->a0==256 && cx->r0==256 && cx->g0==256 && cx->b0==256) &&
+       (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0))
+       return 1;
+    /* A CXForm of all zeros is, unfortunately, not as unlikely
+       as a matrix of all zeros. However, we still treat it
+       as non-existent/uniform transform */
+    if((cx->a0==0 && cx->r0==0 && cx->g0==0 && cx->b0==0) &&
+       (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0))
+       return 1;
+    return 0;
+}
+
 int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,U8 * name)
 { U8 flags;
   if (!t) return -1;
@@ -28,6 +66,9 @@ int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,U8 * name)
        && cx->r0==256 && cx->g0==256 && cx->b0==256 && cx->a0==256)
       cx = 0;
 
+  if(m && isUnitMatrix(m)) 
+      m = 0;
+
   flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)|((m||cx)&&(!id)?PF_MOVE:0);
 
   swf_SetU8(t,flags);
@@ -48,6 +89,9 @@ int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,U8 * nam
   if(cx && cx->r1==0 && cx->g1==0 && cx->b1==0 && cx->a1==0
        && cx->r0==256 && cx->g0==256 && cx->b0==256 && cx->a0==256)
       cx = 0;
+  
+  if(m && isUnitMatrix(m)) 
+      m = 0;
 
   flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)|
           ((m||cx)&&(!id)?PF_MOVE:0)|(clipaction?PF_CLIPACTION:0);
@@ -69,34 +113,6 @@ int swf_ObjectMove(TAG * t,U16 depth,MATRIX * m,CXFORM * cx)
 { return swf_ObjectPlace(t,0,depth,m,cx,NULL);
 }
 
-int isUnitMatrix(MATRIX* m)
-{
-    /* a matrix with all zeros is also considered
-       "unit matrix", as a zeroed out MATRIX structure
-       usually means that the caller doesn't want to
-       set the matrix */
-    if((   (m->sx == 0x10000 && m->sy == 0x10000) 
-       || (m->sx == 0 && m->sy == 0))
-               && ((m->r0|m->r1|m->tx|m->ty) == 0)
-      )
-       return 1;
-    return 0;
-}
-
-int isUnitCXForm(CXFORM* cx)
-{
-    if((cx->a0==256 && cx->r0==256 && cx->g0==256 && cx->b0==256) &&
-       (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0))
-       return 1;
-    /* A CXForm of all zeros is, unfortunately, not as unlikely
-       as a matrix of all zeros. However, we still treat it
-       as non-existent/uniform transform */
-    if((cx->a0==0 && cx->r0==0 && cx->g0==0 && cx->b0==0) &&
-       (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0))
-       return 1;
-    return 0;
-}
-
 void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj)
 { 
     U8 flags;
@@ -110,7 +126,7 @@ void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj)
        int m = !isUnitMatrix(&obj->matrix);
        int cx = !isUnitCXForm(&obj->cxform);
 
-       flags = (obj->id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|
+       flags = (obj->id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(obj->ratio?PF_RATIO:0)|
                (obj->name?PF_NAME:0)|(obj->move?PF_MOVE:0)|
                (obj->clipdepth?PF_CLIPACTION:0);
 
@@ -152,6 +168,8 @@ void swf_GetPlaceObject(TAG * tag,SWFPLACEOBJECT* obj)
     if(flags&4) swf_GetMatrix(tag, &obj->matrix);
     if(flags&8) swf_GetCXForm(tag, &obj->cxform,1);
     if(flags&16) obj->ratio = swf_GetU16(tag);
+    /* if you modify the order of these operations, also
+       modify it in ../src/swfcombine.c */
     if(flags&64) 
        obj->clipdepth = swf_GetU16(tag); //clip
     if(flags&32) {