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; }
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); }
ShapeRecordWriteContext IShapeRecordVisitor <ShapeRecordWriteContext, ShapeRecordWriteContext> .Visit(EndShapeRecord record, ShapeRecordWriteContext ctx) { var writer = ctx.Writer; writer.WriteUnsignedBits(0, 6); return(ctx); }
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); }
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); }