/* @SuppressWarnings("unchecked")*/ public static T CloneChunk <T> (T chunk, ImageInfo info) where T : PngChunk { PngChunk cn = FactoryFromId(chunk.Id, info); if (cn.GetType() != chunk.GetType()) { throw new System.Exception($"bad class cloning chunk: {cn.GetType()} {chunk.GetType()}"); } cn.CloneDataFromRead(chunk); return((T)cn); }
/* @SuppressWarnings("unchecked")*/ public static T CloneChunk <T>(T chunk, ImageInfo info) where T : PngChunk { PngChunk cn = FactoryFromId(chunk.Id, info); if ((Object)cn.GetType() != (Object)chunk.GetType()) { throw new PngjException("bad class cloning chunk: " + cn.GetType() + " " + chunk.GetType()); } cn.CloneDataFromRead(chunk); return((T)cn); }
/// <summary> /// Ad-hoc criteria for 'equivalent' chunks. /// </summary> /// <remarks> /// Two chunks are equivalent if they have the same Id AND either: /// 1. they are Single /// 2. both are textual and have the same key /// 3. both are SPLT and have the same palette name /// Bear in mind that this is an ad-hoc, non-standard, nor required (nor wrong) /// criterion. Use it only if you find it useful. Notice that PNG allows to have /// repeated textual keys with same keys. /// </remarks> /// <param name="c1">Chunk1</param> /// <param name="c2">Chunk1</param> /// <returns>true if equivalent</returns> public static bool Equivalent(PngChunk c1, PngChunk c2) { if (c1 == c2) { return(true); } if (c1 == null || c2 == null || !c1.Id.Equals(c2.Id)) { return(false); } // same id if (c1.GetType() != c2.GetType()) { return(false); // should not happen } if (!c2.AllowsMultiple()) { return(true); } if (c1 is PngChunkTextVar) { return(((PngChunkTextVar)c1).GetKey().Equals(((PngChunkTextVar)c2).GetKey())); } if (c1 is PngChunkSPLT) { return(((PngChunkSPLT)c1).PalName.Equals(((PngChunkSPLT)c2).PalName)); } // unknown chunks that allow multiple? consider they don't match return(false); }