public override ChunkRaw CreateRawChunk() { if (key.Length == 0) { throw new PngjException("Text chunk key must be non empty"); } MemoryStream ba = new MemoryStream(); ChunkHelper.WriteBytesToStream(ba, ChunkHelper.ToBytes(key)); ba.WriteByte(0); // separator ba.WriteByte(compressed ? (byte)1 : (byte)0); ba.WriteByte(0); // compression method (always 0) ChunkHelper.WriteBytesToStream(ba, ChunkHelper.ToBytes(langTag)); ba.WriteByte(0); // separator ChunkHelper.WriteBytesToStream(ba, ChunkHelper.ToBytesUTF8(translatedTag)); ba.WriteByte(0); // separator byte[] textbytes = ChunkHelper.ToBytesUTF8(val); if (compressed) { textbytes = ChunkHelper.compressBytes(textbytes, true); } ChunkHelper.WriteBytesToStream(ba, textbytes); byte[] b = ba.ToArray(); ChunkRaw chunk = createEmptyChunk(b.Length, false); chunk.Data = b; return(chunk); }
public override void ParseFromRaw(ChunkRaw c) { int nullsep = -1; for (int i = 0; i < c.Data.Length; i++) // look for first zero { if (c.Data[i] != 0) { continue; } nullsep = i; break; } if (nullsep < 0 || nullsep > c.Data.Length - 2) { throw new PngjException("bad zTXt chunk: no separator found"); } key = ChunkHelper.ToString(c.Data, 0, nullsep); int compmet = (int)c.Data[nullsep + 1]; if (compmet != 0) { throw new PngjException("bad zTXt chunk: unknown compression method"); } byte[] uncomp = ChunkHelper.compressBytes(c.Data, nullsep + 2, c.Data.Length - nullsep - 2, false); // uncompress val = ChunkHelper.ToString(uncomp); }
public override void ParseFromRaw(ChunkRaw c) { int nullsFound = 0; int[] nullsIdx = new int[3]; for (int k = 0; k < c.Data.Length; k++) { if (c.Data[k] != 0) { continue; } nullsIdx[nullsFound] = k; nullsFound++; if (nullsFound == 1) { k += 2; } if (nullsFound == 3) { break; } } if (nullsFound != 3) { throw new PngjException("Bad formed PngChunkITXT chunk"); } key = ChunkHelper.ToString(c.Data, 0, nullsIdx[0]); int i = nullsIdx[0] + 1; compressed = c.Data[i] == 0 ? false : true; i++; if (compressed && c.Data[i] != 0) { throw new PngjException("Bad formed PngChunkITXT chunk - bad compression method "); } langTag = ChunkHelper.ToString(c.Data, i, nullsIdx[1] - i); translatedTag = ChunkHelper.ToStringUTF8(c.Data, nullsIdx[1] + 1, nullsIdx[2] - nullsIdx[1] - 1); i = nullsIdx[2] + 1; if (compressed) { byte[] bytes = ChunkHelper.compressBytes(c.Data, i, c.Data.Length - i, false); val = ChunkHelper.ToStringUTF8(bytes); } else { val = ChunkHelper.ToStringUTF8(c.Data, i, c.Data.Length - i); } }
public override ChunkRaw CreateRawChunk() { if (key.Length == 0) { throw new PngjException("Text chunk key must be non empty"); } MemoryStream ba = new MemoryStream(); ChunkHelper.WriteBytesToStream(ba, ChunkHelper.ToBytes(key)); ba.WriteByte(0); // separator ba.WriteByte(0); // compression method: 0 byte[] textbytes = ChunkHelper.compressBytes(ChunkHelper.ToBytes(val), true); ChunkHelper.WriteBytesToStream(ba, textbytes); byte[] b = ba.ToArray(); ChunkRaw chunk = createEmptyChunk(b.Length, false); chunk.Data = b; return(chunk); }
/// <summary> /// This uncompresses the string! /// </summary> /// <returns></returns> public byte[] GetProfile() { return(ChunkHelper.compressBytes(compressedProfile, false)); }
/// <summary> /// Sets profile name and profile /// </summary> /// <param name="name">profile name </param> /// <param name="profile">profile (uncompressed)</param> public void SetProfileNameAndContent(String name, byte[] profile) { profileName = name; compressedProfile = ChunkHelper.compressBytes(profile, true); }