private FillStyle ReadFillStyle(SWFDataTypeReader shapeReader, Tag format) { FillStyle style = new FillStyle(); style.Type = (FillType)shapeReader.ReadUI8(); if (style.Type == FillType.Solid) { if (format == Tag.DefineShape3 || format == Tag.DefineShape4) /* Assuming shape4 goes here. Spec is ambiguous. */ { style.Colour = shapeReader.ReadRGBA(); } else if (format == Tag.DefineShape || format == Tag.DefineShape2) { style.Colour = shapeReader.ReadRGB(); } else { throw new SWFModellerException(SWFModellerError.SWFParsing, "Bad tag format for fill style"); } } if (style.Type == FillType.LinearGradient || style.Type == FillType.RadialGradient || style.Type == FillType.FocalGradient) { style.FillMatrix = shapeReader.ReadMatrix(); shapeReader.Align8(); if (style.Type == FillType.LinearGradient || style.Type == FillType.RadialGradient) { style.Gradient = this.ReadGradient(shapeReader, format); } else /* FocalGradient */ { style.Gradient = this.ReadFocalGradient(shapeReader); } } if (FillTypes.IsBitmap(style.Type)) { int cid = shapeReader.ReadUI16(); /* Some fills have this magic number in them which seems to deliberately not * reference a bitmap. The spec is silent on the matter. Oh flash, you * stammering ape. */ if (cid != 0x0000FFFF) { style.Bitmap = this.ImageFinder.FindImage(cid); } style.FillMatrix = shapeReader.ReadMatrix(); shapeReader.Align8(); } return(style); }
private LineStyle ReadLineStyle(SWFDataTypeReader shapeReader, Tag format) { LineStyle ls = new LineStyle(); ls.Width = shapeReader.ReadUI16(); if (format == Tag.DefineShape || format == Tag.DefineShape2) { ls.Colour = shapeReader.ReadRGB(); } else if (format == Tag.DefineShape3 || format == Tag.DefineShape4) { ls.Colour = shapeReader.ReadRGBA(); } else { throw new SWFModellerException(SWFModellerError.Internal, "Can't line style in shape format " + format.ToString()); } return(ls); }
private Gradient ReadGradient(SWFDataTypeReader shapeReader, Tag format) { GradientSpread spread = (GradientSpread)shapeReader.ReadUBits(2); GradientInterpolation interp = (GradientInterpolation)shapeReader.ReadUBits(2); int numRecs = (int)shapeReader.ReadUBits(4); GradientRecord[] recs = new GradientRecord[numRecs]; for (int i = 0; i < recs.Length; i++) { GradientRecord rec = new GradientRecord(); rec.Ratio = shapeReader.ReadUI8(); if (format == Tag.DefineShape || format == Tag.DefineShape2) { rec.Colour = shapeReader.ReadRGB(); } else if (format == Tag.DefineShape3 || format == Tag.DefineShape4) { rec.Colour = shapeReader.ReadRGBA(); } else { throw new SWFModellerException(SWFModellerError.Internal, "Can't read gradient in shape format " + format.ToString()); } recs[i] = rec; } return(new Gradient() { Records = recs, Interpolation = interp, Spread = spread }); }
private LineStyle ReadLineStyle(SWFDataTypeReader shapeReader, Tag format) { LineStyle ls = new LineStyle(); ls.Width = shapeReader.ReadUI16(); if (format == Tag.DefineShape || format == Tag.DefineShape2) { ls.Colour = shapeReader.ReadRGB(); } else if (format == Tag.DefineShape3 || format == Tag.DefineShape4) { ls.Colour = shapeReader.ReadRGBA(); } else { throw new SWFModellerException(SWFModellerError.Internal, "Can't line style in shape format " + format.ToString()); } return ls; }
private Gradient ReadGradient(SWFDataTypeReader shapeReader, Tag format) { GradientSpread spread = (GradientSpread)shapeReader.ReadUBits(2); GradientInterpolation interp = (GradientInterpolation)shapeReader.ReadUBits(2); int numRecs = (int)shapeReader.ReadUBits(4); GradientRecord[] recs = new GradientRecord[numRecs]; for (int i = 0; i < recs.Length; i++) { GradientRecord rec = new GradientRecord(); rec.Ratio = shapeReader.ReadUI8(); if (format == Tag.DefineShape || format == Tag.DefineShape2) { rec.Colour = shapeReader.ReadRGB(); } else if (format == Tag.DefineShape3 || format == Tag.DefineShape4) { rec.Colour = shapeReader.ReadRGBA(); } else { throw new SWFModellerException(SWFModellerError.Internal, "Can't read gradient in shape format " + format.ToString()); } recs[i] = rec; } return new Gradient() { Records = recs, Interpolation = interp, Spread = spread }; }
private FillStyle ReadFillStyle(SWFDataTypeReader shapeReader, Tag format) { FillStyle style = new FillStyle(); style.Type = (FillType)shapeReader.ReadUI8(); if (style.Type == FillType.Solid) { if (format == Tag.DefineShape3 || format == Tag.DefineShape4) /* Assuming shape4 goes here. Spec is ambiguous. */ { style.Colour = shapeReader.ReadRGBA(); } else if (format == Tag.DefineShape || format == Tag.DefineShape2) { style.Colour = shapeReader.ReadRGB(); } else { throw new SWFModellerException(SWFModellerError.SWFParsing, "Bad tag format for fill style"); } } if (style.Type == FillType.LinearGradient || style.Type == FillType.RadialGradient || style.Type == FillType.FocalGradient) { style.FillMatrix = shapeReader.ReadMatrix(); shapeReader.Align8(); if (style.Type == FillType.LinearGradient || style.Type == FillType.RadialGradient) { style.Gradient = this.ReadGradient(shapeReader, format); } else /* FocalGradient */ { style.Gradient = this.ReadFocalGradient(shapeReader); } } if (FillTypes.IsBitmap(style.Type)) { int cid = shapeReader.ReadUI16(); /* Some fills have this magic number in them which seems to deliberately not * reference a bitmap. The spec is silent on the matter. Oh flash, you * stammering ape. */ if (cid != 0x0000FFFF) { style.Bitmap = this.ImageFinder.FindImage(cid); } style.FillMatrix = shapeReader.ReadMatrix(); shapeReader.Align8(); } return style; }