placeobject(2) handling functions
authorkramm <kramm>
Wed, 12 Jun 2002 20:36:26 +0000 (20:36 +0000)
committerkramm <kramm>
Wed, 12 Jun 2002 20:36:26 +0000 (20:36 +0000)
lib/modules/swfobject.c

index 1b58108..8d69e96 100644 (file)
@@ -18,6 +18,7 @@
 #define PF_RATIO        0x10
 #define PF_NAME         0x20
 #define PF_CLIPACTION   0x40
+#define PF_ACTIONEVENT  0x80
 
 int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,U8 * name)
 { U8 flags;
@@ -57,3 +58,100 @@ int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,U8 * nam
 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;
+    if (!t) return ;
+    if(t->id == ST_PLACEOBJECT) {
+       swf_SetU16(t, obj->id);
+       swf_SetU16(t, obj->depth);      
+       swf_SetMatrix(t, &obj->matrix);
+       swf_SetCXForm(t, &obj->cxform, 0);
+    } else {
+       int m = !isUnitMatrix(&obj->matrix);
+       int cx = !isUnitCXForm(&obj->cxform);
+
+       flags = (obj->id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|
+               (obj->name?PF_NAME:0)|(obj->move?PF_MOVE:0)|
+               (obj->clipdepth?PF_CLIPACTION:0);
+
+       swf_SetU8(t,flags);
+       swf_SetU16(t,obj->depth);
+       if (flags&PF_CHAR) swf_SetU16(t,obj->id);
+       if (flags&PF_MATRIX) swf_SetMatrix(t,&obj->matrix);
+       if (flags&PF_CXFORM) swf_SetCXForm(t,&obj->cxform,(obj->cxform.a0!=256)||
+                                                         (obj->cxform.a1));
+       if (flags&PF_RATIO) swf_SetU16(t,obj->ratio);
+       if (flags&PF_NAME) swf_SetString(t,obj->name);
+       if (flags&PF_CLIPACTION) swf_SetU16(t,obj->clipdepth);
+       if (flags&PF_ACTIONEVENT) {
+           // ...
+       }
+    }
+}
+
+void swf_GetPlaceObject(TAG * tag,SWFPLACEOBJECT* obj)
+{
+    U8 flags = swf_GetU8(tag);
+    memset(obj,0,sizeof(SWFPLACEOBJECT));
+    if(!tag) {
+       swf_GetMatrix(0,&obj->matrix);
+       swf_GetCXForm(0,&obj->cxform,1);
+    }
+
+    obj->depth = swf_GetU16(tag);
+    //flags&1: move
+    if(flags&2) obj->id = swf_GetU16(tag);
+    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(flags&32) {
+       int l = strlen(&tag->data[tag->pos]);
+       int t = 0;
+       U8*data = malloc(l+1);
+       obj->name = data;
+       while((data[t++] = swf_GetU8(tag))); 
+    }
+    if(flags&64) 
+       obj->clipdepth = swf_GetU16(tag); //clip
+
+    /* Actionscript ignored (for now) */
+    obj->actions = 0;
+}
+
+void swf_PlaceObjectFree(SWFPLACEOBJECT* obj)
+{
+    if(obj->name)
+       free(obj->name);
+    free(obj);
+}
+