예제 #1
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;
        }
예제 #2
0
        ShapeRecordWriteContext IShapeRecordVisitor <ShapeRecordWriteContext, ShapeRecordWriteContext> .Visit(StyleChangeShapeRecordRGB record, ShapeRecordWriteContext ctx)
        {
            var writer = ctx.Writer;

            WriteStyleChangeShapeRecord(writer, record, ref ctx.FillStyleBits, ref ctx.LineStyleBits);
            if (record.StateNewStyles)
            {
                writer.WriteFillStylesRGB(record.FillStyles, ctx.AllowBigArray);
                writer.WriteLineStylesRGB(record.LineStyles, ctx.AllowBigArray);
                ctx.FillStyleBits = new UnsignedBitsCount((uint)record.FillStyles.Count).GetBits();
                ctx.LineStyleBits = new UnsignedBitsCount((uint)record.LineStyles.Count).GetBits();
                if (ctx.FillStyleBits < 1)
                {
                    ctx.FillStyleBits = 1;                        //TODO: adobe?
                }
                writer.WriteUnsignedBits(ctx.FillStyleBits, 4);
                writer.WriteUnsignedBits(ctx.LineStyleBits, 4);
            }
            return(ctx);
        }
예제 #3
0
        ShapeRecordWriteContext IShapeRecordVisitor <ShapeRecordWriteContext, ShapeRecordWriteContext> .Visit(EndShapeRecord record, ShapeRecordWriteContext ctx)
        {
            var writer = ctx.Writer;

            writer.WriteUnsignedBits(0, 6);
            return(ctx);
        }
예제 #4
0
        ShapeRecordWriteContext IShapeRecordVisitor <ShapeRecordWriteContext, ShapeRecordWriteContext> .Visit(CurvedEdgeShapeRecord record, ShapeRecordWriteContext ctx)
        {
            var writer = ctx.Writer;

            writer.WriteBit(true);
            writer.WriteBit(false);
            var actualBits = new SignedBitsCount(record.ControlDeltaX, record.ControlDeltaY, record.AnchorDeltaX, record.AnchorDeltaY).GetBits();

            if (actualBits < 2)
            {
                actualBits = 2;
            }
            writer.WriteUnsignedBits(actualBits - 2u, 4);
            writer.WriteSignedBits(record.ControlDeltaX, actualBits);
            writer.WriteSignedBits(record.ControlDeltaY, actualBits);
            writer.WriteSignedBits(record.AnchorDeltaX, actualBits);
            writer.WriteSignedBits(record.AnchorDeltaY, actualBits);
            return(ctx);
        }
예제 #5
0
        ShapeRecordWriteContext IShapeRecordVisitor <ShapeRecordWriteContext, ShapeRecordWriteContext> .Visit(StraightEdgeShapeRecord record, ShapeRecordWriteContext ctx)
        {
            var writer = ctx.Writer;

            writer.WriteBit(true);
            writer.WriteBit(true);
            var actualBits = new SignedBitsCount(record.DeltaX, record.DeltaY).GetBits();

            if (actualBits < 2)
            {
                actualBits = 2;
            }
            writer.WriteUnsignedBits(actualBits - 2u, 4);
            bool genLineFlags = record.DeltaX != 0 && record.DeltaY != 0;

            writer.WriteBit(genLineFlags);
            bool vertFlag = record.DeltaX == 0;

            if (!genLineFlags)
            {
                writer.WriteBit(vertFlag);
            }
            if (genLineFlags || !vertFlag)
            {
                writer.WriteSignedBits(record.DeltaX, actualBits);
            }
            if (genLineFlags || vertFlag)
            {
                writer.WriteSignedBits(record.DeltaY, actualBits);
            }
            return(ctx);
        }