protected void CheckBits(Stream stream, params string[] bits) { stream.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(stream); uint bitIndex = 0; foreach (var bitString in bits) { foreach (var ch in bitString) { switch (ch) { case '0': Assert.AreEqual(false, reader.ReadBit(), "Checking bit " + bitIndex); bitIndex++; break; case '1': Assert.AreEqual(true, reader.ReadBit(), "Checking bit " + bitIndex); bitIndex++; break; case '.': break; default: throw new InvalidOperationException("Invalid character " + ch); } } } Assert.AreEqual(stream.Length, stream.Position, "Should reach end of the stream"); }
public static SwfColorTransform Read(SwfStreamReader reader, bool with_alpha) { var transform = SwfColorTransform.identity; transform.HasAdd = reader.ReadBit(); transform.HasMul = reader.ReadBit(); var bits = reader.ReadUnsignedBits(4); if (transform.HasMul) { transform.RMul = (short)reader.ReadSignedBits(bits); transform.GMul = (short)reader.ReadSignedBits(bits); transform.BMul = (short)reader.ReadSignedBits(bits); transform.AMul = with_alpha ? (short)reader.ReadSignedBits(bits) : byte.MaxValue; } if (transform.HasAdd) { transform.RAdd = (short)reader.ReadSignedBits(bits); transform.GAdd = (short)reader.ReadSignedBits(bits); transform.BAdd = (short)reader.ReadSignedBits(bits); transform.AAdd = with_alpha ? (short)reader.ReadSignedBits(bits) : (short)0; } reader.AlignToByte(); return(transform); }
static Filter ReadConcreteFilter(GradientBevelFilter filter, SwfStreamReader reader) { var num_colors = reader.ReadByte(); filter.GradientColors = new SwfColor[num_colors]; for (var i = 0; i < num_colors; ++i) { filter.GradientColors[i] = SwfColor.Read(reader, true); } filter.GradientRatio = new byte[num_colors]; for (var i = 0; i < num_colors; ++i) { filter.GradientRatio[i] = reader.ReadByte(); } filter.BlurX = reader.ReadFixedPoint_16_16(); filter.BlurY = reader.ReadFixedPoint_16_16(); filter.Angle = reader.ReadFixedPoint_16_16(); filter.Distance = reader.ReadFixedPoint_16_16(); filter.Strength = reader.ReadFixedPoint_8_8(); filter.InnerShadow = reader.ReadBit(); filter.Knockout = reader.ReadBit(); filter.CompositeSource = reader.ReadBit(); filter.OnTop = reader.ReadBit(); filter.Passes = reader.ReadUnsignedBits(4); return(filter); }
static void SkipLine2Style(SwfStreamReader reader) { reader.ReadUInt16(); // Width reader.ReadUnsignedBits(2); // StartCapStyle var join_style = reader.ReadUnsignedBits(2); var has_fill_flag = reader.ReadBit(); reader.ReadBit(); // NoHScaleFlag reader.ReadBit(); // NoVScaleFlag reader.ReadBit(); // PixelHintingFlag reader.ReadUnsignedBits(5); // Reserved reader.ReadBit(); // NoClose reader.ReadUnsignedBits(2); // EndCapStyle if (join_style == 2) { reader.ReadFixedPoint_8_8(); // MiterLimitFactor } if (has_fill_flag) { ReadFillStyle(reader, true); // FillStyle } else { SwfColor.Read(reader, true); } }
static Filter ReadConcreteFilter(GlowFilter filter, SwfStreamReader reader) { filter.GlowColor = SwfColor.Read(reader, true); filter.BlurX = reader.ReadFixedPoint_16_16(); filter.BlurY = reader.ReadFixedPoint_16_16(); filter.Strength = reader.ReadFixedPoint_8_8(); filter.InnerGlow = reader.ReadBit(); filter.Knockout = reader.ReadBit(); filter.CompositeSource = reader.ReadBit(); filter.Passes = reader.ReadUnsignedBits(5); return(filter); }
public void ReadUnsignedBits2Test() { var mem = new MemoryStream(); var writer = new SwfStreamWriter(mem); writer.WriteBit(false); writer.WriteBit(false); writer.WriteBit(false); writer.WriteBit(false); writer.WriteBit(true); writer.WriteBit(false); writer.WriteBit(true); writer.WriteBit(false); mem.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(mem); Assert.AreEqual(false, reader.ReadBit()); Assert.AreEqual(false, reader.ReadBit()); Assert.AreEqual(false, reader.ReadBit()); Assert.AreEqual(false, reader.ReadBit()); Assert.AreEqual(true, reader.ReadBit()); Assert.AreEqual(false, reader.ReadBit()); Assert.AreEqual(true, reader.ReadBit()); Assert.AreEqual(false, reader.ReadBit()); }
static void SkipStraigtEdgeShapeRecord(SwfStreamReader reader) { var num_bits = reader.ReadUnsignedBits(4) + 2; var general_line_flag = reader.ReadBit(); var vert_line_flag = general_line_flag ? false : reader.ReadBit(); if (general_line_flag || !vert_line_flag) { reader.ReadSignedBits(num_bits); // delta_x } if (general_line_flag || vert_line_flag) { reader.ReadSignedBits(num_bits); // delta_y } }
static Filter ReadConcreteFilter(BevelFilter filter, SwfStreamReader reader) { filter.ShadowColor = SwfColor.Read(reader, true); filter.HighlightColor = SwfColor.Read(reader, true); filter.BlurX = reader.ReadFixedPoint_16_16(); filter.BlurY = reader.ReadFixedPoint_16_16(); filter.Angle = reader.ReadFixedPoint_16_16(); filter.Distance = reader.ReadFixedPoint_16_16(); filter.Strength = reader.ReadFixedPoint_8_8(); filter.InnerShadow = reader.ReadBit(); filter.Knockout = reader.ReadBit(); filter.CompositeSource = reader.ReadBit(); filter.OnTop = reader.ReadBit(); filter.Passes = reader.ReadUnsignedBits(4); return(filter); }
static Filter ReadConcreteFilter(ConvolutionFilter filter, SwfStreamReader reader) { filter.MatrixX = reader.ReadByte(); filter.MatrixY = reader.ReadByte(); filter.Divisor = reader.ReadFloat32(); filter.Bias = reader.ReadFloat32(); filter.Matrix = new float[filter.MatrixX * filter.MatrixY]; for (var i = 0; i < filter.Matrix.Length; ++i) { filter.Matrix[i] = reader.ReadFloat32(); } filter.DefaultColor = SwfColor.Read(reader, true); reader.ReadUnsignedBits(6); // reserved filter.Clamp = reader.ReadBit(); filter.PreserveAlpha = reader.ReadBit(); return(filter); }
public override bool ReadBit() { var a = _first.ReadBit(); var b = _second.ReadBit(); if (a != b) { throw new Exception(string.Format("a={0}, b={1}", a, b)); } return(a); }
public static SwfMatrix Read(SwfStreamReader reader, bool fill_style) { var matrix = SwfMatrix.identity; var has_scale = reader.ReadBit(); if (has_scale) { var bits = (byte)reader.ReadUnsignedBits(5); matrix.ScaleX = reader.ReadFixedPoint16(bits); matrix.ScaleY = reader.ReadFixedPoint16(bits); } else { matrix.ScaleX = matrix.ScaleY = 1.0f; } var has_rotate = reader.ReadBit(); if (has_rotate) { var bits = (byte)reader.ReadUnsignedBits(5); matrix.RotateSkew0 = reader.ReadFixedPoint16(bits); matrix.RotateSkew1 = reader.ReadFixedPoint16(bits); } else { matrix.RotateSkew0 = matrix.RotateSkew1 = 0.0f; } var translate_bits = (byte)reader.ReadUnsignedBits(5); matrix.TranslateX = reader.ReadSignedBits(translate_bits) / 20.0f; matrix.TranslateY = reader.ReadSignedBits(translate_bits) / 20.0f; reader.AlignToByte(); return(matrix); }
public static PlaceObject2Tag Create(SwfStreamReader reader) { var tag = new PlaceObject2Tag(); tag.HasClipActions = reader.ReadBit(); tag.HasClipDepth = reader.ReadBit(); tag.HasName = reader.ReadBit(); tag.HasRatio = reader.ReadBit(); tag.HasColorTransform = reader.ReadBit(); tag.HasMatrix = reader.ReadBit(); tag.HasCharacter = reader.ReadBit(); tag.Move = reader.ReadBit(); tag.Depth = reader.ReadUInt16(); tag.CharacterId = tag.HasCharacter ? reader.ReadUInt16() : (ushort)0; tag.Matrix = tag.HasMatrix ? SwfMatrix.Read(reader, false) : SwfMatrix.identity; tag.ColorTransform = tag.HasColorTransform ? SwfColorTransform.Read(reader, true) : SwfColorTransform.identity; tag.Ratio = tag.HasRatio ? reader.ReadUInt16() : (ushort)0; tag.Name = tag.HasName ? reader.ReadString() : string.Empty; tag.ClipDepth = tag.HasClipDepth ? reader.ReadUInt16() : (ushort)0; tag.ClipActions = tag.HasClipActions ? SwfClipActions.Read(reader) : SwfClipActions.identity; return(tag); }
public void ReadSignedBitsPositiveTest() { var mem = new MemoryStream(); mem.WriteByte(0x2a); mem.WriteByte(0xc3); mem.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(mem); Assert.AreEqual(0x0ab, reader.ReadSignedBits(10), "Value"); Assert.AreEqual(false, reader.ReadBit(), "Bit 10"); Assert.AreEqual(false, reader.ReadBit(), "Bit 11"); Assert.AreEqual(false, reader.ReadBit(), "Bit 12"); Assert.AreEqual(false, reader.ReadBit(), "Bit 13"); Assert.AreEqual(true, reader.ReadBit(), "Bit 14"); Assert.AreEqual(true, reader.ReadBit(), "Bit 15"); Assert.AreEqual(mem.Length, mem.Position, "Should reach end of the stream"); }
public void ReadSignedBitsNegativeTest() { var mem = new MemoryStream(); mem.WriteByte(0xaa); mem.WriteByte(0xc3); mem.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(mem); Assert.AreEqual(-0x155, reader.ReadSignedBits(10), "Value"); Assert.AreEqual(false, reader.ReadBit(), "Bit 10"); Assert.AreEqual(false, reader.ReadBit(), "Bit 11"); Assert.AreEqual(false, reader.ReadBit(), "Bit 12"); Assert.AreEqual(false, reader.ReadBit(), "Bit 13"); Assert.AreEqual(true, reader.ReadBit(), "Bit 14"); Assert.AreEqual(true, reader.ReadBit(), "Bit 15"); Assert.AreEqual(mem.Length, mem.Position, "Should reach end of the stream"); }
public void ReadUnsignedBitsTest() { var mem = new MemoryStream(); mem.WriteByte(0xaa); mem.WriteByte(0xc3); mem.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(mem); const int bits = 10; Assert.AreEqual(0x2ab, reader.ReadUnsignedBits(bits), "Value"); Assert.AreEqual(false, reader.ReadBit(), "Bit 10"); Assert.AreEqual(false, reader.ReadBit(), "Bit 11"); Assert.AreEqual(false, reader.ReadBit(), "Bit 12"); Assert.AreEqual(false, reader.ReadBit(), "Bit 13"); Assert.AreEqual(true, reader.ReadBit(), "Bit 14"); Assert.AreEqual(true, reader.ReadBit(), "Bit 15"); Assert.AreEqual(mem.Length, mem.Position, "Should reach end of the stream"); }
public void ReadBitTest() { var mem = new MemoryStream(); mem.WriteByte(0xaa); mem.WriteByte(0x73); mem.Seek(0, SeekOrigin.Begin); var reader = new SwfStreamReader(mem); Assert.AreEqual(true, reader.ReadBit(), "Bit 0"); Assert.AreEqual(false, reader.ReadBit(), "Bit 1"); Assert.AreEqual(true, reader.ReadBit(), "Bit 2"); Assert.AreEqual(false, reader.ReadBit(), "Bit 3"); Assert.AreEqual(true, reader.ReadBit(), "Bit 4"); Assert.AreEqual(false, reader.ReadBit(), "Bit 5"); Assert.AreEqual(true, reader.ReadBit(), "Bit 6"); Assert.AreEqual(false, reader.ReadBit(), "Bit 7"); Assert.AreEqual(false, reader.ReadBit(), "Bit 8"); Assert.AreEqual(true, reader.ReadBit(), "Bit 9"); Assert.AreEqual(true, reader.ReadBit(), "Bit 10"); Assert.AreEqual(true, reader.ReadBit(), "Bit 11"); Assert.AreEqual(false, reader.ReadBit(), "Bit 12"); Assert.AreEqual(false, reader.ReadBit(), "Bit 13"); Assert.AreEqual(true, reader.ReadBit(), "Bit 14"); Assert.AreEqual(true, reader.ReadBit(), "Bit 15"); Assert.AreEqual(mem.Length, mem.Position, "Should reach end of the stream"); }
public static PlaceObject3Tag Create(SwfStreamReader reader) { var tag = new PlaceObject3Tag(); tag.HasClipActions = reader.ReadBit(); tag.HasClipDepth = reader.ReadBit(); tag.HasName = reader.ReadBit(); tag.HasRatio = reader.ReadBit(); tag.HasColorTransform = reader.ReadBit(); tag.HasMatrix = reader.ReadBit(); tag.HasCharacter = reader.ReadBit(); tag.Move = reader.ReadBit(); reader.ReadBit(); // reserved tag.OpaqueBackground = reader.ReadBit(); tag.HasVisible = reader.ReadBit(); tag.HasImage = reader.ReadBit(); tag.HasClassName = reader.ReadBit(); tag.HasCacheAsBitmap = reader.ReadBit(); tag.HasBlendMode = reader.ReadBit(); tag.HasFilterList = reader.ReadBit(); tag.Depth = reader.ReadUInt16(); tag.ClassName = tag.HasClassName ? reader.ReadString() : string.Empty; tag.CharacterId = tag.HasCharacter ? reader.ReadUInt16() : (ushort)0; tag.Matrix = tag.HasMatrix ? SwfMatrix.Read(reader) : SwfMatrix.identity; tag.ColorTransform = tag.HasColorTransform ? SwfColorTransform.Read(reader, true) : SwfColorTransform.identity; tag.Ratio = tag.HasRatio ? reader.ReadUInt16() : (ushort)0; tag.Name = tag.HasName ? reader.ReadString() : string.Empty; tag.ClipDepth = tag.HasClipDepth ? reader.ReadUInt16() : (ushort)0; tag.SurfaceFilters = tag.HasFilterList ? SwfSurfaceFilters.Read(reader) : SwfSurfaceFilters.identity; tag.BlendMode = tag.HasBlendMode ? SwfBlendMode.Read(reader) : SwfBlendMode.identity; tag.BitmapCache = tag.HasCacheAsBitmap ? (0 != reader.ReadByte()) : false; tag.Visible = tag.HasVisible && !reader.IsEOF ? (0 != reader.ReadByte()) : true; tag.BackgroundColor = tag.HasVisible && !reader.IsEOF ? SwfColor.Read(reader, true) : SwfColor.identity; tag.ClipActions = tag.HasClipActions && !reader.IsEOF ? SwfClipActions.Read(reader) : SwfClipActions.identity; return(tag); }
static bool ReadShapeRecord( SwfStreamReader reader, List <FillStyle> fill_styles, ref uint fill_style_bits, ref uint line_style_bits, bool allow_big_array, bool with_alpha, bool line2_type) { var is_edge = reader.ReadBit(); if (is_edge) { var straight = reader.ReadBit(); if (straight) { SkipStraigtEdgeShapeRecord(reader); } else { SkipCurvedEdgeShapeRecord(reader); } return(false); } else { var state_new_styles = reader.ReadBit(); var state_line_style = reader.ReadBit(); var state_fill_style1 = reader.ReadBit(); var state_fill_style0 = reader.ReadBit(); var state_move_to = reader.ReadBit(); var is_end_shape_record = !state_new_styles && !state_line_style && !state_fill_style0 && !state_fill_style1 && !state_move_to; if (is_end_shape_record) { return(true); } else { if (state_move_to) { var move_bits = reader.ReadUnsignedBits(5); reader.ReadSignedBits(move_bits); // move_delta_x reader.ReadSignedBits(move_bits); // move_delta_y } if (state_fill_style0) { reader.ReadUnsignedBits(fill_style_bits); // fill_style_0 } if (state_fill_style1) { reader.ReadUnsignedBits(fill_style_bits); // fill_style_1 } if (state_line_style) { reader.ReadUnsignedBits(line_style_bits); // line_style } if (state_new_styles) { reader.AlignToByte(); fill_styles.AddRange(ReadFillStyles(reader, allow_big_array, with_alpha)); SkipLineStyles(reader, allow_big_array, with_alpha, line2_type); fill_style_bits = reader.ReadUnsignedBits(4); line_style_bits = reader.ReadUnsignedBits(4); } return(false); } } }