예제 #1
0
        /// <summary>
        /// Default case that adds comment with keyword to directory
        /// </summary>
        /// <param name="directory">EpsDirectory to add extracted data to</param>
        /// <param name="name">String that holds name of current comment</param>
        /// <param name="value">String that holds value of current comment</param>
        private void AddToDirectory(EpsDirectory directory, string name, string value)
        {
            if (!EpsDirectory.TagIntegerMap.ContainsKey(name))
            {
                return;
            }

            var tag = EpsDirectory.TagIntegerMap[name];

            switch (tag)
            {
            case EpsDirectory.TagImageData:
                ExtractImageData(directory, value);
                break;

            case EpsDirectory.TagContinueLine:
                directory.Set(_previousTag, directory.GetString(_previousTag) + " " + value);
                break;

            default:
                if (EpsDirectory.TagNameMap.ContainsKey(tag) && !directory.ContainsTag(tag))
                {
                    directory.Set(tag, value);
                    _previousTag = tag;
                }
                else
                {
                    // Set previous tag to an Integer that doesn't exist in EpsDirectory
                    _previousTag = 0;
                }
                break;
            }
            _previousTag = tag;
        }
예제 #2
0
        /// <summary>
        /// Parses '%ImageData' comment which holds several values including width in px,
        /// height in px and color type.
        /// </summary>
        private static void ExtractImageData(EpsDirectory directory, string imageData)
        {
            // %ImageData: 1000 1000 8 3 1 1000 7 "beginimage"
            directory.Set(EpsDirectory.TagImageData, imageData.Trim());

            var imageDataParts = imageData.Split(' ');

            int width     = int.Parse(imageDataParts[0]);
            int height    = int.Parse(imageDataParts[1]);
            int colorType = int.Parse(imageDataParts[3]);

            // Only add values that are not already present
            if (!directory.ContainsTag(EpsDirectory.TagImageWidth))
            {
                directory.Set(EpsDirectory.TagImageWidth, width);
            }
            if (!directory.ContainsTag(EpsDirectory.TagImageHeight))
            {
                directory.Set(EpsDirectory.TagImageHeight, height);
            }
            if (!directory.ContainsTag(EpsDirectory.TagColorType))
            {
                directory.Set(EpsDirectory.TagColorType, colorType);
            }

            if (!directory.ContainsTag(EpsDirectory.TagRamSize))
            {
                int bytesPerPixel = colorType switch
                {
                    1 => 1, // grayscale
                    2 => 3, // Lab
                    3 => 3, // RGB
                    4 => 3, // CMYK
                    _ => 0
                };

                if (bytesPerPixel != 0)
                {
                    directory.Set(EpsDirectory.TagRamSize, bytesPerPixel * width * height);
                }
            }
        }