RleImage.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Photoshop PSD FileType Plugin for Paint.NET
  4. // http://psdplugin.codeplex.com/
  5. //
  6. // This software is ptortorovided under the MIT License:
  7. // Copyright (c) 2006-2007 Frank Blumenberg
  8. // Copyright (c) 2010-2017 Tao Yue
  9. //
  10. // See LICENSE.txt for complete licensing and attribution information.
  11. //
  12. /////////////////////////////////////////////////////////////////////////////////
  13. using System;
  14. using System.Diagnostics;
  15. using System.Drawing;
  16. using System.IO;
  17. using System.Linq;
  18. namespace PhotoshopFile.Compression
  19. {
  20. internal class RleImage : ImageData
  21. {
  22. private byte[] rleData;
  23. private RleRowLengths rleRowLengths;
  24. protected override bool AltersWrittenData => false;
  25. public RleImage(byte[] rleData, RleRowLengths rleRowLengths,
  26. Size size, int bitDepth)
  27. : base(size, bitDepth)
  28. {
  29. this.rleData = rleData;
  30. this.rleRowLengths = rleRowLengths;
  31. }
  32. internal override void Read(byte[] buffer)
  33. {
  34. var rleStream = new MemoryStream(rleData);
  35. var rleReader = new RleReader(rleStream);
  36. var bufferIndex = 0;
  37. for (int i = 0; i < Size.Height; i++)
  38. {
  39. var bytesRead = rleReader.Read(buffer, bufferIndex, BytesPerRow);
  40. if (bytesRead != BytesPerRow)
  41. {
  42. throw new Exception("RLE row decompressed to unexpected length.");
  43. }
  44. bufferIndex += bytesRead;
  45. }
  46. }
  47. public override byte[] ReadCompressed()
  48. {
  49. return rleData;
  50. }
  51. internal override void WriteInternal(byte[] array)
  52. {
  53. if (rleData != null)
  54. {
  55. throw new Exception(
  56. "Cannot write to RLE image in Decompress mode.");
  57. }
  58. using (var dataStream = new MemoryStream())
  59. {
  60. var rleWriter = new RleWriter(dataStream);
  61. for (int row = 0; row < Size.Height; row++)
  62. {
  63. int rowIndex = row * BytesPerRow;
  64. rleRowLengths[row] = rleWriter.Write(
  65. array, rowIndex, BytesPerRow);
  66. }
  67. // Save compressed data
  68. dataStream.Flush();
  69. rleData = dataStream.ToArray();
  70. Debug.Assert(rleRowLengths.Total == rleData.Length,
  71. "RLE row lengths do not sum to the compressed data length.");
  72. }
  73. }
  74. }
  75. }