Example #1
0
 /// <summary>
 /// The constructor initializes members with the provided values.
 /// </summary>
 public WangMarkAttributes(WangMarkType type)
 {
     Type   = type;
     Bounds = new int[4];
     Color1 = new byte[3];
     Color2 = new byte[3];
 }
        /// <summary>
        /// ReadMarkAttributes reads a structure designed to hold mark attributes.
        /// </summary>
        /// <remarks>
        /// This methods aplies when the specifications are mentionning the availability of a OIAN_MARK_ATTRIBUTES structure.
        /// </remarks>
        /// <param name="stream">The stream to read the data in.</param>
        /// <param name="dataSize">The size of the data to read.</param>
        /// <returns>The data read.</returns>
        public static WangMarkAttributes ReadMarkAttributes(IWangStream stream, int dataSize)
        {
            // The expected data size is fixed.
            if (dataSize == 164)
            {
                /*
                 * Type         Name                Description
                 * UINT         uType               The type of the mark.
                 * LRECT        lrBounds            Rectangle in FULLSIZE units; equivalent to type RECT.
                 *                                  Can be a rectangle or two points.
                 * RGBQUAD      rgbColor1           The main color; for example, the color of all lines, all rectangles, and standalone text.
                 * RGBQUAD      rgbColor2           The secondary color; for example, the color of the text of an Attach-a-Note.
                 * BOOL         bHighlighting       TRUE - The mark is drawn highlighted. Highlighting
                 *                                  performs the same function as a highlighting marker on a
                 *                                  piece of paper. Valid only for lines, rectangles, and
                 *                                  freehand.
                 * BOOL         bTransparent        TRUE - The mark is drawn transparent. A transparent
                 *                                  mark does not draw white pixels. That is, transparent
                 *                                  replaces white pixels with whatever is behind those pixels.
                 *                                  Available only for images.
                 * UINT         uLineSize           The width of the line in pixels.
                 * UINT         uReserved1          Reserved; must be set to 0.
                 * UINT         uReserved2          Reserved; must be set to 0.
                 * LOGFONT      lfFont              The font information for the text, consisting of standard
                 *                                  font attributes of font size, name, style, effects, and
                 *                                  background color.
                 * DWORD        bReserved3          Reserved; must be set to 0.
                 * time_t       Time                The time that the mark was first saved, in seconds, from
                 *                                  00:00:00 1-1-1970 GMT. Every annotation mark has
                 *                                  time as one of its attributes. If you do not set the time before
                 *                                  the file is saved, the time is set to the date and time that the
                 *                                  save was initiated. This time is in the form returned by the
                 *                                  "time" C call, which is the number of seconds since
                 *                                  midnight 00:00:00 on 1-1-1970 GMT. If necessary, refer
                 *                                  to your C documentation for a more detailed description.
                 * BOOL         bVisible            TRUE - The mark is currently set to be visible.
                 *                                  Annotation marks can be visible or hidden.
                 * DWORD        dwReserved4         Reserved; must be set to 0x0FF83F.
                 * long         lReserved[10]       Must be set to 0.
                 */

                uint         uintMarkType = stream.ReadUint32();
                WangMarkType type         = uintMarkType < ConversionWangMarkTypes.Length
                    ? ConversionWangMarkTypes[uintMarkType]
                    : WangMarkType.Invalid;
                WangMarkAttributes readData = new WangMarkAttributes(type);

                if (!WangAnnotationStructureReader.ReadRectangle(readData.Bounds, stream))
                {
                    return(null);
                }
                if (!WangAnnotationStructureReader.ReadRgbQuad(readData.Color1, stream))
                {
                    return(null);
                }
                if (!WangAnnotationStructureReader.ReadRgbQuad(readData.Color2, stream))
                {
                    return(null);
                }

                readData.Highlighting = WangAnnotationStructureReader.ReadBool(stream);
                readData.Transparent  = WangAnnotationStructureReader.ReadBool(stream);
                readData.LineSize     = stream.ReadUint32();
                uint uReserved1 = stream.ReadUint32();
#if DEBUG
                // Reserved; must be set to 0.
                Debug.Assert(uReserved1 == 0);
#endif // DEBUG
                uint uReserved2 = stream.ReadUint32();
#if DEBUG
                // Reserved; must be set to 0.
                Debug.Assert(uReserved2 == 0);
#endif // DEBUG
                readData.LogFont = ReadLogfont(stream);

                uint bReserved3 = stream.ReadUint32();
#if DEBUG
                // Reserved; must be set to 0.
                // For some reason several file have a non 0 value there.
                // Debug.Assert(bReserved3 == 0);
#endif // DEBUG
                // Skip time
                // TODO - David Ometto - 2016-11-21 - Add support for reading time_t structure.
                stream.SkipBytes(8);

                readData.Visible = WangAnnotationStructureReader.ReadBool(stream);

                // Reserved; must be set to 0x0FF83F... but for some reason several file have a non 0 value there.
                uint dwReserved4 = stream.ReadUint32();

                // Skip 10 reserved long must be set to 0 (which is not true all of the time).
                stream.SkipBytes(40);

                return(readData);
            }
            else
            {
                return(null);
            }
        }