/// <summary>
        /// Writes a <see cref="IccProfileSequenceIdentifierTagDataEntry"/>
        /// </summary>
        /// <param name="value">The entry to write</param>
        /// <returns>The number of bytes written</returns>
        public int WriteProfileSequenceIdentifierTagDataEntry(IccProfileSequenceIdentifierTagDataEntry value)
        {
            long start  = this.dataStream.Position - 8; // 8 is the tag header size
            int  length = value.Data.Length;

            int count = this.WriteUInt32((uint)length);

            // Jump over position table
            long tablePosition = this.dataStream.Position;

            this.dataStream.Position += length * 8;
            IccPositionNumber[] table = new IccPositionNumber[length];

            for (int i = 0; i < length; i++)
            {
                uint offset = (uint)(this.dataStream.Position - start);
                int  size   = this.WriteProfileId(value.Data[i].Id);
                size    += this.WriteTagDataEntry(new IccMultiLocalizedUnicodeTagDataEntry(value.Data[i].Description));
                size    += this.WritePadding();
                table[i] = new IccPositionNumber(offset, (uint)size);
                count   += size;
            }

            // Write position table
            long lpos = this.dataStream.Position;

            this.dataStream.Position = tablePosition;
            foreach (IccPositionNumber pos in table)
            {
                count += this.WritePositionNumber(pos);
            }

            this.dataStream.Position = lpos;
            return(count);
        }
        /// <summary>
        /// Reads a <see cref="IccProfileSequenceIdentifierTagDataEntry"/>
        /// </summary>
        /// <returns>The read entry</returns>
        public IccProfileSequenceIdentifierTagDataEntry ReadProfileSequenceIdentifierTagDataEntry()
        {
            int  start = this.currentIndex - 8; // 8 is the tag header size
            uint count = this.ReadUInt32();

            IccPositionNumber[] table = new IccPositionNumber[count];
            for (int i = 0; i < count; i++)
            {
                table[i] = this.ReadPositionNumber();
            }

            IccProfileSequenceIdentifier[] entries = new IccProfileSequenceIdentifier[count];
            for (int i = 0; i < count; i++)
            {
                this.currentIndex = (int)(start + table[i].Offset);
                IccProfileId id = this.ReadProfileId();
                this.ReadCheckTagDataEntryHeader(IccTypeSignature.MultiLocalizedUnicode);
                IccMultiLocalizedUnicodeTagDataEntry description = this.ReadMultiLocalizedUnicodeTagDataEntry();
                entries[i] = new IccProfileSequenceIdentifier(id, description.Texts);
            }

            return(new IccProfileSequenceIdentifierTagDataEntry(entries));
        }
        /// <summary>
        /// Reads a <see cref="IccMultiProcessElementsTagDataEntry"/>
        /// </summary>
        /// <returns>The read entry</returns>
        public IccMultiProcessElementsTagDataEntry ReadMultiProcessElementsTagDataEntry()
        {
            int start = this.currentIndex - 8;

            // TODO: Why are we storing variable
            ushort inChannelCount  = this.ReadUInt16();
            ushort outChannelCount = this.ReadUInt16();
            uint   elementCount    = this.ReadUInt32();

            IccPositionNumber[] positionTable = new IccPositionNumber[elementCount];
            for (int i = 0; i < elementCount; i++)
            {
                positionTable[i] = this.ReadPositionNumber();
            }

            IccMultiProcessElement[] elements = new IccMultiProcessElement[elementCount];
            for (int i = 0; i < elementCount; i++)
            {
                this.currentIndex = (int)positionTable[i].Offset + start;
                elements[i]       = this.ReadMultiProcessElement();
            }

            return(new IccMultiProcessElementsTagDataEntry(elements));
        }
        /// <summary>
        /// Writes a <see cref="IccMultiProcessElementsTagDataEntry"/>
        /// </summary>
        /// <param name="value">The entry to write</param>
        /// <returns>The number of bytes written</returns>
        public int WriteMultiProcessElementsTagDataEntry(IccMultiProcessElementsTagDataEntry value)
        {
            long start = this.dataStream.Position - 8;  // 8 is the tag header size

            int count = this.WriteUInt16((ushort)value.InputChannelCount);

            count += this.WriteUInt16((ushort)value.OutputChannelCount);
            count += this.WriteUInt32((uint)value.Data.Length);

            // Jump over position table
            long tpos = this.dataStream.Position;

            this.dataStream.Position += value.Data.Length * 8;

            IccPositionNumber[] posTable = new IccPositionNumber[value.Data.Length];
            for (int i = 0; i < value.Data.Length; i++)
            {
                uint offset = (uint)(this.dataStream.Position - start);
                int  size   = this.WriteMultiProcessElement(value.Data[i]);
                count      += this.WritePadding();
                posTable[i] = new IccPositionNumber(offset, (uint)size);
                count      += size;
            }

            // Write position table
            long lpos = this.dataStream.Position;

            this.dataStream.Position = tpos;
            foreach (IccPositionNumber pos in posTable)
            {
                count += this.WritePositionNumber(pos);
            }

            this.dataStream.Position = lpos;
            return(count);
        }
Beispiel #5
0
 /// <summary>
 /// Writes a position number
 /// </summary>
 /// <param name="value">The value to write</param>
 /// <returns>the number of bytes written</returns>
 public int WritePositionNumber(IccPositionNumber value)
 {
     return(this.WriteUInt32(value.Offset)
            + this.WriteUInt32(value.Size));
 }