added gradient fill.
authorkramm <kramm>
Thu, 1 Jan 2004 09:54:38 +0000 (09:54 +0000)
committerkramm <kramm>
Thu, 1 Jan 2004 09:54:38 +0000 (09:54 +0000)
lib/modules/swfshape.c
lib/rfxswf.c
lib/rfxswf.h

index 459db83..1001327 100644 (file)
@@ -182,6 +182,11 @@ int swf_SetFillStyle(TAG * t,FILLSTYLE * f)
       swf_SetU16(t,f->id_bitmap);
       swf_SetMatrix(t,&f->m);
       break;
+    case FILL_LINEAR:
+    case FILL_RADIAL:
+      swf_SetMatrix(t,&f->m);
+      swf_SetGradient(t,&f->gradient,/*alpha?*/t->id==ST_DEFINESHAPE3?1:0);
+      break;
   }
   
   return 0;
@@ -252,63 +257,10 @@ int swf_SetShapeHeader(TAG * t,SHAPE * s)
   return res;
 }
 
-int swf_ShapeExport(int handle,SHAPE * s)  // without Linestyle/Fillstyle Record
-{ int l;
-  if (!s) return 0;
-
-  l = sizeof(SHAPE);
-
-  if (handle>=0)
-    if (write(handle,s,sizeof(SHAPE))!=sizeof(SHAPE)) return -1;
-
-  // Fillstyle, Linestyle ...
-
-  if (s->data)
-  { int ll = (s->bitlen+7)/8;
-    l+=ll;
-    if (handle>=0)
-      if (write(handle,s->data,ll)!=ll) return -1;
-  }
-
-  return l;
-}
-
-int swf_ShapeImport(int handle,SHAPE * * shape)
-{ SHAPE * s;
-
-  if (handle<0) return -1;
-
-  s = (SHAPE *)malloc(sizeof(SHAPE)); shape[0] = s;
-  if (!s) return -1;
-
-  if (read(handle,s,sizeof(SHAPE))!=sizeof(SHAPE))
-  { shape[0] = NULL;
-    free(s);
-    return -1;
-  }
-
-  if (s->data)
-  { int ll = (s->bitlen+7)/8;
-    s->data = (U8*)malloc(ll);
-    if (!s->data)
-    { shape[0] = NULL;
-      free(s);
-      return -1;
-    }
-    if (read(handle,s->data,ll)!=ll)
-    { free(s->data);
-      free(s);
-      shape[0] = NULL;
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitmap)
+int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitmap, GRADIENT*gradient)
 { RGBA def_c;
   MATRIX def_m;    
+  GRADIENT def_g;
 
   // handle defaults
   
@@ -322,6 +274,11 @@ int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitma
   { m = &def_m;
     swf_GetMatrix(NULL,m);
   }
+  if(!gradient)
+  {
+    gradient = &def_g;
+    swf_GetGradient(NULL, gradient, 1);
+  }
 
   // handle memory
   
@@ -342,16 +299,21 @@ int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitma
   s->fillstyle.data[s->fillstyle.n].id_bitmap = id_bitmap;
   memcpy(&s->fillstyle.data[s->fillstyle.n].m,m,sizeof(MATRIX));
   memcpy(&s->fillstyle.data[s->fillstyle.n].color,color,sizeof(RGBA));
+  memcpy(&s->fillstyle.data[s->fillstyle.n].gradient,gradient,sizeof(GRADIENT));
           
   return (++s->fillstyle.n);
 }
 
 int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color)
-{ return swf_ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0);
+{ return swf_ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0,0);
 }
 
 int swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip)
-{ return swf_ShapeAddFillStyle(s,clip?FILL_CLIPPED:FILL_TILED,m,NULL,id_bitmap);
+{ return swf_ShapeAddFillStyle(s,clip?FILL_CLIPPED:FILL_TILED,m,NULL,id_bitmap,0);
+}
+
+int swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial)
+{ return swf_ShapeAddFillStyle(s,radial?FILL_RADIAL:FILL_LINEAR,m,NULL,0,gradient);
 }
 
 int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color)
@@ -730,7 +692,7 @@ void swf_ShapeSetBitmapRect(TAG*tag, U16 gfxid, int width, int height)
     RGBA rgb;
     SRECT r;
     int lines = 0;
-    int ls,fs;
+    int ls=0,fs;
     swf_ShapeNew(&shape);
     rgb.b = rgb.g = rgb.r = 0xff;
     if(lines)
index a3486e6..09f89c5 100644 (file)
@@ -293,6 +293,10 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha)
 {
     GRADIENT dummy;
     int t;
+    if(!tag) {
+      memset(gradient, 0, sizeof(GRADIENT));
+      return;
+    }
     if(!gradient)
        gradient = &dummy;
     gradient->num = swf_GetU8(tag);
@@ -309,6 +313,24 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha)
     }
 }
 
+void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha)
+{
+    int t;
+    if(!tag) {
+      memset(gradient, 0, sizeof(GRADIENT));
+      return;
+    }
+    swf_SetU8(tag, gradient->num);
+    for(t=0; t<8 && t<gradient->num; t++)
+    {
+       swf_SetU8(tag, gradient->ratios[t]);
+       if(!alpha)
+           swf_SetRGB(tag, &gradient->rgba[t]);
+       else
+           swf_SetRGBA(tag, &gradient->rgba[t]);
+    }
+}
+
 int swf_CountUBits(U32 v,int nbits)
 { int n = 32;
   U32 m = 0x80000000;
@@ -1329,3 +1351,4 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
 #include "modules/swfbits.c"
 #include "modules/swfaction.c"
 #include "modules/swfsound.c"
+#include "modules/swfdraw.c"
index fba3f91..c9bdc9e 100644 (file)
@@ -119,6 +119,8 @@ typedef struct _CXFORM
   S16           b0, b1;
 } CXFORM, * LPCXFORM;
 
+#define GRADIENT_LINEAR 0x10
+#define GRADIENT_RADIAL 0x12
 typedef struct _GRADIENT
 {
     int num;
@@ -353,7 +355,7 @@ typedef struct _FILLSTYLE
   RGBA     color;
   MATRIX    m; 
   U16      id_bitmap;
-  GRADIENT* gradient;
+  GRADIENT  gradient;
 } FILLSTYLE, * LPFILLSTYLE;
      
 typedef struct _SHAPE           // NEVER access a Shape-Struct directly !
@@ -412,6 +414,7 @@ int   swf_SetSimpleShape(TAG * t,SHAPE * s);   // without Linestyle/Fillstyle Re
 int   swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color);
 int   swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color);
 int   swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip);
+int   swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial);
 
 int   swf_SetShapeStyles(TAG * t,SHAPE * s);
 int   swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits);
@@ -435,6 +438,7 @@ void           swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape);
 SRECT     swf_GetShapeBoundingBox(SHAPE2*shape);
 void       swf_SetShape2(TAG*tag, SHAPE2*shape);
 void      swf_Shape2Free(SHAPE2 * s);
+void   swf_DumpShape(SHAPE2*shape2);
 
 // swfdraw.c
 
@@ -449,14 +453,22 @@ typedef struct _SWFSHAPEDRAWER
     SHAPE*shape;
     TAG*tag;
     int tagfree;
+    int lastx;
+    int lasty;
+    SRECT bbox;
+    char isfinished;
 } SWFSHAPEDRAWER;
 
-void swf_DrawerInit(SWFSHAPEDRAWER*draw);
+void swf_DrawerInit(SWFSHAPEDRAWER*draw, TAG*tag);
 void swf_DrawerMoveTo(SWFSHAPEDRAWER*draw, FPOINT * to);
 void swf_DrawerLineTo(SWFSHAPEDRAWER*draw, FPOINT * to);
 void swf_DrawerSplineTo(SWFSHAPEDRAWER*draw, FPOINT *  control1, FPOINT*  to);
 void swf_DrawerCubicTo(SWFSHAPEDRAWER*draw, FPOINT*  control1, FPOINT* control2, FPOINT*  to);
 void swf_DrawerConicTo(SWFSHAPEDRAWER*draw, FPOINT*  control, FPOINT*  to);
+void swf_DrawerFinish(SWFSHAPEDRAWER*draw);
+SHAPE* swf_DrawerToShape(SWFSHAPEDRAWER*draw);
+
+void swf_DrawString(SWFSHAPEDRAWER*draw, const char*source);
 
 // swffont.c
 
@@ -585,6 +597,8 @@ void swf_SetEditText(TAG*tag, U16 flags, SRECT r, char*text, RGBA*color,
 
 SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, char*text, int scale);
 
+void swf_DrawText(SWFSHAPEDRAWER*draw, SWFFONT*font, char*text);
+
 // swfdump.c
 
 void swf_DumpHeader(FILE * f,SWF * swf);