コード例 #1
0
        public static void WriteClipActionRecord(this ISwfStreamWriter writer, byte swfVersion, ClipActionRecord record)
        {
            writer.WriteClipEventFlags(swfVersion, record.Flags);
            if (record.Flags.IsEmpty)
            {
                return;
            }

            var awmem = new MemoryStream();
            var aw    = new ActionWriter(new SwfStreamWriter(awmem));

            foreach (var action in record.Actions)
            {
                aw.WriteAction(action);
            }

            var size = awmem.Length + (record.Flags.ClipEventKeyPress ? 1 : 0);

            writer.WriteUInt32((uint)size);

            if (record.Flags.ClipEventKeyPress)
            {
                writer.WriteByte(record.KeyCode);
            }

            writer.WriteBytes(awmem.ToArray());
        }
コード例 #2
0
 /// <summary>
 /// Writes the ARGB color to writer.
 /// </summary>
 /// <param name="writer">The writer to which to write color.</param>
 /// <param name="val">Color to be written.</param>
 public static void WriteARGB(this ISwfStreamWriter writer, SwfRGBA val)
 {
     writer.WriteByte(val.Alpha);
     writer.WriteByte(val.Red);
     writer.WriteByte(val.Green);
     writer.WriteByte(val.Blue);
 }
コード例 #3
0
ファイル: ButtonStreamExt.cs プロジェクト: shhadi/SwfLib
        public static void WriteButtonRecordEx(this ISwfStreamWriter writer, ButtonRecordEx button)
        {
            writer.WriteUnsignedBits(button.Reserved, 2);
            writer.WriteBit(button.BlendMode.HasValue);
            writer.WriteBit(button.Filters.Count > 0);
            writer.WriteBit(button.StateHitTest);
            writer.WriteBit(button.StateDown);
            writer.WriteBit(button.StateOver);
            writer.WriteBit(button.StateUp);
            if (!button.IsEndButton)
            {
                writer.WriteUInt16(button.CharacterID);
                writer.WriteUInt16(button.PlaceDepth);
                writer.WriteMatrix(ref button.PlaceMatrix);
                writer.WriteColorTransformRGBA(button.ColorTransform);
                writer.FlushBits();

                if (button.Filters.Count > 0)
                {
                    writer.WriteFilterList(button.Filters);
                }
                if (button.BlendMode.HasValue)
                {
                    writer.WriteByte((byte)button.BlendMode.Value);
                }
            }
        }
コード例 #4
0
ファイル: LineStyleStreamExt.cs プロジェクト: shhadi/SwfLib
 public static void WriteLineStyleEx(this ISwfStreamWriter writer, LineStyleEx lineStyle)
 {
     writer.WriteUInt16(lineStyle.Width);
     writer.WriteUnsignedBits((uint)lineStyle.StartCapStyle, 2);
     writer.WriteUnsignedBits((uint)lineStyle.JoinStyle, 2);
     writer.WriteBit(lineStyle.HasFill);
     writer.WriteBit(lineStyle.NoHScale);
     writer.WriteBit(lineStyle.NoVScale);
     writer.WriteBit(lineStyle.PixelHinting);
     writer.WriteUnsignedBits(lineStyle.Reserved, 5);
     writer.WriteBit(lineStyle.NoClose);
     writer.WriteUnsignedBits((uint)lineStyle.EndCapStyle, 2);
     if (lineStyle.JoinStyle == JoinStyle.Miter)
     {
         writer.WriteFixedPoint8(lineStyle.MilterLimitFactor);
     }
     if (lineStyle.HasFill)
     {
         writer.WriteFillStyleRGBA(lineStyle.FillStyle);
     }
     else
     {
         writer.WriteRGBA(lineStyle.Color);
     }
 }
コード例 #5
0
        public static void WriteClipEventFlags(this ISwfStreamWriter writer, byte swfVersion, ClipEventFlags flags)
        {
            writer.WriteBit(flags.ClipEventKeyUp);
            writer.WriteBit(flags.ClipEventKeyDown);
            writer.WriteBit(flags.ClipEventMouseUp);
            writer.WriteBit(flags.ClipEventMouseDown);
            writer.WriteBit(flags.ClipEventMouseMove);
            writer.WriteBit(flags.ClipEventUnload);
            writer.WriteBit(flags.ClipEventEnterFrame);
            writer.WriteBit(flags.ClipEventLoad);

            writer.WriteBit(flags.ClipEventDragOver);
            writer.WriteBit(flags.ClipEventRollOut);
            writer.WriteBit(flags.ClipEventRollOver);
            writer.WriteBit(flags.ClipEventReleaseOutside);
            writer.WriteBit(flags.ClipEventRelease);
            writer.WriteBit(flags.ClipEventPress);
            writer.WriteBit(flags.ClipEventInitialize);
            writer.WriteBit(flags.ClipEventData);

            if (swfVersion >= 6)
            {
                writer.WriteUnsignedBits(flags.Reserved, 5);
                writer.WriteBit(flags.ClipEventConstruct);
                writer.WriteBit(flags.ClipEventKeyPress);
                writer.WriteBit(flags.ClipEventDragOut);

                writer.WriteByte(flags.Reserved2);
            }
        }
コード例 #6
0
 public static void WriteClipActionRecords(this ISwfStreamWriter writer, byte swfVersion, IList <ClipActionRecord> source)
 {
     foreach (var record in source)
     {
         writer.WriteClipActionRecord(swfVersion, record);
     }
 }
コード例 #7
0
        public static void WriteColorTransformRGB(this ISwfStreamWriter writer, ref ColorTransformRGB tranform)
        {
            var bitsCounter = new SignedBitsCount(0);

            if (tranform.HasAddTerms)
            {
                bitsCounter.AddValue(tranform.RedAddTerm);
                bitsCounter.AddValue(tranform.GreenAddTerm);
                bitsCounter.AddValue(tranform.BlueAddTerm);
            }
            if (tranform.HasMultTerms)
            {
                bitsCounter.AddValue(tranform.RedMultTerm);
                bitsCounter.AddValue(tranform.GreenMultTerm);
                bitsCounter.AddValue(tranform.BlueMultTerm);
            }
            writer.WriteBit(tranform.HasAddTerms);
            writer.WriteBit(tranform.HasMultTerms);
            var bits = bitsCounter.GetBits();

            writer.WriteUnsignedBits(bits, 4);
            if (tranform.HasMultTerms)
            {
                writer.WriteSignedBits(tranform.RedMultTerm, bits);
                writer.WriteSignedBits(tranform.GreenMultTerm, bits);
                writer.WriteSignedBits(tranform.BlueMultTerm, bits);
            }
            if (tranform.HasAddTerms)
            {
                writer.WriteSignedBits(tranform.RedAddTerm, bits);
                writer.WriteSignedBits(tranform.GreenAddTerm, bits);
                writer.WriteSignedBits(tranform.BlueAddTerm, bits);
            }
            writer.FlushBits();
        }
コード例 #8
0
        private static void WriteStyleChangeShapeRecord(ISwfStreamWriter writer, StyleChangeShapeRecord record, ref uint fillStylesBits, ref uint lineStylesBits)
        {
            writer.WriteBit(false);
            var stateNewStyles  = record.StateNewStyles;
            var stateFillStyle0 = record.FillStyle0.HasValue;
            var stateFillStyle1 = record.FillStyle1.HasValue;
            var stateLineStyle  = record.LineStyle.HasValue;
            var stateMoveTo     = record.StateMoveTo;

            writer.WriteBit(stateNewStyles);
            writer.WriteBit(stateLineStyle);
            writer.WriteBit(stateFillStyle1);
            writer.WriteBit(stateFillStyle0);
            writer.WriteBit(stateMoveTo);
            if (stateMoveTo)
            {
                var cnt      = new SignedBitsCount(record.MoveDeltaX, record.MoveDeltaY);
                var moveBits = cnt.GetBits();
                writer.WriteUnsignedBits(moveBits, 5);
                writer.WriteSignedBits(record.MoveDeltaX, moveBits);
                writer.WriteSignedBits(record.MoveDeltaY, moveBits);
            }
            if (stateFillStyle0)
            {
                writer.WriteUnsignedBits(record.FillStyle0.Value, fillStylesBits);
            }
            if (stateFillStyle1)
            {
                writer.WriteUnsignedBits(record.FillStyle1.Value, fillStylesBits);
            }
            if (stateLineStyle)
            {
                writer.WriteUnsignedBits(record.LineStyle.Value, lineStylesBits);
            }
        }
コード例 #9
0
ファイル: FilterStreamEx.cs プロジェクト: shhadi/SwfLib
 public static void WriteFilterList(this ISwfStreamWriter writer, IList <BaseFilter> source)
 {
     writer.WriteByte((byte)source.Count);
     foreach (var filter in source)
     {
         writer.WriteFilter(filter);
     }
 }
コード例 #10
0
ファイル: TextStreamExt.cs プロジェクト: shhadi/SwfLib
        public static void WriteTextRecordRGBA(this ISwfStreamWriter writer, TextRecordRGBA record, uint glyphBits, uint advanceBits)
        {
            if (record == null)
            {
                throw new ArgumentNullException("record");
            }
            writer.WriteBit(record.Type);
            writer.WriteUnsignedBits(record.Reserved, 3);

            writer.WriteBit(record.FontID.HasValue);
            writer.WriteBit(record.TextColor.HasValue);
            writer.WriteBit(record.YOffset.HasValue);
            writer.WriteBit(record.XOffset.HasValue);

            var isEnd = !record.Type && record.Reserved == 0 && !record.FontID.HasValue && !record.TextColor.HasValue && !record.YOffset.HasValue && !record.XOffset.HasValue;

            if (!isEnd)
            {
                if (record.FontID.HasValue)
                {
                    writer.WriteUInt16(record.FontID.Value);
                }
                if (record.TextColor.HasValue)
                {
                    var color = record.TextColor.Value;
                    writer.WriteRGBA(ref color);
                }
                if (record.XOffset.HasValue)
                {
                    writer.WriteSInt16(record.XOffset.Value);
                }
                if (record.YOffset.HasValue)
                {
                    writer.WriteSInt16(record.YOffset.Value);
                }
                if (record.FontID.HasValue)
                {
                    if (!record.TextHeight.HasValue)
                    {
                        throw new InvalidOperationException("Font height must be specified when font is specified");
                    }
                    writer.WriteUInt16(record.TextHeight.Value);
                }
                if (record.Glyphs.Count > 255)
                {
                    throw new InvalidOperationException("Text record has too much glyphs specified");
                }

                writer.WriteByte((byte)record.Glyphs.Count);
                foreach (var glyph in record.Glyphs)
                {
                    writer.WriteGlyphEntry(glyph, glyphBits, advanceBits);
                }
            }
            writer.FlushBits();
        }
コード例 #11
0
 public static void WriteShapeRecordsRGB(this ISwfStreamWriter writer, IList <IShapeRecordRGB> shapeRecords, uint fillStyleBits, uint lineStyleBits)
 {
     writer.WriteUnsignedBits(fillStyleBits, 4);
     writer.WriteUnsignedBits(lineStyleBits, 4);
     writer.FlushBits();
     foreach (var shapeRecord in shapeRecords)
     {
         _shapeRecordWriter.WriteRGB(writer, shapeRecord, true, ref fillStyleBits, ref lineStyleBits);
     }
 }
コード例 #12
0
        private void Write(ISwfStreamWriter writer, IShapeRecord record, bool allowBigArray, ref uint fillBitsCount, ref uint lineBitsCount)
        {
            var ctx = new ShapeRecordWriteContext {
                FillStyleBits = fillBitsCount,
                LineStyleBits = lineBitsCount,
                AllowBigArray = allowBigArray,
                Writer        = writer
            };

            ctx           = record.AcceptVisitor(this, ctx);
            fillBitsCount = ctx.FillStyleBits;
            lineBitsCount = ctx.LineStyleBits;
        }
コード例 #13
0
ファイル: FontStreamExt.cs プロジェクト: shhadi/SwfLib
 public static void WriteKerningRecord(this ISwfStreamWriter writer, KerningRecord record, bool wideCodes)
 {
     if (wideCodes)
     {
         writer.WriteUInt16(record.LeftCode);
         writer.WriteUInt16(record.RightCode);
     }
     else
     {
         writer.WriteByte((byte)record.LeftCode);
         writer.WriteByte((byte)record.RightCode);
     }
     writer.WriteSInt16(record.Adjustment);
 }
コード例 #14
0
        public static void WriteTagData(this ISwfStreamWriter writer, SwfTagData data)
        {
            var bytes = data.Data;

            if (bytes.Length >= 0x3f)
            {
                writer.WriteUInt16((ushort)(((ushort)data.Type << 6) | 0x3f));
                writer.WriteUInt32((uint)bytes.Length);
            }
            else
            {
                writer.WriteUInt16((ushort)(((ushort)data.Type << 6) | bytes.Length));
            }
            writer.WriteBytes(bytes);
        }
コード例 #15
0
        /// <summary>
        /// Writes rectangle to the writer.
        /// </summary>
        /// <param name="writer">Writer to which to write rectangle.</param>
        /// <param name="rect">Rectangle to be written.</param>
        public static void WriteRect(this ISwfStreamWriter writer, ref SwfRect rect)
        {
            var btCount = new SignedBitsCount(rect.XMin, rect.XMax, rect.YMin, rect.YMax);
            var bits    = btCount.GetBits();

            if (bits < 1)
            {
                bits = 1;
            }
            writer.WriteUnsignedBits(bits, 5);
            writer.WriteSignedBits(rect.XMin, bits);
            writer.WriteSignedBits(rect.XMax, bits);
            writer.WriteSignedBits(rect.YMin, bits);
            writer.WriteSignedBits(rect.YMax, bits);
            writer.FlushBits();
        }
コード例 #16
0
        public static void WriteGradientRGB(this ISwfStreamWriter writer, GradientRGB gradient)
        {
            writer.WriteUnsignedBits((uint)gradient.SpreadMode, 2);
            writer.WriteUnsignedBits((uint)gradient.InterpolationMode, 2);
            var count = gradient.GradientRecords.Count;

            if (count > 15)
            {
                throw new ArgumentOutOfRangeException("gradient", "Can't serialize more them 15 gradient points");
            }
            writer.WriteUnsignedBits((uint)count, 4);
            for (var i = 0; i < count; i++)
            {
                GradientRecordRGB record = gradient.GradientRecords[i];
                writer.WriteGradientRecordRGB(ref record);
            }
        }
コード例 #17
0
ファイル: LineStyleStreamExt.cs プロジェクト: shhadi/SwfLib
 public static void WriteLineStylesEx(this ISwfStreamWriter writer, IList <LineStyleEx> styles)
 {
     if (styles.Count < 255)
     {
         writer.WriteByte((byte)styles.Count);
     }
     else
     {
         writer.WriteByte(255);
         writer.WriteUInt16((ushort)styles.Count);
     }
     foreach (var lineStyle in styles)
     {
         var style = lineStyle;
         writer.WriteLineStyleEx(style);
     }
 }
コード例 #18
0
 public static void WriteFillStylesRGBA(this ISwfStreamWriter writer, IList <FillStyleRGBA> styles)
 {
     if (styles.Count < 255)
     {
         writer.WriteByte((byte)styles.Count);
     }
     else
     {
         writer.WriteByte(255);
         writer.WriteUInt16((ushort)styles.Count);
     }
     foreach (var fillStyle in styles)
     {
         var style = fillStyle;
         writer.WriteFillStyleRGBA(style);
     }
 }
コード例 #19
0
ファイル: ButtonStreamExt.cs プロジェクト: shhadi/SwfLib
        public static void WriteButtonCondition(this ISwfStreamWriter writer, ButtonCondition cond)
        {
            writer.WriteBit(cond.IdleToOverDown);
            writer.WriteBit(cond.OutDownToIdle);
            writer.WriteBit(cond.OutDownToOverDown);
            writer.WriteBit(cond.OverDownToOutDown);
            writer.WriteBit(cond.OverDownToOverUp);
            writer.WriteBit(cond.OverUpToOverDown);
            writer.WriteBit(cond.OverUpToIdle);
            writer.WriteBit(cond.IdleToOverUp);
            writer.WriteUnsignedBits(cond.KeyPress, 7);
            writer.WriteBit(cond.OverDownToIdle);

            var aw = new ActionWriter(writer);

            foreach (var action in cond.Actions)
            {
                aw.WriteAction(action);
            }
        }
コード例 #20
0
        public static void WriteMatrix(this ISwfStreamWriter writer, ref SwfMatrix matrix)
        {
            var hasScale = matrix.HasScale;

            writer.WriteBit(hasScale);
            if (hasScale)
            {
                var sx        = (int)(matrix.ScaleX * 65536.0);
                var sy        = (int)(matrix.ScaleY * 65536.0);
                var scaleBits = new SignedBitsCount(sx, sy).GetBits();
                if (scaleBits < 1)
                {
                    scaleBits = 1;
                }
                writer.WriteUnsignedBits(scaleBits, 5);
                writer.WriteFixedPoint16(matrix.ScaleX, scaleBits);
                writer.WriteFixedPoint16(matrix.ScaleY, scaleBits);
            }
            var hasRotate = matrix.HasRotate;

            writer.WriteBit(hasRotate);
            if (hasRotate)
            {
                var rx         = (int)(matrix.RotateSkew0 * 65536.0);
                var ry         = (int)(matrix.RotateSkew1 * 65536.0);
                var rotateBits = new SignedBitsCount(rx, ry).GetBits();
                if (rotateBits < 1)
                {
                    rotateBits = 1;
                }
                writer.WriteUnsignedBits(rotateBits, 5);
                writer.WriteFixedPoint16(matrix.RotateSkew0, rotateBits);
                writer.WriteFixedPoint16(matrix.RotateSkew1, rotateBits);
            }
            var translateBits = new SignedBitsCount(matrix.TranslateX, matrix.TranslateY).GetBits();

            writer.WriteUnsignedBits(translateBits, 5);
            writer.WriteSignedBits(matrix.TranslateX, translateBits);
            writer.WriteSignedBits(matrix.TranslateY, translateBits);
            writer.FlushBits();
        }
コード例 #21
0
ファイル: LineStyleStreamExt.cs プロジェクト: shhadi/SwfLib
 public static void WriteLineStylesRGB(this ISwfStreamWriter writer, IList <LineStyleRGB> styles, bool allowBigArray)
 {
     if (styles.Count < 255)
     {
         writer.WriteByte((byte)styles.Count);
     }
     else
     {
         if (!allowBigArray)
         {
             throw new InvalidOperationException("DefineShape supports up to 255 fill style records");
         }
         writer.WriteByte(255);
         writer.WriteUInt16((ushort)styles.Count);
     }
     foreach (var lineStyle in styles)
     {
         var style = lineStyle;
         writer.WriteLineStyleRGB(style);
     }
 }
コード例 #22
0
        public static void WriteSwfFileInfo(this ISwfStreamWriter writer, SwfFileInfo fileInfo)
        {
            string format = fileInfo.Format.ToString();

            if (string.IsNullOrEmpty(format) || format.Length != 3)
            {
                throw new InvalidOperationException("Format should be of length 3");
            }
            writer.WriteByte((byte)format[0]);
            writer.WriteByte((byte)format[1]);
            writer.WriteByte((byte)format[2]);

            writer.WriteByte(fileInfo.Version);

            var len = fileInfo.FileLength;

            writer.WriteByte((byte)((len >> 0) & 0xff));
            writer.WriteByte((byte)((len >> 8) & 0xff));
            writer.WriteByte((byte)((len >> 16) & 0xff));
            writer.WriteByte((byte)((len >> 24) & 0xff));
        }
コード例 #23
0
 protected override void Write(ISwfStreamWriter writer, GradientRGBA gradient)
 {
     writer.WriteGradientRGBA(gradient);
 }
コード例 #24
0
 protected abstract void Write(ISwfStreamWriter writer, T gradient);
コード例 #25
0
 public static void WriteClipActions(this ISwfStreamWriter writer, byte swfVersion, ClipActionsList clipActions)
 {
     writer.WriteUInt16(clipActions.Reserved);
     writer.WriteClipEventFlags(swfVersion, clipActions.Flags);
     writer.WriteClipActionRecords(swfVersion, clipActions.Records);
 }
コード例 #26
0
 public static void WriteGradientRecordRGBA(this ISwfStreamWriter writer, ref GradientRecordRGBA record)
 {
     writer.WriteByte(record.Ratio);
     writer.WriteRGBA(ref record.Color);
 }
コード例 #27
0
 public static void WriteMatrix(this ISwfStreamWriter writer, SwfMatrix matrix)
 {
     writer.WriteMatrix(ref matrix);
 }
コード例 #28
0
ファイル: FilterStreamEx.cs プロジェクト: shhadi/SwfLib
 public static void WriteFilter(this ISwfStreamWriter writer, BaseFilter filter)
 {
     _writer.Write(writer, filter);
 }
コード例 #29
0
 /// <summary>
 /// Writes rectangle to the writer.
 /// </summary>
 /// <param name="writer">Writer to which to write rectangle.</param>
 /// <param name="rect">Rectangle to be written.</param>
 public static void WriteRect(this ISwfStreamWriter writer, SwfRect rect)
 {
     writer.WriteRect(ref rect);
 }
コード例 #30
0
 public static void WriteSwfHeader(this ISwfStreamWriter writer, SwfHeader header)
 {
     writer.WriteRect(header.FrameSize);
     writer.WriteFixedPoint8(header.FrameRate);
     writer.WriteUInt16(header.FrameCount);
 }