RleImage.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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-2016 Tao Yue
  9. //
  10. // See LICENSE.txt for complete licensing and attribution information.
  11. //
  12. /////////////////////////////////////////////////////////////////////////////////
  13. using System;
  14. using System.Diagnostics;
  15. using PDNWrapper;
  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
  25. {
  26. get { return false; }
  27. }
  28. public RleImage(byte[] rleData, RleRowLengths rleRowLengths,
  29. Size size, int bitDepth)
  30. : base(size, bitDepth)
  31. {
  32. this.rleData = rleData;
  33. this.rleRowLengths = rleRowLengths;
  34. }
  35. internal override void Read(byte[] buffer)
  36. {
  37. var rleStream = new MemoryStream(rleData);
  38. var rleReader = new RleReader(rleStream);
  39. var bufferIndex = 0;
  40. for (int i = 0; i < Size.Height; i++)
  41. {
  42. var bytesRead = rleReader.Read(buffer, bufferIndex, BytesPerRow);
  43. if (bytesRead != BytesPerRow)
  44. {
  45. throw new Exception("RLE row decompressed to unexpected length.");
  46. }
  47. bufferIndex += bytesRead;
  48. }
  49. }
  50. public override byte[] ReadCompressed()
  51. {
  52. return rleData;
  53. }
  54. }
  55. }