Beispiel #1
0
        /// <summary>
        /// Get sprites for image files.
        /// </summary>
        /// <param name="files">The component images for the sprite.</param>
        /// <returns>A list of css sprites</returns>
        public virtual List <SpriteElement> ProcessFiles(IEnumerable <ImageFile> files)
        {
            var spriteElements = new List <SpriteElement>();

            foreach (var file in files)
            {
                var filePath = new Uri(PathProvider.MapPath(file.FilePath)).LocalPath;
                var fileInfo = new FileInfo(filePath);
                using (var reader = RetryableFileOpener.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var spriteElement = new SpriteElement(file.Name, reader);
                    spriteElements.Add(spriteElement);
                }
            }

            return(spriteElements);
        }
        /// <summary>
        /// Get sprites for image files.
        /// </summary>
        /// <param name="files">The component images for the sprite.</param>
        /// <returns>A list of css sprites</returns>
        public virtual List<SpriteElement> ProcessFiles(IEnumerable<ImageFile> files)
        {
            var spriteElements = new List<SpriteElement>();
            foreach (var file in files)
            {
                var filePath = new Uri(PathProvider.MapPath(file.FilePath)).LocalPath;
                var fileInfo = new FileInfo(filePath);
                using (var reader = RetryableFileOpener.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var spriteElement = new SpriteElement(file.Name, reader);
                    spriteElements.Add(spriteElement);
                }
            }

            return spriteElements;
        }
Beispiel #3
0
        /// <summary>
        /// Combine the images into a sprite image.
        /// </summary>
        /// <param name="imageOutputPath">Sprite image output path.</param>
        /// <param name="spriteImageUrl">Sprite image url.</param>
        /// <param name="cssOutputPath">Sprite css output path.</param>
        /// <param name="files">The component images for the sprite.</param>
        private static void ProcessFiles(string imageOutputPath, string spriteImageUrl, string cssOutputPath, IEnumerable <ImageFile> files)
        {
            var spriteElements = new List <SpriteElement>();

            foreach (var file in files)
            {
                var fileInfo = new FileInfo(HostingEnvironment.MapPath(file.FilePath));
                using (var reader = FileHelper.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var spriteElement = new SpriteElement(file.Name, reader);
                    spriteElements.Add(spriteElement);
                }
            }

            var etag = string.Empty;

            using (var image = GetCssSpriteImage(spriteElements))
            {
                using (var writer = new MemoryStream())
                {
                    image.Save(writer, ImageFormat.Png);
                    writer.Flush();

                    etag = HashHelper.CalculateMd5Etag(writer);

                    var imageFileInfo = new FileInfo(HostingEnvironment.MapPath(imageOutputPath));
                    //We might be competing with the web server for the output file, so try to overwrite it at regular intervals
                    using (var outputFile = FileHelper.OpenFileStream(imageFileInfo, 5, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
                    {
                        var overwrite = true;
                        if (outputFile.Length > 0)
                        {
                            var outputFileHash = HashHelper.CalculateMd5Etag(outputFile);
                            overwrite = (etag != outputFileHash);
                        }

                        if (overwrite)
                        {
                            writer.Seek(0, SeekOrigin.Begin);
                            outputFile.SetLength(writer.Length); //Truncate current file
                            outputFile.Seek(0, SeekOrigin.Begin);

                            var bufferSize = Convert.ToInt32(Math.Min(writer.Length, BufferSize));
                            var buffer     = new byte[bufferSize];

                            int bytesRead;
                            while ((bytesRead = writer.Read(buffer, 0, bufferSize)) > 0)
                            {
                                outputFile.Write(buffer, 0, bytesRead);
                            }
                            outputFile.Flush();
                        }
                    }
                }
            }

            var cssSpriteImageUrl = string.IsNullOrEmpty(spriteImageUrl) ? VirtualPathUtility.ToAbsolute(imageOutputPath) : spriteImageUrl;
            var css = GetCssSpriteCss(spriteElements, etag, cssSpriteImageUrl);

            using (var writer = new MemoryStream())
            {
                var uniEncoding = Encoding.Default;
                if (!string.IsNullOrEmpty(css))
                {
                    writer.Write(uniEncoding.GetBytes(css), 0, uniEncoding.GetByteCount(css));
                }

                var cssFileInfo = new FileInfo(HostingEnvironment.MapPath(cssOutputPath));
                using (var outputFile = FileHelper.OpenFileStream(cssFileInfo, 5, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
                {
                    var overwrite = true;
                    if (outputFile.Length > 0)
                    {
                        var newOutputFileHash = HashHelper.CalculateMd5Etag(writer);
                        var outputFileHash    = HashHelper.CalculateMd5Etag(outputFile);

                        overwrite = (newOutputFileHash != outputFileHash);
                    }

                    if (overwrite)
                    {
                        writer.Seek(0, SeekOrigin.Begin);
                        outputFile.SetLength(writer.Length); //Truncate current file
                        outputFile.Seek(0, SeekOrigin.Begin);

                        var bufferSize = Convert.ToInt32(Math.Min(writer.Length, BufferSize));
                        var buffer     = new byte[bufferSize];

                        int bytesRead;
                        while ((bytesRead = writer.Read(buffer, 0, bufferSize)) > 0)
                        {
                            outputFile.Write(buffer, 0, bytesRead);
                        }
                        outputFile.Flush();
                    }
                }
            }
        }