private static byte[] FillRecordWithBlips(Escher.DrawingGroupContainer dggContainer, ArrayList blipList, Hashtable bseList, Stream stream, ref int currentBlip, ref int currentLength, ref Stream currentImageStream) { byte[] array = null; if (currentBlip >= blipList.Count) { return(null); } do { byte[] checkSum = ((Escher.Blip)blipList[currentBlip]).CheckSum; string @string = Encoding.ASCII.GetString(checkSum); if (bseList.ContainsKey(@string)) { byte[] array2 = new byte[69]; ((Escher.BlipStoreEntry)bseList[@string]).GetData().CopyTo(array2, 0); ((Escher.Blip)blipList[currentBlip]).GetHeaderData().CopyTo(array2, 44); int num = currentLength + 69; currentImageStream = dggContainer.StreamList[currentBlip].Stream; currentImageStream.Seek(dggContainer.StreamList[currentBlip].Offset, SeekOrigin.Begin); if ((int)(currentImageStream.Length - currentImageStream.Position + num) > 8224) { int num2 = 8224 - currentLength; if (num2 <= 69) { stream.Write(array2, 0, num2); if (num2 < 69) { array = new byte[69 - num2]; Array.Copy(array2, num2, array, 0, array.Length); } currentLength += num2; } else { stream.Write(array2, 0, 69); int num3 = num2 - 69; byte[] array3 = new byte[num3]; currentImageStream.Read(array3, 0, num3); stream.Write(array3, 0, array3.Length); currentLength += num2; dggContainer.StreamList[currentBlip].Offset = (int)currentImageStream.Position; } } else { stream.Write(array2, 0, array2.Length); int num4 = (int)(currentImageStream.Length - currentImageStream.Position); byte[] array4 = new byte[num4]; currentImageStream.Read(array4, 0, num4); stream.Write(array4, 0, array4.Length); currentLength += num4 + 69; dggContainer.StreamList[currentBlip].Offset = -1; currentImageStream.Close(); currentImageStream = null; currentBlip++; } } }while (currentLength < 8224 && currentBlip < blipList.Count); return(array); }
private static void WriteShapeProperties(Escher.DrawingGroupContainer aDggContainer, Stream stream, ref int shapePropertiesIndex, int currentLength) { if (shapePropertiesIndex + 8224 - currentLength < 50) { stream.Write(aDggContainer.ShapePropertyData, shapePropertiesIndex, 8224 - currentLength); shapePropertiesIndex += 8224 - currentLength; } else { stream.Write(aDggContainer.ShapePropertyData, shapePropertiesIndex, 50 - shapePropertiesIndex); shapePropertiesIndex = 50; } }
public void AddImage(string imageName, Stream imageData, ImageFormat format, int rowStart, double rowStartPercentage, int columnStart, double columnStartPercentage, int rowEnd, double rowEndPercentage, int columnEnd, double columnEndPercentage, string hyperlinkURL, bool isBookmarkLink) { if (imageData != null && imageData.Length != 0L) { if (m_drawingGroupContainer == null) { m_drawingGroupContainer = new Escher.DrawingGroupContainer(); } uint startSPID = 0u; ushort dgID = 0; uint referenceIndex = m_drawingGroupContainer.AddImage(imageData, format, imageName, m_worksheets.Count - 1, out startSPID, out dgID); Escher.ClientAnchor.SPRC clientAnchor = new Escher.ClientAnchor.SPRC((ushort)columnStart, (short)(columnStartPercentage * 1024.0), (ushort)rowStart, (short)(rowStartPercentage * 256.0), (ushort)columnEnd, (short)(columnEndPercentage * 1024.0), (ushort)rowEnd, (short)(rowEndPercentage * 256.0)); m_worksheet.AddImage(dgID, startSPID, imageName, clientAnchor, referenceIndex, hyperlinkURL, isBookmarkLink); } }
public static void WriteToStream(BinaryWriter output, Escher.DrawingGroupContainer dggContainer) { if (dggContainer != null) { int num = 0; uint num2 = dggContainer.Length + 8; uint num3 = 0u; int size; if (num2 > 8224) { size = 8224; num = (int)num2 / 8224; num3 = (uint)(num2 - num * 8224); } else { size = (ushort)num2; } RecordFactory.WriteHeader(output, 235, size); byte[] drawingGroupContainerData = dggContainer.DrawingGroupContainerData; int num4 = 0; MsoDrawingGroup.WriteDGHeader(output, drawingGroupContainerData, ref num4, ref num, num3); drawingGroupContainerData = dggContainer.DrawingGroupData; MsoDrawingGroup.WriteDGHeader(output, drawingGroupContainerData, ref num4, ref num, num3); drawingGroupContainerData = dggContainer.BStoreContainerData; MsoDrawingGroup.WriteDGHeader(output, drawingGroupContainerData, ref num4, ref num, num3); Hashtable bSEList = dggContainer.BSEList; ArrayList blipList = dggContainer.BlipList; int num5 = 0; Stream stream = null; int num6 = 0; byte[] array = MsoDrawingGroup.FillRecordWithBlips(dggContainer, blipList, bSEList, output.BaseStream, ref num5, ref num4, ref stream); if (array == null && num4 < 8224 && num == 1) { MsoDrawingGroup.WriteShapeProperties(dggContainer, output.BaseStream, ref num6, num4); } for (int i = 0; i < num; i++) { int size2 = (i != num - 1) ? 8224 : ((ushort)num3); RecordFactory.WriteHeader(output, 60, size2); num4 = 0; if (array != null) { output.BaseStream.Write(array, 0, array.Length); num4 += array.Length; array = null; } if (stream == null) { array = MsoDrawingGroup.FillRecordWithBlips(dggContainer, blipList, bSEList, output.BaseStream, ref num5, ref num4, ref stream); if (num4 < 8224) { MsoDrawingGroup.WriteShapeProperties(dggContainer, output.BaseStream, ref num6, num4); } } else { int num7 = 8224 - num4; int num8 = (int)(stream.Length - stream.Position); if (num8 <= num7) { if (num8 > 0) { byte[] array2 = new byte[num8]; stream.Read(array2, 0, array2.Length); output.BaseStream.Write(array2, 0, array2.Length); num4 += array2.Length; } dggContainer.StreamList[num5].Offset = -1; stream.Close(); stream = null; num5++; array = MsoDrawingGroup.FillRecordWithBlips(dggContainer, blipList, bSEList, output.BaseStream, ref num5, ref num4, ref stream); if (num4 < 8224) { MsoDrawingGroup.WriteShapeProperties(dggContainer, output.BaseStream, ref num6, num4); } } else { byte[] buffer = new byte[num7]; stream.Read(buffer, 0, num7); output.BaseStream.Write(buffer, 0, num7); dggContainer.StreamList[num5].Offset = (int)stream.Position; } } } output.BaseStream.Write(dggContainer.ShapePropertyData, num6, 50 - num6); } }