289 lines
6.9 KiB
C#
289 lines
6.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using Hjg.Pngcs.Chunks;
|
|
using Hjg.Pngcs.Zlib;
|
|
|
|
namespace Hjg.Pngcs
|
|
{
|
|
// Token: 0x02000035 RID: 53
|
|
internal class PngIDatChunkInputStream : Stream
|
|
{
|
|
// Token: 0x060001DD RID: 477 RVA: 0x00007CE5 File Offset: 0x00005EE5
|
|
public override void Write(byte[] buffer, int offset, int count)
|
|
{
|
|
}
|
|
|
|
// Token: 0x060001DE RID: 478 RVA: 0x00007CE7 File Offset: 0x00005EE7
|
|
public override void SetLength(long value)
|
|
{
|
|
}
|
|
|
|
// Token: 0x060001DF RID: 479 RVA: 0x00007CE9 File Offset: 0x00005EE9
|
|
public override long Seek(long offset, SeekOrigin origin)
|
|
{
|
|
return -1L;
|
|
}
|
|
|
|
// Token: 0x060001E0 RID: 480 RVA: 0x00007CED File Offset: 0x00005EED
|
|
public override void Flush()
|
|
{
|
|
}
|
|
|
|
// Token: 0x1700002A RID: 42
|
|
// (get) Token: 0x060001E1 RID: 481 RVA: 0x00007CEF File Offset: 0x00005EEF
|
|
// (set) Token: 0x060001E2 RID: 482 RVA: 0x00007CF7 File Offset: 0x00005EF7
|
|
public override long Position { get; set; }
|
|
|
|
// Token: 0x1700002B RID: 43
|
|
// (get) Token: 0x060001E3 RID: 483 RVA: 0x00007D00 File Offset: 0x00005F00
|
|
public override long Length
|
|
{
|
|
get
|
|
{
|
|
return 0L;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002C RID: 44
|
|
// (get) Token: 0x060001E4 RID: 484 RVA: 0x00007D04 File Offset: 0x00005F04
|
|
public override bool CanWrite
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002D RID: 45
|
|
// (get) Token: 0x060001E5 RID: 485 RVA: 0x00007D07 File Offset: 0x00005F07
|
|
public override bool CanRead
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002E RID: 46
|
|
// (get) Token: 0x060001E6 RID: 486 RVA: 0x00007D0A File Offset: 0x00005F0A
|
|
public override bool CanSeek
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Token: 0x060001E7 RID: 487 RVA: 0x00007D10 File Offset: 0x00005F10
|
|
public PngIDatChunkInputStream(Stream iStream, int lenFirstChunk, long offset_0)
|
|
{
|
|
this.idLastChunk = new byte[4];
|
|
this.toReadThisChunk = 0;
|
|
this.ended = false;
|
|
this.foundChunksInfo = new List<PngIDatChunkInputStream.IdatChunkInfo>();
|
|
this.offset = offset_0;
|
|
this.checkCrc = true;
|
|
this.inputStream = iStream;
|
|
this.crcEngine = new CRC32();
|
|
this.lenLastChunk = lenFirstChunk;
|
|
this.toReadThisChunk = lenFirstChunk;
|
|
Array.Copy(ChunkHelper.b_IDAT, 0, this.idLastChunk, 0, 4);
|
|
this.crcEngine.Update(this.idLastChunk, 0, 4);
|
|
this.foundChunksInfo.Add(new PngIDatChunkInputStream.IdatChunkInfo(this.lenLastChunk, offset_0 - 8L));
|
|
if (this.lenLastChunk == 0)
|
|
{
|
|
this.EndChunkGoForNext();
|
|
}
|
|
}
|
|
|
|
// Token: 0x060001E8 RID: 488 RVA: 0x00007DC4 File Offset: 0x00005FC4
|
|
public override void Close()
|
|
{
|
|
base.Close();
|
|
}
|
|
|
|
// Token: 0x060001E9 RID: 489 RVA: 0x00007DCC File Offset: 0x00005FCC
|
|
private void EndChunkGoForNext()
|
|
{
|
|
for (;;)
|
|
{
|
|
int num = PngHelperInternal.ReadInt4(this.inputStream);
|
|
this.offset += 4L;
|
|
if (this.checkCrc)
|
|
{
|
|
int value = (int)this.crcEngine.GetValue();
|
|
if (this.lenLastChunk > 0 && num != value)
|
|
{
|
|
break;
|
|
}
|
|
this.crcEngine.Reset();
|
|
}
|
|
this.lenLastChunk = PngHelperInternal.ReadInt4(this.inputStream);
|
|
if (this.lenLastChunk < 0)
|
|
{
|
|
goto Block_3;
|
|
}
|
|
this.toReadThisChunk = this.lenLastChunk;
|
|
PngHelperInternal.ReadBytes(this.inputStream, this.idLastChunk, 0, 4);
|
|
this.offset += 8L;
|
|
this.ended = !PngCsUtils.arraysEqual4(this.idLastChunk, ChunkHelper.b_IDAT);
|
|
if (!this.ended)
|
|
{
|
|
this.foundChunksInfo.Add(new PngIDatChunkInputStream.IdatChunkInfo(this.lenLastChunk, this.offset - 8L));
|
|
if (this.checkCrc)
|
|
{
|
|
this.crcEngine.Update(this.idLastChunk, 0, 4);
|
|
}
|
|
}
|
|
if (this.lenLastChunk != 0 || this.ended)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
throw new PngjBadCrcException("error reading idat; offset: " + this.offset);
|
|
Block_3:
|
|
throw new PngjInputException("invalid len for chunk: " + this.lenLastChunk);
|
|
}
|
|
|
|
// Token: 0x060001EA RID: 490 RVA: 0x00007F0C File Offset: 0x0000610C
|
|
public void ForceChunkEnd()
|
|
{
|
|
if (!this.ended)
|
|
{
|
|
byte[] array = new byte[this.toReadThisChunk];
|
|
PngHelperInternal.ReadBytes(this.inputStream, array, 0, this.toReadThisChunk);
|
|
if (this.checkCrc)
|
|
{
|
|
this.crcEngine.Update(array, 0, this.toReadThisChunk);
|
|
}
|
|
this.EndChunkGoForNext();
|
|
}
|
|
}
|
|
|
|
// Token: 0x060001EB RID: 491 RVA: 0x00007F64 File Offset: 0x00006164
|
|
public override int Read(byte[] b, int off, int len_0)
|
|
{
|
|
if (this.ended)
|
|
{
|
|
return -1;
|
|
}
|
|
if (this.toReadThisChunk == 0)
|
|
{
|
|
throw new Exception("this should not happen");
|
|
}
|
|
int num = this.inputStream.Read(b, off, (len_0 >= this.toReadThisChunk) ? this.toReadThisChunk : len_0);
|
|
if (num == -1)
|
|
{
|
|
num = -2;
|
|
}
|
|
if (num > 0)
|
|
{
|
|
if (this.checkCrc)
|
|
{
|
|
this.crcEngine.Update(b, off, num);
|
|
}
|
|
this.offset += (long)num;
|
|
this.toReadThisChunk -= num;
|
|
}
|
|
if (num >= 0 && this.toReadThisChunk == 0)
|
|
{
|
|
this.EndChunkGoForNext();
|
|
}
|
|
return num;
|
|
}
|
|
|
|
// Token: 0x060001EC RID: 492 RVA: 0x00007FFF File Offset: 0x000061FF
|
|
public int Read(byte[] b)
|
|
{
|
|
return this.Read(b, 0, b.Length);
|
|
}
|
|
|
|
// Token: 0x060001ED RID: 493 RVA: 0x0000800C File Offset: 0x0000620C
|
|
public override int ReadByte()
|
|
{
|
|
byte[] array = new byte[1];
|
|
int num = this.Read(array, 0, 1);
|
|
if (num >= 0)
|
|
{
|
|
return (int)array[0];
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// Token: 0x060001EE RID: 494 RVA: 0x00008033 File Offset: 0x00006233
|
|
public int GetLenLastChunk()
|
|
{
|
|
return this.lenLastChunk;
|
|
}
|
|
|
|
// Token: 0x060001EF RID: 495 RVA: 0x0000803B File Offset: 0x0000623B
|
|
public byte[] GetIdLastChunk()
|
|
{
|
|
return this.idLastChunk;
|
|
}
|
|
|
|
// Token: 0x060001F0 RID: 496 RVA: 0x00008043 File Offset: 0x00006243
|
|
public long GetOffset()
|
|
{
|
|
return this.offset;
|
|
}
|
|
|
|
// Token: 0x060001F1 RID: 497 RVA: 0x0000804B File Offset: 0x0000624B
|
|
public bool IsEnded()
|
|
{
|
|
return this.ended;
|
|
}
|
|
|
|
// Token: 0x060001F2 RID: 498 RVA: 0x00008053 File Offset: 0x00006253
|
|
internal void DisableCrcCheck()
|
|
{
|
|
this.checkCrc = false;
|
|
}
|
|
|
|
// Token: 0x04000103 RID: 259
|
|
private readonly Stream inputStream;
|
|
|
|
// Token: 0x04000104 RID: 260
|
|
private readonly CRC32 crcEngine;
|
|
|
|
// Token: 0x04000105 RID: 261
|
|
private bool checkCrc;
|
|
|
|
// Token: 0x04000106 RID: 262
|
|
private int lenLastChunk;
|
|
|
|
// Token: 0x04000107 RID: 263
|
|
private byte[] idLastChunk;
|
|
|
|
// Token: 0x04000108 RID: 264
|
|
private int toReadThisChunk;
|
|
|
|
// Token: 0x04000109 RID: 265
|
|
private bool ended;
|
|
|
|
// Token: 0x0400010A RID: 266
|
|
private long offset;
|
|
|
|
// Token: 0x0400010B RID: 267
|
|
public IList<PngIDatChunkInputStream.IdatChunkInfo> foundChunksInfo;
|
|
|
|
// Token: 0x02000036 RID: 54
|
|
public class IdatChunkInfo
|
|
{
|
|
// Token: 0x060001F3 RID: 499 RVA: 0x0000805C File Offset: 0x0000625C
|
|
public IdatChunkInfo(int len_0, long offset_1)
|
|
{
|
|
this.len = len_0;
|
|
this.offset = offset_1;
|
|
}
|
|
|
|
// Token: 0x0400010D RID: 269
|
|
public readonly int len;
|
|
|
|
// Token: 0x0400010E RID: 270
|
|
public readonly long offset;
|
|
}
|
|
}
|
|
}
|