internal int WriteChunks(Stream os, int currentGroup)
        {
            List <int> written = new List <int>();

            for (int i = 0; i < queuedChunks.Count; i++)
            {
                PngChunk c = queuedChunks[i];
                if (!ShouldWrite(c, currentGroup))
                {
                    continue;
                }
                if (ChunkHelper.IsCritical(c.Id) && !c.Id.Equals(ChunkHelper.PLTE))
                {
                    throw new PngjOutputException("bad chunk queued: " + c);
                }
                if (alreadyWrittenKeys.ContainsKey(c.Id) && !c.AllowsMultiple())
                {
                    throw new PngjOutputException("duplicated chunk does not allow multiple: " + c);
                }
                c.Write(os);
                chunks.Add(c);
                alreadyWrittenKeys[c.Id] = alreadyWrittenKeys.ContainsKey(c.Id) ? alreadyWrittenKeys[c.Id] + 1 : 1;
                written.Add(i);
                c.ChunkGroup = currentGroup;
            }
            for (int k = written.Count - 1; k >= 0; k--)
            {
                queuedChunks.RemoveAt(written[k]);
            }
            return(written.Count);
        }
        internal int WriteChunks(IO.Stream os, int currentGroup)
        {
            List <int> written = new List <int>();

            for (int i = 0; i < queuedChunks.Count; i++)
            {
                PngChunk chunk = queuedChunks[i];

                if (!ShouldWrite(chunk, currentGroup))
                {
                    continue;
                }

                if (ChunkHelper.IsCritical(chunk.Id) && !chunk.Id.Equals(ChunkHelper.PLTE))
                {
                    throw new System.IO.IOException($"bad chunk queued: {chunk}");
                }
                if (alreadyWrittenKeys.ContainsKey(chunk.Id) && !chunk.AllowsMultiple())
                {
                    throw new System.IO.IOException($"duplicated chunk does not allow multiple: {chunk}");
                }

                chunk.Write(os);
                chunks.Add(chunk);
                alreadyWrittenKeys[chunk.Id] = alreadyWrittenKeys.ContainsKey(chunk.Id) ? alreadyWrittenKeys[chunk.Id] + 1 : 1;
                written.Add(i);
                chunk.ChunkGroup = currentGroup;
            }
            for (int k = written.Count - 1; k != -1; k--)
            {
                queuedChunks.RemoveAt(written[k]);
            }
            return(written.Count);
        }