dump out a warning if there's an overflow during matrix multiplication
[swftools.git] / lib / modules / swftools.c
index 163d855..37c8e8b 100644 (file)
 #define S64 long long
 SFIXED RFXSWF_SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2)
 { S64 a;
-  a = (S64)a1*(S64)b1+(S64)a2*(S64)b2;
-  return (SFIXED)(a>>16);
+  a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16;
+  SFIXED result = (SFIXED)(a);
+  if(a!=result) 
+      fprintf(stderr, "Warning: overflow in matrix multiplication");
+  return result;
 }
 SFIXED RFXSWF_QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED
 { S64 z = zaehler<<16;
@@ -42,8 +45,8 @@ MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2)
   if (!s1) return (s2)?(MATRIX *)memcpy(d,s2,sizeof(MATRIX)):NULL;
   if (!s2) return (MATRIX *)memcpy(d,s1,sizeof(MATRIX));
   
-  d->tx = RFXSWF_SP(s1->sx,s1->r1,s2->tx,s2->ty);
-  d->ty = RFXSWF_SP(s1->r0,s1->sy,s2->tx,s2->ty);
+  d->tx = s1->tx + RFXSWF_SP(s1->sx,s1->r1,s2->tx,s2->ty);
+  d->ty = s1->ty + RFXSWF_SP(s1->r0,s1->sy,s2->tx,s2->ty);
   
   d->sx = RFXSWF_SP(s1->sx,s1->r1,s2->sx,s2->r0);
   d->r0 = RFXSWF_SP(s1->r0,s1->sy,s2->sx,s2->r0);
@@ -920,6 +923,15 @@ U8 swf_isTextTag(TAG*tag)
     return 0;
 }
 
+U8 swf_isFontTag(TAG*tag)
+{
+    if(tag->id == ST_DEFINEFONT ||
+       tag->id == ST_DEFINEFONT2 ||
+       tag->id == ST_DEFINEFONTINFO)
+        return 1;
+    return 0;
+}
+
 U8  swf_isImageTag(TAG*tag)
 {
     if(tag->id == ST_DEFINEBITSJPEG ||